From 691e1fced5a3113fbfedd44267c27716d1495b0c Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 02:44:36 +0300 Subject: [PATCH 01/48] feat: add swagger docs --- .../modules/agent/api/agent.api.service.ts | 78 +++++++++++++++++++ .../src/modules/agent/hooks/useAgents.hook.ts | 36 +++++++++ frontend/src/modules/agent/index.ts | 18 +++++ .../src/modules/agent/types/agent.types.ts | 71 +++++++++++++++++ frontend/src/pages/add-agents.page.tsx | 19 +++-- 5 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 frontend/src/modules/agent/api/agent.api.service.ts create mode 100644 frontend/src/modules/agent/hooks/useAgents.hook.ts create mode 100644 frontend/src/modules/agent/index.ts create mode 100644 frontend/src/modules/agent/types/agent.types.ts diff --git a/frontend/src/modules/agent/api/agent.api.service.ts b/frontend/src/modules/agent/api/agent.api.service.ts new file mode 100644 index 0000000..e5f629f --- /dev/null +++ b/frontend/src/modules/agent/api/agent.api.service.ts @@ -0,0 +1,78 @@ +import { apiClient } from "@/shared/api/axios.instance"; +import type { + AgentInfo, + TokenCreate, + TokenUser, + LogEntry, + LogFilters, + InsertLogRequest, + InsertLogsRequest, +} from "../types/agent.types"; + +class AgentApiService { + private readonly basePath = "/agents"; + private readonly authBasePath = "/auth"; + private readonly logsBasePath = "/logs"; + + async getAgents(): Promise { + const response = await apiClient.get(this.basePath); + return response.data; + } + + async getUsers(): Promise { + const response = await apiClient.get(`${this.authBasePath}/tokens`); + return response.data; + } + + async createUser(data: TokenCreate): Promise { + await apiClient.post(`${this.authBasePath}/token`, data); + } + + async deleteUser(login: string): Promise { + await apiClient.delete(`${this.authBasePath}/tokens/${login}`); + } + + async deleteMyAccount(): Promise { + await apiClient.delete(`${this.authBasePath}/token`); + } + + async searchLogs(filters?: LogFilters): Promise { + const response = await apiClient.get(this.logsBasePath, { + params: { + level: filters?.level, + service: filters?.service, + agent: filters?.agent, + date_from: filters?.date_from, + date_to: filters?.date_to, + limit: filters?.limit ?? 100, + offset: filters?.offset ?? 0, + }, + }); + return response.data; + } + + async insertLog(entry: InsertLogRequest): Promise { + await apiClient.post(this.logsBasePath, entry); + } + + async insertLogsBatch(data: InsertLogsRequest): Promise { + await apiClient.post(`${this.logsBasePath}/batch`, data); + } + + async getDistinctAgents(): Promise { + const response = await apiClient.get(`${this.logsBasePath}/agents`); + return response.data; + } + + async getDistinctLevels(): Promise { + const response = await apiClient.get(`${this.logsBasePath}/levels`); + return response.data; + } + + async getDistinctServices(): Promise { + const response = await apiClient.get(`${this.logsBasePath}/services`); + return response.data; + } +} + +export const agentApiService = new AgentApiService(); diff --git a/frontend/src/modules/agent/hooks/useAgents.hook.ts b/frontend/src/modules/agent/hooks/useAgents.hook.ts new file mode 100644 index 0000000..7aef8ae --- /dev/null +++ b/frontend/src/modules/agent/hooks/useAgents.hook.ts @@ -0,0 +1,36 @@ +import { useState, useEffect, useCallback } from "react"; +import { agentApiService } from "../api/agent.api.service"; +import type { AgentInfo } from "../types/agent.types"; + +interface UseAgentsResult { + agents: AgentInfo[]; + isLoading: boolean; + error: string | null; + refetch: () => Promise; +} + +export function useAgents(): UseAgentsResult { + const [agents, setAgents] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const fetchAgents = useCallback(async () => { + setIsLoading(true); + setError(null); + try { + const data = await agentApiService.getAgents(); + setAgents(data); + } catch (err) { + const message = err instanceof Error ? err.message : "Failed to fetch agents"; + setError(message); + } finally { + setIsLoading(false); + } + }, []); + + useEffect(() => { + fetchAgents(); + }, [fetchAgents]); + + return { agents, isLoading, error, refetch: fetchAgents }; +} diff --git a/frontend/src/modules/agent/index.ts b/frontend/src/modules/agent/index.ts new file mode 100644 index 0000000..0dab406 --- /dev/null +++ b/frontend/src/modules/agent/index.ts @@ -0,0 +1,18 @@ +export { SSHAgentForm } from "./ui/SSHAgentForm"; +export type { SSHAgentConfig, ExtraField } from "./ui/SSHAgentForm"; + +export { useAgents } from "./hooks/useAgents.hook"; + +export { agentApiService } from "./api/agent.api.service"; + +export type { + AgentInfo, + LoginRequest, + LoginResponse, + TokenCreate, + TokenUser, + LogEntry, + InsertLogRequest, + InsertLogsRequest, + LogFilters, +} from "./types/agent.types"; diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts new file mode 100644 index 0000000..ce0aa51 --- /dev/null +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -0,0 +1,71 @@ +export interface AgentInfo { + label: string; + services: string[]; + token: string; +} + +export interface LoginRequest { + login: string; + password: string; +} + +export interface LoginResponse { + last_name: string; + login: string; + name: string; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; + token: string; +} + +export interface TokenCreate { + login: string; + name: string; + last_name: string; + password: string; + permission_admin?: boolean; + permission_manage_agent?: boolean; + permission_view?: boolean; +} + +export interface TokenUser { + id: number; + login: string; + name: string; + last_name: string; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; + token: string; +} + +export interface LogEntry { + agent: string; + level: string; + message: string; + service: string; + timestamp: string; +} + +export interface InsertLogRequest { + agent: string; + level: string; + message: string; + service: string; + timestamp?: string; +} + +export interface InsertLogsRequest { + logs: InsertLogRequest[]; +} + +export interface LogFilters { + level?: string; + service?: string; + agent?: string; + date_from?: string; + date_to?: string; + limit?: number; + offset?: number; +} diff --git a/frontend/src/pages/add-agents.page.tsx b/frontend/src/pages/add-agents.page.tsx index a56fffa..eb01f41 100644 --- a/frontend/src/pages/add-agents.page.tsx +++ b/frontend/src/pages/add-agents.page.tsx @@ -1,5 +1,6 @@ import React, { useState } from "react"; import { SSHAgentForm } from "../modules/agent/ui/SSHAgentForm"; +import { agentApiService } from "../modules/agent/api/agent.api.service"; import { FiPlusCircle, FiSend } from "react-icons/fi"; interface SSHAgentConfig { @@ -66,18 +67,22 @@ export const AddAgentsPage: React.FC = () => { setSubmitError(null); try { + // Получаем текущих агентов для проверки подключения + const currentAgents = await agentApiService.getAgents(); + console.log("Current agents:", currentAgents); + // TODO: Реальный API вызов для развертывания агентов - console.log("Deploying agents:", agents); - - // Имитация задержки API - await new Promise((resolve) => setTimeout(resolve, 1500)); - + // Пока выводим список подключенных агентов setSubmitMessage( - `Успешно отправлено ${agents.length} сервер(ов) на развертывание`, + `Успешно подключено ${currentAgents.length} агент(ов). Серверы: ${agents.length}`, ); setAgents([createEmptyAgentConfig()]); } catch (error) { - setSubmitError("Ошибка при развертывании на серверах"); + setSubmitError( + error instanceof Error + ? error.message + : "Ошибка при подключении к серверам", + ); } finally { setIsSubmitting(false); } From 57b43da2e31896f0204bfeb7d9eef80172986287 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 03:07:45 +0300 Subject: [PATCH 02/48] feat: add layout --- frontend/src/app/providers/layout/layout.tsx | 31 ++ .../layout/navigation/navigation.tsx | 116 +++++++ .../app/providers/layout/sidebar/sidebar.tsx | 294 ++++++++++++++++++ .../app/providers/layout/store/agent.store.ts | 34 ++ .../src/app/providers/routing/routing.tsx | 11 +- .../src/modules/agent/types/agent.types.ts | 9 +- frontend/src/shared/layouts/DefaultLayout.tsx | 93 +----- 7 files changed, 499 insertions(+), 89 deletions(-) create mode 100644 frontend/src/app/providers/layout/layout.tsx create mode 100644 frontend/src/app/providers/layout/navigation/navigation.tsx create mode 100644 frontend/src/app/providers/layout/sidebar/sidebar.tsx create mode 100644 frontend/src/app/providers/layout/store/agent.store.ts diff --git a/frontend/src/app/providers/layout/layout.tsx b/frontend/src/app/providers/layout/layout.tsx new file mode 100644 index 0000000..4210ac4 --- /dev/null +++ b/frontend/src/app/providers/layout/layout.tsx @@ -0,0 +1,31 @@ +import { useState, useEffect, type ReactNode } from "react"; +import { Sidebar } from "@/app/providers/layout/sidebar/sidebar"; +import { Navigation } from "@/app/providers/layout/navigation/navigation"; +import { useAgentStore } from "@/app/providers/layout/store/agent.store"; + +export const Layout = ({ children }: { children: ReactNode }) => { + const [isOpen, setOpen] = useState(true); + const { fetchAgents } = useAgentStore(); + + useEffect(() => { + fetchAgents(); + }, [fetchAgents]); + + useEffect(() => { + const interval = setInterval(() => { + fetchAgents(); + }, 30000); + + return () => clearInterval(interval); + }, [fetchAgents]); + + return ( +
+ setOpen(!isOpen)} /> +
+ +
{children}
+
+
+ ); +}; diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx new file mode 100644 index 0000000..3c7a3be --- /dev/null +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -0,0 +1,116 @@ +import { useNavigate, useLocation } from "react-router-dom"; +import { FaHome, FaServer, FaPalette, FaUser } from "react-icons/fa"; +import { useAuthStore } from "@/modules/auth/store/useAuthStore"; + +export const Navigation = () => { + const navigate = useNavigate(); + const location = useLocation(); + const { user, logout } = useAuthStore(); + + const navItems = [ + { path: "/", label: "Главная", icon: FaHome }, + { path: "/add-agents", label: "Агенты", icon: FaServer }, + { path: "/themes", label: "Темы", icon: FaPalette }, + ]; + + const isActive = (path: string) => location.pathname === path; + + return ( +
+
+ {/* Логотип */} +
navigate("/")} + > + + + HellreigN + +
+ + {/* Навигация */} +
+ {navItems.map((item) => { + const Icon = item.icon; + const active = isActive(item.path); + return ( + + ); + })} +
+ + {/* Профиль пользователя */} +
+ {user && ( +
+
+ +
+ + {user.name} + +
+ )} + +
+
+
+ ); +}; diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx new file mode 100644 index 0000000..5f20adf --- /dev/null +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -0,0 +1,294 @@ +import React, { useMemo, useState } from "react"; +import { FaBars, FaMicrochip, FaTimes, FaSpinner, FaCopy, FaCheck } from "react-icons/fa"; +import { useAgentStore } from "@/app/providers/layout/store/agent.store"; +import { useAuthStore } from "@/modules/auth/store/useAuthStore"; + +interface SidebarProps { + isOpen?: boolean; + onToggle?: () => void; +} + +export const Sidebar: React.FC = ({ isOpen = true, onToggle }) => { + const { agents, isLoading, error, fetchAgents } = useAgentStore(); + const { token } = useAuthStore(); + const [searchQuery, setSearchQuery] = useState(""); + const [copied, setCopied] = useState(false); + const [showTokenModal, setShowTokenModal] = useState(false); + + const filteredAgents = useMemo(() => { + if (!searchQuery) return agents; + const query = searchQuery.toLowerCase(); + return agents.filter( + (agent) => + agent.name.toLowerCase().includes(query) || + agent.services.some((s) => s.name.toLowerCase().includes(query)) + ); + }, [agents, searchQuery]); + + const handleCopyToken = () => { + if (token) { + navigator.clipboard.writeText(token); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + }; + + if (!isOpen) { + return ( + + ); + } + + return ( + <> + {/* Overlay для мобильных */} +
+ + + + {/* Modal токена */} + {showTokenModal && ( +
setShowTokenModal(false)} + > +
e.stopPropagation()} + > +
+
+ +

+ Ваш токен доступа +

+
+ +
+ +
+
+ +
+ + {token || "Токен не найден"} + + {token && ( + + )} +
+
+ + +
+
+
+ )} + + ); +}; diff --git a/frontend/src/app/providers/layout/store/agent.store.ts b/frontend/src/app/providers/layout/store/agent.store.ts new file mode 100644 index 0000000..33f4352 --- /dev/null +++ b/frontend/src/app/providers/layout/store/agent.store.ts @@ -0,0 +1,34 @@ +import { create } from "zustand"; +import { agentApiService } from "@/modules/agent/api/agent.api.service"; +import type { AgentInfo } from "@/modules/agent/types/agent.types"; + +interface AgentState { + agents: AgentInfo[]; + isLoading: boolean; + error: string | null; + fetchAgents: () => Promise; + removeAgent: (name: string) => void; +} + +export const useAgentStore = create()((set, get) => ({ + agents: [], + isLoading: false, + error: null, + + fetchAgents: async () => { + set({ isLoading: true, error: null }); + try { + const agents = await agentApiService.getAgents(); + set({ agents, isLoading: false }); + } catch (error) { + set({ + error: error instanceof Error ? error.message : "Failed to fetch agents", + isLoading: false, + }); + } + }, + + removeAgent: (name: string) => { + set({ agents: get().agents.filter((a) => a.name !== name) }); + }, +})); diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index af4b471..7d8d4f8 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -17,15 +17,18 @@ export const Routing = () => { } > + {/* Публичные маршруты */} + } /> + } /> + + {/* Защищённые маршруты с Layout */} }> } /> - } /> - } /> } /> } /> - - } /> + + } /> ); diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts index ce0aa51..7d0e342 100644 --- a/frontend/src/modules/agent/types/agent.types.ts +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -1,6 +1,11 @@ +export interface AgentService { + name: string; + status: string; +} + export interface AgentInfo { - label: string; - services: string[]; + name: string; + services: AgentService[]; token: string; } diff --git a/frontend/src/shared/layouts/DefaultLayout.tsx b/frontend/src/shared/layouts/DefaultLayout.tsx index 3a3e439..9d21dbe 100644 --- a/frontend/src/shared/layouts/DefaultLayout.tsx +++ b/frontend/src/shared/layouts/DefaultLayout.tsx @@ -1,90 +1,17 @@ import { useAuthStore } from "@/modules/auth/store/useAuthStore"; -import { ThemeToggle } from "@/modules/theme-bw/ui/ThemeToggle"; -import React from "react"; -import { Outlet, useNavigate } from "react-router-dom"; +import { Navigate, Outlet } from "react-router-dom"; +import { Layout } from "@/app/providers/layout/layout"; -interface DefaultLayoutProps { - children?: React.ReactNode; -} +export const DefaultLayout = () => { + const { token } = useAuthStore(); -export const DefaultLayout: React.FC = ({ children }) => { - const { user, logout } = useAuthStore(); - const navigate = useNavigate(); - - const handleLogout = () => { - logout(); - navigate("/auth"); - }; + if (!token) { + return ; + } return ( -
- {/* Header */} -
-
-
- {/* Logo */} -
navigate("/")} - > - HellreigN -
- - {/* Right side */} -
- - {user && ( -
- - {user.firstName} {user.lastName} - - -
- )} -
-
-
-
- - {/* Main content */} -
{children || }
- - {/* Footer */} -
-
-

- © 2026 HellreigN. Все права защищены. -

-
-
-
+ + + ); }; From 9d1096a9b4e76373001d899eae10f526b71e9961 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 03:37:27 +0300 Subject: [PATCH 03/48] fix: 2 --- frontend/package-lock.json | 7152 +++++++++++++++++ .../src/app/providers/routing/routing.tsx | 2 + frontend/src/pages/test.page.tsx | 1688 ++++ frontend/src/pages/test2.page.tsx | 534 ++ frontend/src/shared/layouts/DefaultLayout.tsx | 6 +- frontend/yarn.lock | 1443 ++-- 6 files changed, 9994 insertions(+), 831 deletions(-) create mode 100644 frontend/package-lock.json create mode 100644 frontend/src/pages/test.page.tsx create mode 100644 frontend/src/pages/test2.page.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..72816fb --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,7152 @@ +{ + "name": "HellreigN", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "HellreigN", + "version": "0.0.0", + "dependencies": { + "@codemirror/lang-sql": "^6.10.0", + "@tailwindcss/vite": "^4.2.2", + "@uiw/react-codemirror": "^4.25.8", + "axios": "^1.13.6", + "framer-motion": "^12.38.0", + "primeicons": "^7.0.0", + "primereact": "^10.9.7", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-icons": "^5.6.0", + "react-router-dom": "^7.13.1", + "recharts": "^3.8.0", + "tailwind": "^4.0.0", + "tailwindcss": "^4.2.2", + "zustand": "^5.0.12" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.57.0", + "vite": "^8.0.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.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-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.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-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz", + "integrity": "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-sql": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz", + "integrity": "sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", + "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz", + "integrity": "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", + "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.41.0.tgz", + "integrity": "sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz", + "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "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", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", + "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.0", + "@typescript-eslint/type-utils": "8.58.0", + "@typescript-eslint/utils": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.58.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz", + "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.0", + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz", + "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.0", + "@typescript-eslint/types": "^8.58.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz", + "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz", + "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz", + "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0", + "@typescript-eslint/utils": "8.58.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", + "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz", + "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.0", + "@typescript-eslint/tsconfig-utils": "8.58.0", + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz", + "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.0", + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz", + "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.9", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.9.tgz", + "integrity": "sha512-QFAqr+pu6lDmNpAlecODcF49TlsrZ0bj15zPzfhiqSDl+Um3EsDLFLppixC7kFLn+rdDM2LTvVjn5CPvefpRgw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/autocomplete": ">=6.0.0", + "@codemirror/commands": ">=6.0.0", + "@codemirror/language": ">=6.0.0", + "@codemirror/lint": ">=6.0.0", + "@codemirror/search": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/react-codemirror": { + "version": "4.25.9", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.9.tgz", + "integrity": "sha512-HftqCBUYShAOH0pGi1CHP8vfm5L8fQ3+0j0VI6lQD6QpK+UBu3J7nxfEN5O/BXMilMNf9ZyFJRvRcuMMOLHMng==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@codemirror/commands": "^6.1.0", + "@codemirror/state": "^6.1.1", + "@codemirror/theme-one-dark": "^6.0.0", + "@uiw/codemirror-extensions-basic-setup": "4.25.9", + "codemirror": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.11.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/theme-one-dark": ">=6.0.0", + "@codemirror/view": ">=6.0.0", + "codemirror": ">=6.0.0", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amqplib": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "license": "MIT", + "dependencies": { + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=0.8 <=9" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-root-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha512-z5BqVjscbjmJBybKlICogJR2jCr2q/Ixu7Pvui5D4y97i7FLsJlvEG9XOR/KJRlkxxZz7UaaS2TMwQh1dRJ2dA==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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==", + "license": "MIT" + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT" + }, + "node_modules/async-retry": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", + "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "license": "MIT", + "dependencies": { + "retry": "0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz", + "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/bitsyntax": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha512-Pav3HSZXD2NLQOWfJldY3bpJLt8+HS2nUo5Z1bLLmHg2vCE/cM1qfEvNjlYo7GgYQPneNr715Bh42i01ZHZPvw==", + "dependencies": { + "buffer-more-ints": "0.0.2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha512-PDgX2QJgUc5+Jb2xAoBFP5MxhtVUmZHR33ak+m/SDxRdCrbnX1BggRIaxiW7ImwfmO4iJeCQKN18ToSXWGjYkA==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001784", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz", + "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commands-events": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/commands-events/-/commands-events-1.0.4.tgz", + "integrity": "sha512-HdP/+1Anoc7z+6L2h7nd4Imz54+LW+BjMGt30riBZrZ3ZeP/8el93wD8Jj8ltAaqVslqNgjX6qlhSBJwuDSmpg==", + "license": "AGPL-3.0", + "dependencies": { + "@babel/runtime": "7.2.0", + "formats": "1.0.0", + "uuidv4": "2.0.0" + } + }, + "node_modules/commands-events/node_modules/@babel/runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", + "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.12.0" + } + }, + "node_modules/commands-events/node_modules/uuidv4": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-2.0.0.tgz", + "integrity": "sha512-sAUlwUVepcVk6bwnaW/oi6LCwMdueako5QQzRr90ioAVVcms6p1mV0PaSxK8gyAC4CRvKddsk217uUpZUbKd2Q==", + "license": "MIT", + "dependencies": { + "sha-1": "0.1.1", + "uuid": "3.3.2" + } + }, + "node_modules/comparejs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/comparejs/-/comparejs-1.0.0.tgz", + "integrity": "sha512-Ue/Zd9aOucHzHXwaCe4yeHR7jypp7TKrIBZ5yls35nPNiVXlW14npmNVKM1ZaLlQTKZ6/4ewA//gYKHHIwCpOw==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/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==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "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==", + "license": "MIT", + "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", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto2/-/crypto2-2.0.0.tgz", + "integrity": "sha512-jdXdAgdILldLOF53md25FiQ6ybj2kUFTiRjs7msKTUoZrzgT/M1FPX5dYGJjbbwFls+RJIiZxNTC02DE/8y0ZQ==", + "license": "MIT", + "dependencies": { + "babel-runtime": "6.26.0", + "node-rsa": "0.4.2", + "util.promisify": "1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/datasette": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/datasette/-/datasette-1.0.1.tgz", + "integrity": "sha512-aJdlCBToEJUP4M57r67r4V6tltwGKa3qetnjpBtXYIlqbX9tM9jsoDMxb4xd9AGjpp3282oHRmqI5Z8TVAU0Mg==", + "license": "MIT", + "dependencies": { + "comparejs": "1.0.0", + "eventemitter2": "5.0.1", + "lodash": "4.17.5" + } + }, + "node_modules/datasette/node_modules/lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/draht": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/draht/-/draht-1.0.1.tgz", + "integrity": "sha512-yNNHL864dniNmIE9ZKD++mKypiAUAvVZtyV0QrbXH/ak3ebzFqo5xsmRBRqV8pZVhImOSBiyq500Wcmrf44zAg==", + "license": "MIT", + "dependencies": { + "eventemitter2": "5.0.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.331", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", + "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-toolkit": { + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", + "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "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==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/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==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flaschenpost": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/flaschenpost/-/flaschenpost-1.1.3.tgz", + "integrity": "sha512-1VAYPvDsVBGFJyUrOa/6clnJwZYC3qVq9nJLcypy6lvaaNbo1wOQiH8HQ+4Fw/k51pVG7JHzSf5epb8lmIW86g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "7.2.0", + "app-root-path": "2.1.0", + "babel-runtime": "6.26.0", + "chalk": "2.4.1", + "find-root": "1.1.0", + "lodash": "4.17.11", + "moment": "2.22.2", + "processenv": "1.1.0", + "split2": "3.0.0", + "stack-trace": "0.0.10", + "stringify-object": "3.3.0", + "untildify": "3.0.3", + "util.promisify": "1.0.0", + "varname": "2.0.3" + }, + "bin": { + "flaschenpost-normalize": "dist/bin/flaschenpost-normalize.js", + "flaschenpost-uncork": "dist/bin/flaschenpost-uncork.js" + } + }, + "node_modules/flaschenpost/node_modules/@babel/runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", + "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.12.0" + } + }, + "node_modules/flaschenpost/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flaschenpost/node_modules/chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flaschenpost/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/flaschenpost/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/flaschenpost/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/flaschenpost/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/flaschenpost/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/formats/-/formats-1.0.0.tgz", + "integrity": "sha512-For0Y8egwEK96JgJo4NONErPhtl7H2QzeB2NYGmzeGeJ8a1JZqPgLYOtM3oJRCYhmgsdDFd6KGRYyfe37XY4Yg==", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz", + "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hase": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hase/-/hase-2.0.0.tgz", + "integrity": "sha512-L83pBR/oZvQQNjv4kw9aUpTqBxERPiY7B42jsmkt1VDeUaRVhYkEIKzkCqrppjtxHe2EZqzZJzuhMXsWsxYIsw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "7.1.2", + "amqplib": "0.5.2" + } + }, + "node_modules/hase/node_modules/@babel/runtime": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", + "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.12.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "license": "MIT", + "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", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-lines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-lines/-/json-lines-1.0.0.tgz", + "integrity": "sha512-ytuLZb4RBQb3bTRsG/QBenyIo5oHLpjeCVph3s2NnoAsZE9K6h+uR+OWpEOWV1UeHdX63tYctGppBpGAc+JNMA==", + "license": "MIT", + "dependencies": { + "timer2": "1.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", + "integrity": "sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", + "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/limes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/limes/-/limes-2.0.0.tgz", + "integrity": "sha512-evWD0pnTgPX7QueaSoJl5JBUL30T1ZVzo34ke97tIKmeagqhBTYK/JkKL0vtG3MpNApw8ZY9TlbybfwEz9knBA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "7.3.4", + "jsonwebtoken": "8.5.0" + } + }, + "node_modules/limes/node_modules/@babel/runtime": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz", + "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.12.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lusca": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/lusca/-/lusca-1.6.1.tgz", + "integrity": "sha512-+JzvUMH/rsE/4XfHdDOl70bip0beRcHSviYATQM0vtls59uVtdn1JMu4iD7ZShBpAmFG8EnaA+PrYG9sECMIOQ==", + "dependencies": { + "tsscmp": "^1.0.5" + }, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "license": "MIT", + "bin": { + "mime": "cli.js" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", + "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nocache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", + "integrity": "sha512-YdKcy2x0dDwOh+8BEuHvA+mnOKAhmMQDgKBOCUGaLpewdmsRYguYZSom3yA+/OrE61O/q+NMQANnun65xpI1Hw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-rsa": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz", + "integrity": "sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==", + "license": "MIT", + "dependencies": { + "asn1": "0.2.3" + } + }, + "node_modules/node-statsd": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.1.1.tgz", + "integrity": "sha512-QDf6R8VXF56QVe1boek8an/Rb3rSNaxoFWb7Elpsv2m1+Noua1yy0F1FpKpK5VluF8oymWM4w764A4KsYL4pDg==", + "engines": { + "node": ">=0.1.97" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz", + "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.8", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "gopd": "^1.2.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/partof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/partof/-/partof-1.0.0.tgz", + "integrity": "sha512-+TXdhKCySpJDynCxgAPoGVyAkiK3QPusQ63/BdU5t68QcYzyU6zkP/T7F3gkMQBVUYqdWEADKa6Kx5zg8QIKrg==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/primeicons": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", + "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==", + "license": "MIT" + }, + "node_modules/primereact": { + "version": "10.9.7", + "resolved": "https://registry.npmjs.org/primereact/-/primereact-10.9.7.tgz", + "integrity": "sha512-Ap/lg9GGaS8Pq7IIlzguuG3qlaU6PYF6E0cCRo0rnWauRw/SQGvfreSVIIxqEhtR6xqlf7OV759lyvVOvBzmsQ==", + "license": "MIT", + "dependencies": { + "@types/react-transition-group": "^4.4.1", + "react-transition-group": "^4.4.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/processenv": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/processenv/-/processenv-1.1.0.tgz", + "integrity": "sha512-SymqIsn8GjEUy8nG7HiyEjgbfk1xFosRIakUX1NHLpriq3vVpKniGrr9RdMWCaGYWByIovbRt2f/WvmP/IOApQ==", + "license": "MIT", + "dependencies": { + "babel-runtime": "6.26.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-icons": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", + "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT", + "peer": true + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", + "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.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz", + "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/recharts": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz", + "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT", + "peer": true + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "license": "MIT" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "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==", + "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" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "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", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/sha-1": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sha-1/-/sha-1-0.1.1.tgz", + "integrity": "sha512-dexizf3hB7d4Jq6Cd0d/NYQiqgEqIfZIpuMfwPfvSb6h06DZKmHyUe55jYwpHC12R42wpqXO6ouhiBpRzIcD/g==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.0.0.tgz", + "integrity": "sha512-Cp7G+nUfKJyHCrAI8kze3Q00PFGEG1pMgrAlTFlDbn+GW24evSZHJuMl+iUJx1w/NTRDeBiTgvwnf6YOt94FMw==", + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stethoskop": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stethoskop/-/stethoskop-1.0.0.tgz", + "integrity": "sha512-4JnZ+UmTs9SFfDjSHFlD/EoXcb1bfwntkt4h1ipNGrpxtRzmHTxOmdquCJvIrVu608Um7a09cGX0ZSOSllWJNQ==", + "license": "MIT", + "dependencies": { + "node-statsd": "0.1.1" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tailwind/-/tailwind-4.0.0.tgz", + "integrity": "sha512-LlUNoD/5maFG1h5kQ6/hXfFPdcnYw+1Z7z+kUD/W/E71CUMwcnrskxiBM8c3G8wmPsD1VvCuqGYMHviI8+yrmg==", + "license": "AGPL-3.0", + "dependencies": { + "@babel/runtime": "7.3.4", + "ajv": "6.10.0", + "app-root-path": "2.1.0", + "async-retry": "1.2.3", + "body-parser": "1.18.3", + "commands-events": "1.0.4", + "compression": "1.7.3", + "content-type": "1.0.4", + "cors": "2.8.5", + "crypto2": "2.0.0", + "datasette": "1.0.1", + "draht": "1.0.1", + "express": "4.16.4 ", + "flaschenpost": "1.1.3", + "hase": "2.0.0", + "json-lines": "1.0.0", + "limes": "2.0.0", + "lodash": "4.17.11", + "lusca": "1.6.1", + "morgan": "1.9.1", + "nocache": "2.0.0", + "partof": "1.0.0", + "processenv": "1.1.0", + "stethoskop": "1.0.0", + "timer2": "1.0.0", + "uuidv4": "3.0.1", + "ws": "6.2.0" + } + }, + "node_modules/tailwind/node_modules/@babel/runtime": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz", + "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.12.0" + } + }, + "node_modules/tailwind/node_modules/ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/tailwind/node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/tailwind/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "license": "MIT", + "peer": true + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/timer2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/timer2/-/timer2-1.0.0.tgz", + "integrity": "sha512-UOZql+P2ET0da+B7V3/RImN3IhC5ghb+9cpecfUhmYGIm0z73dDr3A781nBLnFYmRzeT1AmoT4w9Lgr8n7n7xg==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "license": "MIT", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT", + "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", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz", + "integrity": "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.0", + "@typescript-eslint/parser": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0", + "@typescript-eslint/utils": "8.58.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "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", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/uuidv4": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-3.0.1.tgz", + "integrity": "sha512-PPzksdWRl2a5C9hrs3OOYrArTeyoR0ftJ3jtOy+BnVHkT2UlrrzPNt9nTdiGuxmQItHM/AcTXahwZZC57Njojg==", + "license": "MIT", + "dependencies": { + "uuid": "3.3.2" + } + }, + "node_modules/varname": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/varname/-/varname-2.0.3.tgz", + "integrity": "sha512-+DofT9mJAUALhnr9ipZ5Z2icwaEZ7DAajOZT4ffXy3MQqnXtG3b7atItLQEJCkfcJTOf9WcsywneOEibD4eqJg==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.0.tgz", + "integrity": "sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index 7d8d4f8..65d1d3b 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -26,6 +26,8 @@ export const Routing = () => { } /> } /> } /> + } /> + } /> } /> diff --git a/frontend/src/pages/test.page.tsx b/frontend/src/pages/test.page.tsx new file mode 100644 index 0000000..8a34386 --- /dev/null +++ b/frontend/src/pages/test.page.tsx @@ -0,0 +1,1688 @@ +import React, { useState, useCallback, useRef, useEffect } from "react"; +import Editor from "@monaco-editor/react"; +import { + FiFile, + FiFolder, + FiEdit3, + FiTrash2, + FiChevronRight, + FiChevronDown, + FiSearch, + FiGitBranch, + FiCheckCircle, + FiMinus, + FiAlertCircle, +} from "react-icons/fi"; +import { MdClose, MdAdd } from "react-icons/md"; +import { GoFile, GoTrash, GoKebabHorizontal } from "react-icons/go"; + +/* eslint react-refresh/only-export-components: "off" */ + +export interface FileNode { + name: string; + type: "file" | "folder"; + content?: string; + children?: FileNode[]; + path?: string; +} + +export const initialFiles: FileNode = { + name: "my-project", + type: "folder", + children: [ + { + name: "src", + type: "folder", + children: [ + { + name: "main.py", + type: "file", + content: + 'print("Hello, World!")\n\ndef main():\n print("Welcome!")\n\nif __name__ == "__main__":\n main()', + }, + { + name: "utils.py", + type: "file", + content: "def helper():\n return 42", + }, + ], + }, + { + name: "README.md", + type: "file", + content: "# My Project\n\nWelcome!", + }, + ], +}; + +const addPaths = (node: FileNode, parentPath: string = ""): FileNode => { + const currentPath = parentPath ? `${parentPath}/${node.name}` : node.name; + const newNode = { ...node, path: currentPath }; + if (newNode.children) { + newNode.children = newNode.children.map((child) => + addPaths(child, currentPath), + ); + } + return newNode; +}; + +const getAllFolderPaths = (node: FileNode): string[] => { + let paths: string[] = []; + if (node.type === "folder") { + paths.push(node.path || node.name); + if (node.children) { + node.children.forEach((child) => { + paths = [...paths, ...getAllFolderPaths(child)]; + }); + } + } + return paths; +}; + +const findNode = (node: FileNode, path: string): FileNode | null => { + if (node.path === path) return node; + if (node.children) { + for (const child of node.children) { + const found = findNode(child, path); + if (found) return found; + } + } + return null; +}; + +const deleteNode = (node: FileNode, path: string): FileNode | null => { + if (node.path === path) return null; + + if (node.children) { + const filtered = node.children.filter((child) => child.path !== path); + const mapped = filtered + .map((child) => deleteNode(child, path)) + .filter((child): child is FileNode => child !== null); + return { ...node, children: mapped }; + } + return node; +}; + +const addNode = ( + node: FileNode, + parentPath: string, + newNode: FileNode, +): FileNode => { + if (node.path === parentPath) { + const newPath = addPaths(newNode, node.path); + return { ...node, children: [...(node.children || []), newPath] }; + } + if (node.children) { + return { + ...node, + children: node.children.map((child) => + addNode(child, parentPath, newNode), + ), + }; + } + return node; +}; + +const renameNode = ( + node: FileNode, + oldPath: string, + newName: string, +): FileNode | null => { + if (node.path === oldPath) { + const pathParts = node.path?.split("/") || []; + pathParts[pathParts.length - 1] = newName; + const newPath = pathParts.join("/"); + const renamedNode = { ...node, name: newName, path: newPath }; + + if (renamedNode.children) { + renamedNode.children = renamedNode.children.map((child) => { + const oldChildPath = child.path || ""; + const newChildPath = oldChildPath.replace(oldPath, newPath); + return ( + renameNode( + child, + oldChildPath, + newChildPath.split("/").pop() || "", + ) || child + ); + }); + } + return renamedNode; + } + + if (node.children) { + return { + ...node, + children: node.children.map( + (child) => renameNode(child, oldPath, newName) || child, + ), + }; + } + return node; +}; + +const ContextMenu: React.FC<{ + x: number; + y: number; + node: FileNode | null; + onClose: () => void; + onNewFile: () => void; + onNewFolder: () => void; + onRename: () => void; + onDelete: () => void; +}> = ({ x, y, node, onClose, onNewFile, onNewFolder, onRename, onDelete }) => { + useEffect(() => { + const handleClick = () => onClose(); + document.addEventListener("click", handleClick); + return () => document.removeEventListener("click", handleClick); + }, [onClose]); + + return ( +
+ + New File + + + New Folder + + {node && ( + <> +
+ + Rename + + + Delete + + + )} +
+ ); +}; + +const MenuItem: React.FC<{ + onClick: () => void; + danger?: boolean; + children: React.ReactNode; +}> = ({ onClick, danger, children }) => ( +
{ + e.currentTarget.style.backgroundColor = "#2a2d2e"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + {children} +
+); + +const InputDialog: React.FC<{ + title: string; + initialValue?: string; + onConfirm: (value: string) => void; + onCancel: () => void; +}> = ({ title, initialValue = "", onConfirm, onCancel }) => { + const [value, setValue] = useState(initialValue); + const inputRef = useRef(null); + + useEffect(() => { + inputRef.current?.focus(); + inputRef.current?.select(); + }, []); + + return ( +
+
e.stopPropagation()} + > +

+ {title} +

+

+ Enter a new name +

+ setValue(e.target.value)} + onKeyDown={(e) => + e.key === "Enter" && value.trim() && onConfirm(value.trim()) + } + style={{ + width: "100%", + padding: "10px", + backgroundColor: "#3c3c3c", + border: "1px solid #3e3e42", + borderRadius: "6px", + color: "#ccc", + fontSize: "14px", + marginBottom: "20px", + outline: "none", + }} + /> +
+ + +
+
+
+ ); +}; + +const filterTree = (node: FileNode, query: string): FileNode | null => { + if (!query) return node; + const lowerQuery = query.toLowerCase(); + + if (node.type === "file") { + if (node.name.toLowerCase().includes(lowerQuery)) return node; + return null; + } + + if (node.children) { + const filteredChildren = node.children + .map((child) => filterTree(child, query)) + .filter((child): child is FileNode => child !== null); + + if (filteredChildren.length > 0) { + return { ...node, children: filteredChildren }; + } + } + + if (node.name.toLowerCase().includes(lowerQuery)) return node; + return null; +}; + +const collectPathsToExpand = (node: FileNode, query: string): Set => { + const paths = new Set(); + if (!query) return paths; + + const lowerQuery = query.toLowerCase(); + + const search = (n: FileNode, currentPath: string) => { + if (n.name.toLowerCase().includes(lowerQuery)) { + const pathParts = currentPath.split("/"); + for (let i = 1; i < pathParts.length; i++) { + paths.add(pathParts.slice(0, i).join("/")); + } + } + if (n.children) { + n.children.forEach((child) => { + const childPath = child.path || `${currentPath}/${child.name}`; + search(child, childPath); + }); + } + }; + + search(node, node.path || node.name); + return paths; +}; + +const FileTreeItem: React.FC<{ + node: FileNode; + level: number; + onFileSelect: (node: FileNode) => void; + selectedFile: string | null; + onContextMenu: (e: React.MouseEvent, node: FileNode) => void; + expandedFolders: Set; + onToggleFolder: (path: string) => void; + onDelete: (node: FileNode) => void; + isRoot?: boolean; + searchQuery?: string; +}> = ({ + node, + level, + onFileSelect, + selectedFile, + onContextMenu, + expandedFolders, + onToggleFolder, + onDelete, + isRoot, + searchQuery, +}) => { + const isFolder = node.type === "folder"; + const isSelected = selectedFile === node.path && !isFolder; + const isExpanded = expandedFolders.has(node.path || node.name); + const [hovered, setHovered] = useState(false); + + const handleClick = () => { + if (isFolder) { + onToggleFolder(node.path || node.name); + } else { + onFileSelect(node); + } + }; + + const handleDelete = (e: React.MouseEvent) => { + e.stopPropagation(); + onDelete(node); + }; + + const highlightText = (text: string, query: string) => { + if (!query) return text; + const idx = text.toLowerCase().indexOf(query.toLowerCase()); + if (idx === -1) return text; + return ( + <> + {text.slice(0, idx)} + + {text.slice(idx, idx + query.length)} + + {text.slice(idx + query.length)} + + ); + }; + + return ( +
+
onContextMenu(e, node)} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + style={{ + paddingLeft: isRoot ? "8px" : `${level * 16 + 8}px`, + paddingTop: "4px", + paddingBottom: "4px", + cursor: "pointer", + display: "flex", + alignItems: "center", + gap: "6px", + backgroundColor: isSelected ? "#094771" : "transparent", + color: isSelected ? "#fff" : "#cccccc", + fontSize: "13px", + transition: "background-color 0.1s", + userSelect: "none", + minHeight: "28px", + }} + > + + {isFolder ? ( + isExpanded ? ( + + ) : ( + + ) + ) : ( + + )} + + + {searchQuery ? highlightText(node.name, searchQuery) : node.name} + + {hovered && !isRoot && ( + + )} +
+ {isFolder && isExpanded && node.children && ( +
+ {node.children.map((child, idx) => ( + + ))} +
+ )} +
+ ); +}; + +const TabBar: React.FC<{ + openFiles: FileNode[]; + activeFile: FileNode | null; + onSelectFile: (file: FileNode) => void; + onCloseFile: (file: FileNode) => void; + onCloseAll: () => void; + onCloseOthers: (file: FileNode) => void; +}> = ({ + openFiles, + activeFile, + onSelectFile, + onCloseFile, + onCloseAll, + onCloseOthers, +}) => { + const [showContextMenu, setShowContextMenu] = useState<{ + x: number; + y: number; + file: FileNode; + } | null>(null); + + const handleContextMenu = (e: React.MouseEvent, file: FileNode) => { + e.preventDefault(); + setShowContextMenu({ x: e.clientX, y: e.clientY, file }); + }; + + return ( + <> +
+
+ +
+ {openFiles.map((file) => ( +
onSelectFile(file)} + onContextMenu={(e) => handleContextMenu(e, file)} + style={{ + display: "flex", + alignItems: "center", + padding: "8px 16px", + backgroundColor: + activeFile?.path === file.path ? "#1e1e1e" : "#2d2d30", + color: activeFile?.path === file.path ? "#fff" : "#cccccc", + borderRight: "1px solid #3e3e42", + cursor: "pointer", + fontSize: "13px", + gap: "10px", + whiteSpace: "nowrap", + transition: "all 0.1s", + borderTop: + activeFile?.path === file.path + ? "2px solid #0e639c" + : "2px solid transparent", + }} + > + + {file.name} + +
+ ))} +
+ {showContextMenu && ( +
+
{ + onCloseOthers(showContextMenu.file); + setShowContextMenu(null); + }} + style={{ + padding: "8px 16px", + cursor: "pointer", + color: "#cccccc", + fontSize: "13px", + }} + onMouseEnter={(e) => { + e.currentTarget.style.backgroundColor = "#2a2d2e"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + Close Others +
+
{ + onCloseAll(); + setShowContextMenu(null); + }} + style={{ + padding: "8px 16px", + cursor: "pointer", + color: "#cccccc", + fontSize: "13px", + }} + onMouseEnter={(e) => { + e.currentTarget.style.backgroundColor = "#2a2d2e"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + Close All +
+
+ )} + + ); +}; + +const TitleBar: React.FC = () => { + return ( +
+
+
+
+
+
+
+ + Web VS Code + +
+
+ + main + +
+
+ ); +}; + +const FileExplorer: React.FC<{ + files: FileNode; + onFileSelect: (node: FileNode) => void; + selectedFile: string | null; + onRefresh: (newFiles: FileNode | null, newFile?: FileNode) => void; + expandedFolders: Set; + onToggleFolder: (path: string) => void; + onExpandAll: () => void; + onCollapseAll: () => void; + onDeleteRoot: () => void; + searchQuery: string; + onSearchChange: (query: string) => void; + onAutoExpand: (paths: Set) => void; +}> = ({ + files, + onFileSelect, + selectedFile, + onRefresh, + expandedFolders, + onToggleFolder, + onExpandAll, + onCollapseAll, + onDeleteRoot, + searchQuery, + onSearchChange, + onAutoExpand, +}) => { + const [contextMenu, setContextMenu] = useState<{ + x: number; + y: number; + node: FileNode | null; + } | null>(null); + const [dialog, setDialog] = useState<{ + type: "newFile" | "newFolder" | "rename"; + node: FileNode | null; + } | null>(null); + const [showSearch, setShowSearch] = useState(false); + + // Для контекстного меню на пустом месте (фон эксплорера) + const handleEmptyContextMenu = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setContextMenu({ x: e.clientX, y: e.clientY, node: null }); + }; + + // Для контекстного меню на элементе (передаётся из FileTreeItem) + const handleNodeContextMenu = (e: React.MouseEvent, node: FileNode) => { + e.preventDefault(); + e.stopPropagation(); // ВАЖНО: предотвращаем всплытие + setContextMenu({ x: e.clientX, y: e.clientY, node }); + }; + + const handleDelete = (node: FileNode) => { + const isRootNode = node.path === files.path; + if (isRootNode) { + onDeleteRoot(); + } else if (window.confirm(`Delete "${node.name}"?`)) { + const newFiles = deleteNode(files, node.path || node.name); + if (newFiles) onRefresh(newFiles); + } + }; + + const filteredFiles = searchQuery ? filterTree(files, searchQuery) : files; + + useEffect(() => { + if (searchQuery && files) { + const pathsToExpand = collectPathsToExpand(files, searchQuery); + if (pathsToExpand.size > 0) { + onAutoExpand(pathsToExpand); + } + } + }, [searchQuery, files, onAutoExpand]); + + const handleDialogConfirm = (value: string) => { + if (!dialog) return; + + if (dialog.type === "rename" && dialog.node) { + const parentPath = + dialog.node.path?.split("/").slice(0, -1).join("/") || ""; + const parentNode = parentPath ? findNode(files, parentPath) : files; + if ( + parentNode?.children?.some( + (c) => + c.name.toLowerCase() === value.toLowerCase() && + c.path !== dialog.node?.path, + ) + ) { + alert(`"${value}" already exists.`); + return; + } + const newFiles = renameNode( + files, + dialog.node.path || dialog.node.name, + value, + ); + if (newFiles) { + onRefresh(newFiles); + } + setDialog(null); + return; + } + + let parentPath: string; + + if (!dialog.node) { + parentPath = files.path || files.name; + } else if (dialog.node.type === "folder") { + parentPath = dialog.node.path || dialog.node.name; + } else { + const pathParts = (dialog.node.path || dialog.node.name).split("/"); + pathParts.pop(); + parentPath = pathParts.join("/") || files.path || files.name; + } + + const parentNode = findNode(files, parentPath); + if ( + parentNode?.children?.some( + (c) => c.name.toLowerCase() === value.toLowerCase(), + ) + ) { + alert(`"${value}" already exists in this folder.`); + setDialog(null); + return; + } + + let newFiles: FileNode | null = null; + let createdNode: FileNode | null = null; + + if (dialog.type === "newFile") { + createdNode = { name: value, type: "file", content: "" }; + newFiles = addNode(files, parentPath, createdNode); + } else if (dialog.type === "newFolder") { + createdNode = { name: value, type: "folder", children: [] }; + newFiles = addNode(files, parentPath, createdNode); + } + + if (newFiles) { + const allParentPaths: string[] = []; + let current = parentPath; + while (current) { + allParentPaths.push(current); + const parts = current.split("/"); + parts.pop(); + current = parts.join("/"); + } + allParentPaths.forEach((p) => { + if (!expandedFolders.has(p)) { + onToggleFolder(p); + } + }); + onAutoExpand(new Set(allParentPaths)); + + if (createdNode && createdNode.type === "file") { + const findAndOpen = (node: FileNode, name: string): FileNode | null => { + if (node.name === name && node.type === "file") return node; + if (node.children) { + for (const child of node.children) { + const found = findAndOpen(child, name); + if (found) return found; + } + } + return null; + }; + const openedFile = findAndOpen(newFiles, value); + onRefresh(newFiles, openedFile || undefined); + } else { + onRefresh(newFiles); + } + } + setDialog(null); + }; + + return ( +
+
+ + EXPLORER + +
+ + + +
+
+ +
+ + + {files.name} + +
+ + {showSearch && ( +
+
+ + onSearchChange(e.target.value)} + placeholder="Search..." + autoFocus + style={{ + flex: 1, + padding: "5px 6px", + backgroundColor: "transparent", + border: "none", + color: "#cccccc", + fontSize: "12px", + outline: "none", + }} + /> + {searchQuery && ( + + )} +
+
+ )} + +
+ {filteredFiles ? ( + + ) : ( +
+ No results found +
+ )} +
+ + {contextMenu && ( + setContextMenu(null)} + onNewFile={() => { + setDialog({ type: "newFile", node: contextMenu.node }); + setContextMenu(null); + }} + onNewFolder={() => { + setDialog({ type: "newFolder", node: contextMenu.node }); + setContextMenu(null); + }} + onRename={() => { + setDialog({ type: "rename", node: contextMenu.node }); + setContextMenu(null); + }} + onDelete={() => { + if (contextMenu.node) { + handleDelete(contextMenu.node); + } + setContextMenu(null); + }} + /> + )} + + {dialog && ( + setDialog(null)} + /> + )} +
+ ); +}; + +const CodeEditor: React.FC<{ + filePath: string; + content: string; + onChange: (content: string) => void; +}> = ({ filePath, content, onChange }) => { + const getLanguage = (path: string) => { + const ext = path.split(".").pop(); + const map: Record = { + py: "python", + js: "javascript", + ts: "typescript", + jsx: "javascript", + tsx: "typescript", + json: "json", + md: "markdown", + css: "css", + html: "html", + }; + return map[ext || ""] || "plaintext"; + }; + + return ( +
+
+ {filePath ? ( + onChange(value || "")} + theme="vs-dark" + options={{ + minimap: { enabled: false }, + fontSize: 14, + fontFamily: "'Cascadia Code', 'Fira Code', monospace", + tabSize: 4, + wordWrap: "on", + lineNumbers: "on", + automaticLayout: true, + renderWhitespace: "selection", + smoothScrolling: true, + }} + /> + ) : ( +
+
+
+ +
+
+ Welcome to Web VS Code +
+
+ Right-click on a folder to create files +
+
+ Or right-click anywhere in the explorer +
+
+
+ )} +
+
+ ); +}; + +export const TestPage: React.FC = () => { + const [files, setFiles] = useState(() => + addPaths(initialFiles), + ); + const [openFiles, setOpenFiles] = useState([]); + const [activeFile, setActiveFile] = useState(null); + const [expandedFolders, setExpandedFolders] = useState>( + new Set(["my-project"]), + ); + const [searchQuery, setSearchQuery] = useState(""); + + const handleFileSelect = useCallback( + (node: FileNode) => { + if (node.type === "file") { + if (!openFiles.find((f) => f.path === node.path)) { + setOpenFiles((prev) => [...prev, node]); + } + setActiveFile(node); + } + }, + [openFiles], + ); + + const handleContentChange = useCallback( + (newContent: string) => { + if (activeFile && files) { + const updatedActiveFile = { ...activeFile, content: newContent }; + setActiveFile(updatedActiveFile); + setOpenFiles((prev) => + prev.map((f) => (f.path === activeFile.path ? updatedActiveFile : f)), + ); + } + }, + [activeFile, files], + ); + + const handleCloseFile = useCallback( + (file: FileNode) => { + const newOpenFiles = openFiles.filter((f) => f.path !== file.path); + setOpenFiles(newOpenFiles); + + if (activeFile?.path === file.path) { + setActiveFile(newOpenFiles[newOpenFiles.length - 1] || null); + } + }, + [openFiles, activeFile], + ); + + const handleCloseAll = useCallback(() => { + setOpenFiles([]); + setActiveFile(null); + }, []); + + const handleCloseOthers = useCallback((file: FileNode) => { + setOpenFiles([file]); + setActiveFile(file); + }, []); + + const handleRefresh = useCallback( + (newFiles: FileNode | null, newFile?: FileNode) => { + setFiles(newFiles); + + if (!newFiles) { + setOpenFiles([]); + setActiveFile(null); + return; + } + + const updatedOpenFiles = openFiles + .map((f) => { + const found = findNode(newFiles, f.path || ""); + return found && found.type === "file" ? found : null; + }) + .filter((f): f is FileNode => f !== null); + + setOpenFiles(updatedOpenFiles); + + if (newFile) { + handleFileSelect(newFile); + } else if (activeFile) { + const stillExists = findNode(newFiles, activeFile.path || ""); + if (!stillExists) { + setActiveFile(updatedOpenFiles[updatedOpenFiles.length - 1] || null); + } else if (stillExists.type === "file") { + setActiveFile(stillExists); + } + } + }, + [openFiles, activeFile, handleFileSelect], + ); + + const handleToggleFolder = useCallback((path: string) => { + setExpandedFolders((prev) => { + const newSet = new Set(prev); + if (newSet.has(path)) { + newSet.delete(path); + } else { + newSet.add(path); + } + return newSet; + }); + }, []); + + const handleExpandAll = useCallback(() => { + if (files) { + const allPaths = getAllFolderPaths(files); + setExpandedFolders(new Set(allPaths)); + } + }, [files]); + + const handleCollapseAll = useCallback(() => { + setExpandedFolders(new Set()); + }, []); + + const handleDeleteRoot = useCallback(() => { + setFiles(null); + setOpenFiles([]); + setActiveFile(null); + setExpandedFolders(new Set()); + }, []); + + const handleCreateNewProject = useCallback(() => { + const newProject = addPaths(initialFiles); + setFiles(newProject); + setExpandedFolders(new Set([newProject.path || newProject.name])); + setSearchQuery(""); + }, []); + + if (!files) { + return ( +
+ +
+
+
+ +
+
+ No project open +
+
+ Create a new project to get started +
+ +
+
+
+
+ + main + + + 0 0 + +
+
+ {activeFile && ( + + Ln 1, Col 1 | Spaces: 4 | UTF-8 |{" "} + {activeFile.path?.split(".").pop()?.toUpperCase() || "TXT"} + + )} + Web VS Code +
+
+
+ ); + } + + return ( +
+
+ + {activeFile ? `${activeFile.name} - ` : ""} + {files.name} + +
+
+
+ + setExpandedFolders((prev) => new Set([...prev, ...paths])) + } + /> +
+
+ + +
+
+
+
+ + main + + + 0 0 + +
+
+ {activeFile && ( + + Ln 1, Col 1 | Spaces: 4 | UTF-8 |{" "} + {activeFile.path?.split(".").pop()?.toUpperCase() || "TXT"} + + )} + Web VS Code +
+
+
+ ); +}; diff --git a/frontend/src/pages/test2.page.tsx b/frontend/src/pages/test2.page.tsx new file mode 100644 index 0000000..13bf7a9 --- /dev/null +++ b/frontend/src/pages/test2.page.tsx @@ -0,0 +1,534 @@ +import React, { useRef, useState, useEffect } from "react"; +import ForceGraph2D from "react-force-graph-2d"; +import { + FiDownload, + FiZoomIn, + FiZoomOut, + FiMove, + FiCpu, + FiServer, + FiPlus, + FiTrash2, + FiLink, + FiMinusCircle, +} from "react-icons/fi"; + +interface GraphNode { + id: string; + name: string; + type: "agent" | "service"; + val?: number; + description?: string; + x?: number; + y?: number; +} + +interface GraphLink { + source: string; + target: string; + type?: string; +} + +export interface GraphData { + nodes: GraphNode[]; + links: GraphLink[]; +} + +interface CustomGraphProps { + data: GraphData; + onExport?: () => void; + onDataChange?: (newData: GraphData) => void; +} + +export const Test2Page: React.FC = ({ + data: initialData, + onExport, + onDataChange, +}) => { + const fgRef = useRef(null); + const containerRef = useRef(null); + const [data, setData] = useState(initialData); + const [highlightNodes, setHighlightNodes] = useState>(new Set()); + const [highlightLinks, setHighlightLinks] = useState>(new Set()); + const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); + const [isLinkMode, setIsLinkMode] = useState(false); + const [selectedNode, setSelectedNode] = useState(null); + const [contextMenu, setContextMenu] = useState<{ + x: number; + y: number; + node: GraphNode | null; + link: GraphLink | null; + } | null>(null); + + useEffect(() => { + if (initialData) setData(initialData); + }, [initialData]); + + // Отслеживаем размеры контейнера через ResizeObserver + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + const updateDimensions = () => { + setDimensions({ + width: container.clientWidth, + height: container.clientHeight || window.innerHeight - 160, + }); + }; + + updateDimensions(); + + const observer = new ResizeObserver(updateDimensions); + observer.observe(container); + return () => observer.disconnect(); + }, []); + + // Функция для подсветки связанных элементов + const handleNodeHover = (node: GraphNode | null) => { + const newHighlightNodes = new Set(); + const newHighlightLinks = new Set(); + + if (node) { + newHighlightNodes.add(node.id); + data.links.forEach((link) => { + if (link.source === node.id || link.target === node.id) { + newHighlightLinks.add(link); + newHighlightNodes.add(link.source as string); + newHighlightNodes.add(link.target as string); + } + }); + } + + setHighlightNodes(newHighlightNodes); + setHighlightLinks(newHighlightLinks); + }; + + // Обработчик клика по узлу для создания связей + const handleNodeClick = (node: GraphNode) => { + if (isLinkMode) { + if (selectedNode === null) { + setSelectedNode(node); + } else if (selectedNode.id !== node.id) { + const newLink: GraphLink = { + source: selectedNode.id, + target: node.id, + type: "custom", + }; + + const linkExists = data.links.some( + (link) => + (link.source === selectedNode.id && link.target === node.id) || + (link.source === node.id && link.target === selectedNode.id), + ); + + if (!linkExists) { + const newData = { + nodes: [...data.nodes], + links: [...data.links, newLink], + }; + setData(newData); + onDataChange?.(newData); + } + setSelectedNode(null); + setIsLinkMode(false); + } else { + setSelectedNode(null); + } + } + }; + + // УДАЛЕНИЕ СВЯЗИ + const handleDeleteLink = (linkToDelete: GraphLink) => { + const filteredLinks = data.links.filter((link) => link !== linkToDelete); + const newData = { + nodes: [...data.nodes], + links: filteredLinks, + }; + setData(newData); + onDataChange?.(newData); + setContextMenu(null); + }; + + // УДАЛЕНИЕ УЗЛА + const handleDeleteNode = (nodeToDelete: GraphNode) => { + const filteredNodes = data.nodes.filter( + (node) => node.id !== nodeToDelete.id, + ); + const filteredLinks = data.links.filter( + (link) => + link.source !== nodeToDelete.id && link.target !== nodeToDelete.id, + ); + const newData = { + nodes: filteredNodes, + links: filteredLinks, + }; + setData(newData); + onDataChange?.(newData); + setContextMenu(null); + }; + + // Добавление нового узла + const handleAddNode = () => { + const newNodeName = prompt( + "Введите имя узла:", + `Node ${data.nodes.length + 1}`, + ); + if (newNodeName) { + const isService = window.confirm( + "Выберите тип: OK - Сервис, Отмена - Агент", + ); + const newNode: GraphNode = { + id: `node-${Date.now()}`, + name: newNodeName, + type: isService ? "service" : "agent", + val: isService ? 12 : 8, + description: "Новый узел", + }; + + const newData = { + nodes: [...data.nodes, newNode], + links: [...data.links], + }; + setData(newData); + onDataChange?.(newData); + } + }; + + // Открытие контекстного меню + const openContextMenu = ( + e: React.MouseEvent, + node?: GraphNode, + link?: GraphLink, + ) => { + e.preventDefault(); + e.stopPropagation(); + + if (node) { + setContextMenu({ x: e.clientX, y: e.clientY, node, link: null }); + } else if (link) { + setContextMenu({ x: e.clientX, y: e.clientY, node: null, link }); + } + }; + + // Закрыть контекстное меню + useEffect(() => { + const handleClickOutside = () => setContextMenu(null); + document.addEventListener("click", handleClickOutside); + return () => document.removeEventListener("click", handleClickOutside); + }, []); + + // Функция для определения цвета узла + const getNodeColor = (node: GraphNode) => { + if (highlightNodes.has(node.id)) return "#fbbf24"; + if (selectedNode?.id === node.id && isLinkMode) return "#f97316"; + + switch (node.type) { + case "service": + return "#3b82f6"; + case "agent": + return "#8b5cf6"; + default: + return "#6b7280"; + } + }; + + // Функция для размера узла + const getNodeSize = (node: GraphNode) => { + switch (node.type) { + case "service": + return 3; + case "agent": + return 3; + default: + return 5; + } + }; + + // Кастомный рендер узла + const renderNode = ( + node: GraphNode, + ctx: CanvasRenderingContext2D, + globalScale: number, + ) => { + const size = getNodeSize(node); + const color = getNodeColor(node); + + if (!node.x || !node.y) return; + + ctx.beginPath(); + ctx.arc(node.x, node.y, size, 0, 2 * Math.PI); + ctx.fillStyle = color; + ctx.fill(); + + ctx.fillStyle = "#ffffff"; + ctx.font = `${size}px "Segoe UI Emoji", "Apple Color Emoji", sans-serif`; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + + if (node.type === "service") { + ctx.fillText("S", node.x, node.y); + } else if (node.type === "agent") { + ctx.fillText("A", node.x, node.y); + } + + if (globalScale > 0.5) { + ctx.fillStyle = "#e5e7eb"; + ctx.font = `${Math.min(12, 12 / globalScale)}px "Arial", sans-serif`; + ctx.textAlign = "center"; + ctx.fillText(node.name, node.x, node.y + size + 8); + } + }; + + const handleExport = () => { + if (onExport) { + onExport(); + } else { + const dataStr = JSON.stringify(data, null, 2); + const blob = new Blob([dataStr], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = "graph-data.json"; + link.click(); + URL.revokeObjectURL(url); + } + }; + + const handleZoomIn = () => { + if (fgRef.current) { + const currentZoom = fgRef.current.zoom(); + fgRef.current.zoom(currentZoom * 1.2); + } + }; + + const handleZoomOut = () => { + if (fgRef.current) { + const currentZoom = fgRef.current.zoom(); + fgRef.current.zoom(currentZoom / 1.2); + } + }; + + const handleFit = () => { + if (fgRef.current) { + fgRef.current.zoomToFit(400); + } + }; + + if (!data || data.nodes.length === 0) { + return ( +
+
+
+

Нет данных для отображения

+ +
+
+
+ ); + } + + return ( +
+
+ { + return `${node.name}\n${node.description || ""}\n${node.type === "service" ? "Сервис" : "Агент"}\nПКМ для удаления`; + }} + linkLabel={(link: GraphLink) => { + // ВОЗВРАЩАЕМ СТРОКУ + const sourceName = + data.nodes.find((n) => n.id === link.source)?.name || link.source; + const targetName = + data.nodes.find((n) => n.id === link.target)?.name || link.target; + return `Связь: ${sourceName} → ${targetName}\nПКМ для удаления`; + }} + linkColor={(link: any) => { + return highlightLinks.has(link) ? "#fbbf24" : "#4b5563"; + }} + linkWidth={(link: any) => (highlightLinks.has(link) ? 3 : 1.5)} + linkDirectionalParticles={0} + onNodeClick={handleNodeClick} + onNodeRightClick={(node, event) => + openContextMenu(event as any, node, undefined) + } + onLinkRightClick={(link, event) => + openContextMenu(event as any, undefined, link) + } + onNodeHover={handleNodeHover} + cooldownTicks={50} + cooldownTime={2000} + d3AlphaDecay={0.03} + d3VelocityDecay={0.4} + warmupTicks={50} + onEngineStop={() => { + if (fgRef.current) { + setTimeout(() => { + if (fgRef.current) { + fgRef.current.zoomToFit(400); + } + }, 100); + } + }} + /> + + {contextMenu && ( +
e.stopPropagation()} + > + {contextMenu.node && ( + <> +
+ {contextMenu.node.name} +
+ + + + )} + {contextMenu.link && ( + <> +
+ Связь:{" "} + {typeof contextMenu.link.source === "string" + ? contextMenu.link.source + : (contextMenu.link.source as any).name || + (contextMenu.link.source as any).id}{" "} + →{" "} + {typeof contextMenu.link.target === "string" + ? contextMenu.link.target + : (contextMenu.link.target as any).name || + (contextMenu.link.target as any).id} +
+ + + )} +
+ )} + + {isLinkMode && ( +
+ Режим создания связей: кликните на два узла для + соединения + {selectedNode && ( + Выбран: {selectedNode.name} + )} +
+ )} +
+ +
+
+
+ + + Сервисы: {data.nodes.filter((n) => n.type === "service").length} + +
+
+ + + Агенты: {data.nodes.filter((n) => n.type === "agent").length} + +
+
+
+ Связи: {data.links.length} +
+
+
+ + + + + + + + + + + +
+
+
+ ); +}; diff --git a/frontend/src/shared/layouts/DefaultLayout.tsx b/frontend/src/shared/layouts/DefaultLayout.tsx index 9d21dbe..0b64907 100644 --- a/frontend/src/shared/layouts/DefaultLayout.tsx +++ b/frontend/src/shared/layouts/DefaultLayout.tsx @@ -5,9 +5,9 @@ import { Layout } from "@/app/providers/layout/layout"; export const DefaultLayout = () => { const { token } = useAuthStore(); - if (!token) { - return ; - } + // if (!token) { + // return ; + // } return ( diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 0c45968..225e87c 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4,7 +4,7 @@ "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz" integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: "@babel/helper-validator-identifier" "^7.28.5" @@ -13,12 +13,12 @@ "@babel/compat-data@^7.28.6": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz" integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== -"@babel/core@^7.24.4": +"@babel/core@^7.0.0", "@babel/core@^7.24.4": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz" integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== dependencies: "@babel/code-frame" "^7.29.0" @@ -39,7 +39,7 @@ "@babel/generator@^7.29.0": version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz" integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== dependencies: "@babel/parser" "^7.29.0" @@ -50,7 +50,7 @@ "@babel/helper-compilation-targets@^7.28.6": version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz" integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== dependencies: "@babel/compat-data" "^7.28.6" @@ -61,12 +61,12 @@ "@babel/helper-globals@^7.28.0": version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== "@babel/helper-module-imports@^7.28.6": version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz" integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== dependencies: "@babel/traverse" "^7.28.6" @@ -74,7 +74,7 @@ "@babel/helper-module-transforms@^7.28.6": version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz" integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== dependencies: "@babel/helper-module-imports" "^7.28.6" @@ -83,22 +83,22 @@ "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-validator-identifier@^7.28.5": version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/helper-validator-option@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== "@babel/helpers@^7.28.6": version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz" integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== dependencies: "@babel/template" "^7.28.6" @@ -106,40 +106,40 @@ "@babel/parser@^7.24.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz" integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== dependencies: "@babel/types" "^7.29.0" +"@babel/runtime@^7.18.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.29.2" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz" + integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== + "@babel/runtime@7.1.2": version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz" integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== dependencies: regenerator-runtime "^0.12.0" "@babel/runtime@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz" integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== dependencies: regenerator-runtime "^0.12.0" "@babel/runtime@7.3.4": version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz" integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.18.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" - integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== - "@babel/template@^7.28.6": version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== dependencies: "@babel/code-frame" "^7.28.6" @@ -148,7 +148,7 @@ "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== dependencies: "@babel/code-frame" "^7.29.0" @@ -161,7 +161,7 @@ "@babel/types@^7.28.6", "@babel/types@^7.29.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz" integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" @@ -169,7 +169,7 @@ "@codemirror/autocomplete@^6.0.0": version "6.20.1" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz#4cfbc8b2e1e25f890ec34a081037e58b4e44143e" + resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz" integrity sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A== dependencies: "@codemirror/language" "^6.0.0" @@ -179,7 +179,7 @@ "@codemirror/commands@^6.0.0", "@codemirror/commands@^6.1.0": version "6.10.3" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.10.3.tgz#01877060befdec352e8300dec1f185489c300635" + resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz" integrity sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q== dependencies: "@codemirror/language" "^6.0.0" @@ -189,7 +189,7 @@ "@codemirror/lang-sql@^6.10.0": version "6.10.0" - resolved "https://registry.yarnpkg.com/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz#49bfbf6cf31516a99e674da9a399f4426101a95a" + resolved "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz" integrity sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -201,7 +201,7 @@ "@codemirror/language@^6.0.0": version "6.12.3" - resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.12.3.tgz#0b220182973a4c19850b29f7dd82aec1bbae3d7e" + resolved "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz" integrity sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA== dependencies: "@codemirror/state" "^6.0.0" @@ -213,7 +213,7 @@ "@codemirror/lint@^6.0.0": version "6.9.5" - resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.5.tgz#c7da006f3335a33014799a7375c82df558e89f90" + resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz" integrity sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA== dependencies: "@codemirror/state" "^6.0.0" @@ -222,7 +222,7 @@ "@codemirror/search@^6.0.0": version "6.6.0" - resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.6.0.tgz#3b83a1e35391e1575a83a3b485e3f95263ddaa0b" + resolved "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz" integrity sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw== dependencies: "@codemirror/state" "^6.0.0" @@ -231,14 +231,14 @@ "@codemirror/state@^6.0.0", "@codemirror/state@^6.1.1", "@codemirror/state@^6.6.0": version "6.6.0" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.6.0.tgz#b88dbdc14aea4ace3c6d67bb77fe28bb84e4394e" + resolved "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz" integrity sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ== dependencies: "@marijn/find-cluster-break" "^1.0.0" "@codemirror/theme-one-dark@^6.0.0": version "6.1.3" - resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz#1dbb73f6e73c53c12ad2aed9f48c263c4e63ea37" + resolved "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz" integrity sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA== dependencies: "@codemirror/language" "^6.0.0" @@ -246,9 +246,9 @@ "@codemirror/view" "^6.0.0" "@lezer/highlight" "^1.0.0" -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0": +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0", "@codemirror/view@>=6.0.0": version "6.41.0" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.41.0.tgz#482cbcb5f8f90131908e5f9c0e2f4681e0684db0" + resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.41.0.tgz" integrity sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA== dependencies: "@codemirror/state" "^6.6.0" @@ -256,43 +256,21 @@ style-mod "^4.1.0" w3c-keyname "^2.2.4" -"@emnapi/core@^1.8.1": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.2.tgz#3870265ecffc7352d01ead62d8d83d8358a2d034" - integrity sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA== - dependencies: - "@emnapi/wasi-threads" "1.2.1" - tslib "^2.4.0" - -"@emnapi/runtime@^1.8.1": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.9.2.tgz#8b469a3db160817cadb1de9050211a9d1ea84fa2" - integrity sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw== - dependencies: - tslib "^2.4.0" - -"@emnapi/wasi-threads@1.2.1", "@emnapi/wasi-threads@^1.1.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" - integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== - dependencies: - tslib "^2.4.0" - "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== "@eslint/config-array@^0.21.2": version "0.21.2" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz" integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== dependencies: "@eslint/object-schema" "^2.1.7" @@ -301,21 +279,21 @@ "@eslint/config-helpers@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz" integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== dependencies: "@eslint/core" "^0.17.0" "@eslint/core@^0.17.0": version "0.17.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz" integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.5": version "3.3.5" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz#c131793cfc1a7b96f24a83e0a8bbd4b881558c60" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz" integrity sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg== dependencies: ajv "^6.14.0" @@ -328,19 +306,19 @@ minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@9.39.4", "@eslint/js@^9.39.4": +"@eslint/js@^9.39.4", "@eslint/js@9.39.4": version "9.39.4" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.4.tgz#a3f83bfc6fd9bf33a853dfacd0b49b398eb596c1" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz" integrity sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw== "@eslint/object-schema@^2.1.7": version "2.1.7" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz" integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== "@eslint/plugin-kit@^0.4.1": version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz" integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== dependencies: "@eslint/core" "^0.17.0" @@ -348,12 +326,12 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": version "0.16.7" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz" integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== dependencies: "@humanfs/core" "^0.19.1" @@ -361,17 +339,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -379,7 +357,7 @@ "@jridgewell/remapping@^2.3.5": version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -387,17 +365,17 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -405,43 +383,36 @@ "@lezer/common@^1.0.0", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.3.0", "@lezer/common@^1.5.0": version "1.5.1" - resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.1.tgz#6e8c114ff5d36a41148e146a253734d3bb8807d3" + resolved "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz" integrity sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw== "@lezer/highlight@^1.0.0": version "1.2.3" - resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.3.tgz#a20f324b71148a2ea9ba6ff42e58bbfaec702857" + resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz" integrity sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g== dependencies: "@lezer/common" "^1.3.0" "@lezer/lr@^1.0.0": version "1.4.8" - resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.8.tgz#333de9bc9346057323ff09beb4cda47ccc38a498" + resolved "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz" integrity sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA== dependencies: "@lezer/common" "^1.0.0" "@marijn/find-cluster-break@^1.0.0": version "1.0.2" - resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + resolved "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz" integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== -"@napi-rs/wasm-runtime@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc" - integrity sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw== - dependencies: - "@tybys/wasm-util" "^0.10.1" - "@oxc-project/types@=0.122.0": version "0.122.0" - resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.122.0.tgz#2f4e77a3b183c87b2a326affd703ef71ba836601" + resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz" integrity sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA== "@reduxjs/toolkit@^1.9.0 || 2.x.x": version "2.11.2" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.11.2.tgz#582225acea567329ca6848583e7dd72580d38e82" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz" integrity sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ== dependencies: "@standard-schema/spec" "^1.0.0" @@ -451,106 +422,34 @@ redux-thunk "^3.1.0" reselect "^5.1.0" -"@rolldown/binding-android-arm64@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz#4e6af08b89da02596cc5da4b105082b68673ffec" - integrity sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA== - -"@rolldown/binding-darwin-arm64@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz#a06890f4c9b48ff0fc97edbedfc762bef7cffd73" - integrity sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg== - -"@rolldown/binding-darwin-x64@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz#eddf6aa3ed3509171fe21711f1e8ec8e0fd7ec49" - integrity sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw== - -"@rolldown/binding-freebsd-x64@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz#2102dfed19fd1f1b53435fcaaf0bc61129a266a3" - integrity sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q== - -"@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz#b2c13f40e990fd1e1935492850536c768c961a0f" - integrity sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q== - -"@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz#32ca9f77c1e76b2913b3d53d2029dc171c0532d6" - integrity sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg== - -"@rolldown/binding-linux-arm64-musl@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz#f4337ddd52f0ed3ada2105b59ee1b757a2c4858c" - integrity sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw== - -"@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz#22fdd14cb00ee8208c28a39bab7f28860ec6705d" - integrity sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g== - -"@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz#838215096d1de6d3d509e0410801cb7cda8161ff" - integrity sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og== - -"@rolldown/binding-linux-x64-gnu@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz#f7d71d97f6bd43198596b26dc2cb364586e12673" - integrity sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg== - -"@rolldown/binding-linux-x64-musl@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz#a2ca737f01b0ad620c4c404ca176ea3e3ad804c3" - integrity sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig== - -"@rolldown/binding-openharmony-arm64@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz#f66317e29eafcc300bed7af8dddac26ab3b1bf82" - integrity sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA== - -"@rolldown/binding-wasm32-wasi@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz#8825523fdffa1f1dc4683be9650ffaa9e4a77f04" - integrity sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg== - dependencies: - "@napi-rs/wasm-runtime" "^1.1.1" - -"@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12": - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz#4f3a17e3d68a58309c27c0930b0f7986ccabef47" - integrity sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q== - "@rolldown/binding-win32-x64-msvc@1.0.0-rc.12": version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz#d762765d5660598a96b570b513f535c151272985" + resolved "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz" integrity sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw== "@rolldown/pluginutils@1.0.0-rc.12": version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz#74163aec62fa51cee18d62709483963dceb3f6dc" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz" integrity sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw== "@rolldown/pluginutils@1.0.0-rc.7": version "1.0.0-rc.7" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz#0414869467f0e471a6515d4f506c85fde867e022" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz" integrity sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA== "@standard-schema/spec@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== "@standard-schema/utils@^0.3.0": version "0.3.0" - resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b" + resolved "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz" integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g== "@tailwindcss/node@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.2.2.tgz#840e904226dc1b379609de8a72323fc211568993" + resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz" integrity sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA== dependencies: "@jridgewell/remapping" "^2.3.5" @@ -561,76 +460,14 @@ source-map-js "^1.2.1" tailwindcss "4.2.2" -"@tailwindcss/oxide-android-arm64@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz#61d9ec5c18394fe7a972e99e19e6065e833da77c" - integrity sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg== - -"@tailwindcss/oxide-darwin-arm64@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz#9ad7b141789dae235c85d2f7874592bf869f636e" - integrity sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg== - -"@tailwindcss/oxide-darwin-x64@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz#a5899f1fbe55c4eddcbc871b835d5183ba34658c" - integrity sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw== - -"@tailwindcss/oxide-freebsd-x64@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz#76185bb1bea9af915a5b9f465323861646587e21" - integrity sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ== - -"@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz#74c17c69b2015f7600d566ab0990aaac8701128e" - integrity sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ== - -"@tailwindcss/oxide-linux-arm64-gnu@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz#38a846d9d5795bc3b57951172044d8dbb3c79aa6" - integrity sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw== - -"@tailwindcss/oxide-linux-arm64-musl@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz#f4cc4129c17d3f2bcb01efef4d7a2f381e5e3f53" - integrity sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag== - -"@tailwindcss/oxide-linux-x64-gnu@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz#7c4a00b0829e12736bd72ec74e1c08205448cc2e" - integrity sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg== - -"@tailwindcss/oxide-linux-x64-musl@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz#711756d7bbe97e221fc041b63a4f385b85ba4321" - integrity sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ== - -"@tailwindcss/oxide-wasm32-wasi@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz#ed6d28567b7abb8505f824457c236d2cd07ee18e" - integrity sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q== - dependencies: - "@emnapi/core" "^1.8.1" - "@emnapi/runtime" "^1.8.1" - "@emnapi/wasi-threads" "^1.1.0" - "@napi-rs/wasm-runtime" "^1.1.1" - "@tybys/wasm-util" "^0.10.1" - tslib "^2.8.1" - -"@tailwindcss/oxide-win32-arm64-msvc@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz#f2d0360e5bc06fe201537fb08193d3780e7dd24f" - integrity sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ== - "@tailwindcss/oxide-win32-x64-msvc@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz#10fc71b73883f9c3999b5b8c338fd96a45240dcb" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz" integrity sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA== "@tailwindcss/oxide@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.2.2.tgz#c6534cb4b22650df605a58258235523a6abd7de8" + resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz" integrity sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg== optionalDependencies: "@tailwindcss/oxide-android-arm64" "4.2.2" @@ -648,7 +485,7 @@ "@tailwindcss/vite@^4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.2.2.tgz#49240a41691c34b78ed4a80d07a39301f1a5129f" + resolved "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz" integrity sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w== dependencies: "@tailwindcss/node" "4.2.2" @@ -657,104 +494,104 @@ "@tybys/wasm-util@^0.10.1": version "0.10.1" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" + resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz" integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== dependencies: tslib "^2.4.0" "@types/d3-array@^3.0.3": version "3.2.2" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.2.tgz#e02151464d02d4a1b44646d0fcdb93faf88fde8c" + resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz" integrity sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw== "@types/d3-color@*": version "3.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz" integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== "@types/d3-ease@^3.0.0": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz" integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== "@types/d3-interpolate@^3.0.1": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz" integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== dependencies: "@types/d3-color" "*" "@types/d3-path@*": version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz" integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== "@types/d3-scale@^4.0.2": version "4.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz" integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== dependencies: "@types/d3-time" "*" "@types/d3-shape@^3.1.0": version "3.1.8" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.8.tgz#d1516cc508753be06852cd06758e3bb54a22b0e3" + resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz" integrity sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w== dependencies: "@types/d3-path" "*" "@types/d3-time@*", "@types/d3-time@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz" integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== "@types/d3-timer@^3.0.0": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz" integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== "@types/estree@^1.0.6": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@^24.12.0": +"@types/node@^20.19.0 || >=22.12.0", "@types/node@^24.12.0": version "24.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.12.2.tgz#353cb161dbf1785ea25e8829ba7ec574c5c629ac" + resolved "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz" integrity sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g== dependencies: undici-types "~7.16.0" "@types/react-dom@^19.2.3": version "19.2.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== "@types/react-transition-group@^4.4.1": version "4.4.12" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@^19.2.14": +"@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.2.25 || ^19", "@types/react@^19.2.0", "@types/react@^19.2.14", "@types/react@>=18.0.0": version "19.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad" + resolved "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz" integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== dependencies: csstype "^3.2.2" "@types/use-sync-external-store@^0.0.6": version "0.0.6" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz" integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== "@typescript-eslint/eslint-plugin@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz#ad40e492f1931f46da1bd888e52b9e56df9063aa" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz" integrity sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg== dependencies: "@eslint-community/regexpp" "^4.12.2" @@ -766,9 +603,9 @@ natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@8.58.0": +"@typescript-eslint/parser@^8.58.0", "@typescript-eslint/parser@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.58.0.tgz#da04ece1967b6c2fe8f10c3473dabf3825795ef7" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz" integrity sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA== dependencies: "@typescript-eslint/scope-manager" "8.58.0" @@ -779,7 +616,7 @@ "@typescript-eslint/project-service@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.58.0.tgz#66ceda0aabf7427aec3e2713fa43eb278dead2aa" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz" integrity sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg== dependencies: "@typescript-eslint/tsconfig-utils" "^8.58.0" @@ -788,20 +625,20 @@ "@typescript-eslint/scope-manager@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz#e304142775e49a1b7ac3c8bf2536714447c72cab" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz" integrity sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ== dependencies: "@typescript-eslint/types" "8.58.0" "@typescript-eslint/visitor-keys" "8.58.0" -"@typescript-eslint/tsconfig-utils@8.58.0", "@typescript-eslint/tsconfig-utils@^8.58.0": +"@typescript-eslint/tsconfig-utils@^8.58.0", "@typescript-eslint/tsconfig-utils@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz#c5a8edb21f31e0fdee565724e1b984171c559482" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz" integrity sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A== "@typescript-eslint/type-utils@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz#ce0e72cd967ffbbe8de322db6089bd4374be352f" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz" integrity sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg== dependencies: "@typescript-eslint/types" "8.58.0" @@ -810,14 +647,14 @@ debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@8.58.0", "@typescript-eslint/types@^8.58.0": +"@typescript-eslint/types@^8.58.0", "@typescript-eslint/types@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.58.0.tgz#e94ae7abdc1c6530e71183c1007b61fa93112a5a" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz" integrity sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww== "@typescript-eslint/typescript-estree@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz#ed233faa8e2f2a2e1357c3e7d553d6465a0ee59a" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz" integrity sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA== dependencies: "@typescript-eslint/project-service" "8.58.0" @@ -832,7 +669,7 @@ "@typescript-eslint/utils@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.58.0.tgz#21a74a7963b0d288b719a4121c7dd555adaab3c3" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz" integrity sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA== dependencies: "@eslint-community/eslint-utils" "^4.9.1" @@ -842,7 +679,7 @@ "@typescript-eslint/visitor-keys@8.58.0": version "8.58.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz#2abd55a4be70fd55967aceaba4330b9ba9f45189" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz" integrity sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ== dependencies: "@typescript-eslint/types" "8.58.0" @@ -850,7 +687,7 @@ "@uiw/codemirror-extensions-basic-setup@4.25.9": version "4.25.9" - resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.9.tgz#67e584f437ea40eb2fbbc29a1b489d451c6164e2" + resolved "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.9.tgz" integrity sha512-QFAqr+pu6lDmNpAlecODcF49TlsrZ0bj15zPzfhiqSDl+Um3EsDLFLppixC7kFLn+rdDM2LTvVjn5CPvefpRgw== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -863,7 +700,7 @@ "@uiw/react-codemirror@^4.25.8": version "4.25.9" - resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.25.9.tgz#f0c1f7c9b28c696dcb339e074fe8aa02912214c8" + resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.9.tgz" integrity sha512-HftqCBUYShAOH0pGi1CHP8vfm5L8fQ3+0j0VI6lQD6QpK+UBu3J7nxfEN5O/BXMilMNf9ZyFJRvRcuMMOLHMng== dependencies: "@babel/runtime" "^7.18.6" @@ -875,14 +712,14 @@ "@vitejs/plugin-react@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz#d9113b71a0a592714913eafd9e5e63bcafd0ff15" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz" integrity sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ== dependencies: "@rolldown/pluginutils" "1.0.0-rc.7" accepts@~1.3.5: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -890,27 +727,17 @@ accepts@~1.3.5: acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0: version "8.16.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== -ajv@6.10.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^6.14.0: version "6.14.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz" integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== dependencies: fast-deep-equal "^3.1.1" @@ -918,9 +745,19 @@ ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@6.10.0: + version "6.10.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + amqplib@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.2.tgz#d2d7313c7ffaa4d10bcf1e6252de4591b6cc7b63" + resolved "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz" integrity sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA== dependencies: bitsyntax "~0.0.4" @@ -931,31 +768,31 @@ amqplib@0.5.2: ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" app-root-path@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" + resolved "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz" integrity sha512-z5BqVjscbjmJBybKlICogJR2jCr2q/Ixu7Pvui5D4y97i7FLsJlvEG9XOR/KJRlkxxZz7UaaS2TMwQh1dRJ2dA== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -963,12 +800,12 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array.prototype.reduce@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz#42f97f5078daedca687d4463fd3c05cbfd83da57" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz" integrity sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw== dependencies: call-bind "^1.0.8" @@ -982,7 +819,7 @@ array.prototype.reduce@^1.0.8: arraybuffer.prototype.slice@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -995,41 +832,41 @@ arraybuffer.prototype.slice@^1.0.4: asn1@0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" integrity sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w== async-function@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== async-limiter@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async-retry@1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz" integrity sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q== dependencies: retry "0.12.0" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axios@^1.13.6: version "1.14.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.14.0.tgz#7c29f4cf2ea91ef05018d5aa5399bf23ed3120eb" + resolved "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz" integrity sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ== dependencies: follow-redirects "^1.15.11" @@ -1038,7 +875,7 @@ axios@^1.13.6: babel-runtime@6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" @@ -1046,41 +883,41 @@ babel-runtime@6.26.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== balanced-match@^4.0.2: version "4.0.4" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== baseline-browser-mapping@^2.10.12: version "2.10.14" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz#d25463733a8f80bb59ab9f797c902dc88832d47c" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz" integrity sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA== basic-auth@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" bitsyntax@~0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82" + resolved "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz" integrity sha512-Pav3HSZXD2NLQOWfJldY3bpJLt8+HS2nUo5Z1bLLmHg2vCE/cM1qfEvNjlYo7GgYQPneNr715Bh42i01ZHZPvw== dependencies: buffer-more-ints "0.0.2" bluebird@^3.4.6: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== body-parser@1.18.3: version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz" integrity sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ== dependencies: bytes "3.0.0" @@ -1096,7 +933,7 @@ body-parser@1.18.3: brace-expansion@^1.1.7: version "1.1.13" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.13.tgz#d37875c01dc9eff988dd49d112a57cb67b54efe6" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz" integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w== dependencies: balanced-match "^1.0.0" @@ -1104,14 +941,14 @@ brace-expansion@^1.1.7: brace-expansion@^5.0.5: version "5.0.5" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz" integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== dependencies: balanced-match "^4.0.2" -browserslist@^4.24.0: +browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.28.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz" integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== dependencies: baseline-browser-mapping "^2.10.12" @@ -1122,22 +959,22 @@ browserslist@^4.24.0: buffer-equal-constant-time@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer-more-ints@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c" + resolved "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz" integrity sha512-PDgX2QJgUc5+Jb2xAoBFP5MxhtVUmZHR33ak+m/SDxRdCrbnX1BggRIaxiW7ImwfmO4iJeCQKN18ToSXWGjYkA== bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -1145,7 +982,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -1155,7 +992,7 @@ call-bind@^1.0.7, call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1163,39 +1000,39 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001782: version "1.0.30001784" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz#bdf9733a0813ccfb5ab4d02f2127e62ee4c6b718" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz" integrity sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw== +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - clsx@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== codemirror@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.2.tgz#4d3fea1ad60b6753f97ca835f2f48c6936a8946e" + resolved "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz" integrity sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw== dependencies: "@codemirror/autocomplete" "^6.0.0" @@ -1208,38 +1045,38 @@ codemirror@^6.0.0: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commands-events@1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/commands-events/-/commands-events-1.0.4.tgz#772123d7f175b2984474bce37a722f4c2d3d2830" + resolved "https://registry.npmjs.org/commands-events/-/commands-events-1.0.4.tgz" integrity sha512-HdP/+1Anoc7z+6L2h7nd4Imz54+LW+BjMGt30riBZrZ3ZeP/8el93wD8Jj8ltAaqVslqNgjX6qlhSBJwuDSmpg== dependencies: "@babel/runtime" "7.2.0" @@ -1248,19 +1085,19 @@ commands-events@1.0.4: comparejs@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/comparejs/-/comparejs-1.0.0.tgz#1f61a4c2c19c5aed08983952e88bd1fe8924e3df" + resolved "https://registry.npmjs.org/comparejs/-/comparejs-1.0.0.tgz" integrity sha512-Ue/Zd9aOucHzHXwaCe4yeHR7jypp7TKrIBZ5yls35nPNiVXlW14npmNVKM1ZaLlQTKZ6/4ewA//gYKHHIwCpOw== compressible@~2.0.14: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz" integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== dependencies: accepts "~1.3.5" @@ -1273,57 +1110,57 @@ compression@1.7.3: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== content-disposition@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== -content-type@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - content-type@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== - cookie@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.1.1.tgz#3bb9bdfc82369db9c2f69c93c9c3ceb310c88b3c" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz" integrity sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ== +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" + integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== + core-js@^2.4.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -1331,12 +1168,12 @@ cors@2.8.5: crelt@^1.0.5, crelt@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -1345,7 +1182,7 @@ cross-spawn@^7.0.6: crypto2@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto2/-/crypto2-2.0.0.tgz#5539f45b283d8c2bdca0ea4faf8b34014a4ea2cd" + resolved "https://registry.npmjs.org/crypto2/-/crypto2-2.0.0.tgz" integrity sha512-jdXdAgdILldLOF53md25FiQ6ybj2kUFTiRjs7msKTUoZrzgT/M1FPX5dYGJjbbwFls+RJIiZxNTC02DE/8y0ZQ== dependencies: babel-runtime "6.26.0" @@ -1354,46 +1191,46 @@ crypto2@2.0.0: csstype@^3.0.2, csstype@^3.2.2: version "3.2.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== -"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: +d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": version "3.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" "d3-color@1 - 3": version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== d3-ease@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== "d3-format@1 - 3": version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.2.tgz#01fdb46b58beb1f55b10b42ad70b6e344d5eb2ae" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz" integrity sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg== -"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: +d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" d3-path@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== d3-scale@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== dependencies: d3-array "2.10.0 - 3" @@ -1404,33 +1241,33 @@ d3-scale@^4.0.2: d3-shape@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== dependencies: d3-path "^3.1.0" "d3-time-format@2 - 4": version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: d3-time "1 - 3" -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: +d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" d3-timer@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== data-view-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -1439,7 +1276,7 @@ data-view-buffer@^1.0.2: data-view-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -1448,7 +1285,7 @@ data-view-byte-length@^1.0.2: data-view-byte-offset@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" @@ -1457,40 +1294,40 @@ data-view-byte-offset@^1.0.1: datasette@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/datasette/-/datasette-1.0.1.tgz#c8786bbd36be6606179e7a2525430b9dbd9395e8" + resolved "https://registry.npmjs.org/datasette/-/datasette-1.0.1.tgz" integrity sha512-aJdlCBToEJUP4M57r67r4V6tltwGKa3qetnjpBtXYIlqbX9tM9jsoDMxb4xd9AGjpp3282oHRmqI5Z8TVAU0Mg== dependencies: comparejs "1.0.0" eventemitter2 "5.0.1" lodash "4.17.5" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + decimal.js-light@^2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1499,7 +1336,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-properties@^1.1.2, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1508,27 +1345,27 @@ define-properties@^1.1.2, define-properties@^1.2.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== detect-libc@^2.0.3: version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== dom-helpers@^5.0.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -1536,14 +1373,14 @@ dom-helpers@^5.0.1: draht@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/draht/-/draht-1.0.1.tgz#c4c8879923d2130dfa9c5930e956c85d62b1e975" + resolved "https://registry.npmjs.org/draht/-/draht-1.0.1.tgz" integrity sha512-yNNHL864dniNmIE9ZKD++mKypiAUAvVZtyV0QrbXH/ak3ebzFqo5xsmRBRqV8pZVhImOSBiyq500Wcmrf44zAg== dependencies: eventemitter2 "5.0.1" dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -1552,29 +1389,29 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: ecdsa-sig-formatter@1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: safe-buffer "^5.0.1" ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.328: version "1.5.331" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz#3e4e845042d517c68b3c00be5fc33204f13b2058" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz" integrity sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== enhanced-resolve@^5.19.0: version "5.20.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz" integrity sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA== dependencies: graceful-fs "^4.2.4" @@ -1582,7 +1419,7 @@ enhanced-resolve@^5.19.0: es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: version "1.24.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz" integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== dependencies: array-buffer-byte-length "^1.0.2" @@ -1642,29 +1479,29 @@ es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1674,7 +1511,7 @@ es-set-tostringtag@^2.1.0: es-to-primitive@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: is-callable "^1.2.7" @@ -1683,32 +1520,32 @@ es-to-primitive@^1.3.0: es-toolkit@^1.39.3: version "1.45.1" - resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.45.1.tgz#21b28b2bd43178fd4c9c937c445d5bcaccce907b" + resolved "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz" integrity sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw== escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-plugin-react-hooks@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz" integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== dependencies: "@babel/core" "^7.24.4" @@ -1719,12 +1556,12 @@ eslint-plugin-react-hooks@^7.0.1: eslint-plugin-react-refresh@^0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz#39e11021be10e1cd9adab2bdeabc65b17222409f" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz" integrity sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA== eslint-scope@^8.4.0: version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" @@ -1732,22 +1569,22 @@ eslint-scope@^8.4.0: eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== eslint-visitor-keys@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@^9.39.4: +"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0 || ^10.0.0", "eslint@^9 || ^10", eslint@^9.39.4: version "9.39.4" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.4.tgz#855da1b2e2ad66dc5991195f35e262bcec8117b5" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz" integrity sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" @@ -1787,7 +1624,7 @@ eslint@^9.39.4: espree@^10.0.1, espree@^10.4.0: version "10.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: acorn "^8.15.0" @@ -1796,46 +1633,46 @@ espree@^10.0.1, espree@^10.4.0: esquery@^1.5.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter2@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz" integrity sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg== eventemitter3@^5.0.1: version "5.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz" integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== "express@4.16.4 ": version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + resolved "https://registry.npmjs.org/express/-/express-4.16.4.tgz" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: accepts "~1.3.5" @@ -1871,39 +1708,39 @@ eventemitter3@^5.0.1: fast-deep-equal@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz" integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fdir@^6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" finalhandler@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz" integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" @@ -1916,12 +1753,12 @@ finalhandler@1.1.1: find-root@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1929,7 +1766,7 @@ find-up@^5.0.0: flaschenpost@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/flaschenpost/-/flaschenpost-1.1.3.tgz#2c1e7bf4eecf9f30333dd672b427a174c2d37449" + resolved "https://registry.npmjs.org/flaschenpost/-/flaschenpost-1.1.3.tgz" integrity sha512-1VAYPvDsVBGFJyUrOa/6clnJwZYC3qVq9nJLcypy6lvaaNbo1wOQiH8HQ+4Fw/k51pVG7JHzSf5epb8lmIW86g== dependencies: "@babel/runtime" "7.2.0" @@ -1949,7 +1786,7 @@ flaschenpost@1.1.3: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -1957,24 +1794,24 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.4.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== follow-redirects@^1.15.11: version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" form-data@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" @@ -1985,17 +1822,17 @@ form-data@^4.0.5: formats@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/formats/-/formats-1.0.0.tgz#327154084786eac09d3b839cab28d150b982b163" + resolved "https://registry.npmjs.org/formats/-/formats-1.0.0.tgz" integrity sha512-For0Y8egwEK96JgJo4NONErPhtl7H2QzeB2NYGmzeGeJ8a1JZqPgLYOtM3oJRCYhmgsdDFd6KGRYyfe37XY4Yg== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== framer-motion@^12.38.0: version "12.38.0" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.38.0.tgz#cf28e072a95942881ca4e33fd33be41192fd146b" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz" integrity sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g== dependencies: motion-dom "^12.38.0" @@ -2004,22 +1841,17 @@ framer-motion@^12.38.0: fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" @@ -2031,22 +1863,22 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== generator-function@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz" integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -2062,12 +1894,12 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -2075,7 +1907,7 @@ get-proto@^1.0.1: get-symbol-description@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -2084,24 +1916,24 @@ get-symbol-description@^1.1.0: glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^17.4.0: version "17.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.4.0.tgz#33d7d297ed1536b388a0e2f4bcd0ff19c8ff91b5" + resolved "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz" integrity sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw== globalthis@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -2109,58 +1941,58 @@ globalthis@^1.0.4: gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.2.4: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-bigints@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: dunder-proto "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hase@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hase/-/hase-2.0.0.tgz#344aed71d00826c45d0a37cdf94fe7faf7154c60" + resolved "https://registry.npmjs.org/hase/-/hase-2.0.0.tgz" integrity sha512-L83pBR/oZvQQNjv4kw9aUpTqBxERPiY7B42jsmkt1VDeUaRVhYkEIKzkCqrppjtxHe2EZqzZJzuhMXsWsxYIsw== dependencies: "@babel/runtime" "7.1.2" @@ -2168,26 +2000,26 @@ hase@2.0.0: hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hermes-estree@0.25.1: version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" + resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz" integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== hermes-parser@^0.25.1: version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" + resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz" integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== dependencies: hermes-estree "0.25.1" -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: +http-errors@~1.6.2, http-errors@~1.6.3, http-errors@1.6.3: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" @@ -2197,34 +2029,34 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: iconv-lite@0.4.23: version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz" integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: safer-buffer ">= 2.1.2 < 3" ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== ignore@^7.0.5: version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== -immer@^10.1.1: +immer@^10.1.1, immer@>=9.0.6: version "10.2.0" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.2.0.tgz#88a4ce06a1af64172d254b70f7cb04df51c871b1" + resolved "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz" integrity sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw== immer@^11.0.0: version "11.1.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-11.1.4.tgz#37aee86890b134a8f1a2fadd44361fb86c6ae67e" + resolved "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz" integrity sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -2232,22 +2064,22 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - inherits@^2.0.3, inherits@~2.0.1: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + internal-slot@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" @@ -2256,17 +2088,17 @@ internal-slot@^1.1.0: "internmap@1 - 2": version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -2275,7 +2107,7 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-async-function@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: async-function "^1.0.0" @@ -2286,14 +2118,14 @@ is-async-function@^2.0.0: is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: has-bigints "^1.0.2" is-boolean-object@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: call-bound "^1.0.3" @@ -2301,12 +2133,12 @@ is-boolean-object@^1.2.1: is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" @@ -2315,7 +2147,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2: is-date-object@^1.0.5, is-date-object@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -2323,19 +2155,19 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: call-bound "^1.0.3" is-generator-function@^1.0.10: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz" integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== dependencies: call-bound "^1.0.4" @@ -2346,24 +2178,24 @@ is-generator-function@^1.0.10: is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -2371,12 +2203,12 @@ is-number-object@^1.1.1: is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -2386,24 +2218,24 @@ is-regex@^1.2.1: is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: call-bound "^1.0.3" is-string@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" @@ -2411,7 +2243,7 @@ is-string@^1.1.1: is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" @@ -2420,98 +2252,98 @@ is-symbol@^1.0.4, is-symbol@^1.1.1: is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" get-intrinsic "^1.2.6" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jiti@^2.6.1: +jiti@*, jiti@^2.6.1, jiti@>=1.21.0: version "2.6.1" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-lines@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-lines/-/json-lines-1.0.0.tgz#4ac6d7531deec3b928516c7f86897b548f82711d" + resolved "https://registry.npmjs.org/json-lines/-/json-lines-1.0.0.tgz" integrity sha512-ytuLZb4RBQb3bTRsG/QBenyIo5oHLpjeCVph3s2NnoAsZE9K6h+uR+OWpEOWV1UeHdX63tYctGppBpGAc+JNMA== dependencies: timer2 "1.0.0" json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonwebtoken@8.5.0: version "8.5.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#ebd0ca2a69797816e1c5af65b6c759787252947e" + resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz" integrity sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA== dependencies: jws "^3.2.1" @@ -2527,7 +2359,7 @@ jsonwebtoken@8.5.0: jwa@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" + resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz" integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== dependencies: buffer-equal-constant-time "^1.0.1" @@ -2536,7 +2368,7 @@ jwa@^1.4.2: jws@^3.2.1: version "3.2.3" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1" + resolved "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz" integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g== dependencies: jwa "^1.4.2" @@ -2544,77 +2376,27 @@ jws@^3.2.1: keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" -lightningcss-android-arm64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" - integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== - -lightningcss-darwin-arm64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" - integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== - -lightningcss-darwin-x64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" - integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== - -lightningcss-freebsd-x64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" - integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== - -lightningcss-linux-arm-gnueabihf@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" - integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== - -lightningcss-linux-arm64-gnu@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" - integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== - -lightningcss-linux-arm64-musl@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" - integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== - -lightningcss-linux-x64-gnu@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" - integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== - -lightningcss-linux-x64-musl@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" - integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== - -lightningcss-win32-arm64-msvc@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" - integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== - lightningcss-win32-x64-msvc@1.32.0: version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" + resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz" integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== -lightningcss@1.32.0, lightningcss@^1.32.0: +lightningcss@^1.32.0, lightningcss@1.32.0: version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9" + resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz" integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== dependencies: detect-libc "^2.0.3" @@ -2633,7 +2415,7 @@ lightningcss@1.32.0, lightningcss@^1.32.0: limes@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/limes/-/limes-2.0.0.tgz#32b9fa0c62fe728262c8b2316ca3496ede7153fe" + resolved "https://registry.npmjs.org/limes/-/limes-2.0.0.tgz" integrity sha512-evWD0pnTgPX7QueaSoJl5JBUL30T1ZVzo34ke97tIKmeagqhBTYK/JkKL0vtG3MpNApw8ZY9TlbybfwEz9knBA== dependencies: "@babel/runtime" "7.3.4" @@ -2641,153 +2423,153 @@ limes@2.0.0: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.includes@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== lodash.isboolean@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== lodash.isinteger@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== lodash.isnumber@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.isstring@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.once@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash@4.17.11: version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== lodash@4.17.5: version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz" integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw== loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lusca@1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/lusca/-/lusca-1.6.1.tgz#f7445e50c720030f5ee53d1336e9e53d1786c34f" + resolved "https://registry.npmjs.org/lusca/-/lusca-1.6.1.tgz" integrity sha512-+JzvUMH/rsE/4XfHdDOl70bip0beRcHSviYATQM0vtls59uVtdn1JMu4iD7ZShBpAmFG8EnaA+PrYG9sECMIOQ== dependencies: tsscmp "^1.0.5" magic-string@^0.30.21: version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - "mime-db@>= 1.43.0 < 2": version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== minimatch@^10.2.2: version "10.2.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz" integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== dependencies: brace-expansion "^5.0.5" minimatch@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" moment@2.22.2: version "2.22.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + resolved "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz" integrity sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw== morgan@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz" integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== dependencies: basic-auth "~2.0.0" @@ -2798,81 +2580,86 @@ morgan@1.9.1: motion-dom@^12.38.0: version "12.38.0" - resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-12.38.0.tgz#9ef3253ea0fb28b6757588327073848d940e9aab" + resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz" integrity sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA== dependencies: motion-utils "^12.36.0" motion-utils@^12.36.0: version "12.36.0" - resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-12.36.0.tgz#cff2df2a28c3fe53a3de7e0103ba7f73ff7d77a7" + resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz" integrity sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - nanoid@^3.3.11: version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== nocache@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" + resolved "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz" integrity sha512-YdKcy2x0dDwOh+8BEuHvA+mnOKAhmMQDgKBOCUGaLpewdmsRYguYZSom3yA+/OrE61O/q+NMQANnun65xpI1Hw== node-releases@^2.0.36: version "2.0.37" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.37.tgz#9bd4f10b77ba39c2b9402d4e8399c482a797f671" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz" integrity sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg== node-rsa@0.4.2: version "0.4.2" - resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-0.4.2.tgz#d6391729ec16a830ed5a38042b3157d2d5d72530" + resolved "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz" integrity sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA== dependencies: asn1 "0.2.3" node-statsd@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/node-statsd/-/node-statsd-0.1.1.tgz#27a59348763d0af7a037ac2a031fef3f051013d3" + resolved "https://registry.npmjs.org/node-statsd/-/node-statsd-0.1.1.tgz" integrity sha512-QDf6R8VXF56QVe1boek8an/Rb3rSNaxoFWb7Elpsv2m1+Noua1yy0F1FpKpK5VluF8oymWM4w764A4KsYL4pDg== object-assign@^4, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.7: version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: call-bind "^1.0.8" @@ -2884,7 +2671,7 @@ object.assign@^4.1.7: object.getownpropertydescriptors@^2.0.3: version "2.1.9" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz#bf9e7520f14d50de88dee2b9c9eca841166322dc" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz" integrity sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g== dependencies: array.prototype.reduce "^1.0.8" @@ -2897,19 +2684,19 @@ object.getownpropertydescriptors@^2.0.3: on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -2921,7 +2708,7 @@ optionator@^0.9.3: own-keys@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -2930,68 +2717,68 @@ own-keys@^1.0.1: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parseurl@~1.3.2: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== partof@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/partof/-/partof-1.0.0.tgz#d9d7946a14a7d9d9738a59e7c88f478ec5c964ca" + resolved "https://registry.npmjs.org/partof/-/partof-1.0.0.tgz" integrity sha512-+TXdhKCySpJDynCxgAPoGVyAkiK3QPusQ63/BdU5t68QcYzyU6zkP/T7F3gkMQBVUYqdWEADKa6Kx5zg8QIKrg== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.3, picomatch@^4.0.4: +"picomatch@^3 || ^4", picomatch@^4.0.3, picomatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== possible-typed-array-names@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss@^8.5.8: version "8.5.8" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz" integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== dependencies: nanoid "^3.3.11" @@ -3000,17 +2787,17 @@ postcss@^8.5.8: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== primeicons@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/primeicons/-/primeicons-7.0.0.tgz#6b25c3fdcb29bb745a3035bdc1ed5902f4a419cf" + resolved "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz" integrity sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw== primereact@^10.9.7: version "10.9.7" - resolved "https://registry.yarnpkg.com/primereact/-/primereact-10.9.7.tgz#a79a5de7d842826e7f7fb853f216bb37e581f78b" + resolved "https://registry.npmjs.org/primereact/-/primereact-10.9.7.tgz" integrity sha512-Ap/lg9GGaS8Pq7IIlzguuG3qlaU6PYF6E0cCRo0rnWauRw/SQGvfreSVIIxqEhtR6xqlf7OV759lyvVOvBzmsQ== dependencies: "@types/react-transition-group" "^4.4.1" @@ -3018,14 +2805,14 @@ primereact@^10.9.7: processenv@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/processenv/-/processenv-1.1.0.tgz#3867422468954f1af82ce7bfb944c8adadd5cdf7" + resolved "https://registry.npmjs.org/processenv/-/processenv-1.1.0.tgz" integrity sha512-SymqIsn8GjEUy8nG7HiyEjgbfk1xFosRIakUX1NHLpriq3vVpKniGrr9RdMWCaGYWByIovbRt2f/WvmP/IOApQ== dependencies: babel-runtime "6.26.0" prop-types@^15.6.2: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -3034,7 +2821,7 @@ prop-types@^15.6.2: proxy-addr@~2.0.4: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -3042,27 +2829,27 @@ proxy-addr@~2.0.4: proxy-from-env@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz" integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@6.5.2: version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== range-parser@~1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz" integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== dependencies: bytes "3.0.0" @@ -3070,26 +2857,26 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -react-dom@^19.2.4: +"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.4, react-dom@>=16.6.0, react-dom@>=17.0.0, react-dom@>=18: version "19.2.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz" integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== dependencies: scheduler "^0.27.0" react-icons@^5.6.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.6.0.tgz#27bcc4acbc836e762548d76041cf9b9fef4e3837" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz" integrity sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA== -react-is@^16.13.1: +react-is@^16.13.1, "react-is@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-redux@8.x.x || 9.x.x": +"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", "react-redux@8.x.x || 9.x.x": version "9.2.0" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.2.0.tgz#96c3ab23fb9a3af2cb4654be4b51c989e32366f5" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz" integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g== dependencies: "@types/use-sync-external-store" "^0.0.6" @@ -3097,14 +2884,14 @@ react-is@^16.13.1: react-router-dom@^7.13.1: version "7.14.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.14.0.tgz#9d2df92ec9ce47e696808dc2a0e0a0c794ab278a" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz" integrity sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ== dependencies: react-router "7.14.0" react-router@7.14.0: version "7.14.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.14.0.tgz#33169c9ac03b298bb51aad13e038ba548c79a862" + resolved "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz" integrity sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ== dependencies: cookie "^1.0.1" @@ -3112,7 +2899,7 @@ react-router@7.14.0: react-transition-group@^4.4.1: version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -3120,14 +2907,23 @@ react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^19.2.4: +react@*, "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.2.4, react@>=16.6.0, react@>=17.0.0, react@>=18, react@>=18.0.0: version "19.2.4" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" + resolved "https://registry.npmjs.org/react/-/react-19.2.4.tgz" integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== +readable-stream@^3.0.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + "readable-stream@1.x >=1.1.9": version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" @@ -3135,18 +2931,9 @@ react@^19.2.4: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - recharts@^3.8.0: version "3.8.1" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-3.8.1.tgz#1784b14784dab9a27eb426c475e6a9187f14cf01" + resolved "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz" integrity sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg== dependencies: "@reduxjs/toolkit" "^1.9.0 || 2.x.x" @@ -3163,17 +2950,17 @@ recharts@^3.8.0: redux-thunk@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== -redux@^5.0.1: +redux@^5.0.0, redux@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" @@ -3187,17 +2974,17 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.12.0: version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== regexp.prototype.flags@^1.5.4: version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: call-bind "^1.0.8" @@ -3207,24 +2994,24 @@ regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" -reselect@5.1.1, reselect@^5.1.0: +reselect@^5.1.0, reselect@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz" integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== retry@0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== rolldown@1.0.0-rc.12: version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0-rc.12.tgz#e226fa74a4c21c71a13f8e44f778f81d58853ad5" + resolved "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz" integrity sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A== dependencies: "@oxc-project/types" "=0.122.0" @@ -3248,7 +3035,7 @@ rolldown@1.0.0-rc.12: safe-array-concat@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: call-bind "^1.0.8" @@ -3257,19 +3044,19 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -3277,7 +3064,7 @@ safe-push-apply@^1.0.0: safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -3286,32 +3073,32 @@ safe-regex-test@^1.1.0: "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scheduler@^0.27.0: version "0.27.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== semver@^5.6.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.7.3: version "7.7.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== send@0.16.2: version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz" integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" @@ -3330,7 +3117,7 @@ send@0.16.2: serve-static@1.13.2: version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" @@ -3340,12 +3127,12 @@ serve-static@1.13.2: set-cookie-parser@^2.6.0: version "2.7.2" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz" integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -3357,7 +3144,7 @@ set-function-length@^1.2.2: set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -3367,7 +3154,7 @@ set-function-name@^2.0.2: set-proto@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: dunder-proto "^1.0.1" @@ -3376,29 +3163,29 @@ set-proto@^1.0.0: setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha-1@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/sha-1/-/sha-1-0.1.1.tgz#2a39304bf41bbab11dd9efb7474ec25b1a92c257" + resolved "https://registry.npmjs.org/sha-1/-/sha-1-0.1.1.tgz" integrity sha512-dexizf3hB7d4Jq6Cd0d/NYQiqgEqIfZIpuMfwPfvSb6h06DZKmHyUe55jYwpHC12R42wpqXO6ouhiBpRzIcD/g== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -3406,7 +3193,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -3416,7 +3203,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -3427,7 +3214,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -3438,49 +3225,61 @@ side-channel@^1.1.0: source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== split2@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.0.0.tgz#55057cd560687a7ef6464471597404577ff1735d" + resolved "https://registry.npmjs.org/split2/-/split2-3.0.0.tgz" integrity sha512-Cp7G+nUfKJyHCrAI8kze3Q00PFGEG1pMgrAlTFlDbn+GW24evSZHJuMl+iUJx1w/NTRDeBiTgvwnf6YOt94FMw== dependencies: readable-stream "^3.0.0" stack-trace@0.0.10: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== "statuses@>= 1.4.0 < 2": version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== statuses@~1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stethoskop@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/stethoskop/-/stethoskop-1.0.0.tgz#b838e8f6f78f8e66f86139524e8058e4a2f78b62" + resolved "https://registry.npmjs.org/stethoskop/-/stethoskop-1.0.0.tgz" integrity sha512-4JnZ+UmTs9SFfDjSHFlD/EoXcb1bfwntkt4h1ipNGrpxtRzmHTxOmdquCJvIrVu608Um7a09cGX0ZSOSllWJNQ== dependencies: node-statsd "0.1.1" stop-iteration-iterator@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: es-errors "^1.3.0" internal-slot "^1.1.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + string.prototype.trim@^1.2.10: version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: call-bind "^1.0.8" @@ -3493,7 +3292,7 @@ string.prototype.trim@^1.2.10: string.prototype.trimend@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: call-bind "^1.0.8" @@ -3503,28 +3302,16 @@ string.prototype.trimend@^1.0.9: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - stringify-object@3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -3533,31 +3320,31 @@ stringify-object@3.3.0: strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-mod@^4.0.0, style-mod@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.3.tgz#6e9012255bb799bdac37e288f7671b5d71bf9f73" + resolved "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz" integrity sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" tailwind@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/tailwind/-/tailwind-4.0.0.tgz#070b5e5f1c2c190e4c0d1280a46b36c7369ea46e" + resolved "https://registry.npmjs.org/tailwind/-/tailwind-4.0.0.tgz" integrity sha512-LlUNoD/5maFG1h5kQ6/hXfFPdcnYw+1Z7z+kUD/W/E71CUMwcnrskxiBM8c3G8wmPsD1VvCuqGYMHviI8+yrmg== dependencies: "@babel/runtime" "7.3.4" @@ -3588,29 +3375,29 @@ tailwind@^4.0.0: uuidv4 "3.0.1" ws "6.2.0" -tailwindcss@4.2.2, tailwindcss@^4.2.2: +tailwindcss@^4.2.2, tailwindcss@4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.2.2.tgz#688fb0751c8ca9044e890546510a2ee817308e87" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz" integrity sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q== tapable@^2.3.0: version "2.3.2" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.2.tgz#86755feabad08d82a26b891db044808c6ad00f15" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz" integrity sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA== timer2@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/timer2/-/timer2-1.0.0.tgz#7a2441569c6564cb891f605788eef0377d89f5de" + resolved "https://registry.npmjs.org/timer2/-/timer2-1.0.0.tgz" integrity sha512-UOZql+P2ET0da+B7V3/RImN3IhC5ghb+9cpecfUhmYGIm0z73dDr3A781nBLnFYmRzeT1AmoT4w9Lgr8n7n7xg== tiny-invariant@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tinyglobby@^0.2.15: version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: fdir "^6.5.0" @@ -3618,29 +3405,29 @@ tinyglobby@^0.2.15: ts-api-utils@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== -tslib@^2.4.0, tslib@^2.8.1: +tslib@^2.4.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsscmp@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-is@~1.6.16: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -3648,7 +3435,7 @@ type-is@~1.6.16: typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -3657,7 +3444,7 @@ typed-array-buffer@^1.0.3: typed-array-byte-length@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -3668,7 +3455,7 @@ typed-array-byte-length@^1.0.3: typed-array-byte-offset@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -3681,7 +3468,7 @@ typed-array-byte-offset@^1.0.4: typed-array-length@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" @@ -3693,7 +3480,7 @@ typed-array-length@^1.0.7: typescript-eslint@^8.57.0: version "8.58.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.58.0.tgz#5758b1b68ae7ec05d756b98c63a1f6953a01172b" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz" integrity sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA== dependencies: "@typescript-eslint/eslint-plugin" "8.58.0" @@ -3701,14 +3488,14 @@ typescript-eslint@^8.57.0: "@typescript-eslint/typescript-estree" "8.58.0" "@typescript-eslint/utils" "8.58.0" -typescript@~5.9.3: +typescript@>=4.8.4, "typescript@>=4.8.4 <6.1.0", typescript@~5.9.3: version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -3718,22 +3505,22 @@ unbox-primitive@^1.1.0: undici-types@~7.16.0: version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== untildify@3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + resolved "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== update-browserslist-db@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz" integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" @@ -3741,24 +3528,24 @@ update-browserslist-db@^1.2.3: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0: +use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@>=1.2.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util.promisify@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== dependencies: define-properties "^1.1.2" @@ -3766,17 +3553,17 @@ util.promisify@1.0.0: utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== uuidv4@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-2.0.0.tgz#3ec764288f9e9c4e40f8027ad309c2c528be2976" + resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-2.0.0.tgz" integrity sha512-sAUlwUVepcVk6bwnaW/oi6LCwMdueako5QQzRr90ioAVVcms6p1mV0PaSxK8gyAC4CRvKddsk217uUpZUbKd2Q== dependencies: sha-1 "0.1.1" @@ -3784,24 +3571,24 @@ uuidv4@2.0.0: uuidv4@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-3.0.1.tgz#31751b0ab78f50c9e42dbf231693210b3435b673" + resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-3.0.1.tgz" integrity sha512-PPzksdWRl2a5C9hrs3OOYrArTeyoR0ftJ3jtOy+BnVHkT2UlrrzPNt9nTdiGuxmQItHM/AcTXahwZZC57Njojg== dependencies: uuid "3.3.2" varname@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/varname/-/varname-2.0.3.tgz#05e8dc64fbb6e59170de44aad4ddeab8ab87b68e" + resolved "https://registry.npmjs.org/varname/-/varname-2.0.3.tgz" integrity sha512-+DofT9mJAUALhnr9ipZ5Z2icwaEZ7DAajOZT4ffXy3MQqnXtG3b7atItLQEJCkfcJTOf9WcsywneOEibD4eqJg== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== victory-vendor@^37.0.2: version "37.3.6" - resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-37.3.6.tgz#401ac4b029a0b3d33e0cba8e8a1d765c487254da" + resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz" integrity sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ== dependencies: "@types/d3-array" "^3.0.3" @@ -3819,9 +3606,9 @@ victory-vendor@^37.0.2: d3-time "^3.0.0" d3-timer "^3.0.1" -vite@^8.0.1: +"vite@^5.2.0 || ^6 || ^7 || ^8", vite@^8.0.0, vite@^8.0.1: version "8.0.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.3.tgz#036d9e3b077ff57b128660b3e3a5d2d12bac9b42" + resolved "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz" integrity sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ== dependencies: lightningcss "^1.32.0" @@ -3834,12 +3621,12 @@ vite@^8.0.1: w3c-keyname@^2.2.4: version "2.2.8" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -3850,7 +3637,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: which-builtin-type@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -3869,7 +3656,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -3879,7 +3666,7 @@ which-collection@^1.0.2: which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.20" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz" integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== dependencies: available-typed-arrays "^1.0.7" @@ -3892,44 +3679,44 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== ws@6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.0.tgz#13806d9913b2a5f3cbb9ba47b563c002cbc7c526" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.0.tgz" integrity sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w== dependencies: async-limiter "~1.0.0" yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== "zod-validation-error@^3.5.0 || ^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" + resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz" integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== "zod@^3.25.0 || ^4.0.0": version "4.3.6" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a" + resolved "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz" integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== zustand@^5.0.12: version "5.0.12" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.12.tgz#ed36f647aa89965c4019b671dfc23ef6c6e3af8c" + resolved "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz" integrity sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g== From f537f1eab9de81d650a12de46efcb4698446d408 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 04:59:42 +0300 Subject: [PATCH 04/48] feat: IDE --- README.md | 1 - frontend/package.json | 5 + .../routing/helper/protected.route.tsx | 8 +- .../src/app/providers/routing/routing.tsx | 106 ++- frontend/src/modules/ide/IDE.tsx | 191 ++++ .../src/modules/ide/components/CodeEditor.tsx | 89 ++ .../modules/ide/components/ContextMenu.tsx | 99 ++ .../modules/ide/components/FileExplorer.tsx | 318 +++++++ .../modules/ide/components/FileTreeItem.tsx | 169 ++++ .../modules/ide/components/InputDialog.tsx | 119 +++ .../src/modules/ide/components/StatusBar.tsx | 44 + .../src/modules/ide/components/TabBar.tsx | 196 ++++ .../src/modules/ide/components/TitleBar.tsx | 55 ++ frontend/src/modules/ide/components/index.ts | 8 + frontend/src/modules/ide/helpers/fileTree.ts | 174 ++++ frontend/src/modules/ide/index.ts | 3 + frontend/src/modules/ide/store/useIDEStore.ts | 385 ++++++++ frontend/src/modules/ide/types.ts | 24 + frontend/src/pages/ide.page.tsx | 9 + frontend/yarn.lock | 896 +++++++++++++++++- 20 files changed, 2884 insertions(+), 15 deletions(-) delete mode 100644 README.md create mode 100644 frontend/src/modules/ide/IDE.tsx create mode 100644 frontend/src/modules/ide/components/CodeEditor.tsx create mode 100644 frontend/src/modules/ide/components/ContextMenu.tsx create mode 100644 frontend/src/modules/ide/components/FileExplorer.tsx create mode 100644 frontend/src/modules/ide/components/FileTreeItem.tsx create mode 100644 frontend/src/modules/ide/components/InputDialog.tsx create mode 100644 frontend/src/modules/ide/components/StatusBar.tsx create mode 100644 frontend/src/modules/ide/components/TabBar.tsx create mode 100644 frontend/src/modules/ide/components/TitleBar.tsx create mode 100644 frontend/src/modules/ide/components/index.ts create mode 100644 frontend/src/modules/ide/helpers/fileTree.ts create mode 100644 frontend/src/modules/ide/index.ts create mode 100644 frontend/src/modules/ide/store/useIDEStore.ts create mode 100644 frontend/src/modules/ide/types.ts create mode 100644 frontend/src/pages/ide.page.tsx diff --git a/README.md b/README.md deleted file mode 100644 index fa77674..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# HellreigN \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index 4aecc80..74ee85f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,19 +11,24 @@ }, "dependencies": { "@codemirror/lang-sql": "^6.10.0", + "@monaco-editor/react": "^4.7.0", "@tailwindcss/vite": "^4.2.2", "@uiw/react-codemirror": "^4.25.8", "axios": "^1.13.6", + "file-surf": "^1.0.3", "framer-motion": "^12.38.0", + "monaco-languageclient": "^10.7.0", "primeicons": "^7.0.0", "primereact": "^10.9.7", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-force-graph-2d": "^1.29.1", "react-icons": "^5.6.0", "react-router-dom": "^7.13.1", "recharts": "^3.8.0", "tailwind": "^4.0.0", "tailwindcss": "^4.2.2", + "vscode-ws-jsonrpc": "^3.5.0", "zustand": "^5.0.12" }, "devDependencies": { diff --git a/frontend/src/app/providers/routing/helper/protected.route.tsx b/frontend/src/app/providers/routing/helper/protected.route.tsx index 8ce4d9c..8eb41a6 100644 --- a/frontend/src/app/providers/routing/helper/protected.route.tsx +++ b/frontend/src/app/providers/routing/helper/protected.route.tsx @@ -1,12 +1,12 @@ -import { useAuthStore } from "@/store/auth/auth.store"; +import { useAuthStore } from "@/modules/auth/store/useAuthStore"; import { Navigate } from "react-router-dom"; export const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { const { isAuthenticated } = useAuthStore(); - if (!isAuthenticated) { - return ; - } + // if (!isAuthenticated) { + // return ; + // } return <>{children}; }; diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index 65d1d3b..131f5f6 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -2,10 +2,105 @@ import { Suspense } from "react"; import { Routes as ReactRoutes, Route, Navigate } from "react-router-dom"; import { HomePage } from "@/pages/home.page"; import { ThemesPage } from "@/pages/themes.page"; +import { TestPage } from "@/pages/test.page"; +import { Test2Page, type GraphData } from "@/pages/test2.page"; import { AuthPage } from "@/pages/auth.page"; import { RegisterPage } from "@/pages/register.page"; -import { AddAgentsPage } from "@/pages/add-agents.page"; import { DefaultLayout } from "@/shared/layouts/DefaultLayout"; +import { AddAgentsPage } from "@/pages/add-agents.page"; +import { IDEPage } from "@/pages/ide.page"; + +export const mockGraphData: GraphData = { + nodes: [ + { + id: "api-gateway", + name: "API Gateway", + type: "service", + val: 12, + description: "Входная точка API", + }, + { + id: "auth-service", + name: "Auth Service", + type: "service", + val: 12, + description: "Аутентификация", + }, + { + id: "db-service", + name: "Database", + type: "service", + val: 12, + description: "Хранилище данных", + }, + { + id: "redis-service", + name: "Redis", + type: "service", + val: 12, + description: "Кэширование", + }, + { + id: "queue-service", + name: "Message Queue", + type: "service", + val: 12, + description: "Очередь сообщений", + }, + { + id: "user-agent", + name: "User Agent", + type: "agent", + val: 8, + description: "Обработка пользователей", + }, + { + id: "payment-agent", + name: "Payment Agent", + type: "agent", + val: 8, + description: "Платежи", + }, + { + id: "notification-agent", + name: "Notification Agent", + type: "agent", + val: 8, + description: "Уведомления", + }, + { + id: "analytics-agent", + name: "Analytics Agent", + type: "agent", + val: 8, + description: "Аналитика", + }, + { + id: "report-agent", + name: "Report Agent", + type: "agent", + val: 8, + description: "Отчеты", + }, + ], + links: [ + { source: "user-agent", target: "api-gateway", type: "uses" }, + { source: "user-agent", target: "auth-service", type: "uses" }, + { source: "user-agent", target: "db-service", type: "uses" }, + { source: "payment-agent", target: "api-gateway", type: "uses" }, + { source: "payment-agent", target: "auth-service", type: "uses" }, + { source: "payment-agent", target: "queue-service", type: "uses" }, + { source: "notification-agent", target: "redis-service", type: "uses" }, + { source: "notification-agent", target: "queue-service", type: "uses" }, + { source: "analytics-agent", target: "db-service", type: "uses" }, + { source: "report-agent", target: "db-service", type: "uses" }, + { source: "report-agent", target: "redis-service", type: "uses" }, + { source: "api-gateway", target: "auth-service", type: "depends_on" }, + { source: "auth-service", target: "db-service", type: "depends_on" }, + { source: "api-gateway", target: "queue-service", type: "depends_on" }, + { source: "queue-service", target: "redis-service", type: "depends_on" }, + ], +}; export const Routing = () => { return ( @@ -17,19 +112,20 @@ export const Routing = () => { } > - {/* Публичные маршруты */} } /> } /> - {/* Защищённые маршруты с Layout */} }> } /> } /> } /> - } /> - } /> + } /> + } /> + + } /> + } /> diff --git a/frontend/src/modules/ide/IDE.tsx b/frontend/src/modules/ide/IDE.tsx new file mode 100644 index 0000000..7e0dd30 --- /dev/null +++ b/frontend/src/modules/ide/IDE.tsx @@ -0,0 +1,191 @@ +import React, { useEffect } from "react"; +import { MdAdd } from "react-icons/md"; +import { GoTrash } from "react-icons/go"; +import { + useIDEStore, + initialFiles as defaultInitialFiles, +} from "./store/useIDEStore"; +import type { FileNode } from "./types"; +import { + FileExplorer, + TabBar, + CodeEditor, + TitleBar, + StatusBar, +} from "./components"; + +interface IDEProps { + initialFiles?: FileNode; +} + +export const IDE: React.FC = ({ + initialFiles: externalFiles, +}: IDEProps = {}) => { + const files = useIDEStore((state) => state.files); + const openFiles = useIDEStore((state) => state.openFiles); + const activeFile = useIDEStore((state) => state.activeFile); + const createNewProject = useIDEStore((state) => state.createNewProject); + const selectFile = useIDEStore((state) => state.selectFile); + const updateFileContent = useIDEStore((state) => state.updateFileContent); + const closeFile = useIDEStore((state) => state.closeFile); + const closeAllFiles = useIDEStore((state) => state.closeAllFiles); + const closeOtherFiles = useIDEStore((state) => state.closeOtherFiles); + const initialize = useIDEStore((state) => state.initialize); + const isInitialized = useIDEStore((state) => state.isInitialized); + + // Инициализация файлов + useEffect(() => { + if (!isInitialized) { + const filesToInit = externalFiles || defaultInitialFiles; + initialize(filesToInit); + } + }, [isInitialized, externalFiles, initialize]); + + // Если проект не открыт + if (!files) { + return ( +
+ +
+
+
+ +
+
+ No project open +
+
+ Create a new project to get started +
+ +
+
+ +
+ ); + } + + return ( +
+
+ + {activeFile ? `${activeFile.name} - ` : ""} + {files.name} + +
+
+
+ +
+
+ + +
+
+ +
+ ); +}; + +export default IDE; diff --git a/frontend/src/modules/ide/components/CodeEditor.tsx b/frontend/src/modules/ide/components/CodeEditor.tsx new file mode 100644 index 0000000..4b50be5 --- /dev/null +++ b/frontend/src/modules/ide/components/CodeEditor.tsx @@ -0,0 +1,89 @@ +import React from "react"; +import Editor from "@monaco-editor/react"; +import { FiFolder } from "react-icons/fi"; +import { getLanguage } from "../helpers/fileTree"; + +interface CodeEditorProps { + filePath: string; + content: string; + onChange: (content: string) => void; +} + +export const CodeEditor: React.FC = ({ + filePath, + content, + onChange, +}) => { + return ( +
+
+ {filePath ? ( + onChange(value || "")} + theme="vs-dark" + options={{ + minimap: { enabled: false }, + fontSize: 14, + fontFamily: "'Cascadia Code', 'Fira Code', monospace", + tabSize: 4, + wordWrap: "on", + lineNumbers: "on", + automaticLayout: true, + renderWhitespace: "selection", + smoothScrolling: true, + }} + /> + ) : ( +
+
+
+ +
+
+ Welcome to Web VS Code +
+
+ Right-click on a folder to create files +
+
+ Or right-click anywhere in the explorer +
+
+
+ )} +
+
+ ); +}; diff --git a/frontend/src/modules/ide/components/ContextMenu.tsx b/frontend/src/modules/ide/components/ContextMenu.tsx new file mode 100644 index 0000000..d07cb43 --- /dev/null +++ b/frontend/src/modules/ide/components/ContextMenu.tsx @@ -0,0 +1,99 @@ +import React, { useEffect } from "react"; +import { FiFile, FiFolder, FiEdit3, FiTrash2 } from "react-icons/fi"; + +const MenuItem: React.FC<{ + onClick: () => void; + danger?: boolean; + children: React.ReactNode; +}> = ({ onClick, danger, children }) => ( +
{ + e.currentTarget.style.backgroundColor = "#2a2d2e"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + {children} +
+); + +interface ContextMenuProps { + x: number; + y: number; + onClose: () => void; + onNewFile: () => void; + onNewFolder: () => void; + onRename: () => void; + onDelete: () => void; + hasNode: boolean; +} + +export const ContextMenu: React.FC = ({ + x, + y, + onClose, + onNewFile, + onNewFolder, + onRename, + onDelete, + hasNode, +}) => { + useEffect(() => { + const handleClick = () => onClose(); + document.addEventListener("click", handleClick); + return () => document.removeEventListener("click", handleClick); + }, [onClose]); + + return ( +
+ + New File + + + New Folder + + {hasNode && ( + <> +
+ + Rename + + + Delete + + + )} +
+ ); +}; diff --git a/frontend/src/modules/ide/components/FileExplorer.tsx b/frontend/src/modules/ide/components/FileExplorer.tsx new file mode 100644 index 0000000..38f537d --- /dev/null +++ b/frontend/src/modules/ide/components/FileExplorer.tsx @@ -0,0 +1,318 @@ +import React, { useEffect, useState } from "react"; +import { FiSearch, FiFile, FiFolder, FiMinus } from "react-icons/fi"; +import { GoKebabHorizontal } from "react-icons/go"; +import { MdClose, MdAdd } from "react-icons/md"; +import { FileTreeItem } from "./FileTreeItem"; +import { ContextMenu } from "./ContextMenu"; +import { InputDialog } from "./InputDialog"; +import { filterTree, collectPathsToExpand } from "../helpers/fileTree"; +import { useIDEStore } from "../store/useIDEStore"; +import type { FileNode } from "../types"; + +interface FileExplorerProps { + files: FileNode; + onDeleteRoot: () => void; +} + +export const FileExplorer: React.FC = ({ + files, + onDeleteRoot, +}) => { + const store = useIDEStore(); + const [showSearch, setShowSearch] = useState(false); + + const handleEmptyContextMenu = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + store.setContextMenu({ x: e.clientX, y: e.clientY, node: null }); + }; + + const handleNodeContextMenu = (e: React.MouseEvent, node: FileNode) => { + e.preventDefault(); + e.stopPropagation(); + store.setContextMenu({ x: e.clientX, y: e.clientY, node }); + }; + + const filteredFiles = store.searchQuery + ? filterTree(files, store.searchQuery) + : files; + + useEffect(() => { + if (store.searchQuery && files) { + const pathsToExpand = collectPathsToExpand(files, store.searchQuery); + if (pathsToExpand.size > 0) { + store.autoExpandPaths(pathsToExpand); + } + } + }, [store.searchQuery, files, store.autoExpandPaths]); + + return ( +
+
+ + EXPLORER + +
+ + + +
+
+ +
+ + + {files.name} + +
+ + {showSearch && ( +
+
+ + store.setSearchQuery(e.target.value)} + placeholder="Search..." + autoFocus + style={{ + flex: 1, + padding: "5px 6px", + backgroundColor: "transparent", + border: "none", + color: "#cccccc", + fontSize: "12px", + outline: "none", + }} + /> + {store.searchQuery && ( + + )} +
+
+ )} + +
+ {filteredFiles ? ( + + ) : ( +
+ No results found +
+ )} +
+ + {store.contextMenu && ( + store.setContextMenu(null)} + onNewFile={() => { + store.setDialog({ + type: "newFile", + node: store.contextMenu?.node || null, + }); + store.setContextMenu(null); + }} + onNewFolder={() => { + store.setDialog({ + type: "newFolder", + node: store.contextMenu?.node || null, + }); + store.setContextMenu(null); + }} + onRename={() => { + store.setDialog({ + type: "rename", + node: store.contextMenu?.node || null, + }); + store.setContextMenu(null); + }} + onDelete={() => { + if (store.contextMenu?.node) { + store.handleDeleteNode(store.contextMenu.node); + } + store.setContextMenu(null); + }} + hasNode={!!store.contextMenu.node} + /> + )} + + {store.dialog && ( + store.setDialog(null)} + /> + )} +
+ ); +}; diff --git a/frontend/src/modules/ide/components/FileTreeItem.tsx b/frontend/src/modules/ide/components/FileTreeItem.tsx new file mode 100644 index 0000000..05c7039 --- /dev/null +++ b/frontend/src/modules/ide/components/FileTreeItem.tsx @@ -0,0 +1,169 @@ +import React, { useState } from "react"; +import { FiChevronRight, FiChevronDown, FiTrash2 } from "react-icons/fi"; +import { GoFile } from "react-icons/go"; +import type { FileNode } from "../types"; + +interface FileTreeItemProps { + node: FileNode; + level: number; + onFileSelect: (node: FileNode) => void; + selectedFile: string | null; + onContextMenu: (e: React.MouseEvent, node: FileNode) => void; + expandedFolders: Set; + onToggleFolder: (path: string) => void; + onDelete: (node: FileNode) => void; + isRoot?: boolean; + searchQuery?: string; +} + +export const FileTreeItem: React.FC = ({ + node, + level, + onFileSelect, + selectedFile, + onContextMenu, + expandedFolders, + onToggleFolder, + onDelete, + isRoot, + searchQuery, +}) => { + const isFolder = node.type === "folder"; + const isSelected = selectedFile === node.path && !isFolder; + const isExpanded = expandedFolders.has(node.path || node.name); + const [hovered, setHovered] = useState(false); + + const handleClick = () => { + if (isFolder) { + onToggleFolder(node.path || node.name); + } else { + onFileSelect(node); + } + }; + + const handleDelete = (e: React.MouseEvent) => { + e.stopPropagation(); + onDelete(node); + }; + + const highlightText = (text: string, query: string) => { + if (!query) return text; + const idx = text.toLowerCase().indexOf(query.toLowerCase()); + if (idx === -1) return text; + return ( + <> + {text.slice(0, idx)} + + {text.slice(idx, idx + query.length)} + + {text.slice(idx + query.length)} + + ); + }; + + return ( +
+
onContextMenu(e, node)} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + style={{ + paddingLeft: isRoot ? "8px" : `${level * 16 + 8}px`, + paddingTop: "4px", + paddingBottom: "4px", + cursor: "pointer", + display: "flex", + alignItems: "center", + gap: "6px", + backgroundColor: isSelected ? "#094771" : "transparent", + color: isSelected ? "#fff" : "#cccccc", + fontSize: "13px", + transition: "background-color 0.1s", + userSelect: "none", + minHeight: "28px", + }} + > + + {isFolder ? ( + isExpanded ? ( + + ) : ( + + ) + ) : ( + + )} + + + {searchQuery ? highlightText(node.name, searchQuery) : node.name} + + {hovered && !isRoot && ( + + )} +
+ {isFolder && isExpanded && node.children && ( +
+ {node.children.map((child, idx) => ( + + ))} +
+ )} +
+ ); +}; diff --git a/frontend/src/modules/ide/components/InputDialog.tsx b/frontend/src/modules/ide/components/InputDialog.tsx new file mode 100644 index 0000000..38270e9 --- /dev/null +++ b/frontend/src/modules/ide/components/InputDialog.tsx @@ -0,0 +1,119 @@ +import React, { useState, useRef, useEffect } from "react"; + +interface InputDialogProps { + title: string; + initialValue?: string; + onConfirm: (value: string) => void; + onCancel: () => void; +} + +export const InputDialog: React.FC = ({ + title, + initialValue = "", + onConfirm, + onCancel, +}) => { + const [value, setValue] = useState(initialValue); + const inputRef = useRef(null); + + useEffect(() => { + inputRef.current?.focus(); + inputRef.current?.select(); + }, []); + + return ( +
+
e.stopPropagation()} + > +

+ {title} +

+

+ Enter a new name +

+ setValue(e.target.value)} + onKeyDown={(e) => + e.key === "Enter" && value.trim() && onConfirm(value.trim()) + } + style={{ + width: "100%", + padding: "10px", + backgroundColor: "#3c3c3c", + border: "1px solid #3e3e42", + borderRadius: "6px", + color: "#ccc", + fontSize: "14px", + marginBottom: "20px", + outline: "none", + }} + /> +
+ + +
+
+
+ ); +}; diff --git a/frontend/src/modules/ide/components/StatusBar.tsx b/frontend/src/modules/ide/components/StatusBar.tsx new file mode 100644 index 0000000..257cd45 --- /dev/null +++ b/frontend/src/modules/ide/components/StatusBar.tsx @@ -0,0 +1,44 @@ +import React from "react"; +import { FiGitBranch, FiCheckCircle, FiAlertCircle } from "react-icons/fi"; +import type { FileNode } from "../types"; + +interface StatusBarProps { + activeFile: FileNode | null; +} + +export const StatusBar: React.FC = ({ activeFile }) => { + return ( +
+
+ + main + + + 0 0 + +
+
+ {activeFile && ( + + Ln 1, Col 1 | Spaces: 4 | UTF-8 |{" "} + {activeFile.path?.split(".").pop()?.toUpperCase() || "TXT"} + + )} + Web VS Code +
+
+ ); +}; diff --git a/frontend/src/modules/ide/components/TabBar.tsx b/frontend/src/modules/ide/components/TabBar.tsx new file mode 100644 index 0000000..797332e --- /dev/null +++ b/frontend/src/modules/ide/components/TabBar.tsx @@ -0,0 +1,196 @@ +import React, { useState } from "react"; +import { GoFile } from "react-icons/go"; +import { MdClose } from "react-icons/md"; +import type { FileNode } from "../types"; + +interface TabBarProps { + openFiles: FileNode[]; + activeFile: FileNode | null; + onSelectFile: (file: FileNode) => void; + onCloseFile: (file: FileNode) => void; + onCloseAll: () => void; + onCloseOthers: (file: FileNode) => void; +} + +export const TabBar: React.FC = ({ + openFiles, + activeFile, + onSelectFile, + onCloseFile, + onCloseAll, + onCloseOthers, +}) => { + const [showContextMenu, setShowContextMenu] = useState<{ + x: number; + y: number; + file: FileNode; + } | null>(null); + + const handleContextMenu = (e: React.MouseEvent, file: FileNode) => { + e.preventDefault(); + setShowContextMenu({ x: e.clientX, y: e.clientY, file }); + }; + + return ( + <> +
+
+ +
+ {openFiles.map((file) => ( +
onSelectFile(file)} + onContextMenu={(e) => handleContextMenu(e, file)} + style={{ + display: "flex", + alignItems: "center", + padding: "8px 16px", + backgroundColor: + activeFile?.path === file.path ? "#1e1e1e" : "#2d2d30", + color: activeFile?.path === file.path ? "#fff" : "#cccccc", + borderRight: "1px solid #3e3e42", + cursor: "pointer", + fontSize: "13px", + gap: "10px", + whiteSpace: "nowrap", + transition: "all 0.1s", + borderTop: + activeFile?.path === file.path + ? "2px solid #0e639c" + : "2px solid transparent", + }} + > + + {file.name} + +
+ ))} +
+ {showContextMenu && ( +
+
{ + onCloseOthers(showContextMenu.file); + setShowContextMenu(null); + }} + style={{ + padding: "8px 16px", + cursor: "pointer", + color: "#cccccc", + fontSize: "13px", + }} + onMouseEnter={(e) => { + e.currentTarget.style.backgroundColor = "#2a2d2e"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + Close Others +
+
{ + onCloseAll(); + setShowContextMenu(null); + }} + style={{ + padding: "8px 16px", + cursor: "pointer", + color: "#cccccc", + fontSize: "13px", + }} + onMouseEnter={(e) => { + e.currentTarget.style.backgroundColor = "#2a2d2e"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + Close All +
+
+ )} + + ); +}; diff --git a/frontend/src/modules/ide/components/TitleBar.tsx b/frontend/src/modules/ide/components/TitleBar.tsx new file mode 100644 index 0000000..99fae56 --- /dev/null +++ b/frontend/src/modules/ide/components/TitleBar.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import { FiGitBranch, FiCheckCircle } from "react-icons/fi"; + +export const TitleBar: React.FC = () => { + return ( +
+
+
+
+
+
+
+ + Web VS Code + +
+
+ + main + +
+
+ ); +}; diff --git a/frontend/src/modules/ide/components/index.ts b/frontend/src/modules/ide/components/index.ts new file mode 100644 index 0000000..95f10f9 --- /dev/null +++ b/frontend/src/modules/ide/components/index.ts @@ -0,0 +1,8 @@ +export { ContextMenu } from "./ContextMenu"; +export { InputDialog } from "./InputDialog"; +export { FileTreeItem } from "./FileTreeItem"; +export { FileExplorer } from "./FileExplorer"; +export { TabBar } from "./TabBar"; +export { CodeEditor } from "./CodeEditor"; +export { TitleBar } from "./TitleBar"; +export { StatusBar } from "./StatusBar"; diff --git a/frontend/src/modules/ide/helpers/fileTree.ts b/frontend/src/modules/ide/helpers/fileTree.ts new file mode 100644 index 0000000..22f60be --- /dev/null +++ b/frontend/src/modules/ide/helpers/fileTree.ts @@ -0,0 +1,174 @@ +import type { FileNode } from "../types"; + +export const addPaths = (node: FileNode, parentPath: string = ""): FileNode => { + const currentPath = parentPath ? `${parentPath}/${node.name}` : node.name; + const newNode = { ...node, path: currentPath }; + if (newNode.children) { + newNode.children = newNode.children.map((child) => + addPaths(child, currentPath), + ); + } + return newNode; +}; + +export const getAllFolderPaths = (node: FileNode): string[] => { + let paths: string[] = []; + if (node.type === "folder") { + paths.push(node.path || node.name); + if (node.children) { + node.children.forEach((child) => { + paths = [...paths, ...getAllFolderPaths(child)]; + }); + } + } + return paths; +}; + +export const findNode = (node: FileNode, path: string): FileNode | null => { + if (node.path === path) return node; + if (node.children) { + for (const child of node.children) { + const found = findNode(child, path); + if (found) return found; + } + } + return null; +}; + +export const deleteNode = (node: FileNode, path: string): FileNode | null => { + if (node.path === path) return null; + + if (node.children) { + const filtered = node.children.filter((child) => child.path !== path); + const mapped = filtered + .map((child) => deleteNode(child, path)) + .filter((child): child is FileNode => child !== null); + return { ...node, children: mapped }; + } + return node; +}; + +export const addNode = ( + node: FileNode, + parentPath: string, + newNode: FileNode, +): FileNode => { + if (node.path === parentPath) { + const newPath = addPaths(newNode, node.path); + return { ...node, children: [...(node.children || []), newPath] }; + } + if (node.children) { + return { + ...node, + children: node.children.map((child) => + addNode(child, parentPath, newNode), + ), + }; + } + return node; +}; + +export const renameNode = ( + node: FileNode, + oldPath: string, + newName: string, +): FileNode | null => { + if (node.path === oldPath) { + const pathParts = node.path?.split("/") || []; + pathParts[pathParts.length - 1] = newName; + const newPath = pathParts.join("/"); + const renamedNode = { ...node, name: newName, path: newPath }; + + if (renamedNode.children) { + renamedNode.children = renamedNode.children.map((child) => { + const oldChildPath = child.path || ""; + const newChildPath = oldChildPath.replace(oldPath, newPath); + return ( + renameNode( + child, + oldChildPath, + newChildPath.split("/").pop() || "", + ) || child + ); + }); + } + return renamedNode; + } + + if (node.children) { + return { + ...node, + children: node.children.map( + (child) => renameNode(child, oldPath, newName) || child, + ), + }; + } + return node; +}; + +export const filterTree = (node: FileNode, query: string): FileNode | null => { + if (!query) return node; + const lowerQuery = query.toLowerCase(); + + if (node.type === "file") { + if (node.name.toLowerCase().includes(lowerQuery)) return node; + return null; + } + + if (node.children) { + const filteredChildren = node.children + .map((child) => filterTree(child, query)) + .filter((child): child is FileNode => child !== null); + + if (filteredChildren.length > 0) { + return { ...node, children: filteredChildren }; + } + } + + if (node.name.toLowerCase().includes(lowerQuery)) return node; + return null; +}; + +export const collectPathsToExpand = ( + node: FileNode, + query: string, +): Set => { + const paths = new Set(); + if (!query) return paths; + + const lowerQuery = query.toLowerCase(); + + const search = (n: FileNode, currentPath: string) => { + if (n.name.toLowerCase().includes(lowerQuery)) { + const pathParts = currentPath.split("/"); + for (let i = 1; i < pathParts.length; i++) { + paths.add(pathParts.slice(0, i).join("/")); + } + } + if (n.children) { + n.children.forEach((child) => { + const childPath = child.path || `${currentPath}/${child.name}`; + search(child, childPath); + }); + } + }; + + search(node, node.path || node.name); + return paths; +}; + +export const getLanguage = (path: string) => { + const ext = path.split(".").pop(); + const map: Record = { + py: "python", + js: "javascript", + ts: "typescript", + jsx: "javascript", + tsx: "typescript", + json: "json", + md: "markdown", + css: "css", + html: "html", + }; + return map[ext || ""] || "plaintext"; +}; diff --git a/frontend/src/modules/ide/index.ts b/frontend/src/modules/ide/index.ts new file mode 100644 index 0000000..caeba36 --- /dev/null +++ b/frontend/src/modules/ide/index.ts @@ -0,0 +1,3 @@ +export { IDE } from "./IDE"; +export { useIDEStore, initialFiles } from "./store/useIDEStore"; +export type { FileNode } from "./types"; diff --git a/frontend/src/modules/ide/store/useIDEStore.ts b/frontend/src/modules/ide/store/useIDEStore.ts new file mode 100644 index 0000000..39fe5b9 --- /dev/null +++ b/frontend/src/modules/ide/store/useIDEStore.ts @@ -0,0 +1,385 @@ +import { create } from "zustand"; +import type { FileNode } from "../types"; +import { + addPaths, + getAllFolderPaths, + findNode, + deleteNode, + addNode, + renameNode, +} from "../helpers/fileTree"; + +export const initialFiles: FileNode = { + name: "my-project", + type: "folder", + children: [ + { + name: "src", + type: "folder", + children: [ + { + name: "main.py", + type: "file", + content: + 'print("Hello, World!")\n\ndef main():\n print("Welcome!")\n\nif __name__ == "__main__":\n main()', + }, + { + name: "utils.py", + type: "file", + content: "def helper():\n return 42", + }, + ], + }, + { + name: "README.md", + type: "file", + content: "# My Project\n\nWelcome!", + }, + ], +}; + +interface IDEState { + // Файловая система + files: FileNode | null; + openFiles: FileNode[]; + activeFile: FileNode | null; + expandedFolders: Set; + searchQuery: string; + showSearch: boolean; + isInitialized: boolean; + + // Диалоги и контекстные меню + contextMenu: { x: number; y: number; node: FileNode | null } | null; + dialog: { + type: "newFile" | "newFolder" | "rename"; + node: FileNode | null; + } | null; + tabContextMenu: { x: number; y: number; file: FileNode } | null; + + // Действия с файлами + selectFile: (node: FileNode) => void; + updateFileContent: (content: string) => void; + closeFile: (file: FileNode) => void; + closeAllFiles: () => void; + closeOtherFiles: (file: FileNode) => void; + + // Действия с деревом + refreshFiles: (newFiles: FileNode | null, newFile?: FileNode) => void; + toggleFolder: (path: string) => void; + expandAllFolders: () => void; + collapseAllFolders: () => void; + autoExpandPaths: (paths: Set) => void; + deleteRoot: () => void; + createNewProject: () => void; + + // Поиск + setSearchQuery: (query: string) => void; + toggleSearch: () => void; + + // Контекстные меню и диалоги + setContextMenu: ( + menu: { x: number; y: number; node: FileNode | null } | null, + ) => void; + setDialog: ( + dialog: { + type: "newFile" | "newFolder" | "rename"; + node: FileNode | null; + } | null, + ) => void; + setTabContextMenu: ( + menu: { x: number; y: number; file: FileNode } | null, + ) => void; + + // Инициализация + initialize: (initialFiles: FileNode) => void; + + // Диалог подтверждения + handleDialogConfirm: (value: string) => void; + handleDeleteNode: (node: FileNode) => void; +} + +export const useIDEStore = create((set, get) => ({ + // Начальное состояние + files: null, + openFiles: [], + activeFile: null, + expandedFolders: new Set(), + searchQuery: "", + showSearch: false, + isInitialized: false, + + contextMenu: null, + dialog: null, + tabContextMenu: null, + + // Инициализация + initialize: (initialFiles: FileNode) => { + const filesWithPaths = addPaths(initialFiles); + set({ + files: filesWithPaths, + expandedFolders: new Set([filesWithPaths.path || filesWithPaths.name]), + isInitialized: true, + }); + }, + + // Выбор файла + selectFile: (node: FileNode) => { + if (node.type === "file") { + const { openFiles } = get(); + if (!openFiles.find((f) => f.path === node.path)) { + set((state) => ({ openFiles: [...state.openFiles, node] })); + } + set({ activeFile: node }); + } + }, + + // Обновление содержимого файла + updateFileContent: (content: string) => { + const { activeFile } = get(); + if (activeFile) { + const updatedFile = { ...activeFile, content }; + set({ activeFile: updatedFile }); + set((state) => ({ + openFiles: state.openFiles.map((f) => + f.path === activeFile.path ? updatedFile : f, + ), + })); + } + }, + + // Закрытие файла + closeFile: (file: FileNode) => { + const { openFiles, activeFile } = get(); + const newOpenFiles = openFiles.filter((f) => f.path !== file.path); + set({ openFiles: newOpenFiles }); + + if (activeFile?.path === file.path) { + set({ activeFile: newOpenFiles[newOpenFiles.length - 1] || null }); + } + }, + + // Закрыть все файлы + closeAllFiles: () => { + set({ openFiles: [], activeFile: null }); + }, + + // Закрыть другие файлы + closeOtherFiles: (file: FileNode) => { + set({ openFiles: [file], activeFile: file }); + }, + + // Обновить файловую систему + refreshFiles: (newFiles: FileNode | null, newFile?: FileNode) => { + const { openFiles, activeFile, selectFile } = get(); + + set({ files: newFiles }); + + if (!newFiles) { + set({ openFiles: [], activeFile: null }); + return; + } + + const updatedOpenFiles = openFiles + .map((f) => { + const found = findNode(newFiles, f.path || ""); + return found && found.type === "file" ? found : null; + }) + .filter((f): f is FileNode => f !== null); + + set({ openFiles: updatedOpenFiles }); + + if (newFile) { + selectFile(newFile); + } else if (activeFile) { + const stillExists = findNode(newFiles, activeFile.path || ""); + if (!stillExists) { + set({ + activeFile: updatedOpenFiles[updatedOpenFiles.length - 1] || null, + }); + } else if (stillExists.type === "file") { + set({ activeFile: stillExists }); + } + } + }, + + // Переключить папку + toggleFolder: (path: string) => { + set((state) => { + const newSet = new Set(state.expandedFolders); + if (newSet.has(path)) { + newSet.delete(path); + } else { + newSet.add(path); + } + return { expandedFolders: newSet }; + }); + }, + + // Раскрыть все папки + expandAllFolders: () => { + const { files } = get(); + if (files) { + set({ expandedFolders: new Set(getAllFolderPaths(files)) }); + } + }, + + // Свернуть все папки + collapseAllFolders: () => { + set({ expandedFolders: new Set() }); + }, + + // Автоматически раскрыть пути + autoExpandPaths: (paths: Set) => { + set((state) => ({ + expandedFolders: new Set([...state.expandedFolders, ...paths]), + })); + }, + + // Удалить корень + deleteRoot: () => { + set({ + files: null, + openFiles: [], + activeFile: null, + expandedFolders: new Set(), + }); + }, + + // Создать новый проект + createNewProject: () => { + const newProject = addPaths(initialFiles); + set({ + files: newProject, + expandedFolders: new Set([newProject.path || newProject.name]), + searchQuery: "", + }); + }, + + // Поиск + setSearchQuery: (query: string) => { + set({ searchQuery: query }); + }, + + toggleSearch: () => { + set((state) => ({ showSearch: !state.showSearch })); + }, + + // Контекстные меню и диалоги + setContextMenu: (menu) => set({ contextMenu: menu }), + setDialog: (dialog) => set({ dialog: dialog }), + setTabContextMenu: (menu) => set({ tabContextMenu: menu }), + + // Подтверждение диалога + handleDialogConfirm: (value: string) => { + const { dialog, files, refreshFiles, toggleFolder, autoExpandPaths } = + get(); + if (!dialog) return; + + if (dialog.type === "rename" && dialog.node) { + const parentPath = + dialog.node.path?.split("/").slice(0, -1).join("/") || ""; + const parentNode = parentPath ? findNode(files!, parentPath) : files; + if ( + parentNode?.children?.some( + (c) => + c.name.toLowerCase() === value.toLowerCase() && + c.path !== dialog.node?.path, + ) + ) { + alert(`"${value}" already exists.`); + return; + } + const newFiles = renameNode( + files!, + dialog.node.path || dialog.node.name, + value, + ); + if (newFiles) { + refreshFiles(newFiles); + } + set({ dialog: null }); + return; + } + + let parentPath: string; + + if (!dialog.node) { + parentPath = files!.path || files!.name; + } else if (dialog.node.type === "folder") { + parentPath = dialog.node.path || dialog.node.name; + } else { + const pathParts = (dialog.node.path || dialog.node.name).split("/"); + pathParts.pop(); + parentPath = pathParts.join("/") || files!.path || files!.name; + } + + const parentNode = findNode(files!, parentPath); + if ( + parentNode?.children?.some( + (c) => c.name.toLowerCase() === value.toLowerCase(), + ) + ) { + alert(`"${value}" already exists in this folder.`); + set({ dialog: null }); + return; + } + + let newFiles: FileNode | null = null; + let createdNode: FileNode | null = null; + + if (dialog.type === "newFile") { + createdNode = { name: value, type: "file", content: "" }; + newFiles = addNode(files!, parentPath, createdNode); + } else if (dialog.type === "newFolder") { + createdNode = { name: value, type: "folder", children: [] }; + newFiles = addNode(files!, parentPath, createdNode); + } + + if (newFiles) { + const allParentPaths: string[] = []; + let current = parentPath; + while (current) { + allParentPaths.push(current); + const parts = current.split("/"); + parts.pop(); + current = parts.join("/"); + } + allParentPaths.forEach((p) => { + if (!get().expandedFolders.has(p)) { + toggleFolder(p); + } + }); + autoExpandPaths(new Set(allParentPaths)); + + if (createdNode && createdNode.type === "file") { + const findAndOpen = (node: FileNode, name: string): FileNode | null => { + if (node.name === name && node.type === "file") return node; + if (node.children) { + for (const child of node.children) { + const found = findAndOpen(child, name); + if (found) return found; + } + } + return null; + }; + const openedFile = findAndOpen(newFiles, value); + refreshFiles(newFiles, openedFile || undefined); + } else { + refreshFiles(newFiles); + } + } + set({ dialog: null }); + }, + + // Удаление узла + handleDeleteNode: (node: FileNode) => { + const { files, refreshFiles } = get(); + const isRootNode = node.path === files?.path; + if (isRootNode) { + get().deleteRoot(); + } else if (window.confirm(`Delete "${node.name}"?`)) { + const newFiles = deleteNode(files!, node.path || node.name); + if (newFiles) refreshFiles(newFiles); + } + }, +})); diff --git a/frontend/src/modules/ide/types.ts b/frontend/src/modules/ide/types.ts new file mode 100644 index 0000000..1744b5e --- /dev/null +++ b/frontend/src/modules/ide/types.ts @@ -0,0 +1,24 @@ +export interface FileNode { + name: string; + type: "file" | "folder"; + content?: string; + children?: FileNode[]; + path?: string; +} + +export interface ContextMenuState { + x: number; + y: number; + node: FileNode | null; +} + +export interface DialogState { + type: "newFile" | "newFolder" | "rename"; + node: FileNode | null; +} + +export interface TabContextMenuState { + x: number; + y: number; + file: FileNode; +} diff --git a/frontend/src/pages/ide.page.tsx b/frontend/src/pages/ide.page.tsx new file mode 100644 index 0000000..218d1ef --- /dev/null +++ b/frontend/src/pages/ide.page.tsx @@ -0,0 +1,9 @@ +import { IDE } from "../modules/ide"; + +export const IDEPage = () => { + return ( +
+ +
+ ); +}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 225e87c..24295b2 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -256,6 +256,332 @@ style-mod "^4.1.0" w3c-keyname "^2.2.4" +<<<<<<< Updated upstream +======= +"@codingame/monaco-vscode-api@^25.1.2", "@codingame/monaco-vscode-api@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-25.1.2.tgz" + integrity sha512-K04QcQA+Zb0KXucBAK/BGCT5dldiwIqdUbBQq7yuLvBLbof3cP1WSUuxasMHGYwM0MWyzIAsDtyAYMS7is8ZuA== + dependencies: + "@codingame/monaco-vscode-base-service-override" "25.1.2" + "@codingame/monaco-vscode-environment-service-override" "25.1.2" + "@codingame/monaco-vscode-extensions-service-override" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + "@codingame/monaco-vscode-host-service-override" "25.1.2" + "@codingame/monaco-vscode-layout-service-override" "25.1.2" + "@codingame/monaco-vscode-quickaccess-service-override" "25.1.2" + "@vscode/iconv-lite-umd" "0.7.1" + dompurify "3.3.1" + jschardet "3.1.4" + marked "14.0.0" + +"@codingame/monaco-vscode-base-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-base-service-override/-/monaco-vscode-base-service-override-25.1.2.tgz" + integrity sha512-OwYs6h1ATUAeMmX+Q1c8esTG7GLMqniBs+fLEr1/9b/ciY485ArKo5UvrUxVPDtRNy/7F06vRW9IUCq9iKP14w== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-bulk-edit-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-bulk-edit-service-override/-/monaco-vscode-bulk-edit-service-override-25.1.2.tgz" + integrity sha512-+EfSzjiFakCf0IIJKPZrHVGioq5N8GBsp51bXuKBR5J/B58cUaJY0Dc12PNTSpgAusAGOppUIOSBqUk4F/7IaQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-configuration-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-configuration-service-override/-/monaco-vscode-configuration-service-override-25.1.2.tgz" + integrity sha512-oeoZ3WtM42zHA1IWHrx9UGEfE+TixE+G8Bl9M9bjgFj1EROnkB5yOfELwRYPo4WOEtcK1C5nvIvWIj/hL9MaLg== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + +"@codingame/monaco-vscode-editor-api@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-editor-api/-/monaco-vscode-editor-api-25.1.2.tgz" + integrity sha512-dVXoBLRN8vyFHsLY6iYISaNetZ3ispXLut0qL+jvN0e0CEFkUv1F/3EAE7myptrJSS/N1AptrRIxATT3lwFP+Q== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-editor-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-editor-service-override/-/monaco-vscode-editor-service-override-25.1.2.tgz" + integrity sha512-EadvDCyWdgxOPmaIvbcVVDNjTUYuKdjYWwKbPbbcTs9t4z1/DjdE7mV3ZdT6aGh5m6zkEEUOi143l27Y5eRt+Q== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-environment-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-environment-service-override/-/monaco-vscode-environment-service-override-25.1.2.tgz" + integrity sha512-8GoD3lk0CN0dIMZOrZNS/i8RCaF1YSQ6nmrf+rqneOSHG9S382EnsZZD69d4+i7JnoeyttO7Kr9KH8WOhRV6OA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-extension-api@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extension-api/-/monaco-vscode-extension-api-25.1.2.tgz" + integrity sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-extensions-service-override" "25.1.2" + +"@codingame/monaco-vscode-extensions-service-override@^25.1.2", "@codingame/monaco-vscode-extensions-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extensions-service-override/-/monaco-vscode-extensions-service-override-25.1.2.tgz" + integrity sha512-rTTZW2biPxcg+JumhVf2L+38C5ptvNNxiJlwz39VfXFEh6qOHtAsIMy7vIXa0uGg5/y8DNp0SnOQJP/RKhLYZA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + +"@codingame/monaco-vscode-files-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-files-service-override/-/monaco-vscode-files-service-override-25.1.2.tgz" + integrity sha512-TenLLAFIwY7keZFF8e3beUn7OVfnNINR5Noi4PVrjeeTcy6FuNH6Jghdul2JwpRAkvyJLdFMvomE2jlT6F03jQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-host-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-host-service-override/-/monaco-vscode-host-service-override-25.1.2.tgz" + integrity sha512-lgaalpA9CUQW7i0bBwgBOK0DQNDvOo3QO3p6Rz6yVsHpgA4iMqq2d11dBDUKvuQSwIHPRu8CMHCqhQk/BQN/YA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-keybindings-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-keybindings-service-override/-/monaco-vscode-keybindings-service-override-25.1.2.tgz" + integrity sha512-cp/gGyTvCTAzCYnQm0HJykXJRB0Huz8Lvq60lj5LutgWcb8S3w6dOB2Houm8dHoeUm/jOko8SQNIP8hzWN92Zw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + +"@codingame/monaco-vscode-language-pack-cs@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-cs/-/monaco-vscode-language-pack-cs-25.1.2.tgz" + integrity sha512-v0cB2uAOCwj135aGIf0arGV+DNW32lbWh04bv8ctTxcWRt1Pr2kTQ1pjfE8ynKgxabPfAk8E25/CerKSYOmZ+A== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-de@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-de/-/monaco-vscode-language-pack-de-25.1.2.tgz" + integrity sha512-xA3WOt1w5jlAOnyx4PBwx+qV3vx8C8/zie29qjYbgJMxGKDkb0HfpuKUwywDA2uUMI2wJZS+PnNG00zPDoLIrw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-es@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-es/-/monaco-vscode-language-pack-es-25.1.2.tgz" + integrity sha512-1/upuO9lRJilZ3sRr0QLTpz55KYRaBWDe8wtPvghOFYOHyWgW8A4VhUQxa6L9SJgY1JkypUAm0U8WcMX2G4LnQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-fr@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-fr/-/monaco-vscode-language-pack-fr-25.1.2.tgz" + integrity sha512-iq+xx+tv1QIMmFD0eBhFRMF4xMAsVf/HyA1WogqBofteCWeAvRE9HUjZ5JzHz7jXBPe3dLP1LOM0r0GrJZs4fQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-it@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-it/-/monaco-vscode-language-pack-it-25.1.2.tgz" + integrity sha512-FajWCML9OR8ppLnJ0mcg+sFHEhYJl8zhb3/DHnd+pNysw8dLfetXoSWjaPnwPPpwiQgkNN1UsToZHOU9czVifQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-ja@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ja/-/monaco-vscode-language-pack-ja-25.1.2.tgz" + integrity sha512-NwKh0BnPgUrJkxsm0X6vY4ftnd9DjxkcnQqK+bohta6UOzm09J1EjZ6QD42fjWngxrp/xiegtrYQ9NA2q6VpoA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-ko@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ko/-/monaco-vscode-language-pack-ko-25.1.2.tgz" + integrity sha512-fvaisgfcg8YaAwnyPcGmQDLwkwqzamLQUyx9HmnwDpXw0YANzd058Kwn6bz+Vfn9MjwuMNT0nllD0qQMnpdyew== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-pl@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pl/-/monaco-vscode-language-pack-pl-25.1.2.tgz" + integrity sha512-9hDRyzFJkDia5rO9QE262JgxwP/cnalFisLFo7FQcw57ZhqzqXIdQIuwcKaHuAgzeQ6W2+A3KOLfTr3m7VZrXw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-pt-br@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pt-br/-/monaco-vscode-language-pack-pt-br-25.1.2.tgz" + integrity sha512-7fFnqOTAJGb5RuJ4uwh9sh0JmXALuHPGOl7iL9rZkcgIuVP5y6wVDUDXq5qjiRTNSFDs7Bzh463Ir5m5D6mJbA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-qps-ploc@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-qps-ploc/-/monaco-vscode-language-pack-qps-ploc-25.1.2.tgz" + integrity sha512-IFjoqrSuPtIFWb+KlPT6PFWKszzNX+TCD9drgCV6AigvBO/xfGL3QwHB68l/DLbmDbohOz4Xdkutv20wuENAeA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-ru@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ru/-/monaco-vscode-language-pack-ru-25.1.2.tgz" + integrity sha512-0uDAeXO+GllKUPhJzP893rlDhlFV1IwCu/515rBdcyegt48iGm/xAgj26V90hNz8hmB6EuM/7d8MFeklbiIpYA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-tr@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-tr/-/monaco-vscode-language-pack-tr-25.1.2.tgz" + integrity sha512-MJhHxDyJEiuVLQ9+jb8MnnN9lsbJOjJjMswVCeJ7v/Q/msAhq25QYUfn0DbOIzESJE1f7crffRb5e38XP8sYWA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-zh-hans@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hans/-/monaco-vscode-language-pack-zh-hans-25.1.2.tgz" + integrity sha512-c7MMrhnSLb59NxpAa8nVy9aIbxy4gVYrCpDMq8W380LOaXTYb7nueTrw8QJ5QbJBNi2P2KZoGkn2BlONuBtJJg== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-language-pack-zh-hant@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hant/-/monaco-vscode-language-pack-zh-hant-25.1.2.tgz" + integrity sha512-ARedFTM6JCluoPLJqkBcTJaQFdJNcN86OX6B8/NMApIPrnSIAfanMndpyilt8XjzUG6IH22cypR+DAlEjf48cA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-languages-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-25.1.2.tgz" + integrity sha512-ipuS1V3NgXDkNrj0vBcgMBFnqo+19HVsZjjFGfPFH3x0uptP9aiWWK42wtDK3Qbu4teSjHL7WnSLrmw94rplWw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + +"@codingame/monaco-vscode-layout-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-25.1.2.tgz" + integrity sha512-SxBGcMK3RgkGtUn7ZDl7dCoyNW0CWFQ/bfSRYUY06A0IA4JNS5jq1lhof57d0WXewm+5l8w1Spr/vMsfx1c9ig== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-localization-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-localization-service-override/-/monaco-vscode-localization-service-override-25.1.2.tgz" + integrity sha512-QLj62A8XDOIQW3KjsZlNxs+sfsNNHYxWMjQMwZu/y2Vw3IIHGly2Lpn4t4SFbeaBHJQJy4i5s7NpzlbF9MbEzQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-log-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-log-service-override/-/monaco-vscode-log-service-override-25.1.2.tgz" + integrity sha512-OoileAUtPAJ0j3RW31DFSxtOipy0EcFq+iIXEdGvoRlsQPZJ3o9ayjf1JvCXpxUjJ3QkmvQVhXsWNUFREjEFLg== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-environment-service-override" "25.1.2" + +"@codingame/monaco-vscode-model-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-25.1.2.tgz" + integrity sha512-MGz/eV1CxibLvnl6WzK6idUHJCXJOVepJvKM6Trkv5050vRe+f/o1TjCiG8PaznAypYqZvnwkTG0B7/OTizCpQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-monarch-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-monarch-service-override/-/monaco-vscode-monarch-service-override-25.1.2.tgz" + integrity sha512-akyNHOJQRS7YHyk6kf0Encnkt+shlR+bIB84UJRUHFgSeF8s5gkDkQuFJph0YeUDWJWat+yBLUSZx2nHomdbHQ== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-quickaccess-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-25.1.2.tgz" + integrity sha512-7IIrXnwHiF3w9d9p9kspEUz/LCibMLUztmRpGdZQfFtWBJw043q7rk8V1O42KdXr1hVg9IR5vfffwjy9nbiiUg== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-textmate-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-textmate-service-override/-/monaco-vscode-textmate-service-override-25.1.2.tgz" + integrity sha512-AL0FtSQBW+1vtoXYQvUqB2hfWojpK73Kq/n6KuNXxjLF/XBJ5FpeeZDfrBfwhWPPoHuBTsaFUCQy4L8xQgbVlA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + +"@codingame/monaco-vscode-theme-defaults-default-extension@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-theme-defaults-default-extension/-/monaco-vscode-theme-defaults-default-extension-25.1.2.tgz" + integrity sha512-0vTMFiC89YSDSmjFckuQBUKwRuFNtsILNO3k0PBiSLN/MW+VDItjJpiVLXC42+rUWlGgY2lYxOneGVa5slCV1w== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-theme-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-theme-service-override/-/monaco-vscode-theme-service-override-25.1.2.tgz" + integrity sha512-hsTwl6YYTiheFuQMmCmiEGLIdIdgYaf8Z85XWyxe6YgPtDaYGnp0fGSOXKA9/bf0JtuynzoLKtUUfDupK/A7Tw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-files-service-override" "25.1.2" + +"@codingame/monaco-vscode-view-banner-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-banner-service-override/-/monaco-vscode-view-banner-service-override-25.1.2.tgz" + integrity sha512-zhujHd1PQ6rRXsC2OQGrx/282G2v3lpPFl9heDFGKzpdj5119SgcW+B9p/MwJ1qF3LJpuRRgefNiQtqC/KT1eA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-view-common-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-common-service-override/-/monaco-vscode-view-common-service-override-25.1.2.tgz" + integrity sha512-4Po/YaHUvVf4VmhVCZmM2lc/flOptiWSM140bIRNpMcfH0VwihYg15CcDeu1Oc+6DaauzsG3u59GtEvlMmJ9Zw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-bulk-edit-service-override" "25.1.2" + +"@codingame/monaco-vscode-view-status-bar-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-status-bar-service-override/-/monaco-vscode-view-status-bar-service-override-25.1.2.tgz" + integrity sha512-Jp9ytLaWZ6evabTPtG3Mu3dFx+7WTIPz69BsGpl9PnU0kiSWUqQhPSob0Jz7E2qmMj0ZcNv2Wqvm6bMBu5OyrA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-view-title-bar-service-override@25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-title-bar-service-override/-/monaco-vscode-view-title-bar-service-override-25.1.2.tgz" + integrity sha512-NVYtTAFR35NV/Fx7tSlbASicvpAjK5A14fmxF7/LJJN8ZmzhA/P3Y+UzhqOQl6/VcPV4pAMU0Z7Sicgwbn37dw== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + +"@codingame/monaco-vscode-views-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-views-service-override/-/monaco-vscode-views-service-override-25.1.2.tgz" + integrity sha512-LfzlztsvobdP5L5EvJ/rqSEgy5fEVmrkMqRteuhEtNGd4hnmdBoX8W7BNMBPff6d4NfCK74pGHJF57RyT4Iixg== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-keybindings-service-override" "25.1.2" + "@codingame/monaco-vscode-layout-service-override" "25.1.2" + "@codingame/monaco-vscode-quickaccess-service-override" "25.1.2" + "@codingame/monaco-vscode-view-common-service-override" "25.1.2" + +"@codingame/monaco-vscode-workbench-service-override@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-workbench-service-override/-/monaco-vscode-workbench-service-override-25.1.2.tgz" + integrity sha512-2LMHr+na03FhOAaXpIGmamq9hf7e4wt2kULn8NqNZRd3i+0v1tx/TSSjGhsA5EkrNrFD7CMSoXayBq8tgpCq/A== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-keybindings-service-override" "25.1.2" + "@codingame/monaco-vscode-quickaccess-service-override" "25.1.2" + "@codingame/monaco-vscode-view-banner-service-override" "25.1.2" + "@codingame/monaco-vscode-view-common-service-override" "25.1.2" + "@codingame/monaco-vscode-view-status-bar-service-override" "25.1.2" + "@codingame/monaco-vscode-view-title-bar-service-override" "25.1.2" + +>>>>>>> Stashed changes "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" @@ -405,11 +731,158 @@ resolved "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz" integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== +<<<<<<< Updated upstream +======= +"@monaco-editor/loader@^1.5.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz" + integrity sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.6.0", "@monaco-editor/react@^4.7.0": + version "4.7.0" + resolved "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz" + integrity sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA== + dependencies: + "@monaco-editor/loader" "^1.5.0" + +>>>>>>> Stashed changes "@oxc-project/types@=0.122.0": version "0.122.0" resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz" integrity sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA== +"@radix-ui/primitive@1.1.3": + version "1.1.3" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz" + integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== + +"@radix-ui/react-collection@1.1.7": + version "1.1.7" + resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz" + integrity sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" + +"@radix-ui/react-compose-refs@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz" + integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== + +"@radix-ui/react-context@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz" + integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== + +"@radix-ui/react-dismissable-layer@1.1.11": + version "1.1.11" + resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz" + integrity sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-escape-keydown" "1.1.1" + +"@radix-ui/react-portal@1.1.9": + version "1.1.9" + resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz" + integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-presence@1.1.5": + version "1.1.5" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz" + integrity sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-primitive@2.1.3": + version "2.1.3" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz" + integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== + dependencies: + "@radix-ui/react-slot" "1.2.3" + +"@radix-ui/react-slot@^1.1.0": + version "1.2.4" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz" + integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + +"@radix-ui/react-slot@1.2.3": + version "1.2.3" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz" + integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + +"@radix-ui/react-toast@^1.2.1": + version "1.2.15" + resolved "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz" + integrity sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.11" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-presence" "1.1.5" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-visually-hidden" "1.2.3" + +"@radix-ui/react-use-callback-ref@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz" + integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== + +"@radix-ui/react-use-controllable-state@1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz" + integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== + dependencies: + "@radix-ui/react-use-effect-event" "0.0.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-effect-event@0.0.2": + version "0.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz" + integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-escape-keydown@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz" + integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-use-layout-effect@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz" + integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== + +"@radix-ui/react-visually-hidden@1.2.3": + version "1.2.3" + resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz" + integrity sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + "@reduxjs/toolkit@^1.9.0 || 2.x.x": version "2.11.2" resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz" @@ -492,6 +965,11 @@ "@tailwindcss/oxide" "4.2.2" tailwindcss "4.2.2" +"@tweenjs/tween.js@18 - 25": + version "25.0.0" + resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz" + integrity sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A== + "@tybys/wasm-util@^0.10.1": version "0.10.1" resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz" @@ -567,7 +1045,7 @@ dependencies: undici-types "~7.16.0" -"@types/react-dom@^19.2.3": +"@types/react-dom@*", "@types/react-dom@^19.2.3": version "19.2.3" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== @@ -584,6 +1062,11 @@ dependencies: csstype "^3.2.2" +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/use-sync-external-store@^0.0.6": version "0.0.6" resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz" @@ -717,6 +1200,11 @@ dependencies: "@rolldown/pluginutils" "1.0.0-rc.7" +"@vscode/iconv-lite-umd@0.7.1": + version "0.7.1" + resolved "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.1.tgz" + integrity sha512-tK6k0DXFHW7q5+GGuGZO+phpAqpxO4WXl+BLc/8/uOk3RsM2ssAL3CQUQDb1TGfwltjsauhN6S4ghYZzs4sPFw== + accepts@~1.3.5: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" @@ -725,6 +1213,11 @@ accepts@~1.3.5: mime-types "~2.1.34" negotiator "0.6.3" +accessor-fn@1: + version "1.5.3" + resolved "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz" + integrity sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" @@ -903,6 +1396,11 @@ basic-auth@~2.0.0: dependencies: safe-buffer "5.1.2" +"bezier-js@3 - 6": + version "6.1.4" + resolved "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz" + integrity sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg== + bitsyntax@~0.0.4: version "0.0.4" resolved "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz" @@ -939,6 +1437,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.3" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz" + integrity sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA== + dependencies: + balanced-match "^1.0.0" + brace-expansion@^5.0.5: version "5.0.5" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz" @@ -1008,6 +1513,16 @@ caniuse-lite@^1.0.30001782: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz" integrity sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw== +<<<<<<< Updated upstream +======= +canvas-color-tracker@^1.3: + version "1.3.2" + resolved "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz" + integrity sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg== + dependencies: + tinycolor2 "^1.6.0" + +>>>>>>> Stashed changes chalk@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -1025,6 +1540,16 @@ chalk@2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +<<<<<<< Updated upstream +======= +class-variance-authority@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz" + integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg== + dependencies: + clsx "^2.1.1" + +>>>>>>> Stashed changes clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" @@ -1194,41 +1719,99 @@ csstype@^3.0.2, csstype@^3.2.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== +<<<<<<< Updated upstream d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": +======= +d3-array@^3.1.6, "d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3": +>>>>>>> Stashed changes version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" +d3-binarytree@1: + version "1.0.2" + resolved "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz" + integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw== + "d3-color@1 - 3": version "3.1.0" resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== -d3-ease@^3.0.1: +"d3-dispatch@1 - 3": version "3.0.1" +<<<<<<< Updated upstream +======= + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3": + version "3.0.0" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +d3-ease@^3.0.1, "d3-ease@1 - 3": + version "3.0.1" +>>>>>>> Stashed changes resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== +"d3-force-3d@2 - 3": + version "3.0.6" + resolved "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz" + integrity sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA== + dependencies: + d3-binarytree "1" + d3-dispatch "1 - 3" + d3-octree "1" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + "d3-format@1 - 3": version "3.1.2" resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz" integrity sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg== +<<<<<<< Updated upstream d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3": +======= +d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": +>>>>>>> Stashed changes version "3.0.1" resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" +d3-octree@1: + version "1.1.0" + resolved "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz" + integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A== + d3-path@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== -d3-scale@^4.0.2: +"d3-quadtree@1 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +"d3-scale-chromatic@1 - 3": + version "3.1.0" + resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@^4.0.2, "d3-scale@1 - 4": version "4.0.2" resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== @@ -1239,6 +1822,11 @@ d3-scale@^4.0.2: d3-time "2.1.1 - 3" d3-time-format "2 - 4" +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + d3-shape@^3.1.0: version "3.2.0" resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" @@ -1260,11 +1848,33 @@ d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": dependencies: d3-array "2 - 3" -d3-timer@^3.0.1: +d3-timer@^3.0.1, "d3-timer@1 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== +"d3-transition@2 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +"d3-zoom@2 - 3": + version "3.0.0" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + data-view-buffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" @@ -1371,6 +1981,20 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dompurify@3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz" + integrity sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + +dompurify@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz" + integrity sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + draht@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/draht/-/draht-1.0.1.tgz" @@ -1738,6 +2362,22 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" +file-surf@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/file-surf/-/file-surf-1.0.3.tgz" + integrity sha512-XdNCxUASI/teXZ22/e4eDtPWhqqzDSWkkd0TFdqH3y8KUdSCpleZtId5XAahDxvdJdQDoWrpe8+SQiVb9yD5OQ== + dependencies: + "@monaco-editor/react" "^4.6.0" + "@radix-ui/react-slot" "^1.1.0" + "@radix-ui/react-toast" "^1.2.1" + class-variance-authority "^0.7.1" + clsx "^2.1.1" + lucide-react "^0.462.0" + monaco-editor "^0.45.0" + sonner "^1.5.0" + tailwind-merge "^2.5.2" + tailwindcss-animate "^1.0.7" + finalhandler@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz" @@ -1797,6 +2437,15 @@ flatted@^3.2.9: resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== +float-tooltip@^1.7: + version "1.7.5" + resolved "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz" + integrity sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg== + dependencies: + d3-selection "2 - 3" + kapsule "^1.16" + preact "10" + follow-redirects@^1.15.11: version "1.15.11" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" @@ -1809,6 +2458,27 @@ for-each@^0.3.3, for-each@^0.3.5: dependencies: is-callable "^1.2.7" +force-graph@^1.51: + version "1.51.2" + resolved "https://registry.npmjs.org/force-graph/-/force-graph-1.51.2.tgz" + integrity sha512-zZNdMqx8qIQGurgnbgYIUsdXxSfvhfRSIdncsKGv/twUOZpwCsk9hPHmdjdcme1+epATgb41G0rkIGHJ0Wydng== + dependencies: + "@tweenjs/tween.js" "18 - 25" + accessor-fn "1" + bezier-js "3 - 6" + canvas-color-tracker "^1.3" + d3-array "1 - 3" + d3-drag "2 - 3" + d3-force-3d "2 - 3" + d3-scale "1 - 4" + d3-scale-chromatic "1 - 3" + d3-selection "2 - 3" + d3-zoom "2 - 3" + float-tooltip "^1.7" + index-array-by "1" + kapsule "^1.16" + lodash-es "4" + form-data@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz" @@ -2067,6 +2737,14 @@ imurmurhash@^0.1.4: resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +<<<<<<< Updated upstream +======= +index-array-by@1: + version "1.4.2" + resolved "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz" + integrity sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw== + +>>>>>>> Stashed changes inherits@^2.0.3, inherits@~2.0.1: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" @@ -2292,6 +2970,14 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +<<<<<<< Updated upstream +======= +jerrypick@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz" + integrity sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA== + +>>>>>>> Stashed changes jiti@*, jiti@^2.6.1, jiti@>=1.21.0: version "2.6.1" resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz" @@ -2309,6 +2995,11 @@ js-yaml@^4.1.1: dependencies: argparse "^2.0.1" +jschardet@3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/jschardet/-/jschardet-3.1.4.tgz" + integrity sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg== + jsesc@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" @@ -2374,6 +3065,13 @@ jws@^3.2.1: jwa "^1.4.2" safe-buffer "^5.0.1" +kapsule@^1.16: + version "1.16.3" + resolved "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz" + integrity sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg== + dependencies: + lodash-es "4" + keyv@^4.5.4: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" @@ -2428,6 +3126,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@4: + version "4.18.1" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" @@ -2492,6 +3195,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lucide-react@^0.462.0: + version "0.462.0" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.462.0.tgz" + integrity sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g== + lusca@1.6.1: version "1.6.1" resolved "https://registry.npmjs.org/lusca/-/lusca-1.6.1.tgz" @@ -2506,6 +3214,11 @@ magic-string@^0.30.21: dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" +marked@14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz" + integrity sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" @@ -2562,11 +3275,71 @@ minimatch@^3.1.5: dependencies: brace-expansion "^1.1.7" +minimatch@^5.1.0: + version "5.1.9" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz" + integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== + dependencies: + brace-expansion "^2.0.1" + moment@2.22.2: version "2.22.2" resolved "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz" integrity sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw== +monaco-editor@^0.45.0: + version "0.45.0" + resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz" + integrity sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA== + +"monaco-editor@>= 0.25.0 < 1": + version "0.55.1" + resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz" + integrity sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A== + dependencies: + dompurify "3.2.7" + marked "14.0.0" + +monaco-languageclient@^10.7.0: + version "10.7.0" + resolved "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-10.7.0.tgz" + integrity sha512-oA5cOFixkF4bspVL2zMSn48LvlNR/Cu3vJ8MCVam3PdjobSULGgHtOASuZIi3FgWK42X1z8/6hrG0LCjvNu1Hw== + dependencies: + "@codingame/monaco-vscode-api" "^25.1.2" + "@codingame/monaco-vscode-configuration-service-override" "^25.1.2" + "@codingame/monaco-vscode-editor-api" "^25.1.2" + "@codingame/monaco-vscode-editor-service-override" "^25.1.2" + "@codingame/monaco-vscode-extension-api" "^25.1.2" + "@codingame/monaco-vscode-extensions-service-override" "^25.1.2" + "@codingame/monaco-vscode-language-pack-cs" "^25.1.2" + "@codingame/monaco-vscode-language-pack-de" "^25.1.2" + "@codingame/monaco-vscode-language-pack-es" "^25.1.2" + "@codingame/monaco-vscode-language-pack-fr" "^25.1.2" + "@codingame/monaco-vscode-language-pack-it" "^25.1.2" + "@codingame/monaco-vscode-language-pack-ja" "^25.1.2" + "@codingame/monaco-vscode-language-pack-ko" "^25.1.2" + "@codingame/monaco-vscode-language-pack-pl" "^25.1.2" + "@codingame/monaco-vscode-language-pack-pt-br" "^25.1.2" + "@codingame/monaco-vscode-language-pack-qps-ploc" "^25.1.2" + "@codingame/monaco-vscode-language-pack-ru" "^25.1.2" + "@codingame/monaco-vscode-language-pack-tr" "^25.1.2" + "@codingame/monaco-vscode-language-pack-zh-hans" "^25.1.2" + "@codingame/monaco-vscode-language-pack-zh-hant" "^25.1.2" + "@codingame/monaco-vscode-languages-service-override" "^25.1.2" + "@codingame/monaco-vscode-localization-service-override" "^25.1.2" + "@codingame/monaco-vscode-log-service-override" "^25.1.2" + "@codingame/monaco-vscode-model-service-override" "^25.1.2" + "@codingame/monaco-vscode-monarch-service-override" "^25.1.2" + "@codingame/monaco-vscode-textmate-service-override" "^25.1.2" + "@codingame/monaco-vscode-theme-defaults-default-extension" "^25.1.2" + "@codingame/monaco-vscode-theme-service-override" "^25.1.2" + "@codingame/monaco-vscode-views-service-override" "^25.1.2" + "@codingame/monaco-vscode-workbench-service-override" "^25.1.2" + vscode "npm:@codingame/monaco-vscode-extension-api@^25.1.2" + vscode-languageclient "~9.0.1" + vscode-languageserver-protocol "~3.17.5" + vscode-ws-jsonrpc "~3.5.0" + morgan@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz" @@ -2785,6 +3558,11 @@ postcss@^8.5.8: picocolors "^1.1.1" source-map-js "^1.2.1" +preact@10: + version "10.29.1" + resolved "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz" + integrity sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -2810,7 +3588,7 @@ processenv@1.1.0: dependencies: babel-runtime "6.26.0" -prop-types@^15.6.2: +prop-types@^15.6.2, prop-types@15: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -2857,13 +3635,26 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" +<<<<<<< Updated upstream "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.4, react-dom@>=16.6.0, react-dom@>=17.0.0, react-dom@>=18: +======= +"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.3.1 || ^19.0.0", react-dom@^19.2.4, react-dom@>=16.6.0, react-dom@>=17.0.0, react-dom@>=18: +>>>>>>> Stashed changes version "19.2.4" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz" integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== dependencies: scheduler "^0.27.0" +react-force-graph-2d@^1.29.1: + version "1.29.1" + resolved "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.29.1.tgz" + integrity sha512-1Rl/1Z3xy2iTHKj6a0jRXGyiI86xUti81K+jBQZ+Oe46csaMikp47L5AjrzA9hY9fNGD63X8ffrqnvaORukCuQ== + dependencies: + force-graph "^1.51" + prop-types "15" + react-kapsule "^2.5" + react-icons@^5.6.0: version "5.6.0" resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz" @@ -2874,6 +3665,16 @@ react-is@^16.13.1, "react-is@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +<<<<<<< Updated upstream +======= +react-kapsule@^2.5: + version "2.5.7" + resolved "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.5.7.tgz" + integrity sha512-kifAF4ZPD77qZKc4CKLmozq6GY1sBzPEJTIJb0wWFK6HsePJatK3jXplZn2eeAt3x67CDozgi7/rO8fNQ/AL7A== + dependencies: + jerrypick "^1.1.1" + +>>>>>>> Stashed changes "react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", "react-redux@8.x.x || 9.x.x": version "9.2.0" resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz" @@ -2907,7 +3708,11 @@ react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" +<<<<<<< Updated upstream react@*, "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.2.4, react@>=16.6.0, react@>=17.0.0, react@>=18, react@>=18.0.0: +======= +react@*, "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.3.1 || ^19.0.0", react@^19.2.4, react@>=16.13.1, react@>=16.6.0, react@>=17.0.0, react@>=18, react@>=18.0.0: +>>>>>>> Stashed changes version "19.2.4" resolved "https://registry.npmjs.org/react/-/react-19.2.4.tgz" integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== @@ -3091,6 +3896,11 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.7: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + semver@^7.7.3: version "7.7.4" resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" @@ -3223,6 +4033,11 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" +sonner@^1.5.0: + version "1.7.4" + resolved "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz" + integrity sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw== + source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" @@ -3240,6 +4055,11 @@ stack-trace@0.0.10: resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" @@ -3342,6 +4162,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tailwind-merge@^2.5.2: + version "2.6.1" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz" + integrity sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ== + tailwind@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/tailwind/-/tailwind-4.0.0.tgz" @@ -3375,7 +4200,16 @@ tailwind@^4.0.0: uuidv4 "3.0.1" ws "6.2.0" +<<<<<<< Updated upstream tailwindcss@^4.2.2, tailwindcss@4.2.2: +======= +tailwindcss-animate@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" + integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== + +tailwindcss@^4.2.2, "tailwindcss@>=3.0.0 || insiders", tailwindcss@4.2.2: +>>>>>>> Stashed changes version "4.2.2" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz" integrity sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q== @@ -3395,6 +4229,11 @@ tiny-invariant@^1.3.3: resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== +tinycolor2@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== + tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" @@ -3619,6 +4458,53 @@ victory-vendor@^37.0.2: optionalDependencies: fsevents "~2.3.3" +vscode-jsonrpc@~8.2.1: + version "8.2.1" + resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz" + integrity sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ== + +vscode-jsonrpc@8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz" + integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== + +vscode-languageclient@~9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz" + integrity sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA== + dependencies: + minimatch "^5.1.0" + semver "^7.3.7" + vscode-languageserver-protocol "3.17.5" + +vscode-languageserver-protocol@~3.17.5, vscode-languageserver-protocol@3.17.5: + version "3.17.5" + resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz" + integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== + dependencies: + vscode-jsonrpc "8.2.0" + vscode-languageserver-types "3.17.5" + +vscode-languageserver-types@3.17.5: + version "3.17.5" + resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== + +vscode-ws-jsonrpc@^3.5.0, vscode-ws-jsonrpc@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-3.5.0.tgz" + integrity sha512-13ZDy7Od4AfEPK2HIfY3DtyRi4FVsvFql1yobVJrpIoHOKGGJpIjVvIJpMxkrHzCZzWlYlg+WEu2hrYkCTvM0Q== + dependencies: + vscode-jsonrpc "~8.2.1" + +"vscode@npm:@codingame/monaco-vscode-extension-api@^25.1.2": + version "25.1.2" + resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extension-api/-/monaco-vscode-extension-api-25.1.2.tgz" + integrity sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA== + dependencies: + "@codingame/monaco-vscode-api" "25.1.2" + "@codingame/monaco-vscode-extensions-service-override" "25.1.2" + w3c-keyname@^2.2.4: version "2.2.8" resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" From 43e16b1360fdc1a4d5f804082c4f4296683d7f1a Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 05:13:27 +0300 Subject: [PATCH 05/48] fix: autocloseder for input search & button back --- frontend/src/modules/ide/IDE.tsx | 76 ++++++++++++++++++- .../modules/ide/components/FileExplorer.tsx | 36 ++++++++- frontend/src/pages/ide.page.tsx | 7 +- 3 files changed, 113 insertions(+), 6 deletions(-) diff --git a/frontend/src/modules/ide/IDE.tsx b/frontend/src/modules/ide/IDE.tsx index 7e0dd30..ca2214f 100644 --- a/frontend/src/modules/ide/IDE.tsx +++ b/frontend/src/modules/ide/IDE.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import { MdAdd } from "react-icons/md"; +import { MdAdd, MdArrowBack } from "react-icons/md"; import { GoTrash } from "react-icons/go"; import { useIDEStore, @@ -16,10 +16,12 @@ import { interface IDEProps { initialFiles?: FileNode; + onBack?: () => void; } export const IDE: React.FC = ({ initialFiles: externalFiles, + onBack, }: IDEProps = {}) => { const files = useIDEStore((state) => state.files); const openFiles = useIDEStore((state) => state.openFiles); @@ -52,9 +54,46 @@ export const IDE: React.FC = ({ backgroundColor: "#1e1e1e", fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", + position: "relative", }} > + {onBack && ( + + )}
= ({ backgroundColor: "#323233", display: "flex", alignItems: "center", - justifyContent: "center", + justifyContent: "space-between", + padding: "0 8px", borderBottom: "1px solid #1e1e1e", fontSize: "12px", color: "#cccccc", @@ -148,10 +188,42 @@ export const IDE: React.FC = ({ flexShrink: 0, }} > + {onBack && ( + + )} + {!onBack &&
} {activeFile ? `${activeFile.name} - ` : ""} {files.name} +
diff --git a/frontend/src/modules/ide/components/FileExplorer.tsx b/frontend/src/modules/ide/components/FileExplorer.tsx index 38f537d..a798bfc 100644 --- a/frontend/src/modules/ide/components/FileExplorer.tsx +++ b/frontend/src/modules/ide/components/FileExplorer.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, useRef, useCallback } from "react"; import { FiSearch, FiFile, FiFolder, FiMinus } from "react-icons/fi"; import { GoKebabHorizontal } from "react-icons/go"; import { MdClose, MdAdd } from "react-icons/md"; @@ -20,6 +20,28 @@ export const FileExplorer: React.FC = ({ }) => { const store = useIDEStore(); const [showSearch, setShowSearch] = useState(false); + const searchInputRef = useRef(null); + + // Фокус на инпут при открытии поиска + useEffect(() => { + if (showSearch) { + searchInputRef.current?.focus(); + } + }, [showSearch]); + + const handleSearchBlur = useCallback(() => { + // Скрываем поиск при потере фокуса с небольшой задержкой, + // чтобы клики по кнопке очистки успели сработать + setTimeout(() => { + if ( + searchInputRef.current && + !searchInputRef.current.contains(document.activeElement) + ) { + setShowSearch(false); + store.setSearchQuery(""); + } + }, 100); + }, [store]); const handleEmptyContextMenu = (e: React.MouseEvent) => { e.preventDefault(); @@ -78,7 +100,14 @@ export const FileExplorer: React.FC = ({
- ); - })} + {navItems + .filter((item) => { + if (item.adminOnly && !user?.permission_admin) return false; + return true; + }) + .map((item) => { + const Icon = item.icon; + const active = isActive(item.path); + return ( + + ); + })}
{/* Профиль пользователя */} @@ -82,7 +98,10 @@ export const Navigation = () => { >
- + {user.name}
diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index 131f5f6..c9b4e6d 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -9,6 +9,7 @@ import { RegisterPage } from "@/pages/register.page"; import { DefaultLayout } from "@/shared/layouts/DefaultLayout"; import { AddAgentsPage } from "@/pages/add-agents.page"; import { IDEPage } from "@/pages/ide.page"; +import { AdminPage } from "@/pages/admin.page"; export const mockGraphData: GraphData = { nodes: [ @@ -119,6 +120,7 @@ export const Routing = () => { } /> } /> } /> + } /> } /> diff --git a/frontend/src/modules/agent/api/agent.api.service.ts b/frontend/src/modules/agent/api/agent.api.service.ts index e5f629f..db258e8 100644 --- a/frontend/src/modules/agent/api/agent.api.service.ts +++ b/frontend/src/modules/agent/api/agent.api.service.ts @@ -7,6 +7,12 @@ import type { LogFilters, InsertLogRequest, InsertLogsRequest, + TokenUpdate, + TokenUpdatePermissions, + TokenPasswordReset, + RegistrationRequest, + DeployAgentsRequest, + DeployResponse, } from "../types/agent.types"; class AgentApiService { @@ -20,7 +26,9 @@ class AgentApiService { } async getUsers(): Promise { - const response = await apiClient.get(`${this.authBasePath}/tokens`); + const response = await apiClient.get( + `${this.authBasePath}/tokens`, + ); return response.data; } @@ -60,17 +68,85 @@ class AgentApiService { } async getDistinctAgents(): Promise { - const response = await apiClient.get(`${this.logsBasePath}/agents`); + const response = await apiClient.get( + `${this.logsBasePath}/agents`, + ); return response.data; } async getDistinctLevels(): Promise { - const response = await apiClient.get(`${this.logsBasePath}/levels`); + const response = await apiClient.get( + `${this.logsBasePath}/levels`, + ); return response.data; } async getDistinctServices(): Promise { - const response = await apiClient.get(`${this.logsBasePath}/services`); + const response = await apiClient.get( + `${this.logsBasePath}/services`, + ); + return response.data; + } + + // User management methods + async getUserByLogin(login: string): Promise { + const response = await apiClient.get( + `${this.authBasePath}/users/${login}`, + ); + return response.data; + } + + async getInactiveUsers(): Promise { + const response = await apiClient.get( + `${this.authBasePath}/users/inactive`, + ); + return response.data; + } + + async updateUser(login: string, data: TokenUpdate): Promise { + await apiClient.put(`${this.authBasePath}/users/${login}`, data); + } + + async updateUserPermissions( + login: string, + data: TokenUpdatePermissions, + ): Promise { + await apiClient.put( + `${this.authBasePath}/users/${login}/permissions`, + data, + ); + } + + async resetUserPassword( + login: string, + data: TokenPasswordReset, + ): Promise { + await apiClient.put(`${this.authBasePath}/users/${login}/password`, data); + } + + async activateUser(login: string): Promise { + await apiClient.post(`${this.authBasePath}/users/${login}/activate`); + } + + async deactivateUser(login: string): Promise { + await apiClient.post(`${this.authBasePath}/users/${login}/deactivate`); + } + + async createRegistrationToken( + data: RegistrationRequest, + ): Promise> { + const response = await apiClient.post>( + `${this.basePath}/register-token`, + data, + ); + return response.data; + } + + async deployAgents(data: DeployAgentsRequest): Promise { + const response = await apiClient.post( + `${this.basePath}/deploy`, + data, + ); return response.data; } } diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts index 7d0e342..6b7b168 100644 --- a/frontend/src/modules/agent/types/agent.types.ts +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -74,3 +74,51 @@ export interface LogFilters { limit?: number; offset?: number; } + +export interface TokenUpdate { + name?: string; + last_name?: string; +} + +export interface TokenUpdatePermissions { + is_active?: boolean; + permission_admin?: boolean; + permission_manage_agent?: boolean; + permission_view?: boolean; +} + +export interface TokenPasswordReset { + new_password: string; +} + +export interface RegistrationRequest { + label: string; +} + +export interface DeployResult { + agent_label: string; + error?: string; + ip: string; + success: boolean; + token?: string; +} + +export interface DeployAgentsRequest { + servers: AgentDeployConfig[]; +} + +export interface AgentDeployConfig { + agentLabel: string; + authMethod: "key" | "password"; + deployType: "docker" | "binary"; + ip: string; + password?: string; + port?: number; + sshKey?: string; + user: string; +} + +export interface DeployResponse { + message?: string; + results: DeployResult[]; +} diff --git a/frontend/src/pages/add-agents.page.tsx b/frontend/src/pages/add-agents.page.tsx index eb01f41..ca439d1 100644 --- a/frontend/src/pages/add-agents.page.tsx +++ b/frontend/src/pages/add-agents.page.tsx @@ -1,17 +1,18 @@ import React, { useState } from "react"; import { SSHAgentForm } from "../modules/agent/ui/SSHAgentForm"; import { agentApiService } from "../modules/agent/api/agent.api.service"; -import { FiPlusCircle, FiSend } from "react-icons/fi"; - -interface SSHAgentConfig { - user: string; - ip: string; - authMethod: string; - sshKey?: string; - password?: string; - extraFields: { key: string; value: string }[]; - deployType: string; -} +import type { SSHAgentConfig } from "../modules/agent/ui/SSHAgentForm"; +import type { + DeployAgentsRequest, + DeployResult, +} from "../modules/agent/types/agent.types"; +import { + FiPlusCircle, + FiSend, + FiCheck, + FiX, + FiAlertCircle, +} from "react-icons/fi"; const createEmptyAgentConfig = (): SSHAgentConfig => ({ user: "", @@ -67,21 +68,52 @@ export const AddAgentsPage: React.FC = () => { setSubmitError(null); try { - // Получаем текущих агентов для проверки подключения - const currentAgents = await agentApiService.getAgents(); - console.log("Current agents:", currentAgents); + // Преобразуем данные из формы в формат API + const deployData: DeployAgentsRequest = { + servers: agents.map((agent) => ({ + agentLabel: `${agent.ip}-${agent.user}`, + ip: agent.ip, + user: agent.user, + authMethod: agent.authMethod as "key" | "password", + deployType: (agent.deployType === "deploy" + ? "docker" + : agent.deployType) as "docker" | "binary", + port: 22, + ...(agent.authMethod === "key" + ? { sshKey: agent.sshKey } + : { password: agent.password }), + })), + }; - // TODO: Реальный API вызов для развертывания агентов - // Пока выводим список подключенных агентов - setSubmitMessage( - `Успешно подключено ${currentAgents.length} агент(ов). Серверы: ${agents.length}`, - ); - setAgents([createEmptyAgentConfig()]); + // Вызываем API для развертывания агентов + const response = await agentApiService.deployAgents(deployData); + + // Формируем сообщение о результатах + const successCount = response.results.filter( + (r: DeployResult) => r.success, + ).length; + const failCount = response.results.length - successCount; + + if (failCount === 0) { + setSubmitMessage( + `Успешно развернуто ${successCount} агент(ов) на ${agents.length} сервер(ах)`, + ); + setAgents([createEmptyAgentConfig()]); + } else { + const errorMsg = response.results + .filter((r: DeployResult) => !r.success) + .map( + (r: DeployResult) => `${r.ip}: ${r.error || "Неизвестная ошибка"}`, + ) + .join("\n"); + setSubmitMessage(`Успешно: ${successCount}, Ошибки: ${failCount}`); + setSubmitError(`Ошибки при развертывании:\n${errorMsg}`); + } } catch (error) { setSubmitError( error instanceof Error ? error.message - : "Ошибка при подключении к серверам", + : "Ошибка при развертывании агентов", ); } finally { setIsSubmitting(false); @@ -167,20 +199,26 @@ export const AddAgentsPage: React.FC = () => { color: "var(--success-text)", }} > - {submitMessage} +
+ + {submitMessage} +
)} {submitError && (
- {submitError} +
+ + {submitError} +
)} diff --git a/frontend/src/pages/admin.page.tsx b/frontend/src/pages/admin.page.tsx new file mode 100644 index 0000000..1db30d9 --- /dev/null +++ b/frontend/src/pages/admin.page.tsx @@ -0,0 +1,730 @@ +import React, { useState, useEffect, useCallback } from "react"; +import { agentApiService } from "@/modules/agent"; +import type { TokenUser, TokenCreate, TokenUpdatePermissions, TokenPasswordReset } from "@/modules/agent"; +import { FiUsers, FiUserPlus, FiEdit2, FiTrash2, FiUnlock, FiLock, FiKey, FiX, FiCheck, FiSearch } from "react-icons/fi"; + +export const AdminPage: React.FC = () => { + const [users, setUsers] = useState([]); + const [inactiveUsers, setInactiveUsers] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [successMessage, setSuccessMessage] = useState(null); + const [activeTab, setActiveTab] = useState<"active" | "inactive">("active"); + const [searchQuery, setSearchQuery] = useState(""); + + // Modal states + const [showCreateModal, setShowCreateModal] = useState(false); + const [showEditModal, setShowEditModal] = useState(false); + const [showPasswordModal, setShowPasswordModal] = useState(false); + const [selectedUser, setSelectedUser] = useState(null); + + // Form states + const [createData, setCreateData] = useState({ + login: "", + name: "", + last_name: "", + password: "", + permission_admin: false, + permission_manage_agent: false, + permission_view: false, + is_active: false, + }); + + const [editData, setEditData] = useState({ + is_active: false, + permission_admin: false, + permission_manage_agent: false, + permission_view: false, + }); + + const [passwordData, setPasswordData] = useState({ + new_password: "", + }); + + const fetchUsers = useCallback(async () => { + setIsLoading(true); + setError(null); + try { + const [active, inactive] = await Promise.all([ + agentApiService.getUsers(), + agentApiService.getInactiveUsers(), + ]); + setUsers(active); + setInactiveUsers(inactive); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при загрузке пользователей"); + } finally { + setIsLoading(false); + } + }, []); + + useEffect(() => { + fetchUsers(); + }, [fetchUsers]); + + const handleCreateUser = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + try { + await agentApiService.createUser(createData); + setSuccessMessage("Пользователь успешно создан"); + setShowCreateModal(false); + setCreateData({ + login: "", + name: "", + last_name: "", + password: "", + permission_admin: false, + permission_manage_agent: false, + permission_view: false, + is_active: false, + }); + await fetchUsers(); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при создании пользователя"); + } + }; + + const handleUpdatePermissions = async (e: React.FormEvent) => { + e.preventDefault(); + if (!selectedUser) return; + + setError(null); + try { + await agentApiService.updateUserPermissions(selectedUser.login, editData); + setSuccessMessage("Права пользователя обновлены"); + setShowEditModal(false); + await fetchUsers(); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при обновлении прав"); + } + }; + + const handleResetPassword = async (e: React.FormEvent) => { + e.preventDefault(); + if (!selectedUser) return; + + setError(null); + try { + await agentApiService.resetUserPassword(selectedUser.login, passwordData); + setSuccessMessage("Пароль изменен"); + setShowPasswordModal(false); + setPasswordData({ new_password: "" }); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при сбросе пароля"); + } + }; + + const handleActivateUser = async (login: string) => { + setError(null); + try { + await agentApiService.activateUser(login); + setSuccessMessage("Пользователь активирован"); + await fetchUsers(); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при активации пользователя"); + } + }; + + const handleDeactivateUser = async (login: string) => { + setError(null); + try { + await agentApiService.deactivateUser(login); + setSuccessMessage("Пользователь деактивирован"); + await fetchUsers(); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при деактивации пользователя"); + } + }; + + const handleDeleteUser = async (login: string) => { + if (!confirm(`Вы уверены, что хотите удалить пользователя ${login}?`)) return; + + setError(null); + try { + await agentApiService.deleteUser(login); + setSuccessMessage("Пользователь удален"); + await fetchUsers(); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при удалении пользователя"); + } + }; + + const openEditModal = (user: TokenUser) => { + setSelectedUser(user); + setEditData({ + is_active: user.is_active, + permission_admin: user.permission_admin, + permission_manage_agent: user.permission_manage_agent, + permission_view: user.permission_view, + }); + setShowEditModal(true); + }; + + const openPasswordModal = (user: TokenUser) => { + setSelectedUser(user); + setPasswordData({ new_password: "" }); + setShowPasswordModal(true); + }; + + const filteredUsers = (activeTab === "active" ? users : inactiveUsers).filter( + (user) => + user.login.toLowerCase().includes(searchQuery.toLowerCase()) || + user.name.toLowerCase().includes(searchQuery.toLowerCase()) || + user.last_name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + const inputStyle: React.CSSProperties = { + width: "100%", + padding: "10px 12px", + border: "1px solid var(--border)", + borderRadius: "8px", + backgroundColor: "var(--input-bg)", + color: "var(--text-primary)", + fontSize: "14px", + }; + + const labelStyle: React.CSSProperties = { + display: "block", + marginBottom: "8px", + color: "var(--text-secondary)", + fontSize: "14px", + fontWeight: 500, + }; + + const buttonBaseStyle: React.CSSProperties = { + padding: "8px 16px", + borderRadius: "8px", + border: "none", + fontSize: "14px", + fontWeight: 500, + cursor: "pointer", + display: "inline-flex", + alignItems: "center", + gap: "6px", + }; + + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

+ Управление пользователями +

+

+ Администрирование учетных записей +

+
+
+
+ + {/* Messages */} + {successMessage && ( +
+
+ {successMessage} + +
+
+ )} + + {error && ( +
+
+ {error} + +
+
+ )} + + {/* Tabs and Actions */} +
+
+ {/* Tabs */} +
+ + +
+ + {/* Create Button */} + +
+ + {/* Search */} +
+ + setSearchQuery(e.target.value)} + placeholder="Поиск по логину, имени или фамилии..." + className="w-full pl-10 pr-4 py-2.5 rounded-lg border" + style={{ + backgroundColor: "var(--input-bg)", + borderColor: "var(--border)", + color: "var(--text-primary)", + }} + /> +
+
+ + {/* Users Table */} + {isLoading ? ( +
+ Загрузка... +
+ ) : filteredUsers.length === 0 ? ( +
+ Пользователи не найдены +
+ ) : ( +
+ + + + + + + + + + + + + + {filteredUsers.map((user, index) => ( + + + + + + + + + + ))} + +
ЛогинИмяФамилияАдминУправлениеПросмотрДействия
{user.login}{user.name}{user.last_name} + {user.permission_admin ? ( + + ) : ( + + )} + + {user.permission_manage_agent ? ( + + ) : ( + + )} + + {user.permission_view ? ( + + ) : ( + + )} + +
+ + + {activeTab === "active" ? ( + + ) : ( + + )} + +
+
+
+ )} +
+ + {/* Create User Modal */} + {showCreateModal && ( +
+
+
+

Создать пользователя

+ +
+
+
+ + setCreateData({ ...createData, login: e.target.value })} + required + style={inputStyle} + /> +
+
+ + setCreateData({ ...createData, name: e.target.value })} + required + style={inputStyle} + /> +
+
+ + setCreateData({ ...createData, last_name: e.target.value })} + required + style={inputStyle} + /> +
+
+ + setCreateData({ ...createData, password: e.target.value })} + required + style={inputStyle} + /> +
+
+ + + + +
+
+ + +
+
+
+
+ )} + + {/* Edit Permissions Modal */} + {showEditModal && selectedUser && ( +
+
+
+

+ Редактировать: {selectedUser.login} +

+ +
+
+
+ + + + +
+
+ + +
+
+
+
+ )} + + {/* Reset Password Modal */} + {showPasswordModal && selectedUser && ( +
+
+
+

+ Сброс пароля: {selectedUser.login} +

+ +
+
+
+ + setPasswordData({ new_password: e.target.value })} + required + style={inputStyle} + /> +
+
+ + +
+
+
+
+ )} +
+ ); +}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 24295b2..e800e91 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -16,7 +16,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz" integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== -"@babel/core@^7.0.0", "@babel/core@^7.24.4": +"@babel/core@^7.24.4": version "7.29.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz" integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== @@ -111,11 +111,6 @@ dependencies: "@babel/types" "^7.29.0" -"@babel/runtime@^7.18.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.29.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz" - integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== - "@babel/runtime@7.1.2": version "7.1.2" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz" @@ -137,6 +132,11 @@ dependencies: regenerator-runtime "^0.12.0" +"@babel/runtime@^7.18.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.29.2" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz" + integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== + "@babel/template@^7.28.6": version "7.28.6" resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz" @@ -246,7 +246,7 @@ "@codemirror/view" "^6.0.0" "@lezer/highlight" "^1.0.0" -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0", "@codemirror/view@>=6.0.0": +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0": version "6.41.0" resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.41.0.tgz" integrity sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA== @@ -256,9 +256,7 @@ style-mod "^4.1.0" w3c-keyname "^2.2.4" -<<<<<<< Updated upstream -======= -"@codingame/monaco-vscode-api@^25.1.2", "@codingame/monaco-vscode-api@25.1.2": +"@codingame/monaco-vscode-api@25.1.2", "@codingame/monaco-vscode-api@^25.1.2": version "25.1.2" resolved "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-25.1.2.tgz" integrity sha512-K04QcQA+Zb0KXucBAK/BGCT5dldiwIqdUbBQq7yuLvBLbof3cP1WSUuxasMHGYwM0MWyzIAsDtyAYMS7is8ZuA== @@ -326,7 +324,7 @@ "@codingame/monaco-vscode-api" "25.1.2" "@codingame/monaco-vscode-extensions-service-override" "25.1.2" -"@codingame/monaco-vscode-extensions-service-override@^25.1.2", "@codingame/monaco-vscode-extensions-service-override@25.1.2": +"@codingame/monaco-vscode-extensions-service-override@25.1.2", "@codingame/monaco-vscode-extensions-service-override@^25.1.2": version "25.1.2" resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extensions-service-override/-/monaco-vscode-extensions-service-override-25.1.2.tgz" integrity sha512-rTTZW2biPxcg+JumhVf2L+38C5ptvNNxiJlwz39VfXFEh6qOHtAsIMy7vIXa0uGg5/y8DNp0SnOQJP/RKhLYZA== @@ -581,7 +579,28 @@ "@codingame/monaco-vscode-view-status-bar-service-override" "25.1.2" "@codingame/monaco-vscode-view-title-bar-service-override" "25.1.2" ->>>>>>> Stashed changes +"@emnapi/core@^1.8.1": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.2.tgz#3870265ecffc7352d01ead62d8d83d8358a2d034" + integrity sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + +"@emnapi/runtime@^1.8.1": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.9.2.tgz#8b469a3db160817cadb1de9050211a9d1ea84fa2" + integrity sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.1", "@emnapi/wasi-threads@^1.1.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" @@ -632,7 +651,7 @@ minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@^9.39.4", "@eslint/js@9.39.4": +"@eslint/js@9.39.4", "@eslint/js@^9.39.4": version "9.39.4" resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz" integrity sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw== @@ -731,8 +750,6 @@ resolved "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz" integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== -<<<<<<< Updated upstream -======= "@monaco-editor/loader@^1.5.0": version "1.7.0" resolved "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz" @@ -747,7 +764,13 @@ dependencies: "@monaco-editor/loader" "^1.5.0" ->>>>>>> Stashed changes +"@napi-rs/wasm-runtime@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc" + integrity sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw== + dependencies: + "@tybys/wasm-util" "^0.10.1" + "@oxc-project/types@=0.122.0": version "0.122.0" resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz" @@ -812,13 +835,6 @@ dependencies: "@radix-ui/react-slot" "1.2.3" -"@radix-ui/react-slot@^1.1.0": - version "1.2.4" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz" - integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-slot@1.2.3": version "1.2.3" resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz" @@ -826,6 +842,13 @@ dependencies: "@radix-ui/react-compose-refs" "1.1.2" +"@radix-ui/react-slot@^1.1.0": + version "1.2.4" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz" + integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-toast@^1.2.1": version "1.2.15" resolved "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz" @@ -895,6 +918,78 @@ redux-thunk "^3.1.0" reselect "^5.1.0" +"@rolldown/binding-android-arm64@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz#4e6af08b89da02596cc5da4b105082b68673ffec" + integrity sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA== + +"@rolldown/binding-darwin-arm64@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz#a06890f4c9b48ff0fc97edbedfc762bef7cffd73" + integrity sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg== + +"@rolldown/binding-darwin-x64@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz#eddf6aa3ed3509171fe21711f1e8ec8e0fd7ec49" + integrity sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw== + +"@rolldown/binding-freebsd-x64@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz#2102dfed19fd1f1b53435fcaaf0bc61129a266a3" + integrity sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q== + +"@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz#b2c13f40e990fd1e1935492850536c768c961a0f" + integrity sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q== + +"@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz#32ca9f77c1e76b2913b3d53d2029dc171c0532d6" + integrity sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg== + +"@rolldown/binding-linux-arm64-musl@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz#f4337ddd52f0ed3ada2105b59ee1b757a2c4858c" + integrity sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw== + +"@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz#22fdd14cb00ee8208c28a39bab7f28860ec6705d" + integrity sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g== + +"@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz#838215096d1de6d3d509e0410801cb7cda8161ff" + integrity sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og== + +"@rolldown/binding-linux-x64-gnu@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz#f7d71d97f6bd43198596b26dc2cb364586e12673" + integrity sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg== + +"@rolldown/binding-linux-x64-musl@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz#a2ca737f01b0ad620c4c404ca176ea3e3ad804c3" + integrity sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig== + +"@rolldown/binding-openharmony-arm64@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz#f66317e29eafcc300bed7af8dddac26ab3b1bf82" + integrity sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA== + +"@rolldown/binding-wasm32-wasi@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz#8825523fdffa1f1dc4683be9650ffaa9e4a77f04" + integrity sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg== + dependencies: + "@napi-rs/wasm-runtime" "^1.1.1" + +"@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12": + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz#4f3a17e3d68a58309c27c0930b0f7986ccabef47" + integrity sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q== + "@rolldown/binding-win32-x64-msvc@1.0.0-rc.12": version "1.0.0-rc.12" resolved "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz" @@ -933,6 +1028,68 @@ source-map-js "^1.2.1" tailwindcss "4.2.2" +"@tailwindcss/oxide-android-arm64@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz#61d9ec5c18394fe7a972e99e19e6065e833da77c" + integrity sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg== + +"@tailwindcss/oxide-darwin-arm64@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz#9ad7b141789dae235c85d2f7874592bf869f636e" + integrity sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg== + +"@tailwindcss/oxide-darwin-x64@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz#a5899f1fbe55c4eddcbc871b835d5183ba34658c" + integrity sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw== + +"@tailwindcss/oxide-freebsd-x64@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz#76185bb1bea9af915a5b9f465323861646587e21" + integrity sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz#74c17c69b2015f7600d566ab0990aaac8701128e" + integrity sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ== + +"@tailwindcss/oxide-linux-arm64-gnu@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz#38a846d9d5795bc3b57951172044d8dbb3c79aa6" + integrity sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw== + +"@tailwindcss/oxide-linux-arm64-musl@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz#f4cc4129c17d3f2bcb01efef4d7a2f381e5e3f53" + integrity sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag== + +"@tailwindcss/oxide-linux-x64-gnu@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz#7c4a00b0829e12736bd72ec74e1c08205448cc2e" + integrity sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg== + +"@tailwindcss/oxide-linux-x64-musl@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz#711756d7bbe97e221fc041b63a4f385b85ba4321" + integrity sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ== + +"@tailwindcss/oxide-wasm32-wasi@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz#ed6d28567b7abb8505f824457c236d2cd07ee18e" + integrity sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q== + dependencies: + "@emnapi/core" "^1.8.1" + "@emnapi/runtime" "^1.8.1" + "@emnapi/wasi-threads" "^1.1.0" + "@napi-rs/wasm-runtime" "^1.1.1" + "@tybys/wasm-util" "^0.10.1" + tslib "^2.8.1" + +"@tailwindcss/oxide-win32-arm64-msvc@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz#f2d0360e5bc06fe201537fb08193d3780e7dd24f" + integrity sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ== + "@tailwindcss/oxide-win32-x64-msvc@4.2.2": version "4.2.2" resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz" @@ -1038,14 +1195,14 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@^20.19.0 || >=22.12.0", "@types/node@^24.12.0": +"@types/node@^24.12.0": version "24.12.2" resolved "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz" integrity sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g== dependencies: undici-types "~7.16.0" -"@types/react-dom@*", "@types/react-dom@^19.2.3": +"@types/react-dom@^19.2.3": version "19.2.3" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== @@ -1055,7 +1212,7 @@ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.2.25 || ^19", "@types/react@^19.2.0", "@types/react@^19.2.14", "@types/react@>=18.0.0": +"@types/react@^19.2.14": version "19.2.14" resolved "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz" integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== @@ -1086,7 +1243,7 @@ natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@^8.58.0", "@typescript-eslint/parser@8.58.0": +"@typescript-eslint/parser@8.58.0": version "8.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz" integrity sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA== @@ -1114,7 +1271,7 @@ "@typescript-eslint/types" "8.58.0" "@typescript-eslint/visitor-keys" "8.58.0" -"@typescript-eslint/tsconfig-utils@^8.58.0", "@typescript-eslint/tsconfig-utils@8.58.0": +"@typescript-eslint/tsconfig-utils@8.58.0", "@typescript-eslint/tsconfig-utils@^8.58.0": version "8.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz" integrity sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A== @@ -1130,7 +1287,7 @@ debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@^8.58.0", "@typescript-eslint/types@8.58.0": +"@typescript-eslint/types@8.58.0", "@typescript-eslint/types@^8.58.0": version "8.58.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz" integrity sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww== @@ -1223,21 +1380,11 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0: +acorn@^8.15.0: version "8.16.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== -ajv@^6.14.0: - version "6.14.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz" - integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@6.10.0: version "6.10.0" resolved "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz" @@ -1248,6 +1395,16 @@ ajv@6.10.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.14.0: + version "6.14.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + amqplib@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz" @@ -1451,7 +1608,7 @@ brace-expansion@^5.0.5: dependencies: balanced-match "^4.0.2" -browserslist@^4.24.0, "browserslist@>= 4.21.0": +browserslist@^4.24.0: version "4.28.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz" integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== @@ -1513,8 +1670,6 @@ caniuse-lite@^1.0.30001782: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz" integrity sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw== -<<<<<<< Updated upstream -======= canvas-color-tracker@^1.3: version "1.3.2" resolved "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz" @@ -1522,15 +1677,6 @@ canvas-color-tracker@^1.3: dependencies: tinycolor2 "^1.6.0" ->>>>>>> Stashed changes -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz" @@ -1540,8 +1686,14 @@ chalk@2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -<<<<<<< Updated upstream -======= +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + class-variance-authority@^0.7.1: version "0.7.1" resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz" @@ -1549,7 +1701,6 @@ class-variance-authority@^0.7.1: dependencies: clsx "^2.1.1" ->>>>>>> Stashed changes clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" @@ -1582,16 +1733,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -1643,16 +1794,16 @@ content-disposition@0.5.2: resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - content-type@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" @@ -1663,16 +1814,16 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz" - integrity sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ== - cookie@0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== +cookie@^1.0.1: + version "1.1.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz" + integrity sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ== + core-js@^2.4.0: version "2.6.12" resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" @@ -1719,11 +1870,7 @@ csstype@^3.0.2, csstype@^3.2.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== -<<<<<<< Updated upstream -d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": -======= -d3-array@^3.1.6, "d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3": ->>>>>>> Stashed changes +"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== @@ -1742,8 +1889,6 @@ d3-binarytree@1: "d3-dispatch@1 - 3": version "3.0.1" -<<<<<<< Updated upstream -======= resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== @@ -1755,9 +1900,8 @@ d3-binarytree@1: d3-dispatch "1 - 3" d3-selection "3" -d3-ease@^3.0.1, "d3-ease@1 - 3": +"d3-ease@1 - 3", d3-ease@^3.0.1: version "3.0.1" ->>>>>>> Stashed changes resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== @@ -1777,11 +1921,7 @@ d3-ease@^3.0.1, "d3-ease@1 - 3": resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz" integrity sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg== -<<<<<<< Updated upstream -d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3": -======= -d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": ->>>>>>> Stashed changes +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== @@ -1811,7 +1951,7 @@ d3-path@^3.1.0: d3-color "1 - 3" d3-interpolate "1 - 3" -d3-scale@^4.0.2, "d3-scale@1 - 4": +"d3-scale@1 - 4", d3-scale@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== @@ -1841,14 +1981,14 @@ d3-shape@^3.1.0: dependencies: d3-time "1 - 3" -d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -d3-timer@^3.0.1, "d3-timer@1 - 3": +"d3-timer@1 - 3", d3-timer@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== @@ -1911,13 +2051,6 @@ datasette@1.0.1: eventemitter2 "5.0.1" lodash "4.17.5" -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -1925,6 +2058,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decimal.js-light@^2.5.1: version "2.5.1" resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" @@ -1981,13 +2121,6 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -dompurify@3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz" - integrity sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw== - optionalDependencies: - "@types/trusted-types" "^2.0.7" - dompurify@3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz" @@ -2206,7 +2339,7 @@ eslint-visitor-keys@^5.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0 || ^10.0.0", "eslint@^9 || ^10", eslint@^9.39.4: +eslint@^9.39.4: version "9.39.4" resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz" integrity sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ== @@ -2514,6 +2647,11 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -2687,7 +2825,7 @@ hermes-parser@^0.25.1: dependencies: hermes-estree "0.25.1" -http-errors@~1.6.2, http-errors@~1.6.3, http-errors@1.6.3: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== @@ -2714,7 +2852,7 @@ ignore@^7.0.5: resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== -immer@^10.1.1, immer@>=9.0.6: +immer@^10.1.1: version "10.2.0" resolved "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz" integrity sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw== @@ -2737,24 +2875,21 @@ imurmurhash@^0.1.4: resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -<<<<<<< Updated upstream -======= index-array-by@1: version "1.4.2" resolved "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz" integrity sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw== ->>>>>>> Stashed changes -inherits@^2.0.3, inherits@~2.0.1: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - inherits@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +inherits@^2.0.3, inherits@~2.0.1: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" @@ -2955,30 +3090,27 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isarray@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -<<<<<<< Updated upstream -======= jerrypick@^1.1.1: version "1.1.2" resolved "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz" integrity sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA== ->>>>>>> Stashed changes -jiti@*, jiti@^2.6.1, jiti@>=1.21.0: +jiti@^2.6.1: version "2.6.1" resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== @@ -3087,12 +3219,62 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lightningcss-android-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" + integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== + +lightningcss-darwin-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" + integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== + +lightningcss-darwin-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" + integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== + +lightningcss-freebsd-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" + integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== + +lightningcss-linux-arm-gnueabihf@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" + integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== + +lightningcss-linux-arm64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" + integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== + +lightningcss-linux-arm64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" + integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== + +lightningcss-linux-x64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" + integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== + +lightningcss-linux-x64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" + integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== + +lightningcss-win32-arm64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" + integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== + lightningcss-win32-x64-msvc@1.32.0: version "1.32.0" resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz" integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== -lightningcss@^1.32.0, lightningcss@1.32.0: +lightningcss@1.32.0, lightningcss@^1.32.0: version "1.32.0" resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz" integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== @@ -3239,16 +3421,16 @@ methods@~1.1.2: resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -"mime-db@>= 1.43.0 < 2": - version "1.54.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" @@ -3292,14 +3474,6 @@ monaco-editor@^0.45.0: resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz" integrity sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA== -"monaco-editor@>= 0.25.0 < 1": - version "0.55.1" - resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz" - integrity sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A== - dependencies: - dompurify "3.2.7" - marked "14.0.0" - monaco-languageclient@^10.7.0: version "10.7.0" resolved "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-10.7.0.tgz" @@ -3363,21 +3537,16 @@ motion-utils@^12.36.0: resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz" integrity sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanoid@^3.3.11: version "3.3.11" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" @@ -3539,7 +3708,7 @@ picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -"picomatch@^3 || ^4", picomatch@^4.0.3, picomatch@^4.0.4: +picomatch@^4.0.3, picomatch@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== @@ -3588,7 +3757,7 @@ processenv@1.1.0: dependencies: babel-runtime "6.26.0" -prop-types@^15.6.2, prop-types@15: +prop-types@15, prop-types@^15.6.2: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -3635,11 +3804,7 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -<<<<<<< Updated upstream -"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.4, react-dom@>=16.6.0, react-dom@>=17.0.0, react-dom@>=18: -======= -"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^18.3.1 || ^19.0.0", react-dom@^19.2.4, react-dom@>=16.6.0, react-dom@>=17.0.0, react-dom@>=18: ->>>>>>> Stashed changes +react-dom@^19.2.4: version "19.2.4" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz" integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== @@ -3660,13 +3825,11 @@ react-icons@^5.6.0: resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz" integrity sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA== -react-is@^16.13.1, "react-is@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": +react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -<<<<<<< Updated upstream -======= react-kapsule@^2.5: version "2.5.7" resolved "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.5.7.tgz" @@ -3674,8 +3837,7 @@ react-kapsule@^2.5: dependencies: jerrypick "^1.1.1" ->>>>>>> Stashed changes -"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", "react-redux@8.x.x || 9.x.x": +"react-redux@8.x.x || 9.x.x": version "9.2.0" resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz" integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g== @@ -3708,24 +3870,11 @@ react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" -<<<<<<< Updated upstream -react@*, "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.2.4, react@>=16.6.0, react@>=17.0.0, react@>=18, react@>=18.0.0: -======= -react@*, "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18.3.1 || ^19.0.0", react@^19.2.4, react@>=16.13.1, react@>=16.6.0, react@>=17.0.0, react@>=18, react@>=18.0.0: ->>>>>>> Stashed changes +react@^19.2.4: version "19.2.4" resolved "https://registry.npmjs.org/react/-/react-19.2.4.tgz" integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== -readable-stream@^3.0.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - "readable-stream@1.x >=1.1.9": version "1.1.14" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" @@ -3736,6 +3885,15 @@ readable-stream@^3.0.0: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^3.0.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + recharts@^3.8.0: version "3.8.1" resolved "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz" @@ -3758,7 +3916,7 @@ redux-thunk@^3.1.0: resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== -redux@^5.0.0, redux@^5.0.1: +redux@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== @@ -3799,7 +3957,7 @@ regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" -reselect@^5.1.0, reselect@5.1.1: +reselect@5.1.1, reselect@^5.1.0: version "5.1.1" resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz" integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== @@ -3849,16 +4007,16 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-push-apply@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" @@ -3896,12 +4054,7 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.7: - version "7.7.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" - integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== - -semver@^7.7.3: +semver@^7.3.7, semver@^7.7.3: version "7.7.4" resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== @@ -4085,18 +4238,6 @@ stop-iteration-iterator@^1.1.0: es-errors "^1.3.0" internal-slot "^1.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string.prototype.trim@^1.2.10: version "1.2.10" resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" @@ -4129,6 +4270,18 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + stringify-object@3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -4200,16 +4353,12 @@ tailwind@^4.0.0: uuidv4 "3.0.1" ws "6.2.0" -<<<<<<< Updated upstream -tailwindcss@^4.2.2, tailwindcss@4.2.2: -======= tailwindcss-animate@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@^4.2.2, "tailwindcss@>=3.0.0 || insiders", tailwindcss@4.2.2: ->>>>>>> Stashed changes +tailwindcss@4.2.2, tailwindcss@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz" integrity sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q== @@ -4247,7 +4396,7 @@ ts-api-utils@^2.5.0: resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== -tslib@^2.4.0: +tslib@^2.4.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -4327,7 +4476,7 @@ typescript-eslint@^8.57.0: "@typescript-eslint/typescript-estree" "8.58.0" "@typescript-eslint/utils" "8.58.0" -typescript@>=4.8.4, "typescript@>=4.8.4 <6.1.0", typescript@~5.9.3: +typescript@~5.9.3: version "5.9.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== @@ -4347,7 +4496,7 @@ undici-types@~7.16.0: resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -4372,7 +4521,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@>=1.2.0: +use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0: version "1.6.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== @@ -4445,7 +4594,7 @@ victory-vendor@^37.0.2: d3-time "^3.0.0" d3-timer "^3.0.1" -"vite@^5.2.0 || ^6 || ^7 || ^8", vite@^8.0.0, vite@^8.0.1: +vite@^8.0.1: version "8.0.3" resolved "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz" integrity sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ== @@ -4458,16 +4607,16 @@ victory-vendor@^37.0.2: optionalDependencies: fsevents "~2.3.3" -vscode-jsonrpc@~8.2.1: - version "8.2.1" - resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz" - integrity sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ== - vscode-jsonrpc@8.2.0: version "8.2.0" resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz" integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== +vscode-jsonrpc@~8.2.1: + version "8.2.1" + resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz" + integrity sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ== + vscode-languageclient@~9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz" @@ -4477,7 +4626,7 @@ vscode-languageclient@~9.0.1: semver "^7.3.7" vscode-languageserver-protocol "3.17.5" -vscode-languageserver-protocol@~3.17.5, vscode-languageserver-protocol@3.17.5: +vscode-languageserver-protocol@3.17.5, vscode-languageserver-protocol@~3.17.5: version "3.17.5" resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz" integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== From d62205b329929fac201ab8b390296a0958279472 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 05:46:01 +0300 Subject: [PATCH 07/48] fix: add agent --- frontend/src/modules/agent/index.ts | 8 +++++ .../src/modules/agent/ui/SSHAgentForm.tsx | 31 +++++++++++++++++-- frontend/src/pages/add-agents.page.tsx | 6 ++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/frontend/src/modules/agent/index.ts b/frontend/src/modules/agent/index.ts index 0dab406..3b4cdad 100644 --- a/frontend/src/modules/agent/index.ts +++ b/frontend/src/modules/agent/index.ts @@ -15,4 +15,12 @@ export type { InsertLogRequest, InsertLogsRequest, LogFilters, + TokenUpdate, + TokenUpdatePermissions, + TokenPasswordReset, + RegistrationRequest, + DeployResult, + DeployAgentsRequest, + AgentDeployConfig, + DeployResponse, } from "./types/agent.types"; diff --git a/frontend/src/modules/agent/ui/SSHAgentForm.tsx b/frontend/src/modules/agent/ui/SSHAgentForm.tsx index d53b187..d41fe1c 100644 --- a/frontend/src/modules/agent/ui/SSHAgentForm.tsx +++ b/frontend/src/modules/agent/ui/SSHAgentForm.tsx @@ -7,6 +7,7 @@ import { FiPlus, FiTrash2, FiSettings, + FiLink, } from "react-icons/fi"; import { SiDocker } from "react-icons/si"; import { FiPackage, FiUploadCloud } from "react-icons/fi"; @@ -22,6 +23,7 @@ interface ExtraField { export interface SSHAgentConfig { user: string; ip: string; + port: number; authMethod: AuthMethod; sshKey?: string; password?: string; @@ -193,7 +195,7 @@ export const SSHAgentForm: React.FC = ({
@@ -238,6 +240,31 @@ export const SSHAgentForm: React.FC = ({ placeholder="192.168.1.1" />
+ +
+ + + handleChange("port", parseInt(e.target.value) || 22) + } + required + min={1} + max={65535} + style={inputBaseStyle} + onFocus={handleFocus} + onBlur={handleBlur} + placeholder="22" + /> +
{/* Метод аутентификации */} @@ -457,7 +484,7 @@ export const SSHAgentForm: React.FC = ({
diff --git a/frontend/src/pages/add-agents.page.tsx b/frontend/src/pages/add-agents.page.tsx index ca439d1..94e7525 100644 --- a/frontend/src/pages/add-agents.page.tsx +++ b/frontend/src/pages/add-agents.page.tsx @@ -17,6 +17,7 @@ import { const createEmptyAgentConfig = (): SSHAgentConfig => ({ user: "", ip: "", + port: 22, authMethod: "key", sshKey: "", password: "", @@ -52,7 +53,8 @@ export const AddAgentsPage: React.FC = () => { // Валидация const isValid = agents.every((agent) => { - if (!agent.user || !agent.ip) return false; + if (!agent.user || !agent.ip || !agent.port) return false; + if (agent.port < 1 || agent.port > 65535) return false; if (agent.authMethod === "key" && !agent.sshKey) return false; if (agent.authMethod === "password" && !agent.password) return false; return true; @@ -74,11 +76,11 @@ export const AddAgentsPage: React.FC = () => { agentLabel: `${agent.ip}-${agent.user}`, ip: agent.ip, user: agent.user, + port: agent.port, authMethod: agent.authMethod as "key" | "password", deployType: (agent.deployType === "deploy" ? "docker" : agent.deployType) as "docker" | "binary", - port: 22, ...(agent.authMethod === "key" ? { sshKey: agent.sshKey } : { password: agent.password }), From ed439656f87d08f0ffc4e729e036a62fef63cf14 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 05:52:43 +0300 Subject: [PATCH 08/48] feat: add registration token --- .../layout/navigation/navigation.tsx | 2 + .../src/app/providers/routing/routing.tsx | 2 + .../src/modules/agent/ui/SSHAgentForm.tsx | 23 +- frontend/src/pages/add-agents.page.tsx | 6 +- frontend/src/pages/registration.page.tsx | 423 ++++++++++++++++++ 5 files changed, 453 insertions(+), 3 deletions(-) create mode 100644 frontend/src/pages/registration.page.tsx diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx index 14a83ed..01f4887 100644 --- a/frontend/src/app/providers/layout/navigation/navigation.tsx +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -6,6 +6,7 @@ import { FaUser, FaUsers, FaRocket, + FaKey, } from "react-icons/fa"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; @@ -17,6 +18,7 @@ export const Navigation = () => { const navItems = [ { path: "/", label: "Главная", icon: FaHome }, { path: "/add-agents", label: "Деплой", icon: FaRocket }, + { path: "/registration", label: "Регистрация", icon: FaKey }, { path: "/admin", label: "Админка", icon: FaUsers, adminOnly: true }, { path: "/themes", label: "Темы", icon: FaPalette }, ]; diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index c9b4e6d..3b436c4 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -10,6 +10,7 @@ import { DefaultLayout } from "@/shared/layouts/DefaultLayout"; import { AddAgentsPage } from "@/pages/add-agents.page"; import { IDEPage } from "@/pages/ide.page"; import { AdminPage } from "@/pages/admin.page"; +import { RegistrationTokenPage } from "@/pages/registration.page"; export const mockGraphData: GraphData = { nodes: [ @@ -120,6 +121,7 @@ export const Routing = () => { } /> } /> } /> + } /> } /> } /> diff --git a/frontend/src/modules/agent/ui/SSHAgentForm.tsx b/frontend/src/modules/agent/ui/SSHAgentForm.tsx index d41fe1c..032dce4 100644 --- a/frontend/src/modules/agent/ui/SSHAgentForm.tsx +++ b/frontend/src/modules/agent/ui/SSHAgentForm.tsx @@ -21,6 +21,7 @@ interface ExtraField { } export interface SSHAgentConfig { + agentLabel: string; user: string; ip: string; port: number; @@ -191,7 +192,27 @@ export const SSHAgentForm: React.FC = ({
- {/* User и IP */} + {/* Agent Label */} +
+ + handleChange("agentLabel", e.target.value)} + required + style={inputBaseStyle} + onFocus={handleFocus} + onBlur={handleBlur} + placeholder="production-server-1" + /> +
+ + {/* User, IP и Port */}
({ + agentLabel: "", user: "", ip: "", port: 22, @@ -53,7 +54,8 @@ export const AddAgentsPage: React.FC = () => { // Валидация const isValid = agents.every((agent) => { - if (!agent.user || !agent.ip || !agent.port) return false; + if (!agent.agentLabel || !agent.user || !agent.ip || !agent.port) + return false; if (agent.port < 1 || agent.port > 65535) return false; if (agent.authMethod === "key" && !agent.sshKey) return false; if (agent.authMethod === "password" && !agent.password) return false; @@ -73,7 +75,7 @@ export const AddAgentsPage: React.FC = () => { // Преобразуем данные из формы в формат API const deployData: DeployAgentsRequest = { servers: agents.map((agent) => ({ - agentLabel: `${agent.ip}-${agent.user}`, + agentLabel: agent.agentLabel, ip: agent.ip, user: agent.user, port: agent.port, diff --git a/frontend/src/pages/registration.page.tsx b/frontend/src/pages/registration.page.tsx new file mode 100644 index 0000000..ecf464a --- /dev/null +++ b/frontend/src/pages/registration.page.tsx @@ -0,0 +1,423 @@ +import React, { useState } from "react"; +import { agentApiService } from "@/modules/agent/api/agent.api.service"; +import { FiKey, FiPlus, FiTrash2, FiCopy, FiCheck, FiX } from "react-icons/fi"; + +interface RegistrationTokenForm { + label: string; +} + +interface RegistrationResult { + label: string; + token: string; +} + +export const RegistrationTokenPage: React.FC = () => { + const [tokens, setTokens] = useState([ + { label: "" }, + ]); + const [results, setResults] = useState([]); + const [isSubmitting, setIsSubmitting] = useState(false); + const [error, setError] = useState(null); + const [successMessage, setSuccessMessage] = useState(null); + const [copiedIndex, setCopiedIndex] = useState(null); + + const handleTokenChange = (index: number, label: string) => { + const newTokens = [...tokens]; + newTokens[index] = { label }; + setTokens(newTokens); + }; + + const handleAddToken = () => { + setTokens([...tokens, { label: "" }]); + }; + + const handleRemoveToken = (index: number) => { + const newTokens = tokens.filter((_, i) => i !== index); + setTokens(newTokens); + }; + + const handleCopyToken = async (token: string, index: number) => { + await navigator.clipboard.writeText(token); + setCopiedIndex(index); + setTimeout(() => setCopiedIndex(null), 2000); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + // Валидация + const validTokens = tokens.filter((t) => t.label.trim()); + if (validTokens.length === 0) { + setError("Введите хотя бы одну метку для токена"); + return; + } + + setIsSubmitting(true); + setError(null); + setSuccessMessage(null); + setResults([]); + + try { + const createdTokens: RegistrationResult[] = []; + + for (const tokenData of validTokens) { + const response = await agentApiService.createRegistrationToken({ + label: tokenData.label, + }); + + // API возвращает объект с токеном + const token = response.token || Object.values(response)[0] as string; + + createdTokens.push({ + label: tokenData.label, + token, + }); + } + + setResults(createdTokens); + setSuccessMessage( + `Успешно создано ${createdTokens.length} токен(ов)` + ); + setTokens([{ label: "" }]); + } catch (err) { + setError( + err instanceof Error + ? err.message + : "Ошибка при создании токенов" + ); + } finally { + setIsSubmitting(false); + } + }; + + const inputStyle: React.CSSProperties = { + width: "100%", + padding: "10px 12px", + border: "1px solid var(--border)", + borderRadius: "8px", + backgroundColor: "var(--input-bg)", + color: "var(--text-primary)", + fontSize: "14px", + transition: "border-color 0.2s, box-shadow 0.2s", + }; + + const labelStyle: React.CSSProperties = { + display: "block", + marginBottom: "8px", + color: "var(--text-secondary)", + fontSize: "14px", + fontWeight: 500, + }; + + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

+ Регистрация токенов для агентов +

+

+ Создайте токены для регистрации новых агентов +

+
+
+
+ +
+ {/* Token Forms */} +
+ {tokens.map((token, index) => ( +
+ {/* Header */} +
+
+
+ +
+

+ Токен #{index + 1} +

+
+ {tokens.length > 1 && ( + + )} +
+ + {/* Label Input */} +
+ + handleTokenChange(index, e.target.value)} + required + style={inputStyle} + onFocus={(e) => { + e.currentTarget.style.borderColor = "var(--border-focus)"; + e.currentTarget.style.boxShadow = `0 0 0 3px var(--border-focus)30`; + }} + onBlur={(e) => { + e.currentTarget.style.borderColor = "var(--border)"; + e.currentTarget.style.boxShadow = "none"; + }} + placeholder="agent-production-1" + /> +
+
+ ))} +
+ + {/* Add Token Button */} + + + {/* Messages */} + {successMessage && ( +
+
+ {successMessage} + +
+
+ )} + + {error && ( +
+
+ {error} + +
+
+ )} + + {/* Submit Button */} + + + {/* Results */} + {results.length > 0 && ( +
+

+ Созданные токены +

+
+ {results.map((result, index) => ( +
+
+ + {result.label} + + +
+ + {result.token} + +
+ ))} +
+
+ )} +
+
+
+ ); +}; From 96f82b4162c31cebb2ea56359a2169d4736c99b2 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 05:57:34 +0300 Subject: [PATCH 09/48] feat: create register --- .../src/modules/auth/store/useAuthStore.ts | 17 ++++-- frontend/src/modules/auth/types/auth.types.ts | 4 ++ frontend/src/pages/register.page.tsx | 55 +++++++++++++++---- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/frontend/src/modules/auth/store/useAuthStore.ts b/frontend/src/modules/auth/store/useAuthStore.ts index 523cea3..081f837 100644 --- a/frontend/src/modules/auth/store/useAuthStore.ts +++ b/frontend/src/modules/auth/store/useAuthStore.ts @@ -17,12 +17,18 @@ const login = async (credentials: LoginCredentials): Promise => { return response.data; }; -const register = async (data: RegisterData): Promise => { - const response = await apiClient.post("/auth/register", { +const register = async ( + data: RegisterData, +): Promise> => { + const response = await apiClient.post>("/auth/token", { login: data.login, password: data.password, name: data.firstName, last_name: data.lastName, + is_active: data.is_active, + permission_admin: data.permission_admin, + permission_manage_agent: data.permission_manage_agent, + permission_view: data.permission_view, }); return response.data; }; @@ -62,9 +68,10 @@ export const useAuthStore = create()( register: async (data: RegisterData) => { set({ isLoading: true, error: null }); try { - const response = await register(data); - const user = mapResponseToUser(response); - set({ user, token: response.token, isLoading: false }); + await register(data); + // После регистрации пользователь не авторизуется автоматически + // Нужно войти через /auth/login + set({ isLoading: false }); } catch (error) { set({ error: diff --git a/frontend/src/modules/auth/types/auth.types.ts b/frontend/src/modules/auth/types/auth.types.ts index ca4e6d8..ff289a8 100644 --- a/frontend/src/modules/auth/types/auth.types.ts +++ b/frontend/src/modules/auth/types/auth.types.ts @@ -8,6 +8,10 @@ export interface RegisterData { password: string; firstName: string; lastName: string; + is_active?: boolean; + permission_admin?: boolean; + permission_manage_agent?: boolean; + permission_view?: boolean; } export interface LoginResponse { diff --git a/frontend/src/pages/register.page.tsx b/frontend/src/pages/register.page.tsx index 98d8843..7406899 100644 --- a/frontend/src/pages/register.page.tsx +++ b/frontend/src/pages/register.page.tsx @@ -5,7 +5,7 @@ import { useAuthStore } from "@/modules/auth/store/useAuthStore"; export const RegisterPage: React.FC = () => { const navigate = useNavigate(); - const { register, isLoading, error, clearError, token } = useAuthStore(); + const { register, isLoading, error, clearError } = useAuthStore(); const [formData, setFormData] = useState({ login: "", password: "", @@ -14,12 +14,7 @@ export const RegisterPage: React.FC = () => { lastName: "", }); const [passwordError, setPasswordError] = useState(null); - - useEffect(() => { - if (token) { - navigate("/"); - } - }, [token, navigate]); + const [successMessage, setSuccessMessage] = useState(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); @@ -38,7 +33,17 @@ export const RegisterPage: React.FC = () => { firstName: formData.firstName, lastName: formData.lastName, }); - navigate("/"); + setSuccessMessage("Аккаунт успешно создан! Теперь вы можете войти."); + setFormData({ + login: "", + password: "", + confirmPassword: "", + firstName: "", + lastName: "", + }); + setTimeout(() => { + navigate("/auth"); + }, 2000); } catch (err) { // Error is handled by store } @@ -82,7 +87,10 @@ export const RegisterPage: React.FC = () => { className="w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center" style={{ backgroundColor: "var(--bg-secondary)" }} > - +

{

)} + {/* Success Message */} + {successMessage && ( +
+ {successMessage} +
+ )} + {/* Form */}
{/* Name Fields */} @@ -293,8 +315,16 @@ export const RegisterPage: React.FC = () => { className="mt-2 text-sm flex items-center gap-1" style={{ color: "var(--error-text)" }} > - - + + {passwordError}

@@ -311,7 +341,8 @@ export const RegisterPage: React.FC = () => { }} onMouseEnter={(e) => { if (!isLoading) { - e.currentTarget.style.backgroundColor = "var(--button-primary-hover)"; + e.currentTarget.style.backgroundColor = + "var(--button-primary-hover)"; } }} onMouseLeave={(e) => { From adbb0ee368d7e76cbec496a84c36408aebbd9234 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 06:05:51 +0300 Subject: [PATCH 10/48] feat: page tempaltes --- .../layout/navigation/navigation.tsx | 15 +- .../src/app/providers/routing/routing.tsx | 2 + .../src/modules/ide/components/FilePicker.tsx | 65 ++++++ .../modules/ide/components/FilePickerItem.tsx | 156 +++++++++++++++ frontend/src/modules/ide/components/index.ts | 2 + frontend/src/modules/ide/index.ts | 2 + .../modules/ide/store/useFilePickerStore.ts | 57 ++++++ frontend/src/pages/ide.page.tsx | 11 +- frontend/src/pages/templates.page.tsx | 189 ++++++++++++++++++ 9 files changed, 490 insertions(+), 9 deletions(-) create mode 100644 frontend/src/modules/ide/components/FilePicker.tsx create mode 100644 frontend/src/modules/ide/components/FilePickerItem.tsx create mode 100644 frontend/src/modules/ide/store/useFilePickerStore.ts create mode 100644 frontend/src/pages/templates.page.tsx diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx index 3c7a3be..7cd745e 100644 --- a/frontend/src/app/providers/layout/navigation/navigation.tsx +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -1,5 +1,5 @@ import { useNavigate, useLocation } from "react-router-dom"; -import { FaHome, FaServer, FaPalette, FaUser } from "react-icons/fa"; +import { FaHome, FaServer, FaPalette, FaUser, FaCode } from "react-icons/fa"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; export const Navigation = () => { @@ -10,6 +10,7 @@ export const Navigation = () => { const navItems = [ { path: "/", label: "Главная", icon: FaHome }, { path: "/add-agents", label: "Агенты", icon: FaServer }, + { path: "/templates", label: "Шаблоны", icon: FaCode }, { path: "/themes", label: "Темы", icon: FaPalette }, ]; @@ -50,11 +51,14 @@ export const Navigation = () => { className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium transition-all" style={{ backgroundColor: active ? "var(--accent)" : "transparent", - color: active ? "var(--accent-text)" : "var(--text-secondary)", + color: active + ? "var(--accent-text)" + : "var(--text-secondary)", }} onMouseEnter={(e) => { if (!active) { - e.currentTarget.style.backgroundColor = "var(--bg-secondary)"; + e.currentTarget.style.backgroundColor = + "var(--bg-secondary)"; e.currentTarget.style.color = "var(--text-primary)"; } }} @@ -82,7 +86,10 @@ export const Navigation = () => { >
- + {user.name}
diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index 131f5f6..05b6b27 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -9,6 +9,7 @@ import { RegisterPage } from "@/pages/register.page"; import { DefaultLayout } from "@/shared/layouts/DefaultLayout"; import { AddAgentsPage } from "@/pages/add-agents.page"; import { IDEPage } from "@/pages/ide.page"; +import { TemplatesPage } from "@/pages/templates.page"; export const mockGraphData: GraphData = { nodes: [ @@ -120,6 +121,7 @@ export const Routing = () => { } /> } /> } /> + } /> } /> diff --git a/frontend/src/modules/ide/components/FilePicker.tsx b/frontend/src/modules/ide/components/FilePicker.tsx new file mode 100644 index 0000000..e6441c9 --- /dev/null +++ b/frontend/src/modules/ide/components/FilePicker.tsx @@ -0,0 +1,65 @@ +import React from "react"; +import type { FileNode } from "../types"; +import { FilePickerItem } from "./FilePickerItem"; +import { useFilePickerStore } from "../store/useFilePickerStore"; + +interface FilePickerProps { + files: FileNode; +} + +const FilePickerTree: React.FC<{ node: FileNode; level: number }> = ({ + node, + level, +}) => { + const expandedFolders = useFilePickerStore((s) => s.expandedFolders); + const selectedPaths = useFilePickerStore((s) => s.selectedPaths); + const toggleSelection = useFilePickerStore((s) => s.toggleSelection); + const toggleFolder = useFilePickerStore((s) => s.toggleFolder); + + const nodePath = node.path || node.name; + const isExpanded = expandedFolders.has(nodePath); + const isSelected = node.type === "file" && selectedPaths.has(nodePath); + + if (node.type === "file") { + return ( + + ); + } + + return ( + <> + + {node.children?.map((child, idx) => ( + + ))} + + + ); +}; + +export const FilePicker: React.FC = ({ files }) => { + return ( +
+ +
+ ); +}; diff --git a/frontend/src/modules/ide/components/FilePickerItem.tsx b/frontend/src/modules/ide/components/FilePickerItem.tsx new file mode 100644 index 0000000..39aeddd --- /dev/null +++ b/frontend/src/modules/ide/components/FilePickerItem.tsx @@ -0,0 +1,156 @@ +import React from "react"; +import { + FiChevronRight, + FiChevronDown, + FiFile, + FiFolder, +} from "react-icons/fi"; + +interface FilePickerItemProps { + name: string; + type: "file" | "folder"; + path: string; + isSelected?: boolean; + isExpanded?: boolean; + children?: React.ReactNode; + level: number; + onToggleSelect?: (path: string) => void; + onToggleFolder?: (path: string) => void; +} + +export const FilePickerItem: React.FC = ({ + name, + type, + path, + isSelected, + isExpanded, + children, + level, + onToggleSelect, + onToggleFolder, +}) => { + const isFolder = type === "folder"; + const extension = name.includes(".") + ? name.split(".").pop()?.toUpperCase() + : ""; + const paddingLeft = 12 + level * 20; + + return ( +
+
{ + if (isFolder && onToggleFolder) { + onToggleFolder(path); + } else if (!isFolder && onToggleSelect) { + onToggleSelect(path); + } + }} + onMouseEnter={(e) => { + e.currentTarget.style.backgroundColor = "#2a2a2a"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "transparent"; + }} + > + {/* Folder expand icon */} + {isFolder && ( + + {isExpanded ? ( + + ) : ( + + )} + + )} + + {/* File/Folder icon */} + + {isFolder ? ( + + ) : ( + + )} + + + {/* Name */} + + {name} + + + {/* Extension badge — только у файлов */} + {!isFolder && extension && ( + + {extension} + + )} + + {/* Checkbox — только у файлов */} + {!isFolder && onToggleSelect && ( +
{ + e.stopPropagation(); + onToggleSelect(path); + }} + > + {isSelected && ( + + + + )} +
+ )} +
+ + {/* Children */} + {isFolder && isExpanded && children} +
+ ); +}; diff --git a/frontend/src/modules/ide/components/index.ts b/frontend/src/modules/ide/components/index.ts index 95f10f9..7a2a8e9 100644 --- a/frontend/src/modules/ide/components/index.ts +++ b/frontend/src/modules/ide/components/index.ts @@ -6,3 +6,5 @@ export { TabBar } from "./TabBar"; export { CodeEditor } from "./CodeEditor"; export { TitleBar } from "./TitleBar"; export { StatusBar } from "./StatusBar"; +export { FilePickerItem } from "./FilePickerItem"; +export { FilePicker } from "./FilePicker"; diff --git a/frontend/src/modules/ide/index.ts b/frontend/src/modules/ide/index.ts index caeba36..294db1d 100644 --- a/frontend/src/modules/ide/index.ts +++ b/frontend/src/modules/ide/index.ts @@ -1,3 +1,5 @@ export { IDE } from "./IDE"; +export { FilePicker } from "./components/FilePicker"; export { useIDEStore, initialFiles } from "./store/useIDEStore"; +export { useFilePickerStore } from "./store/useFilePickerStore"; export type { FileNode } from "./types"; diff --git a/frontend/src/modules/ide/store/useFilePickerStore.ts b/frontend/src/modules/ide/store/useFilePickerStore.ts new file mode 100644 index 0000000..e6b9e74 --- /dev/null +++ b/frontend/src/modules/ide/store/useFilePickerStore.ts @@ -0,0 +1,57 @@ +import { create } from "zustand"; + +interface FilePickerState { + selectedPaths: Set; + expandedFolders: Set; + + toggleSelection: (path: string) => void; + selectAll: (paths: string[]) => void; + clearSelection: () => void; + toggleFolder: (path: string) => void; + getSelectedPaths: () => string[]; +} + +export const useFilePickerStore = create((set, get) => ({ + selectedPaths: new Set(), + expandedFolders: new Set(), + + toggleSelection: (path: string) => { + set((state) => { + const newSet = new Set(state.selectedPaths); + if (newSet.has(path)) { + newSet.delete(path); + } else { + newSet.add(path); + } + return { selectedPaths: newSet }; + }); + }, + + selectAll: (paths: string[]) => { + set((state) => { + const newSet = new Set(state.selectedPaths); + paths.forEach((p) => newSet.add(p)); + return { selectedPaths: newSet }; + }); + }, + + clearSelection: () => { + set({ selectedPaths: new Set() }); + }, + + toggleFolder: (path: string) => { + set((state) => { + const newSet = new Set(state.expandedFolders); + if (newSet.has(path)) { + newSet.delete(path); + } else { + newSet.add(path); + } + return { expandedFolders: newSet }; + }); + }, + + getSelectedPaths: () => { + return Array.from(get().selectedPaths); + }, +})); diff --git a/frontend/src/pages/ide.page.tsx b/frontend/src/pages/ide.page.tsx index 7097165..d518e94 100644 --- a/frontend/src/pages/ide.page.tsx +++ b/frontend/src/pages/ide.page.tsx @@ -1,14 +1,15 @@ -import { useNavigate } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { IDE } from "../modules/ide"; +import type { FileNode } from "../modules/ide"; export const IDEPage = () => { const navigate = useNavigate(); + const location = useLocation(); + const files: FileNode | undefined = location.state?.files; + return (
- navigate("/home")} - initialFiles={{ name: "тест", type: "folder" }} - /> + navigate("/templates")} initialFiles={files} />
); }; diff --git a/frontend/src/pages/templates.page.tsx b/frontend/src/pages/templates.page.tsx new file mode 100644 index 0000000..2cc3561 --- /dev/null +++ b/frontend/src/pages/templates.page.tsx @@ -0,0 +1,189 @@ +import { useNavigate } from "react-router-dom"; +import { FiEdit3, FiPlay } from "react-icons/fi"; +import { FilePicker, useFilePickerStore } from "../modules/ide"; +import type { FileNode } from "../modules/ide"; + +const mockFiles: FileNode = { + name: "templates", + type: "folder", + children: [ + { + name: "python-basic", + type: "folder", + children: [ + { + name: "src", + type: "folder", + children: [ + { + name: "main.py", + type: "file", + content: + 'print("Hello, World!")\n\ndef main():\n print("Welcome!")\n\nif __name__ == "__main__":\n main()', + }, + { + name: "utils.py", + type: "file", + content: "def helper():\n return 42", + }, + ], + }, + { + name: "README.md", + type: "file", + content: "# Python Project\n\nA basic Python project.", + }, + ], + }, + { + name: "react-starter", + type: "folder", + children: [ + { + name: "src", + type: "folder", + children: [ + { + name: "App.tsx", + type: "file", + content: + 'import React from "react";\n\nexport const App: React.FC = () => {\n return
Hello React!
;\n};', + }, + { + name: "index.tsx", + type: "file", + content: + 'import React from "react";\nimport { createRoot } from "react-dom/client";\nimport { App } from "./App";\n\ncreateRoot(document.getElementById("root")!).render();', + }, + ], + }, + { + name: "package.json", + type: "file", + content: '{\n "name": "react-project",\n "version": "1.0.0"\n}', + }, + ], + }, + { + name: "node-api", + type: "folder", + children: [ + { + name: "src", + type: "folder", + children: [ + { + name: "index.js", + type: "file", + content: + 'const express = require("express");\nconst app = express();\nconst PORT = 3000;\n\napp.get("/", (req, res) => {\n res.json({ message: "Hello!" });\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});', + }, + ], + }, + { + name: "package.json", + type: "file", + content: + '{\n "name": "api-project",\n "dependencies": {\n "express": "^4.18.0"\n }\n}', + }, + ], + }, + { + name: "html-css", + type: "folder", + children: [ + { + name: "index.html", + type: "file", + content: + '\n\n\n My Landing\n \n\n\n

Welcome!

\n\n', + }, + { + name: "styles.css", + type: "file", + content: + "body {\n font-family: sans-serif;\n margin: 0;\n padding: 2rem;\n background: #f5f5f5;\n}\n\nh1 {\n color: #333;\n}", + }, + ], + }, + ], +}; + +export const TemplatesPage = () => { + const navigate = useNavigate(); + const selectedPaths = useFilePickerStore((s) => s.selectedPaths); + + return ( +
+ {/* Floating header */} +
+ {/* Running scripts counter */} +
+ + + {selectedPaths.size} script{selectedPaths.size !== 1 ? "s" : ""}{" "} + running + +
+ + {/* Open in Editor button */} + +
+ + {/* File Picker */} +
+ +
+
+ ); +}; From 95a6902dae7ddd1664a9daf28b61f78343ffc0d7 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 06:13:12 +0300 Subject: [PATCH 11/48] feat: create logs --- .../layout/navigation/navigation.tsx | 2 + .../src/app/providers/routing/routing.tsx | 2 + .../modules/agent/store/logFilter.store.ts | 86 ++++ frontend/src/modules/agent/ui/LogFilters.tsx | 399 ++++++++++++++++++ frontend/src/pages/logs.page.tsx | 295 +++++++++++++ 5 files changed, 784 insertions(+) create mode 100644 frontend/src/modules/agent/store/logFilter.store.ts create mode 100644 frontend/src/modules/agent/ui/LogFilters.tsx create mode 100644 frontend/src/pages/logs.page.tsx diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx index 01f4887..b1e03cf 100644 --- a/frontend/src/app/providers/layout/navigation/navigation.tsx +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -7,6 +7,7 @@ import { FaUsers, FaRocket, FaKey, + FaFileAlt, } from "react-icons/fa"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; @@ -19,6 +20,7 @@ export const Navigation = () => { { path: "/", label: "Главная", icon: FaHome }, { path: "/add-agents", label: "Деплой", icon: FaRocket }, { path: "/registration", label: "Регистрация", icon: FaKey }, + { path: "/logs", label: "Логи", icon: FaFileAlt }, { path: "/admin", label: "Админка", icon: FaUsers, adminOnly: true }, { path: "/themes", label: "Темы", icon: FaPalette }, ]; diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index 3b436c4..6722b29 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -11,6 +11,7 @@ import { AddAgentsPage } from "@/pages/add-agents.page"; import { IDEPage } from "@/pages/ide.page"; import { AdminPage } from "@/pages/admin.page"; import { RegistrationTokenPage } from "@/pages/registration.page"; +import { LogsPage } from "@/pages/logs.page"; export const mockGraphData: GraphData = { nodes: [ @@ -122,6 +123,7 @@ export const Routing = () => { } /> } /> } /> + } /> } /> } /> diff --git a/frontend/src/modules/agent/store/logFilter.store.ts b/frontend/src/modules/agent/store/logFilter.store.ts new file mode 100644 index 0000000..c736e60 --- /dev/null +++ b/frontend/src/modules/agent/store/logFilter.store.ts @@ -0,0 +1,86 @@ +import { create } from "zustand"; + +export type LogLevel = "INFO" | "WARNING" | "ERROR" | "FATAL"; + +interface LogFilterState { + searchQuery: string; + startDate: Date | null; + endDate: Date | null; + selectedLogLevels: LogLevel[]; + selectedService: string; + selectedAgent: string; + limit: number; + offset: number; + + setSearchQuery: (query: string) => void; + setStartDate: (date: Date | null) => void; + setEndDate: (date: Date | null) => void; + toggleLogLevel: (level: LogLevel) => void; + setSelectedService: (service: string) => void; + setSelectedAgent: (agent: string) => void; + setLimit: (limit: number) => void; + setOffset: (offset: number) => void; + resetFilters: () => void; + getFilters: () => { + level?: string; + service?: string; + agent?: string; + date_from?: string; + date_to?: string; + limit: number; + offset: number; + }; +} + +export const useLogFilterStore = create((set, get) => ({ + searchQuery: "", + startDate: null, + endDate: null, + selectedLogLevels: ["INFO", "WARNING", "ERROR", "FATAL"], + selectedService: "", + selectedAgent: "", + limit: 100, + offset: 0, + + setSearchQuery: (query) => set({ searchQuery: query }), + setStartDate: (date) => set({ startDate: date }), + setEndDate: (date) => set({ endDate: date }), + toggleLogLevel: (level) => { + const { selectedLogLevels } = get(); + if (selectedLogLevels.includes(level)) { + set({ selectedLogLevels: selectedLogLevels.filter((l) => l !== level) }); + } else { + set({ selectedLogLevels: [...selectedLogLevels, level] }); + } + }, + setSelectedService: (service) => set({ selectedService: service }), + setSelectedAgent: (agent) => set({ selectedAgent: agent }), + setLimit: (limit) => set({ limit }), + setOffset: (offset) => set({ offset }), + + resetFilters: () => { + set({ + searchQuery: "", + startDate: null, + endDate: null, + selectedLogLevels: ["INFO", "WARNING", "ERROR", "FATAL"], + selectedService: "", + selectedAgent: "", + limit: 100, + offset: 0, + }); + }, + + getFilters: () => { + const { selectedLogLevels, selectedService, selectedAgent, startDate, endDate, limit, offset } = get(); + return { + level: selectedLogLevels.length > 0 ? selectedLogLevels.join(",") : undefined, + service: selectedService || undefined, + agent: selectedAgent || undefined, + date_from: startDate ? startDate.toISOString() : undefined, + date_to: endDate ? endDate.toISOString() : undefined, + limit, + offset, + }; + }, +})); diff --git a/frontend/src/modules/agent/ui/LogFilters.tsx b/frontend/src/modules/agent/ui/LogFilters.tsx new file mode 100644 index 0000000..4457628 --- /dev/null +++ b/frontend/src/modules/agent/ui/LogFilters.tsx @@ -0,0 +1,399 @@ +import React, { useState, useEffect, useCallback } from "react"; +import { + FiSearch, + FiX, + FiFilter, + FiCalendar, + FiTag, + FiCheck, +} from "react-icons/fi"; +import { useLogFilterStore, type LogLevel } from "../store/logFilter.store"; + +const logLevelColors: Record = { + INFO: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)" }, + WARNING: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)" }, + ERROR: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)" }, + FATAL: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)" }, +}; + +interface LogFiltersProps { + onApply: () => void; + availableServices: string[]; + availableAgents: string[]; +} + +export const LogFilters: React.FC = ({ onApply, availableServices, availableAgents }) => { + const { + searchQuery, + startDate, + endDate, + selectedLogLevels, + selectedService, + selectedAgent, + setSearchQuery, + setStartDate, + setEndDate, + toggleLogLevel, + setSelectedService, + setSelectedAgent, + resetFilters, + } = useLogFilterStore(); + + const [localSearchQuery, setLocalSearchQuery] = useState(searchQuery); + const [localStartDate, setLocalStartDate] = useState(startDate); + const [localEndDate, setLocalEndDate] = useState(endDate); + const [localService, setLocalService] = useState(selectedService); + const [localAgent, setLocalAgent] = useState(selectedAgent); + + useEffect(() => { + setLocalSearchQuery(searchQuery); + }, [searchQuery]); + + useEffect(() => { + setLocalStartDate(startDate); + }, [startDate]); + + useEffect(() => { + setLocalEndDate(endDate); + }, [endDate]); + + useEffect(() => { + setLocalService(selectedService); + }, [selectedService]); + + useEffect(() => { + setLocalAgent(selectedAgent); + }, [selectedAgent]); + + const handleApply = useCallback(() => { + setSearchQuery(localSearchQuery); + setStartDate(localStartDate); + setEndDate(localEndDate); + setSelectedService(localService); + setSelectedAgent(localAgent); + onApply(); + }, [localSearchQuery, localStartDate, localEndDate, localService, localAgent, onApply]); + + const handleReset = useCallback(() => { + setLocalSearchQuery(""); + setLocalStartDate(null); + setLocalEndDate(null); + setLocalService(""); + setLocalAgent(""); + resetFilters(); + onApply(); + }, [resetFilters, onApply]); + + const getActiveFiltersCount = () => { + let count = 0; + if (searchQuery) count++; + if (startDate) count++; + if (endDate) count++; + if (selectedService) count++; + if (selectedAgent) count++; + if (selectedLogLevels.length < 4) count++; + return count; + }; + + const formatDate = (date: Date | null) => { + if (!date) return null; + return date.toLocaleDateString("ru-RU"); + }; + + const activeFiltersCount = getActiveFiltersCount(); + + const inputStyle: React.CSSProperties = { + width: "100%", + padding: "8px 12px", + border: "1px solid var(--border)", + borderRadius: "6px", + backgroundColor: "var(--input-bg)", + color: "var(--text-primary)", + fontSize: "13px", + }; + + const selectStyle: React.CSSProperties = { + ...inputStyle, + cursor: "pointer", + }; + + return ( +
+
+ {/* Header */} +
+
+ +

+ Фильтры логов +

+
+ + Активно: {activeFiltersCount} + +
+ + {/* Filters Grid */} +
+ {/* Search */} +
+ + setLocalSearchQuery(e.target.value)} + placeholder="Поиск по сообщению..." + style={{ ...inputStyle, paddingLeft: "32px" }} + onKeyDown={(e) => e.key === "Enter" && handleApply()} + /> +
+ + {/* Service Select */} + + + {/* Agent Select */} + + + {/* Date Range */} +
+ setLocalStartDate(e.target.value ? new Date(e.target.value) : null)} + style={inputStyle} + placeholder="Дата от" + /> + setLocalEndDate(e.target.value ? new Date(e.target.value) : null)} + style={inputStyle} + placeholder="Дата до" + /> +
+
+ + {/* Log Levels */} +
+
+ + + Уровни логов + + + ({selectedLogLevels.length}/4) + +
+
+ {(["INFO", "WARNING", "ERROR", "FATAL"] as LogLevel[]).map((level) => { + const isSelected = selectedLogLevels.includes(level); + const colors = logLevelColors[level]; + return ( + + ); + })} +
+
+ + {/* Action Buttons */} +
+ + +
+ + {/* Active Filters Display */} + {activeFiltersCount > 0 && ( +
+
+ + + Активные фильтры: + +
+
+ {searchQuery && ( +
+ + Поиск: {searchQuery} + +
+ )} + {selectedService && ( +
+ + Сервис: {selectedService} + +
+ )} + {selectedAgent && ( +
+ + Агент: {selectedAgent} + +
+ )} + {startDate && ( +
+ + С: {formatDate(startDate)} + +
+ )} + {endDate && ( +
+ + По: {formatDate(endDate)} + +
+ )} +
+
+ )} +
+
+ ); +}; diff --git a/frontend/src/pages/logs.page.tsx b/frontend/src/pages/logs.page.tsx new file mode 100644 index 0000000..bedc742 --- /dev/null +++ b/frontend/src/pages/logs.page.tsx @@ -0,0 +1,295 @@ +import React, { useState, useEffect, useCallback } from "react"; +import { agentApiService } from "@/modules/agent"; +import type { LogEntry } from "@/modules/agent"; +import { LogFilters } from "@/modules/agent/ui/LogFilters"; +import { useLogFilterStore } from "@/modules/agent/store/logFilter.store"; +import { + FiFileText, + FiRefreshCw, + FiChevronLeft, + FiChevronRight, + FiInfo, + FiAlertTriangle, + FiAlertCircle, + FiXOctagon, +} from "react-icons/fi"; + +const logLevelIcons: Record = { + INFO: , + WARNING: , + ERROR: , + FATAL: , +}; + +const logLevelColors: Record = { + INFO: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)" }, + WARNING: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)" }, + ERROR: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)" }, + FATAL: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)" }, +}; + +export const LogsPage: React.FC = () => { + const [logs, setLogs] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [availableServices, setAvailableServices] = useState([]); + const [availableAgents, setAvailableAgents] = useState([]); + const [totalLogs, setTotalLogs] = useState(0); + + const { getFilters, limit, offset, setOffset } = useLogFilterStore(); + + const fetchLogs = useCallback(async () => { + setIsLoading(true); + setError(null); + try { + const filters = getFilters(); + const data = await agentApiService.searchLogs(filters); + setLogs(data); + setTotalLogs(data.length); + } catch (err) { + setError(err instanceof Error ? err.message : "Ошибка при загрузке логов"); + } finally { + setIsLoading(false); + } + }, [getFilters]); + + const fetchDistinctData = useCallback(async () => { + try { + const [services, agents] = await Promise.all([ + agentApiService.getDistinctServices(), + agentApiService.getDistinctAgents(), + ]); + setAvailableServices(services); + setAvailableAgents(agents); + } catch (err) { + console.error("Failed to fetch distinct data:", err); + } + }, []); + + useEffect(() => { + fetchDistinctData(); + }, [fetchDistinctData]); + + useEffect(() => { + fetchLogs(); + }, [fetchLogs, offset, limit]); + + const handleFilterApply = () => { + setOffset(0); + fetchLogs(); + }; + + const handleNextPage = () => { + setOffset(offset + limit); + }; + + const handlePrevPage = () => { + setOffset(Math.max(0, offset - limit)); + }; + + const formatTimestamp = (timestamp: string) => { + const date = new Date(timestamp); + return date.toLocaleString("ru-RU", { + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }); + }; + + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

+ Поиск логов +

+

+ Фильтрация и анализ логов системы +

+
+
+
+ + {/* Filters */} +
+ +
+ + {/* Error Message */} + {error && ( +
+ {error} +
+ )} + + {/* Logs Table */} +
+ {/* Table Header */} +
+ + Найдено: {totalLogs} записей + + +
+ + {isLoading ? ( +
+ + Загрузка логов... +
+ ) : logs.length === 0 ? ( +
+ Логи не найдены +
+ ) : ( + <> +
+ + + + + + + + + + + + {logs.map((log, index) => { + const colors = logLevelColors[log.level] || logLevelColors.INFO; + return ( + + + + + + + + ); + })} + +
+ Время + + Уровень + + Сервис + + Агент + + Сообщение +
+ {formatTimestamp(log.timestamp)} + + + {logLevelIcons[log.level]} + {log.level} + + + {log.service} + + {log.agent} + + {log.message} +
+
+ + {/* Pagination */} +
+ + + Показано {logs.length} записей (смещение: {offset}) + + +
+ + )} +
+
+
+ ); +}; From eedc9c9b6290c19773d486ecf8db3266520175ef Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 07:06:27 +0300 Subject: [PATCH 12/48] fix: menu adaptive --- .../layout/navigation/navigation.tsx | 96 ++++++++----------- frontend/src/shared/styles/index.css | 10 ++ 2 files changed, 52 insertions(+), 54 deletions(-) diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx index 9442195..14ea644 100644 --- a/frontend/src/app/providers/layout/navigation/navigation.tsx +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -39,60 +39,48 @@ export const Navigation = () => { }} >
- {/* Логотип */} -
navigate("/")} - > - - - HellreigN - -
- - {/* Навигация */} -
- {navItems - .filter((item) => { - if (item.adminOnly && !user?.permission_admin) return false; - return true; - }) - .map((item) => { - const Icon = item.icon; - const active = isActive(item.path); - return ( - - ); - })} + {/* Навигация с горизонтальным скроллом */} +
+
+ {navItems + .filter((item) => { + if (item.adminOnly && !user?.permission_admin) return false; + return true; + }) + .map((item) => { + const Icon = item.icon; + const active = isActive(item.path); + return ( + + ); + })} +
{/* Профиль пользователя */} diff --git a/frontend/src/shared/styles/index.css b/frontend/src/shared/styles/index.css index 755d870..580b131 100644 --- a/frontend/src/shared/styles/index.css +++ b/frontend/src/shared/styles/index.css @@ -2,3 +2,13 @@ @import "./normalize.css"; @import "./root.css"; @import "./themes.css"; + +/* Hide scrollbar but keep functionality */ +.scrollbar-hide { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.scrollbar-hide::-webkit-scrollbar { + display: none; /* Chrome, Safari and Opera */ +} From dd921e5892793dd6f97ecf8b3c46d332068b32d4 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 07:11:41 +0300 Subject: [PATCH 13/48] fix: logs filter adaptive --- frontend/src/modules/agent/ui/LogFilters.tsx | 199 ++++++++++++++----- 1 file changed, 149 insertions(+), 50 deletions(-) diff --git a/frontend/src/modules/agent/ui/LogFilters.tsx b/frontend/src/modules/agent/ui/LogFilters.tsx index 4457628..36ba5fb 100644 --- a/frontend/src/modules/agent/ui/LogFilters.tsx +++ b/frontend/src/modules/agent/ui/LogFilters.tsx @@ -9,11 +9,30 @@ import { } from "react-icons/fi"; import { useLogFilterStore, type LogLevel } from "../store/logFilter.store"; -const logLevelColors: Record = { - INFO: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)" }, - WARNING: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)" }, - ERROR: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)" }, - FATAL: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)" }, +const logLevelColors: Record< + LogLevel, + { bg: string; text: string; border: string } +> = { + INFO: { + bg: "var(--info-bg)", + text: "var(--info-text)", + border: "var(--info-border)", + }, + WARNING: { + bg: "var(--warning-bg)", + text: "var(--warning-text)", + border: "var(--warning-border)", + }, + ERROR: { + bg: "var(--error-bg)", + text: "var(--error-text)", + border: "var(--error-border)", + }, + FATAL: { + bg: "var(--fatal-bg)", + text: "var(--fatal-text)", + border: "var(--fatal-border)", + }, }; interface LogFiltersProps { @@ -22,7 +41,11 @@ interface LogFiltersProps { availableAgents: string[]; } -export const LogFilters: React.FC = ({ onApply, availableServices, availableAgents }) => { +export const LogFilters: React.FC = ({ + onApply, + availableServices, + availableAgents, +}) => { const { searchQuery, startDate, @@ -72,7 +95,14 @@ export const LogFilters: React.FC = ({ onApply, availableServic setSelectedService(localService); setSelectedAgent(localAgent); onApply(); - }, [localSearchQuery, localStartDate, localEndDate, localService, localAgent, onApply]); + }, [ + localSearchQuery, + localStartDate, + localEndDate, + localService, + localAgent, + onApply, + ]); const handleReset = useCallback(() => { setLocalSearchQuery(""); @@ -130,7 +160,10 @@ export const LogFilters: React.FC = ({ onApply, availableServic
-

+

Фильтры логов

@@ -140,7 +173,7 @@ export const LogFilters: React.FC = ({ onApply, availableServic
{/* Filters Grid */} -
+
{/* Search */}
= ({ onApply, availableServic
setLocalStartDate(e.target.value ? new Date(e.target.value) : null)} - style={inputStyle} + value={ + localStartDate ? localStartDate.toISOString().split("T")[0] : "" + } + onChange={(e) => + setLocalStartDate( + e.target.value ? new Date(e.target.value) : null, + ) + } + style={{ ...inputStyle, minWidth: 0 }} placeholder="Дата от" + className="flex-1 min-w-0" /> setLocalEndDate(e.target.value ? new Date(e.target.value) : null)} - style={inputStyle} + value={ + localEndDate ? localEndDate.toISOString().split("T")[0] : "" + } + onChange={(e) => + setLocalEndDate( + e.target.value ? new Date(e.target.value) : null, + ) + } + style={{ ...inputStyle, minWidth: 0 }} placeholder="Дата до" + className="flex-1 min-w-0" />
@@ -214,7 +261,10 @@ export const LogFilters: React.FC = ({ onApply, availableServic
- + Уровни логов @@ -222,36 +272,42 @@ export const LogFilters: React.FC = ({ onApply, availableServic
- {(["INFO", "WARNING", "ERROR", "FATAL"] as LogLevel[]).map((level) => { - const isSelected = selectedLogLevels.includes(level); - const colors = logLevelColors[level]; - return ( - - ); - })} + {(["INFO", "WARNING", "ERROR", "FATAL"] as LogLevel[]).map( + (level) => { + const isSelected = selectedLogLevels.includes(level); + const colors = logLevelColors[level]; + return ( + + ); + }, + )}
{/* Action Buttons */} -
+
{/* Active Filters Display */} {activeFiltersCount > 0 && ( -
+
- + Активные фильтры:
@@ -289,14 +353,21 @@ export const LogFilters: React.FC = ({ onApply, availableServic }} > - Поиск: {searchQuery} + + Поиск: {searchQuery} + @@ -311,14 +382,21 @@ export const LogFilters: React.FC = ({ onApply, availableServic }} > - Сервис: {selectedService} + + Сервис: {selectedService} + @@ -333,14 +411,21 @@ export const LogFilters: React.FC = ({ onApply, availableServic }} > - Агент: {selectedAgent} + + Агент: {selectedAgent} + @@ -355,14 +440,21 @@ export const LogFilters: React.FC = ({ onApply, availableServic }} > - С: {formatDate(startDate)} + + С: {formatDate(startDate)} + @@ -377,14 +469,21 @@ export const LogFilters: React.FC = ({ onApply, availableServic }} > - По: {formatDate(endDate)} + + По: {formatDate(endDate)} + From 26ca7c0d51d0f5541f10b9eb4b2e8b539108142d Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 11:08:45 +0300 Subject: [PATCH 14/48] redezign: list agents & services; feat: button remove agents --- .../app/providers/layout/sidebar/sidebar.tsx | 310 ++++++++++++++---- .../app/providers/layout/store/agent.store.ts | 34 +- frontend/src/shared/api/websocket.service.ts | 2 +- 3 files changed, 279 insertions(+), 67 deletions(-) diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx index 5f20adf..bc22ebe 100644 --- a/frontend/src/app/providers/layout/sidebar/sidebar.tsx +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -1,5 +1,16 @@ import React, { useMemo, useState } from "react"; -import { FaBars, FaMicrochip, FaTimes, FaSpinner, FaCopy, FaCheck } from "react-icons/fa"; +import { + FaBars, + FaMicrochip, + FaTimes, + FaSpinner, + FaCopy, + FaCheck, + FaChevronRight, + FaChevronDown, + FaProjectDiagram, + FaTrash, +} from "react-icons/fa"; import { useAgentStore } from "@/app/providers/layout/store/agent.store"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; @@ -8,12 +19,28 @@ interface SidebarProps { onToggle?: () => void; } -export const Sidebar: React.FC = ({ isOpen = true, onToggle }) => { - const { agents, isLoading, error, fetchAgents } = useAgentStore(); +export const Sidebar: React.FC = ({ + isOpen = true, + onToggle, +}) => { + const { agents, isLoading, error, fetchAgents, removeAgent } = + useAgentStore(); const { token } = useAuthStore(); const [searchQuery, setSearchQuery] = useState(""); const [copied, setCopied] = useState(false); const [showTokenModal, setShowTokenModal] = useState(false); + const [expandedAgents, setExpandedAgents] = useState>( + new Set(agents.map((a) => a.name)), + ); + + const toggleAgent = (name: string) => { + setExpandedAgents((prev) => { + const next = new Set(prev); + if (next.has(name)) next.delete(name); + else next.add(name); + return next; + }); + }; const filteredAgents = useMemo(() => { if (!searchQuery) return agents; @@ -21,7 +48,7 @@ export const Sidebar: React.FC = ({ isOpen = true, onToggle }) => return agents.filter( (agent) => agent.name.toLowerCase().includes(query) || - agent.services.some((s) => s.name.toLowerCase().includes(query)) + agent.services.some((s) => s.name.toLowerCase().includes(query)), ); }, [agents, searchQuery]); @@ -38,7 +65,10 @@ export const Sidebar: React.FC = ({ isOpen = true, onToggle }) =>
) : filteredAgents.length === 0 ? ( -
+

{searchQuery ? "Ничего не найдено" : "Нет агентов"} @@ -141,58 +189,153 @@ export const Sidebar: React.FC = ({ isOpen = true, onToggle }) =>

) : (
- {filteredAgents.map((agent) => ( -
-
- - {agent.name} - -
-
- {agent.services.map((service) => ( -
{ + const isExpanded = expandedAgents.has(agent.name); + return ( +
+ {/* Agent header — кликабельный для сворачивания */} +
toggleAgent(agent.name)} + > + + {isExpanded ? ( + + ) : ( + + )} + + + - {service.name} + {agent.name} + + {/* Статус-индикатор агента (сколько сервисов запущено) */} +
+ {agent.services.filter((s) => s.status === "running") + .length > 0 && ( + + )} - {service.status} + { + agent.services.filter((s) => s.status === "running") + .length + } + /{agent.services.length}
- ))} + {/* Кнопка удаления — появляется при наведении */} + +
+ + {/* Services list — сворачивается */} + {isExpanded && ( +
+
+ {agent.services.map((service) => { + const isRunning = service.status === "running"; + const isError = service.status === "error"; + const isStopped = + service.status === "stopped" || !isRunning; + + return ( +
+ + {service.name} + + {/* Status indicator */} +
+ + + {isRunning + ? "run" + : isError + ? "err" + : "stop"} + +
+
+ ); + })} +
+
+ )}
-
- ))} + ); + })}
)}
@@ -200,8 +343,29 @@ export const Sidebar: React.FC = ({ isOpen = true, onToggle }) => {/* Footer с кнопками */}
+ {/* Кнопка Графы */} + diff --git a/frontend/src/app/providers/layout/store/agent.store.ts b/frontend/src/app/providers/layout/store/agent.store.ts index 33f4352..fb00e96 100644 --- a/frontend/src/app/providers/layout/store/agent.store.ts +++ b/frontend/src/app/providers/layout/store/agent.store.ts @@ -10,8 +10,37 @@ interface AgentState { removeAgent: (name: string) => void; } +const mockAgents: AgentInfo[] = [ + { + name: "agent-core-01", + token: "tok_a1b2c3d4e5f6g7h8", + services: [ + { name: "postgres", status: "running" }, + { name: "redis", status: "running" }, + { name: "log-collector", status: "running" }, + ], + }, + { + name: "agent-worker-02", + token: "tok_x9y8z7w6v5u4t3s2", + services: [ + { name: "celery-worker", status: "running" }, + { name: "flower", status: "stopped" }, + ], + }, + { + name: "agent-monitor-03", + token: "tok_m1n2o3p4q5r6s7t8", + services: [ + { name: "prometheus", status: "running" }, + { name: "grafana", status: "running" }, + { name: "alertmanager", status: "stopped" }, + ], + }, +]; + export const useAgentStore = create()((set, get) => ({ - agents: [], + agents: mockAgents, isLoading: false, error: null, @@ -22,7 +51,8 @@ export const useAgentStore = create()((set, get) => ({ set({ agents, isLoading: false }); } catch (error) { set({ - error: error instanceof Error ? error.message : "Failed to fetch agents", + error: + error instanceof Error ? error.message : "Failed to fetch agents", isLoading: false, }); } diff --git a/frontend/src/shared/api/websocket.service.ts b/frontend/src/shared/api/websocket.service.ts index 08419b9..6d72ea8 100644 --- a/frontend/src/shared/api/websocket.service.ts +++ b/frontend/src/shared/api/websocket.service.ts @@ -1,5 +1,5 @@ // shared/api/websocket.service.ts -import { useAgentStore } from "@/components/layout/sidebar/store/agent.store"; +import { useAgentStore } from "@/app/providers/layout/store/agent.store"; import { useWebSocket, type LogMessage } from "@/shared/hooks/useWebSocket"; import { useEffect, useRef, useCallback, useMemo } from "react"; From aac3fa3758585f981ddf3c1bf7245c0cc2ac3d4c Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 12:14:17 +0300 Subject: [PATCH 15/48] feat: graph-page --- frontend/.qwen/settings.json | 3 +- .../app/providers/layout/sidebar/sidebar.tsx | 3 + .../src/app/providers/routing/routing.tsx | 6 +- frontend/src/modules/graph/Graph.tsx | 125 ++++ .../modules/graph/components/ForceGraph.tsx | 162 ++++++ .../graph/components/GraphContextMenu.tsx | 87 +++ .../graph/components/GraphControls.tsx | 149 +++++ .../graph/components/GraphStatusBar.tsx | 24 + .../src/modules/graph/components/index.ts | 4 + frontend/src/modules/graph/index.ts | 3 + .../src/modules/graph/store/useGraphStore.ts | 113 ++++ frontend/src/modules/graph/types.ts | 27 + frontend/src/pages/graphs.page.tsx | 54 ++ frontend/src/pages/test2.page.tsx | 534 ------------------ 14 files changed, 757 insertions(+), 537 deletions(-) create mode 100644 frontend/src/modules/graph/Graph.tsx create mode 100644 frontend/src/modules/graph/components/ForceGraph.tsx create mode 100644 frontend/src/modules/graph/components/GraphContextMenu.tsx create mode 100644 frontend/src/modules/graph/components/GraphControls.tsx create mode 100644 frontend/src/modules/graph/components/GraphStatusBar.tsx create mode 100644 frontend/src/modules/graph/components/index.ts create mode 100644 frontend/src/modules/graph/index.ts create mode 100644 frontend/src/modules/graph/store/useGraphStore.ts create mode 100644 frontend/src/modules/graph/types.ts create mode 100644 frontend/src/pages/graphs.page.tsx delete mode 100644 frontend/src/pages/test2.page.tsx diff --git a/frontend/.qwen/settings.json b/frontend/.qwen/settings.json index 627a679..e8c96d2 100644 --- a/frontend/.qwen/settings.json +++ b/frontend/.qwen/settings.json @@ -7,7 +7,8 @@ "Bash(type *)", "Bash(dir)", "Bash(move *)", - "Bash(findstr *)" + "Bash(findstr *)", + "Bash(del *)" ] }, "$version": 3 diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx index bc22ebe..5685785 100644 --- a/frontend/src/app/providers/layout/sidebar/sidebar.tsx +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -11,6 +11,7 @@ import { FaProjectDiagram, FaTrash, } from "react-icons/fa"; +import { useNavigate } from "react-router-dom"; import { useAgentStore } from "@/app/providers/layout/store/agent.store"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; @@ -23,6 +24,7 @@ export const Sidebar: React.FC = ({ isOpen = true, onToggle, }) => { + const navigate = useNavigate(); const { agents, isLoading, error, fetchAgents, removeAgent } = useAgentStore(); const { token } = useAuthStore(); @@ -350,6 +352,7 @@ export const Sidebar: React.FC = ({ > {/* Кнопка Графы */} + + + )} + {menu.link && ( + <> +
+ Связь:{" "} + {typeof menu.link.source === "string" + ? menu.link.source + : (menu.link.source as any).name || (menu.link.source as any).id}{" "} + →{" "} + {typeof menu.link.target === "string" + ? menu.link.target + : (menu.link.target as any).name || (menu.link.target as any).id} +
+ + + )} +
+ ); +}; diff --git a/frontend/src/modules/graph/components/GraphControls.tsx b/frontend/src/modules/graph/components/GraphControls.tsx new file mode 100644 index 0000000..5dd52cd --- /dev/null +++ b/frontend/src/modules/graph/components/GraphControls.tsx @@ -0,0 +1,149 @@ +import React from "react"; +import { + FiDownload, + FiZoomIn, + FiZoomOut, + FiMove, + FiPlus, + FiLink, +} from "react-icons/fi"; +import { useGraphStore } from "../store/useGraphStore"; +import type { GraphData } from "../types"; + +interface GraphControlsProps { + fgRef: React.RefObject; + onExport?: () => void; + onDataChange?: (data: GraphData) => void; +} + +export const GraphControls: React.FC = ({ + fgRef, + onExport, + onDataChange, +}) => { + const isLinkMode = useGraphStore((s) => s.isLinkMode); + const selectedNode = useGraphStore((s) => s.selectedNode); + const data = useGraphStore((s) => s.data); + const toggleLinkMode = useGraphStore((s) => s.toggleLinkMode); + const addNode = useGraphStore((s) => s.addNode); + const exportData = useGraphStore((s) => s.exportData); + + const handleAddNode = () => { + const newNodeName = prompt( + "Введите имя узла:", + `Node ${data.nodes.length + 1}`, + ); + if (newNodeName) { + const isService = window.confirm( + "Выберите тип: OK - Сервис, Отмена - Агент", + ); + addNode({ + id: `node-${Date.now()}`, + name: newNodeName, + type: isService ? "service" : "agent", + val: isService ? 12 : 8, + description: "Новый узел", + }); + } + }; + + const handleZoomIn = () => { + if (fgRef.current) { + const currentZoom = fgRef.current.zoom(); + fgRef.current.zoom(currentZoom * 1.2); + } + }; + + const handleZoomOut = () => { + if (fgRef.current) { + const currentZoom = fgRef.current.zoom(); + fgRef.current.zoom(currentZoom / 1.2); + } + }; + + const handleFit = () => { + if (fgRef.current) { + fgRef.current.zoomToFit(400); + } + }; + + return ( +
+
+
+ + Сервисы: {data.nodes.filter((n) => n.type === "service").length} + +
+
+ + Агенты: {data.nodes.filter((n) => n.type === "agent").length} + +
+
+
+ Связи: {data.links.length} +
+
+ +
+ {/* Режим создания связи */} + + + {/* Добавить узел */} + + + {/* Зум + */} + + + {/* Зум - */} + + + {/* Fit */} + + + {/* Экспорт */} + +
+
+ ); +}; diff --git a/frontend/src/modules/graph/components/GraphStatusBar.tsx b/frontend/src/modules/graph/components/GraphStatusBar.tsx new file mode 100644 index 0000000..e8cbc14 --- /dev/null +++ b/frontend/src/modules/graph/components/GraphStatusBar.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import { FiLink } from "react-icons/fi"; +import type { GraphNode } from "../types"; + +interface GraphStatusBarProps { + isLinkMode: boolean; + selectedNode: GraphNode | null; +} + +export const GraphStatusBar: React.FC = ({ + isLinkMode, + selectedNode, +}) => { + if (!isLinkMode) return null; + + return ( +
+ Режим создания связей: кликните на два узла для соединения + {selectedNode && ( + Выбран: {selectedNode.name} + )} +
+ ); +}; diff --git a/frontend/src/modules/graph/components/index.ts b/frontend/src/modules/graph/components/index.ts new file mode 100644 index 0000000..7fd486a --- /dev/null +++ b/frontend/src/modules/graph/components/index.ts @@ -0,0 +1,4 @@ +export { ForceGraph } from "./ForceGraph"; +export { GraphControls } from "./GraphControls"; +export { GraphContextMenu } from "./GraphContextMenu"; +export { GraphStatusBar } from "./GraphStatusBar"; diff --git a/frontend/src/modules/graph/index.ts b/frontend/src/modules/graph/index.ts new file mode 100644 index 0000000..2de88fb --- /dev/null +++ b/frontend/src/modules/graph/index.ts @@ -0,0 +1,3 @@ +export { Graph } from "./Graph"; +export { useGraphStore } from "./store/useGraphStore"; +export type { GraphData, GraphNode, GraphLink } from "./types"; diff --git a/frontend/src/modules/graph/store/useGraphStore.ts b/frontend/src/modules/graph/store/useGraphStore.ts new file mode 100644 index 0000000..4207af4 --- /dev/null +++ b/frontend/src/modules/graph/store/useGraphStore.ts @@ -0,0 +1,113 @@ +import { create } from "zustand"; +import type { GraphData, GraphNode, GraphLink } from "../types"; + +interface GraphState { + data: GraphData; + highlightNodes: Set; + highlightLinks: Set; + isLinkMode: boolean; + selectedNode: GraphNode | null; + + // Действия с данными + setData: (data: GraphData) => void; + addNode: (node: GraphNode) => void; + removeNode: (nodeId: string) => void; + addLink: (link: GraphLink) => void; + removeLink: (link: GraphLink) => void; + + // Подсветка + setHighlight: (nodeIds: Set, links: Set) => void; + + // Режим связи + toggleLinkMode: () => void; + setSelectedNode: (node: GraphNode | null) => void; + createLink: (sourceId: string, targetId: string) => void; + + // Экспорт + exportData: () => void; +} + +export const useGraphStore = create((set, get) => ({ + data: { nodes: [], links: [] }, + highlightNodes: new Set(), + highlightLinks: new Set(), + isLinkMode: false, + selectedNode: null, + + setData: (data) => set({ data }), + + addNode: (node) => { + set((state) => ({ + data: { + ...state.data, + nodes: [...state.data.nodes, node], + }, + })); + }, + + removeNode: (nodeId) => { + set((state) => ({ + data: { + nodes: state.data.nodes.filter((n) => n.id !== nodeId), + links: state.data.links.filter( + (l) => l.source !== nodeId && l.target !== nodeId, + ), + }, + })); + }, + + addLink: (link) => { + set((state) => ({ + data: { + ...state.data, + links: [...state.data.links, link], + }, + })); + }, + + removeLink: (linkToRemove) => { + set((state) => ({ + data: { + ...state.data, + links: state.data.links.filter((l) => l !== linkToRemove), + }, + })); + }, + + setHighlight: (nodeIds, links) => + set({ highlightNodes: nodeIds, highlightLinks: links }), + + toggleLinkMode: () => + set((state) => ({ + isLinkMode: !state.isLinkMode, + selectedNode: null, + })), + + setSelectedNode: (node) => set({ selectedNode: node }), + + createLink: (sourceId, targetId) => { + const { data, addLink } = get(); + + const linkExists = data.links.some( + (link) => + (link.source === sourceId && link.target === targetId) || + (link.source === targetId && link.target === sourceId), + ); + + if (!linkExists) { + addLink({ source: sourceId, target: targetId, type: "custom" }); + } + }, + + exportData: () => { + const { data } = get(); + const dataStr = JSON.stringify(data, null, 2); + const blob = new Blob([dataStr], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = "graph-data.json"; + link.click(); + URL.revokeObjectURL(url); + }, +})); diff --git a/frontend/src/modules/graph/types.ts b/frontend/src/modules/graph/types.ts new file mode 100644 index 0000000..2a5f950 --- /dev/null +++ b/frontend/src/modules/graph/types.ts @@ -0,0 +1,27 @@ +export interface GraphNode { + id: string; + name: string; + type: "agent" | "service"; + val?: number; + description?: string; + x?: number; + y?: number; +} + +export interface GraphLink { + source: string; + target: string; + type?: string; +} + +export interface GraphData { + nodes: GraphNode[]; + links: GraphLink[]; +} + +export interface ContextMenuState { + x: number; + y: number; + node: GraphNode | null; + link: GraphLink | null; +} diff --git a/frontend/src/pages/graphs.page.tsx b/frontend/src/pages/graphs.page.tsx new file mode 100644 index 0000000..5879abd --- /dev/null +++ b/frontend/src/pages/graphs.page.tsx @@ -0,0 +1,54 @@ +import { useMemo } from "react"; +import { Graph, type GraphData, type GraphNode, type GraphLink } from "@/modules/graph"; +import { useAgentStore } from "@/app/providers/layout/store/agent.store"; + +const buildGraphFromAgents = (): GraphData => { + const agents = useAgentStore.getState().agents; + const nodes: GraphNode[] = []; + const links: GraphLink[] = []; + + agents.forEach((agent) => { + // Агент как узел + nodes.push({ + id: agent.name, + name: agent.name, + type: "agent", + val: 8, + description: `Агент: ${agent.name}`, + }); + + // Сервисы агента как узлы + связи + agent.services.forEach((service) => { + const serviceId = `${agent.name}-${service.name}`; + nodes.push({ + id: serviceId, + name: service.name, + type: "service", + val: 12, + description: `Сервис: ${service.name} (${service.status})`, + }); + + links.push({ + source: agent.name, + target: serviceId, + type: "hosts", + }); + }); + }); + + return { nodes, links }; +}; + +export const GraphsPage = () => { + const agents = useAgentStore((s) => s.agents); + + const graphData: GraphData = useMemo(() => { + return buildGraphFromAgents(); + }, [agents]); + + return ( +
+ +
+ ); +}; diff --git a/frontend/src/pages/test2.page.tsx b/frontend/src/pages/test2.page.tsx deleted file mode 100644 index 13bf7a9..0000000 --- a/frontend/src/pages/test2.page.tsx +++ /dev/null @@ -1,534 +0,0 @@ -import React, { useRef, useState, useEffect } from "react"; -import ForceGraph2D from "react-force-graph-2d"; -import { - FiDownload, - FiZoomIn, - FiZoomOut, - FiMove, - FiCpu, - FiServer, - FiPlus, - FiTrash2, - FiLink, - FiMinusCircle, -} from "react-icons/fi"; - -interface GraphNode { - id: string; - name: string; - type: "agent" | "service"; - val?: number; - description?: string; - x?: number; - y?: number; -} - -interface GraphLink { - source: string; - target: string; - type?: string; -} - -export interface GraphData { - nodes: GraphNode[]; - links: GraphLink[]; -} - -interface CustomGraphProps { - data: GraphData; - onExport?: () => void; - onDataChange?: (newData: GraphData) => void; -} - -export const Test2Page: React.FC = ({ - data: initialData, - onExport, - onDataChange, -}) => { - const fgRef = useRef(null); - const containerRef = useRef(null); - const [data, setData] = useState(initialData); - const [highlightNodes, setHighlightNodes] = useState>(new Set()); - const [highlightLinks, setHighlightLinks] = useState>(new Set()); - const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); - const [isLinkMode, setIsLinkMode] = useState(false); - const [selectedNode, setSelectedNode] = useState(null); - const [contextMenu, setContextMenu] = useState<{ - x: number; - y: number; - node: GraphNode | null; - link: GraphLink | null; - } | null>(null); - - useEffect(() => { - if (initialData) setData(initialData); - }, [initialData]); - - // Отслеживаем размеры контейнера через ResizeObserver - useEffect(() => { - const container = containerRef.current; - if (!container) return; - - const updateDimensions = () => { - setDimensions({ - width: container.clientWidth, - height: container.clientHeight || window.innerHeight - 160, - }); - }; - - updateDimensions(); - - const observer = new ResizeObserver(updateDimensions); - observer.observe(container); - return () => observer.disconnect(); - }, []); - - // Функция для подсветки связанных элементов - const handleNodeHover = (node: GraphNode | null) => { - const newHighlightNodes = new Set(); - const newHighlightLinks = new Set(); - - if (node) { - newHighlightNodes.add(node.id); - data.links.forEach((link) => { - if (link.source === node.id || link.target === node.id) { - newHighlightLinks.add(link); - newHighlightNodes.add(link.source as string); - newHighlightNodes.add(link.target as string); - } - }); - } - - setHighlightNodes(newHighlightNodes); - setHighlightLinks(newHighlightLinks); - }; - - // Обработчик клика по узлу для создания связей - const handleNodeClick = (node: GraphNode) => { - if (isLinkMode) { - if (selectedNode === null) { - setSelectedNode(node); - } else if (selectedNode.id !== node.id) { - const newLink: GraphLink = { - source: selectedNode.id, - target: node.id, - type: "custom", - }; - - const linkExists = data.links.some( - (link) => - (link.source === selectedNode.id && link.target === node.id) || - (link.source === node.id && link.target === selectedNode.id), - ); - - if (!linkExists) { - const newData = { - nodes: [...data.nodes], - links: [...data.links, newLink], - }; - setData(newData); - onDataChange?.(newData); - } - setSelectedNode(null); - setIsLinkMode(false); - } else { - setSelectedNode(null); - } - } - }; - - // УДАЛЕНИЕ СВЯЗИ - const handleDeleteLink = (linkToDelete: GraphLink) => { - const filteredLinks = data.links.filter((link) => link !== linkToDelete); - const newData = { - nodes: [...data.nodes], - links: filteredLinks, - }; - setData(newData); - onDataChange?.(newData); - setContextMenu(null); - }; - - // УДАЛЕНИЕ УЗЛА - const handleDeleteNode = (nodeToDelete: GraphNode) => { - const filteredNodes = data.nodes.filter( - (node) => node.id !== nodeToDelete.id, - ); - const filteredLinks = data.links.filter( - (link) => - link.source !== nodeToDelete.id && link.target !== nodeToDelete.id, - ); - const newData = { - nodes: filteredNodes, - links: filteredLinks, - }; - setData(newData); - onDataChange?.(newData); - setContextMenu(null); - }; - - // Добавление нового узла - const handleAddNode = () => { - const newNodeName = prompt( - "Введите имя узла:", - `Node ${data.nodes.length + 1}`, - ); - if (newNodeName) { - const isService = window.confirm( - "Выберите тип: OK - Сервис, Отмена - Агент", - ); - const newNode: GraphNode = { - id: `node-${Date.now()}`, - name: newNodeName, - type: isService ? "service" : "agent", - val: isService ? 12 : 8, - description: "Новый узел", - }; - - const newData = { - nodes: [...data.nodes, newNode], - links: [...data.links], - }; - setData(newData); - onDataChange?.(newData); - } - }; - - // Открытие контекстного меню - const openContextMenu = ( - e: React.MouseEvent, - node?: GraphNode, - link?: GraphLink, - ) => { - e.preventDefault(); - e.stopPropagation(); - - if (node) { - setContextMenu({ x: e.clientX, y: e.clientY, node, link: null }); - } else if (link) { - setContextMenu({ x: e.clientX, y: e.clientY, node: null, link }); - } - }; - - // Закрыть контекстное меню - useEffect(() => { - const handleClickOutside = () => setContextMenu(null); - document.addEventListener("click", handleClickOutside); - return () => document.removeEventListener("click", handleClickOutside); - }, []); - - // Функция для определения цвета узла - const getNodeColor = (node: GraphNode) => { - if (highlightNodes.has(node.id)) return "#fbbf24"; - if (selectedNode?.id === node.id && isLinkMode) return "#f97316"; - - switch (node.type) { - case "service": - return "#3b82f6"; - case "agent": - return "#8b5cf6"; - default: - return "#6b7280"; - } - }; - - // Функция для размера узла - const getNodeSize = (node: GraphNode) => { - switch (node.type) { - case "service": - return 3; - case "agent": - return 3; - default: - return 5; - } - }; - - // Кастомный рендер узла - const renderNode = ( - node: GraphNode, - ctx: CanvasRenderingContext2D, - globalScale: number, - ) => { - const size = getNodeSize(node); - const color = getNodeColor(node); - - if (!node.x || !node.y) return; - - ctx.beginPath(); - ctx.arc(node.x, node.y, size, 0, 2 * Math.PI); - ctx.fillStyle = color; - ctx.fill(); - - ctx.fillStyle = "#ffffff"; - ctx.font = `${size}px "Segoe UI Emoji", "Apple Color Emoji", sans-serif`; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - - if (node.type === "service") { - ctx.fillText("S", node.x, node.y); - } else if (node.type === "agent") { - ctx.fillText("A", node.x, node.y); - } - - if (globalScale > 0.5) { - ctx.fillStyle = "#e5e7eb"; - ctx.font = `${Math.min(12, 12 / globalScale)}px "Arial", sans-serif`; - ctx.textAlign = "center"; - ctx.fillText(node.name, node.x, node.y + size + 8); - } - }; - - const handleExport = () => { - if (onExport) { - onExport(); - } else { - const dataStr = JSON.stringify(data, null, 2); - const blob = new Blob([dataStr], { type: "application/json" }); - const url = URL.createObjectURL(blob); - const link = document.createElement("a"); - link.href = url; - link.download = "graph-data.json"; - link.click(); - URL.revokeObjectURL(url); - } - }; - - const handleZoomIn = () => { - if (fgRef.current) { - const currentZoom = fgRef.current.zoom(); - fgRef.current.zoom(currentZoom * 1.2); - } - }; - - const handleZoomOut = () => { - if (fgRef.current) { - const currentZoom = fgRef.current.zoom(); - fgRef.current.zoom(currentZoom / 1.2); - } - }; - - const handleFit = () => { - if (fgRef.current) { - fgRef.current.zoomToFit(400); - } - }; - - if (!data || data.nodes.length === 0) { - return ( -
-
-
-

Нет данных для отображения

- -
-
-
- ); - } - - return ( -
-
- { - return `${node.name}\n${node.description || ""}\n${node.type === "service" ? "Сервис" : "Агент"}\nПКМ для удаления`; - }} - linkLabel={(link: GraphLink) => { - // ВОЗВРАЩАЕМ СТРОКУ - const sourceName = - data.nodes.find((n) => n.id === link.source)?.name || link.source; - const targetName = - data.nodes.find((n) => n.id === link.target)?.name || link.target; - return `Связь: ${sourceName} → ${targetName}\nПКМ для удаления`; - }} - linkColor={(link: any) => { - return highlightLinks.has(link) ? "#fbbf24" : "#4b5563"; - }} - linkWidth={(link: any) => (highlightLinks.has(link) ? 3 : 1.5)} - linkDirectionalParticles={0} - onNodeClick={handleNodeClick} - onNodeRightClick={(node, event) => - openContextMenu(event as any, node, undefined) - } - onLinkRightClick={(link, event) => - openContextMenu(event as any, undefined, link) - } - onNodeHover={handleNodeHover} - cooldownTicks={50} - cooldownTime={2000} - d3AlphaDecay={0.03} - d3VelocityDecay={0.4} - warmupTicks={50} - onEngineStop={() => { - if (fgRef.current) { - setTimeout(() => { - if (fgRef.current) { - fgRef.current.zoomToFit(400); - } - }, 100); - } - }} - /> - - {contextMenu && ( -
e.stopPropagation()} - > - {contextMenu.node && ( - <> -
- {contextMenu.node.name} -
- - - - )} - {contextMenu.link && ( - <> -
- Связь:{" "} - {typeof contextMenu.link.source === "string" - ? contextMenu.link.source - : (contextMenu.link.source as any).name || - (contextMenu.link.source as any).id}{" "} - →{" "} - {typeof contextMenu.link.target === "string" - ? contextMenu.link.target - : (contextMenu.link.target as any).name || - (contextMenu.link.target as any).id} -
- - - )} -
- )} - - {isLinkMode && ( -
- Режим создания связей: кликните на два узла для - соединения - {selectedNode && ( - Выбран: {selectedNode.name} - )} -
- )} -
- -
-
-
- - - Сервисы: {data.nodes.filter((n) => n.type === "service").length} - -
-
- - - Агенты: {data.nodes.filter((n) => n.type === "agent").length} - -
-
-
- Связи: {data.links.length} -
-
-
- - - - - - - - - - - -
-
-
- ); -}; From e7f1ea238688c1353cd3db032f21b6fffdf9aff8 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 12:38:21 +0300 Subject: [PATCH 16/48] fix: graphs --- .../app/providers/layout/sidebar/sidebar.tsx | 537 ++++++++++-------- frontend/src/modules/graph/Graph.tsx | 38 +- .../modules/graph/components/ForceGraph.tsx | 295 +++++----- .../graph/components/GraphControls.tsx | 116 ++-- .../modules/graph/components/GraphStats.tsx | 23 + .../src/modules/graph/components/index.ts | 1 + 6 files changed, 544 insertions(+), 466 deletions(-) create mode 100644 frontend/src/modules/graph/components/GraphStats.tsx diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx index 5685785..894824c 100644 --- a/frontend/src/app/providers/layout/sidebar/sidebar.tsx +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -10,10 +10,11 @@ import { FaChevronDown, FaProjectDiagram, FaTrash, + FaArrowLeft, } from "react-icons/fa"; -import { useNavigate } from "react-router-dom"; import { useAgentStore } from "@/app/providers/layout/store/agent.store"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; +import { Graph, type GraphData } from "@/modules/graph"; interface SidebarProps { isOpen?: boolean; @@ -24,13 +25,13 @@ export const Sidebar: React.FC = ({ isOpen = true, onToggle, }) => { - const navigate = useNavigate(); const { agents, isLoading, error, fetchAgents, removeAgent } = useAgentStore(); const { token } = useAuthStore(); const [searchQuery, setSearchQuery] = useState(""); const [copied, setCopied] = useState(false); const [showTokenModal, setShowTokenModal] = useState(false); + const [showGraphs, setShowGraphs] = useState(false); const [expandedAgents, setExpandedAgents] = useState>( new Set(agents.map((a) => a.name)), ); @@ -54,6 +55,40 @@ export const Sidebar: React.FC = ({ ); }, [agents, searchQuery]); + const graphData: GraphData = useMemo(() => { + const nodes = []; + const links = []; + + agents.forEach((agent) => { + nodes.push({ + id: agent.name, + name: agent.name, + type: "agent" as const, + val: 8, + description: `Агент: ${agent.name}`, + }); + + agent.services.forEach((service) => { + const serviceId = `${agent.name}-${service.name}`; + nodes.push({ + id: serviceId, + name: service.name, + type: "service" as const, + val: 12, + description: `Сервис: ${service.name} (${service.status})`, + }); + + links.push({ + source: agent.name, + target: serviceId, + type: "hosts", + }); + }); + }); + + return { nodes, links }; + }, [agents]); + const handleCopyToken = () => { if (token) { navigator.clipboard.writeText(token); @@ -87,10 +122,12 @@ export const Sidebar: React.FC = ({ />
- {/* Поиск */} -
- setSearchQuery(e.target.value)} - placeholder="Поиск агентов..." - className="w-full px-3 py-2 rounded-lg border text-sm focus:outline-none transition-all" - style={{ - backgroundColor: "var(--input-bg)", - borderColor: "var(--border)", - color: "var(--text-primary)", - }} - onFocus={(e) => { - e.currentTarget.style.borderColor = "var(--border-focus)"; - e.currentTarget.style.boxShadow = `0 0 0 3px var(--border-focus)30`; - }} - onBlur={(e) => { - e.currentTarget.style.borderColor = "var(--border)"; - e.currentTarget.style.boxShadow = "none"; - }} - /> -
- - {/* Список агентов */} -
- {isLoading && agents.length === 0 ? ( -
- + +
+ ) : ( + <> + {/* Поиск */} +
+ setSearchQuery(e.target.value)} + placeholder="Поиск агентов..." + className="w-full px-3 py-2 rounded-lg border text-sm focus:outline-none transition-all" + style={{ + backgroundColor: "var(--input-bg)", + borderColor: "var(--border)", + color: "var(--text-primary)", + }} + onFocus={(e) => { + e.currentTarget.style.borderColor = "var(--border-focus)"; + e.currentTarget.style.boxShadow = `0 0 0 3px var(--border-focus)30`; + }} + onBlur={(e) => { + e.currentTarget.style.borderColor = "var(--border)"; + e.currentTarget.style.boxShadow = "none"; + }} /> -

- Загрузка агентов... -

- ) : error ? ( -
-
- {error} -
- -
- ) : filteredAgents.length === 0 ? ( -
- -

- {searchQuery ? "Ничего не найдено" : "Нет агентов"} -

-
- ) : ( -
- {filteredAgents.map((agent) => { - const isExpanded = expandedAgents.has(agent.name); - return ( -
+ {isLoading && agents.length === 0 ? ( +
+ +

- {/* Agent header — кликабельный для сворачивания */} -

toggleAgent(agent.name)} - > - - {isExpanded ? ( - - ) : ( - - )} - - - - {agent.name} - - {/* Статус-индикатор агента (сколько сервисов запущено) */} -
- {agent.services.filter((s) => s.status === "running") - .length > 0 && ( - - )} - - { - agent.services.filter((s) => s.status === "running") - .length - } - /{agent.services.length} - -
- {/* Кнопка удаления — появляется при наведении */} - -
- - {/* Services list — сворачивается */} - {isExpanded && ( -
-
- {agent.services.map((service) => { - const isRunning = service.status === "running"; - const isError = service.status === "error"; - const isStopped = - service.status === "stopped" || !isRunning; - - return ( -
- - {service.name} - - {/* Status indicator */} -
- - - {isRunning - ? "run" - : isError - ? "err" - : "stop"} - -
-
- ); - })} -
-
- )} + Загрузка агентов... +

+
+ ) : error ? ( +
+
+ {error}
- ); - })} + +
+ ) : filteredAgents.length === 0 ? ( +
+ +

+ {searchQuery ? "Ничего не найдено" : "Нет агентов"} +

+
+ ) : ( +
+ {filteredAgents.map((agent) => { + const isExpanded = expandedAgents.has(agent.name); + return ( +
+ {/* Agent header — кликабельный для сворачивания */} +
toggleAgent(agent.name)} + > + + {isExpanded ? ( + + ) : ( + + )} + + + + {agent.name} + + {/* Статус-индикатор агента (сколько сервисов запущено) */} +
+ {agent.services.filter( + (s) => s.status === "running", + ).length > 0 && ( + + )} + + { + agent.services.filter( + (s) => s.status === "running", + ).length + } + /{agent.services.length} + +
+ {/* Кнопка удаления — появляется при наведении */} + +
+ + {/* Services list — сворачивается */} + {isExpanded && ( +
+
+ {agent.services.map((service) => { + const isRunning = service.status === "running"; + const isError = service.status === "error"; + const isStopped = + service.status === "stopped" || !isRunning; + + return ( +
+ + {service.name} + + {/* Status indicator */} +
+ + + {isRunning + ? "run" + : isError + ? "err" + : "stop"} + +
+
+ ); + })} +
+
+ )} +
+ ); + })} +
+ )}
- )} -
+ + )} {/* Footer с кнопками */}
= ({ backgroundColor: "var(--card-bg)", }} > - {/* Кнопка Графы */} - + {showGraphs ? ( + /* Кнопка назад к агентам */ + + ) : ( + /* Кнопка Графы */ + + )} -
- {/* Режим создания связи */} - + {/* Зум + */} + - {/* Добавить узел */} - + {/* Зум - */} + - {/* Зум + */} - + {/* Fit */} + - {/* Зум - */} - - - {/* Fit */} - - - {/* Экспорт */} - -
+ {/* Экспорт */} +
); }; diff --git a/frontend/src/modules/graph/components/GraphStats.tsx b/frontend/src/modules/graph/components/GraphStats.tsx new file mode 100644 index 0000000..f3ab918 --- /dev/null +++ b/frontend/src/modules/graph/components/GraphStats.tsx @@ -0,0 +1,23 @@ +import React from "react"; +import type { GraphData } from "../types"; + +interface GraphStatsProps { + data: GraphData; +} + +export const GraphStats: React.FC = ({ data }) => { + return ( +
+ + Сервисы: {data.nodes.filter((n) => n.type === "service").length} + + + Агенты: {data.nodes.filter((n) => n.type === "agent").length} + +
+
+ Связи: {data.links.length} +
+
+ ); +}; diff --git a/frontend/src/modules/graph/components/index.ts b/frontend/src/modules/graph/components/index.ts index 7fd486a..076d0b7 100644 --- a/frontend/src/modules/graph/components/index.ts +++ b/frontend/src/modules/graph/components/index.ts @@ -2,3 +2,4 @@ export { ForceGraph } from "./ForceGraph"; export { GraphControls } from "./GraphControls"; export { GraphContextMenu } from "./GraphContextMenu"; export { GraphStatusBar } from "./GraphStatusBar"; +export { GraphStats } from "./GraphStats"; From 822f9536989ebe638ff8fab62c2cdd53c55d2a05 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 12:51:35 +0300 Subject: [PATCH 17/48] fix: forceGraph --- .../src/app/providers/layout/sidebar/sidebar.tsx | 4 ++-- .../src/modules/graph/components/ForceGraph.tsx | 13 +++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx index 894824c..780fb40 100644 --- a/frontend/src/app/providers/layout/sidebar/sidebar.tsx +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -56,8 +56,8 @@ export const Sidebar: React.FC = ({ }, [agents, searchQuery]); const graphData: GraphData = useMemo(() => { - const nodes = []; - const links = []; + const nodes: any[] = []; + const links: any[] = []; agents.forEach((agent) => { nodes.push({ diff --git a/frontend/src/modules/graph/components/ForceGraph.tsx b/frontend/src/modules/graph/components/ForceGraph.tsx index d80960b..7f239c1 100644 --- a/frontend/src/modules/graph/components/ForceGraph.tsx +++ b/frontend/src/modules/graph/components/ForceGraph.tsx @@ -138,15 +138,11 @@ export const ForceGraph = forwardRef( } }; - // Fit zoom on engine stop - useEffect(() => { - if (ref && typeof ref === "object" && ref.current) { - const timer = setTimeout(() => { - ref.current?.zoomToFit(400); - }, 100); - return () => clearTimeout(timer); + const handleEngineStop = () => { + if (typeof ref !== "function" && ref && "current" in ref && ref.current) { + ref.current.zoomToFit(400); } - }, [data, ref]); + }; return (
@@ -180,6 +176,7 @@ export const ForceGraph = forwardRef( d3AlphaDecay={0.03} d3VelocityDecay={0.4} warmupTicks={50} + onEngineStop={handleEngineStop} />
); From 8175d7b3a571ddc0dc1760670856cb4a8a260ec2 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 12:57:03 +0300 Subject: [PATCH 18/48] fix: save code in ide --- frontend/src/modules/ide/store/useIDEStore.ts | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/frontend/src/modules/ide/store/useIDEStore.ts b/frontend/src/modules/ide/store/useIDEStore.ts index 39fe5b9..004637e 100644 --- a/frontend/src/modules/ide/store/useIDEStore.ts +++ b/frontend/src/modules/ide/store/useIDEStore.ts @@ -125,18 +125,23 @@ export const useIDEStore = create((set, get) => ({ // Выбор файла selectFile: (node: FileNode) => { if (node.type === "file") { - const { openFiles } = get(); - if (!openFiles.find((f) => f.path === node.path)) { - set((state) => ({ openFiles: [...state.openFiles, node] })); + const { openFiles, files } = get(); + // Берём актуальную версию из дерева файлов + const latestFile = files ? findNode(files, node.path || "") : null; + const fileToOpen = + latestFile && latestFile.type === "file" ? latestFile : node; + + if (!openFiles.find((f) => f.path === fileToOpen.path)) { + set((state) => ({ openFiles: [...state.openFiles, fileToOpen] })); } - set({ activeFile: node }); + set({ activeFile: fileToOpen }); } }, // Обновление содержимого файла updateFileContent: (content: string) => { - const { activeFile } = get(); - if (activeFile) { + const { activeFile, files } = get(); + if (activeFile && files) { const updatedFile = { ...activeFile, content }; set({ activeFile: updatedFile }); set((state) => ({ @@ -144,6 +149,21 @@ export const useIDEStore = create((set, get) => ({ f.path === activeFile.path ? updatedFile : f, ), })); + + // Обновляем также в дереве файлов + const updateFileInTree = (node: FileNode): FileNode => { + if (node.path === activeFile.path) { + return updatedFile; + } + if (node.children) { + return { + ...node, + children: node.children.map((child) => updateFileInTree(child)), + }; + } + return node; + }; + set({ files: updateFileInTree(files) }); } }, From 55cb21445882c99bda55f85ad2e9a28e4838228e Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 13:38:32 +0300 Subject: [PATCH 19/48] feat: themes --- .../layout/navigation/navigation.tsx | 23 ++++++- .../src/app/providers/routing/routing.tsx | 2 - frontend/src/modules/graph/Graph.tsx | 10 ++- .../modules/graph/components/ForceGraph.tsx | 11 +++- .../graph/components/GraphContextMenu.tsx | 62 +++++++++++++++--- .../graph/components/GraphControls.tsx | 56 ++++++---------- .../modules/graph/components/GraphStats.tsx | 14 ++-- .../graph/components/GraphStatusBar.tsx | 5 +- frontend/src/modules/ide/IDE.tsx | 65 ++++++++++++++----- .../src/modules/ide/components/FilePicker.tsx | 1 + .../modules/ide/components/FilePickerItem.tsx | 26 +++++--- frontend/src/pages/ide.page.tsx | 5 +- frontend/src/pages/templates.page.tsx | 7 +- frontend/src/pages/themes.page.tsx | 9 --- 14 files changed, 197 insertions(+), 99 deletions(-) delete mode 100644 frontend/src/pages/themes.page.tsx diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx index 14ea644..d89fe05 100644 --- a/frontend/src/app/providers/layout/navigation/navigation.tsx +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -3,19 +3,24 @@ import { FaCode } from "react-icons/fa"; import { FaHome, FaServer, - FaPalette, FaUser, FaUsers, FaRocket, FaKey, FaFileAlt, + FaSun, + FaMoon, } from "react-icons/fa"; import { useAuthStore } from "@/modules/auth/store/useAuthStore"; +import { useThemeStore } from "@/modules/theme-bw/stores/theme.store"; export const Navigation = () => { const navigate = useNavigate(); const location = useLocation(); const { user, logout } = useAuthStore(); + const { toggleTheme, theme } = useThemeStore(); + + const isDark = theme === "dark"; const navItems = [ { path: "/", label: "Главная", icon: FaHome }, @@ -25,7 +30,6 @@ export const Navigation = () => { { path: "/registration", label: "Регистрация", icon: FaKey }, { path: "/logs", label: "Логи", icon: FaFileAlt }, { path: "/admin", label: "Админка", icon: FaUsers, adminOnly: true }, - { path: "/themes", label: "Темы", icon: FaPalette }, ]; const isActive = (path: string) => location.pathname === path; @@ -101,6 +105,21 @@ export const Navigation = () => {
)} + + {/* Переключатель темы */} + + @@ -64,11 +94,18 @@ export const GraphContextMenu: React.FC = ({ )} {menu.link && ( <> -
+
Связь:{" "} {typeof menu.link.source === "string" ? menu.link.source - : (menu.link.source as any).name || (menu.link.source as any).id}{" "} + : (menu.link.source as any).name || + (menu.link.source as any).id}{" "} →{" "} {typeof menu.link.target === "string" ? menu.link.target @@ -76,7 +113,14 @@ export const GraphContextMenu: React.FC = ({
diff --git a/frontend/src/modules/graph/components/GraphControls.tsx b/frontend/src/modules/graph/components/GraphControls.tsx index df0b732..ff53aab 100644 --- a/frontend/src/modules/graph/components/GraphControls.tsx +++ b/frontend/src/modules/graph/components/GraphControls.tsx @@ -4,7 +4,6 @@ import { FiZoomIn, FiZoomOut, FiMove, - FiPlus, FiLink, } from "react-icons/fi"; import { useGraphStore } from "../store/useGraphStore"; @@ -16,37 +15,20 @@ interface GraphControlsProps { onDataChange?: (data: GraphData) => void; } +const btnStyle: React.CSSProperties = { + backgroundColor: "var(--bg-secondary)", + color: "var(--text-primary)", +}; + export const GraphControls: React.FC = ({ fgRef, onExport, onDataChange, }) => { const isLinkMode = useGraphStore((s) => s.isLinkMode); - const selectedNode = useGraphStore((s) => s.selectedNode); - const data = useGraphStore((s) => s.data); const toggleLinkMode = useGraphStore((s) => s.toggleLinkMode); - const addNode = useGraphStore((s) => s.addNode); const exportData = useGraphStore((s) => s.exportData); - const handleAddNode = () => { - const newNodeName = prompt( - "Введите имя узла:", - `Node ${data.nodes.length + 1}`, - ); - if (newNodeName) { - const isService = window.confirm( - "Выберите тип: OK - Сервис, Отмена - Агент", - ); - addNode({ - id: `node-${Date.now()}`, - name: newNodeName, - type: isService ? "service" : "agent", - val: isService ? 12 : 8, - description: "Новый узел", - }); - } - }; - const handleZoomIn = () => { if (fgRef.current) { const currentZoom = fgRef.current.zoom(); @@ -72,22 +54,21 @@ export const GraphControls: React.FC = ({ {/* Режим создания связи */} {/* Зум + */} @@ -95,7 +76,8 @@ export const GraphControls: React.FC = ({ {/* Зум - */} @@ -103,7 +85,8 @@ export const GraphControls: React.FC = ({ {/* Fit */} @@ -111,10 +94,11 @@ export const GraphControls: React.FC = ({ {/* Экспорт */}
); diff --git a/frontend/src/modules/graph/components/GraphStats.tsx b/frontend/src/modules/graph/components/GraphStats.tsx index f3ab918..856782d 100644 --- a/frontend/src/modules/graph/components/GraphStats.tsx +++ b/frontend/src/modules/graph/components/GraphStats.tsx @@ -7,15 +7,19 @@ interface GraphStatsProps { export const GraphStats: React.FC = ({ data }) => { return ( -
+
Сервисы: {data.nodes.filter((n) => n.type === "service").length} - - Агенты: {data.nodes.filter((n) => n.type === "agent").length} - + Агенты: {data.nodes.filter((n) => n.type === "agent").length}
-
+
Связи: {data.links.length}
diff --git a/frontend/src/modules/graph/components/GraphStatusBar.tsx b/frontend/src/modules/graph/components/GraphStatusBar.tsx index e8cbc14..f98d340 100644 --- a/frontend/src/modules/graph/components/GraphStatusBar.tsx +++ b/frontend/src/modules/graph/components/GraphStatusBar.tsx @@ -14,7 +14,10 @@ export const GraphStatusBar: React.FC = ({ if (!isLinkMode) return null; return ( -
+
Режим создания связей: кликните на два узла для соединения {selectedNode && ( Выбран: {selectedNode.name} diff --git a/frontend/src/modules/ide/IDE.tsx b/frontend/src/modules/ide/IDE.tsx index ca2214f..272fb2a 100644 --- a/frontend/src/modules/ide/IDE.tsx +++ b/frontend/src/modules/ide/IDE.tsx @@ -13,16 +13,45 @@ import { TitleBar, StatusBar, } from "./components"; +import { useThemeStore } from "@/modules/theme-bw/stores/theme.store"; interface IDEProps { initialFiles?: FileNode; onBack?: () => void; } +const darkColors = { + bg: "#1e1e1e", + bgSecondary: "#252526", + bgTertiary: "#2d2d30", + border: "#3e3e42", + textPrimary: "#cccccc", + textSecondary: "#858585", + accent: "#0e639c", + accentHover: "#1177bb", + statusBar: "#007acc", +}; + +const lightColors = { + bg: "#ffffff", + bgSecondary: "#f3f3f3", + bgTertiary: "#e8e8e8", + border: "#e0e0e0", + textPrimary: "#333333", + textSecondary: "#616161", + accent: "#0e639c", + accentHover: "#1177bb", + statusBar: "#007acc", +}; + export const IDE: React.FC = ({ initialFiles: externalFiles, onBack, }: IDEProps = {}) => { + const theme = useThemeStore((s) => s.theme); + const isDark = theme === "dark"; + const c = isDark ? darkColors : lightColors; + const files = useIDEStore((state) => state.files); const openFiles = useIDEStore((state) => state.openFiles); const activeFile = useIDEStore((state) => state.activeFile); @@ -51,7 +80,7 @@ export const IDE: React.FC = ({ height: "100vh", display: "flex", flexDirection: "column", - backgroundColor: "#1e1e1e", + backgroundColor: c.bg, fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", position: "relative", @@ -66,8 +95,8 @@ export const IDE: React.FC = ({ top: "40px", left: "12px", background: "transparent", - border: "1px solid #3e3e42", - color: "#cccccc", + border: `1px solid ${c.border}`, + color: c.textPrimary, cursor: "pointer", display: "flex", alignItems: "center", @@ -79,14 +108,14 @@ export const IDE: React.FC = ({ zIndex: 10, }} onMouseEnter={(e) => { - e.currentTarget.style.backgroundColor = "#3e3e42"; + e.currentTarget.style.backgroundColor = c.border; e.currentTarget.style.color = "#fff"; e.currentTarget.style.borderColor = "#555"; }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = "transparent"; - e.currentTarget.style.color = "#cccccc"; - e.currentTarget.style.borderColor = "#3e3e42"; + e.currentTarget.style.color = c.textPrimary; + e.currentTarget.style.borderColor = c.border; }} title="Go back" > @@ -117,7 +146,7 @@ export const IDE: React.FC = ({ style={{ fontSize: "22px", marginBottom: "12px", - color: "#cccccc", + color: c.textPrimary, fontWeight: 300, }} > @@ -127,7 +156,7 @@ export const IDE: React.FC = ({ style={{ fontSize: "13px", marginBottom: "32px", - color: "#858585", + color: c.textSecondary, }} > Create a new project to get started @@ -136,7 +165,7 @@ export const IDE: React.FC = ({ onClick={createNewProject} style={{ padding: "10px 24px", - backgroundColor: "#0e639c", + backgroundColor: c.accent, border: "none", borderRadius: "4px", color: "#fff", @@ -146,10 +175,10 @@ export const IDE: React.FC = ({ transition: "background-color 0.1s", }} onMouseEnter={(e) => { - e.currentTarget.style.backgroundColor = "#1177bb"; + e.currentTarget.style.backgroundColor = c.accentHover; }} onMouseLeave={(e) => { - e.currentTarget.style.backgroundColor = "#0e639c"; + e.currentTarget.style.backgroundColor = c.accent; }} > New Project @@ -168,7 +197,7 @@ export const IDE: React.FC = ({ display: "flex", flexDirection: "column", overflow: "hidden", - backgroundColor: "#1e1e1e", + backgroundColor: c.bg, fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", }} @@ -176,14 +205,14 @@ export const IDE: React.FC = ({
= ({ style={{ background: "transparent", border: "none", - color: "#cccccc", + color: c.textPrimary, cursor: "pointer", display: "flex", alignItems: "center", @@ -205,12 +234,12 @@ export const IDE: React.FC = ({ transition: "all 0.1s", }} onMouseEnter={(e) => { - e.currentTarget.style.backgroundColor = "#3e3e42"; + e.currentTarget.style.backgroundColor = c.border; e.currentTarget.style.color = "#fff"; }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = "transparent"; - e.currentTarget.style.color = "#cccccc"; + e.currentTarget.style.color = c.textPrimary; }} title="Go back" > diff --git a/frontend/src/modules/ide/components/FilePicker.tsx b/frontend/src/modules/ide/components/FilePicker.tsx index e6441c9..7a7bf1a 100644 --- a/frontend/src/modules/ide/components/FilePicker.tsx +++ b/frontend/src/modules/ide/components/FilePicker.tsx @@ -57,6 +57,7 @@ export const FilePicker: React.FC = ({ files }) => { style={{ height: "100%", overflowY: "auto", + backgroundColor: "var(--bg-primary)", }} > diff --git a/frontend/src/modules/ide/components/FilePickerItem.tsx b/frontend/src/modules/ide/components/FilePickerItem.tsx index 39aeddd..22f5f5f 100644 --- a/frontend/src/modules/ide/components/FilePickerItem.tsx +++ b/frontend/src/modules/ide/components/FilePickerItem.tsx @@ -44,7 +44,7 @@ export const FilePickerItem: React.FC = ({ paddingLeft: `${paddingLeft}px`, paddingRight: "12px", height: "36px", - borderBottom: "1px solid #1a1a1a", + borderBottom: "1px solid var(--border)", cursor: "pointer", transition: "background-color 0.1s", gap: "8px", @@ -57,7 +57,7 @@ export const FilePickerItem: React.FC = ({ } }} onMouseEnter={(e) => { - e.currentTarget.style.backgroundColor = "#2a2a2a"; + e.currentTarget.style.backgroundColor = "var(--bg-secondary)"; }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = "transparent"; @@ -65,7 +65,13 @@ export const FilePickerItem: React.FC = ({ > {/* Folder expand icon */} {isFolder && ( - + {isExpanded ? ( ) : ( @@ -77,9 +83,9 @@ export const FilePickerItem: React.FC = ({ {/* File/Folder icon */} {isFolder ? ( - + ) : ( - + )} @@ -87,7 +93,7 @@ export const FilePickerItem: React.FC = ({ = ({ {!isFolder && extension && ( = ({ style={{ width: "18px", height: "18px", - border: isSelected ? "2px solid #0e639c" : "2px solid #555", + border: isSelected + ? "2px solid #0e639c" + : "2px solid var(--border)", borderRadius: "3px", backgroundColor: isSelected ? "#0e639c" : "transparent", display: "flex", diff --git a/frontend/src/pages/ide.page.tsx b/frontend/src/pages/ide.page.tsx index d518e94..a5fe8ef 100644 --- a/frontend/src/pages/ide.page.tsx +++ b/frontend/src/pages/ide.page.tsx @@ -8,7 +8,10 @@ export const IDEPage = () => { const files: FileNode | undefined = location.state?.files; return ( -
+
navigate("/templates")} initialFiles={files} />
); diff --git a/frontend/src/pages/templates.page.tsx b/frontend/src/pages/templates.page.tsx index 2cc3561..68c6783 100644 --- a/frontend/src/pages/templates.page.tsx +++ b/frontend/src/pages/templates.page.tsx @@ -118,6 +118,7 @@ export const TemplatesPage = () => { style={{ height: "100vh", position: "relative", + backgroundColor: "var(--bg-primary)", }} > {/* Floating header */} @@ -139,13 +140,13 @@ export const TemplatesPage = () => { alignItems: "center", gap: "8px", padding: "6px 12px", - backgroundColor: "#1a1a1a", + backgroundColor: "var(--card-bg)", borderRadius: "4px", - border: "1px solid #2a2a2a", + border: "1px solid var(--border)", }} > - + {selectedPaths.size} script{selectedPaths.size !== 1 ? "s" : ""}{" "} running diff --git a/frontend/src/pages/themes.page.tsx b/frontend/src/pages/themes.page.tsx deleted file mode 100644 index fa02cc9..0000000 --- a/frontend/src/pages/themes.page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { ThemeChanger } from "@/modules/theme-changer"; - -export const ThemesPage = () => { - return ( -
- -
- ); -}; From 78f35f68116d700ae375994ccafbe2406c4d86cc Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 16:53:12 +0300 Subject: [PATCH 20/48] feat: dashboard-page --- .../src/app/providers/routing/routing.tsx | 2 + .../components/add.widget.button.tsx | 20 ++ .../dashboard/components/add.widget.modal.tsx | 108 +++++++ .../dashboard/components/chart,widget.tsx | 299 ++++++++++++++++++ .../dashboard/components/chart.settings.tsx | 105 ++++++ .../dashboard/components/dashboard.chart.tsx | 171 ++++++++++ frontend/src/modules/dashboard/dashboard.tsx | 96 ++++++ .../src/modules/dashboard/hooks/use.widget.ts | 72 +++++ .../dashboard/store/dashboard.store.ts | 129 ++++++++ frontend/src/modules/dashboard/types.ts | 22 ++ frontend/src/pages/dashboard.page.tsx | 197 ++++++++++++ 11 files changed, 1221 insertions(+) create mode 100644 frontend/src/modules/dashboard/components/add.widget.button.tsx create mode 100644 frontend/src/modules/dashboard/components/add.widget.modal.tsx create mode 100644 frontend/src/modules/dashboard/components/chart,widget.tsx create mode 100644 frontend/src/modules/dashboard/components/chart.settings.tsx create mode 100644 frontend/src/modules/dashboard/components/dashboard.chart.tsx create mode 100644 frontend/src/modules/dashboard/dashboard.tsx create mode 100644 frontend/src/modules/dashboard/hooks/use.widget.ts create mode 100644 frontend/src/modules/dashboard/store/dashboard.store.ts create mode 100644 frontend/src/modules/dashboard/types.ts create mode 100644 frontend/src/pages/dashboard.page.tsx diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx index 158f76d..3fd0a16 100644 --- a/frontend/src/app/providers/routing/routing.tsx +++ b/frontend/src/app/providers/routing/routing.tsx @@ -13,6 +13,7 @@ import { AdminPage } from "@/pages/admin.page"; import { RegistrationTokenPage } from "@/pages/registration.page"; import { LogsPage } from "@/pages/logs.page"; import { GraphsPage } from "@/pages/graphs.page"; +import { DashboardPage } from "@/pages/dashboard.page"; export const mockGraphData: GraphData = { nodes: [ @@ -128,6 +129,7 @@ export const Routing = () => { } /> } /> } /> + } /> } /> diff --git a/frontend/src/modules/dashboard/components/add.widget.button.tsx b/frontend/src/modules/dashboard/components/add.widget.button.tsx new file mode 100644 index 0000000..0ca90a9 --- /dev/null +++ b/frontend/src/modules/dashboard/components/add.widget.button.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { FaPlus } from "react-icons/fa"; + +interface AddWidgetButtonProps { + onClick: () => void; +} + +export const AddWidgetButton: React.FC = ({ + onClick, +}) => { + return ( + + ); +}; diff --git a/frontend/src/modules/dashboard/components/add.widget.modal.tsx b/frontend/src/modules/dashboard/components/add.widget.modal.tsx new file mode 100644 index 0000000..30e46e4 --- /dev/null +++ b/frontend/src/modules/dashboard/components/add.widget.modal.tsx @@ -0,0 +1,108 @@ +import React, { useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import type { ChartType } from "../types"; + +interface AddWidgetModalProps { + isOpen: boolean; + onAdd: (data: { type: ChartType; title: string; dataKey: string }) => void; + onClose: () => void; +} + +export const AddWidgetModal: React.FC = ({ + isOpen, + onAdd, + onClose, +}) => { + const [type, setType] = useState("line"); + const [title, setTitle] = useState(""); + const [dataKey, setDataKey] = useState("requests"); + + const handleAdd = () => { + if (!title.trim()) return; + onAdd({ type, title: title.trim(), dataKey }); + setTitle(""); + setType("line"); + setDataKey("requests"); + onClose(); + }; + + return ( + + {isOpen && ( + + e.stopPropagation()} + > +

+ Добавить график +

+ +
+
+ +
+ {(["line", "bar", "area", "pie"] as ChartType[]).map((t) => ( + + ))} +
+
+ +
+ + setTitle(e.target.value)} + placeholder="Название" + className="w-full px-2 py-1 text-[11px] bg-tertiary border border-primary rounded text-primary focus:outline-none focus:border-accent-primary" + /> +
+ +
+ + +
+
+
+
+ )} +
+ ); +}; diff --git a/frontend/src/modules/dashboard/components/chart,widget.tsx b/frontend/src/modules/dashboard/components/chart,widget.tsx new file mode 100644 index 0000000..709d150 --- /dev/null +++ b/frontend/src/modules/dashboard/components/chart,widget.tsx @@ -0,0 +1,299 @@ +// modules/dashboard/components/ChartWidget.tsx +import React from "react"; +import { + LineChart, + Line, + BarChart, + Bar, + AreaChart, + Area, + PieChart, + Pie, + Cell, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + Legend, +} from "recharts"; +import { + FaChartLine, + FaChartBar, + FaChartArea, + FaChartPie, + FaCog, + FaEye, + FaEyeSlash, +} from "react-icons/fa"; +import { motion } from "framer-motion"; +import type { ChartWidget as ChartWidgetType, MetricData } from "../types"; + +interface ChartWidgetProps { + widget: ChartWidgetType; + data: MetricData[]; + onEdit: () => void; + onToggleVisibility: () => void; +} + +// Все возможные уровни логов (метрики) +const METRICS = ["INFO", "WARN", "ERROR", "DEBUG"]; + +// Цвета для каждой метрики +const METRIC_COLORS: Record = { + INFO: "#10b981", // зеленый + WARN: "#f59e0b", // оранжевый + ERROR: "#ef4444", // красный + DEBUG: "#3b82f6", // синий +}; + +export const ChartWidget: React.FC = ({ + widget, + data, + onEdit, + onToggleVisibility, +}) => { + const renderChart = () => { + if (!data || !Array.isArray(data) || data.length === 0) { + return ( +
+ Нет данных +
+ ); + } + + const normalizedData = data.map((point) => { + const normalized: MetricData = { timestamp: point.timestamp }; + METRICS.forEach((metric) => { + normalized[metric] = point[metric] || 0; + }); + return normalized; + }); + + const commonProps = { + data: normalizedData, + margin: { top: 5, right: 10, left: 0, bottom: 5 }, + }; + + switch (widget.type) { + case "line": + return ( + + + + + + + {METRICS.map((metric) => ( + + ))} + + ); + + case "bar": + return ( + + + + + + + {METRICS.map((metric) => ( + + ))} + + ); + + case "area": + return ( + + + + + + + {METRICS.map((metric) => ( + + ))} + + ); + + case "pie": + // Для круговой диаграммы берем последнюю точку + const lastPoint = normalizedData[normalizedData.length - 1]; + const pieData = METRICS.map((metric) => ({ + name: metric, + value: lastPoint[metric] || 0, + })).filter((item) => Number(item.value) > 0); + + return ( + + + {pieData.map((entry, index) => ( + + ))} + + + + + ); + + default: + return null; + } + }; + + const getIcon = () => { + switch (widget.type) { + case "line": + return ; + case "bar": + return ; + case "area": + return ; + case "pie": + return ; + default: + return null; + } + }; + + return ( + +
+
+ {getIcon()} +

+ {widget.title} +

+
+
+ + +
+
+
+ + {renderChart()} + +
+
+ ); +}; diff --git a/frontend/src/modules/dashboard/components/chart.settings.tsx b/frontend/src/modules/dashboard/components/chart.settings.tsx new file mode 100644 index 0000000..cc4f78d --- /dev/null +++ b/frontend/src/modules/dashboard/components/chart.settings.tsx @@ -0,0 +1,105 @@ +// modules/dashboard/components/WidgetSettings.tsx +import React, { useState } from "react"; +import { motion } from "framer-motion"; +import type { ChartType, ChartWidget } from "../types"; + +interface WidgetSettingsProps { + widget: ChartWidget; + onUpdate: (widget: ChartWidget) => void; + onRemove: () => void; + onClose: () => void; +} + +export const WidgetSettings: React.FC = ({ + widget, + onUpdate, + onRemove, + onClose, +}) => { + const [type, setType] = useState(widget.type); + const [title, setTitle] = useState(widget.title); + + const handleSave = () => { + onUpdate({ ...widget, type, title }); + onClose(); + }; + + return ( + + e.stopPropagation()} + > +

+ Настройки графика +

+ +
+
+ +
+ {(["line", "bar", "area", "pie"] as ChartType[]).map((t) => ( + + ))} +
+
+ +
+ + setTitle(e.target.value)} + className="w-full px-2 py-1 text-[11px] bg-tertiary border border-primary rounded text-primary focus:outline-none focus:border-accent-primary" + /> +
+ +
+ + + +
+
+
+
+ ); +}; diff --git a/frontend/src/modules/dashboard/components/dashboard.chart.tsx b/frontend/src/modules/dashboard/components/dashboard.chart.tsx new file mode 100644 index 0000000..e68b996 --- /dev/null +++ b/frontend/src/modules/dashboard/components/dashboard.chart.tsx @@ -0,0 +1,171 @@ +import React from "react"; +import { + LineChart, + Line, + AreaChart, + Area, + BarChart, + Bar, + PieChart, + Pie, + Cell, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + Legend, +} from "recharts"; +import { motion } from "framer-motion"; +import type { ChartType, MetricData } from "../types"; + +interface DashboardChartProps { + title: string; + type: ChartType; + data: MetricData[]; + dataKeys: string[]; + colors?: string[]; +} + +const COLORS = ["#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6"]; + +export const DashboardChart: React.FC = ({ + title, + type, + data, + dataKeys, + colors = COLORS, +}) => { + const renderChart = () => { + if (!data || data.length === 0) { + return ( +
+ + Нет данных + +
+ ); + } + + const commonProps = { + data, + margin: { top: 5, right: 10, left: 0, bottom: 5 }, + }; + + const axisStyle = { + stroke: "var(--text-secondary)", + tick: { fontSize: 10 }, + }; + + const tooltipStyle = { + contentStyle: { + backgroundColor: "var(--card-bg)", + border: "1px solid var(--border)", + borderRadius: "6px", + fontSize: "11px", + }, + labelStyle: { color: "var(--text-primary)" }, + }; + + if (type === "pie") { + // Если данные уже в формате { name, value } — используем напрямую + const isPieFormat = + data.length > 0 && "name" in data[0] && "value" in data[0]; + + const pieData = isPieFormat + ? data + : data.map((point, i) => ({ + name: dataKeys[i % dataKeys.length], + value: point[dataKeys[i % dataKeys.length]] || 0, + })); + + return ( + + + {pieData.map((entry, index) => ( + + ))} + + + + + ); + } + + const ChartComponent = + type === "line" ? LineChart : type === "area" ? AreaChart : BarChart; + const DataComponent = type === "line" ? Line : type === "area" ? Area : Bar; + + return ( + + + + + + + {dataKeys.map((key, i) => ( + + ))} + + ); + }; + + return ( + +

+ {title} +

+
+ + {renderChart()} + +
+
+ ); +}; diff --git a/frontend/src/modules/dashboard/dashboard.tsx b/frontend/src/modules/dashboard/dashboard.tsx new file mode 100644 index 0000000..6b1999c --- /dev/null +++ b/frontend/src/modules/dashboard/dashboard.tsx @@ -0,0 +1,96 @@ +// modules/dashboard/Dashboard.tsx +import { useAgentStore } from "@/app/providers/layout/store/agent.store"; +import { useEffect, useRef, useState } from "react"; +import { useDashboardStore } from "./store/dashboard.store"; +import { useAuthStore } from "../auth/store/useAuthStore"; +import { ChartWidget } from "./components/chart,widget"; +import { AddWidgetButton } from "./components/add.widget.button"; +import { AddWidgetModal } from "./components/add.widget.modal"; +import { WidgetSettings } from "./components/chart.settings"; +import { useWidgets } from "./hooks/use.widget"; + +export const Dashboard: React.FC = () => { + const { chartData, loading, error, fetchMetrics, clearData } = + useDashboardStore(); + // const { servicesQueryParams } = useAgentStore(); + const intervalRef = useRef(null); + + const { token } = useAuthStore(); + + // Первичная загрузка (не latest) + // const fetchPrimaryData = () => { + // fetchMetrics(false, token || "", servicesQueryParams, { since: "10m" }); + // }; + + // Периодическое обновление (latest) + // const fetchLatestData = () => { + // fetchMetrics(true, token || "", servicesQueryParams); + // }; + + // useEffect(() => { + // fetchPrimaryData(); + // }, []); + + // useEffect(() => { + // intervalRef.current = window.setInterval(() => { + // fetchLatestData(); + // }, 30000); + + // return () => { + // if (intervalRef.current) { + // window.clearInterval(intervalRef.current); + // } + // clearData(); + // }; + // }, [servicesQueryParams]); + + const { widgets, addWidget, updateWidget, removeWidget, toggleVisibility } = + useWidgets(); + const [editingWidget, setEditingWidget] = useState(null); + const [isAdding, setIsAdding] = useState(false); + + const visibleWidgets = widgets.filter((w) => w.visible); + + return ( +
+ {loading && chartData.length === 0 ? ( +
+
+
+ ) : error ? ( +
+ {error} +
+ ) : ( +
+ {visibleWidgets.map((widget) => ( + setEditingWidget(widget)} + onToggleVisibility={() => toggleVisibility(widget.id)} + /> + ))} +
+ )} + + setIsAdding(true)} /> + + setIsAdding(false)} + /> + + {editingWidget && ( + removeWidget(editingWidget.id)} + onClose={() => setEditingWidget(null)} + /> + )} +
+ ); +}; diff --git a/frontend/src/modules/dashboard/hooks/use.widget.ts b/frontend/src/modules/dashboard/hooks/use.widget.ts new file mode 100644 index 0000000..7d701a7 --- /dev/null +++ b/frontend/src/modules/dashboard/hooks/use.widget.ts @@ -0,0 +1,72 @@ +import { useState } from "react"; +import type { ChartType, ChartWidget } from "../types"; + +const initialWidgets: ChartWidget[] = [ + { + id: "1", + type: "line", + title: "Линии", + dataKey: "chart-line", + visible: true, + }, + { + id: "2", + type: "bar", + title: "Столбцы", + dataKey: "chart-bar", + visible: true, + }, + { + id: "3", + type: "area", + title: "Закрашенные линии", + dataKey: "chart-area", + visible: true, + }, + { + id: "4", + type: "pie", + title: "Круговая диаграмма", + dataKey: "chart-pie", + visible: true, + }, +]; + +export const useWidgets = () => { + const [widgets, setWidgets] = useState(initialWidgets); + + const addWidget = (data: { + type: ChartType; + title: string; + dataKey: string; + }) => { + const newWidget: ChartWidget = { + id: Date.now().toString(), + ...data, + visible: true, + }; + setWidgets([...widgets, newWidget]); + }; + + const updateWidget = (updated: ChartWidget) => { + setWidgets(widgets.map((w) => (w.id === updated.id ? updated : w))); + }; + + const removeWidget = (id: string) => { + setWidgets(widgets.filter((w) => w.id !== id)); + }; + + const toggleVisibility = (id: string) => { + setWidgets( + widgets.map((w) => (w.id === id ? { ...w, visible: !w.visible } : w)), + ); + }; + + return { + widgets, + addWidget, + updateWidget, + removeWidget, + toggleVisibility, + }; +}; diff --git a/frontend/src/modules/dashboard/store/dashboard.store.ts b/frontend/src/modules/dashboard/store/dashboard.store.ts new file mode 100644 index 0000000..ae0a368 --- /dev/null +++ b/frontend/src/modules/dashboard/store/dashboard.store.ts @@ -0,0 +1,129 @@ +import { create } from "zustand"; +import { apiService } from "@/shared/api/api.service"; +import type { MetricData } from "../types"; + +interface DashboardState { + chartData: MetricData[]; + loading: boolean; + error: string | null; + fetchMetrics: ( + isLatest: boolean, + token: string, + queryParams?: string, + extraParams?: Record, + ) => Promise; + clearData: () => void; +} + +export const useDashboardStore = create((set, get) => { + const convertPrimaryData = (response: any) => { + set((state) => { + if (!response.intervals || !Array.isArray(response.intervals)) + return { chartData: state.chartData }; + + const newData = [...state.chartData]; + + response.intervals.forEach((interval: any) => { + const newPoint: MetricData = { + timestamp: new Date(interval.timestamp).toLocaleTimeString(), + }; + + if (interval.group_by && Array.isArray(interval.group_by)) { + interval.group_by.forEach((item: any) => { + newPoint[item.value] = item.count; + }); + } + + newData.push(newPoint); + }); + + return { chartData: newData.slice(-20) }; + }); + }; + + const convertSingleData = (response: any) => { + set((state) => { + const newPoint: MetricData = { + timestamp: new Date().toLocaleTimeString(), + }; + + if (Array.isArray(response)) { + response.forEach((item: any) => { + newPoint[item.value] = item.count; + }); + } else if (response.groupBy && Array.isArray(response.groupBy)) { + response.groupBy.forEach((item: any) => { + newPoint[item.value] = item.count; + }); + } + + const updatedData = [...state.chartData, newPoint].slice(-20); + return { chartData: updatedData }; + }); + }; + + const fetchMetrics = async ( + isLatest: boolean, + token: string, + queryParams?: string, + extraParams?: Record, + ) => { + set({ loading: true, error: null }); + + try { + let endpoint = isLatest + ? "logs/aggregations/latest" + : "logs/aggregations"; + + // Если есть queryParams, добавляем его к эндпоинту + if (queryParams && queryParams.trim() !== "") { + endpoint = `${endpoint}?${queryParams}`; + } + + const params: Record = { + agg: "count", + groupby: "level", + ...extraParams, + }; + + const result = await apiService.get(endpoint, { + params, + headers: { + Authorization: `bearer ${token}`, + }, + }); + + if (result) { + if (isLatest) { + convertSingleData(result); + } else { + convertPrimaryData(result); + } + } + } catch (error) { + console.error( + `Failed to fetch ${isLatest ? "latest" : "primary"} metrics:`, + error, + ); + set({ + error: error instanceof Error ? error.message : "Ошибка запроса", + }); + } finally { + set({ loading: false }); + } + }; + + const clearData = () => { + set({ chartData: [], error: null }); + }; + + return { + chartData: [], + loading: false, + error: null, + fetchMetrics, + clearData, + setChartData: (data: MetricData[]) => + set({ chartData: data, loading: false }), + }; +}); diff --git a/frontend/src/modules/dashboard/types.ts b/frontend/src/modules/dashboard/types.ts new file mode 100644 index 0000000..7dc1fac --- /dev/null +++ b/frontend/src/modules/dashboard/types.ts @@ -0,0 +1,22 @@ +export type ChartType = "line" | "bar" | "area" | "pie"; + +export interface ChartWidget { + id: string; + type: ChartType; + title: string; + dataKey: string; + visible: boolean; +} + +export interface MetricData { + timestamp: string; + [key: string]: number | string; +} + +export interface StatsItem { + label: string; + key: string; + icon: string; + color: string; + suffix?: string; +} diff --git a/frontend/src/pages/dashboard.page.tsx b/frontend/src/pages/dashboard.page.tsx new file mode 100644 index 0000000..0141041 --- /dev/null +++ b/frontend/src/pages/dashboard.page.tsx @@ -0,0 +1,197 @@ +import { DashboardChart } from "@/modules/dashboard/components/dashboard.chart"; +import { + ResponsiveContainer, + PieChart, + Pie, + Cell, + Tooltip, + Legend, +} from "recharts"; + +const generateTimeData = (count: number, base: number, variance: number) => { + const data = []; + const now = new Date(); + for (let i = count - 1; i >= 0; i--) { + const time = new Date(now.getTime() - i * 60000); + const h = time.getHours().toString().padStart(2, "0"); + const m = time.getMinutes().toString().padStart(2, "0"); + data.push({ + timestamp: `${h}:${m}`, + value: Math.round( + base + Math.sin(i / 3) * variance + Math.random() * variance * 0.5, + ), + }); + } + return data; +}; + +const cpuData = generateTimeData(20, 45, 25).map((d, i) => ({ + timestamp: d.timestamp, + "Использование %": d.value, +})); + +const ramData = generateTimeData(20, 60, 15).map((d) => ({ + timestamp: d.timestamp, + "Использовано ГБ": d.value / 10, + "Свободно ГБ": 16 - d.value / 10, +})); + +const diskData = generateTimeData(20, 70, 5).map((d) => ({ + timestamp: d.timestamp, + "Занято ГБ": d.value, +})); + +const networkData = generateTimeData(20, 50, 30).map((d) => ({ + timestamp: d.timestamp, + "Входящий Мбит/с": d.value, + "Исходящий Мбит/с": Math.round(d.value * 0.4), +})); + +const metricData = [ + { name: "INFO", value: 125 }, + { name: "WARN", value: 42 }, + { name: "ERROR", value: 18 }, + { name: "CRITICAL", value: 5 }, +]; + +export const DashboardPage = () => { + return ( +
+

+ Мониторинг системы +

+ +
+ {/* Центр: Метрика логов — круговая диаграмма */} +
+
+

+ Метрики логов +

+
+ + + + {metricData.map((entry, index) => ( + + ))} + + + + + +
+
+
+ + {/* Верхний ряд: CPU + RAM */} +
+ + + +
+ + {/* Нижний ряд: Диск + Сеть */} +
+ + + +
+
+
+ ); +}; From 3430070df820b1155ac69c39be7783286aaadbd8 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 18:13:54 +0300 Subject: [PATCH 21/48] feat: adminka --- .../layout/navigation/navigation.tsx | 20 + frontend/src/modules/admin/AdminPanel.tsx | 68 ++ .../src/modules/admin/components/UserCard.tsx | 172 +++++ frontend/src/modules/admin/index.ts | 3 + .../src/modules/admin/store/useAdminStore.ts | 69 ++ frontend/src/modules/admin/types.ts | 15 + frontend/src/pages/admin.page.tsx | 731 +----------------- 7 files changed, 350 insertions(+), 728 deletions(-) create mode 100644 frontend/src/modules/admin/AdminPanel.tsx create mode 100644 frontend/src/modules/admin/components/UserCard.tsx create mode 100644 frontend/src/modules/admin/index.ts create mode 100644 frontend/src/modules/admin/store/useAdminStore.ts create mode 100644 frontend/src/modules/admin/types.ts diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx index d89fe05..8e380fa 100644 --- a/frontend/src/app/providers/layout/navigation/navigation.tsx +++ b/frontend/src/app/providers/layout/navigation/navigation.tsx @@ -120,6 +120,26 @@ export const Navigation = () => { {isDark ? : } + {/* Админка */} + + +
+
+ + {/* Permissions */} +
+ {permissions.map(({ key, label }) => ( + + ))} +
+
+ ); +}; diff --git a/frontend/src/modules/admin/index.ts b/frontend/src/modules/admin/index.ts new file mode 100644 index 0000000..b997e10 --- /dev/null +++ b/frontend/src/modules/admin/index.ts @@ -0,0 +1,3 @@ +export { AdminPanel } from "./AdminPanel"; +export { useAdminStore } from "./store/useAdminStore"; +export type { AdminUser } from "./types"; diff --git a/frontend/src/modules/admin/store/useAdminStore.ts b/frontend/src/modules/admin/store/useAdminStore.ts new file mode 100644 index 0000000..cda4279 --- /dev/null +++ b/frontend/src/modules/admin/store/useAdminStore.ts @@ -0,0 +1,69 @@ +import { create } from "zustand"; +import type { AdminUser, PermissionKey } from "../types"; + +const mockUsers: AdminUser[] = [ + { + id: "1", + login: "admin", + name: "Иван", + last_name: "Петров", + is_active: true, + permission_admin: true, + permission_manage_agent: true, + permission_view: true, + }, + { + id: "2", + login: "operator", + name: "Анна", + last_name: "Сидорова", + is_active: true, + permission_admin: false, + permission_manage_agent: true, + permission_view: true, + }, + { + id: "3", + login: "viewer", + name: "Сергей", + last_name: "Козлов", + is_active: true, + permission_admin: false, + permission_manage_agent: false, + permission_view: true, + }, + { + id: "4", + login: "dev_user", + name: "Мария", + last_name: "Новикова", + is_active: false, + permission_admin: false, + permission_manage_agent: true, + permission_view: true, + }, +]; + +interface AdminState { + users: AdminUser[]; + toggleActive: (id: string) => void; + togglePermission: (id: string, permission: PermissionKey) => void; +} + +export const useAdminStore = create((set) => ({ + users: mockUsers, + + toggleActive: (id: string) => + set((state) => ({ + users: state.users.map((u) => + u.id === id ? { ...u, is_active: !u.is_active } : u, + ), + })), + + togglePermission: (id: string, permission: PermissionKey) => + set((state) => ({ + users: state.users.map((u) => + u.id === id ? { ...u, [permission]: !u[permission] } : u, + ), + })), +})); diff --git a/frontend/src/modules/admin/types.ts b/frontend/src/modules/admin/types.ts new file mode 100644 index 0000000..28686a5 --- /dev/null +++ b/frontend/src/modules/admin/types.ts @@ -0,0 +1,15 @@ +export interface AdminUser { + id: string; + login: string; + name: string; + last_name: string; + is_active: boolean; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; +} + +export type PermissionKey = + | "permission_admin" + | "permission_manage_agent" + | "permission_view"; diff --git a/frontend/src/pages/admin.page.tsx b/frontend/src/pages/admin.page.tsx index 1db30d9..600ce98 100644 --- a/frontend/src/pages/admin.page.tsx +++ b/frontend/src/pages/admin.page.tsx @@ -1,730 +1,5 @@ -import React, { useState, useEffect, useCallback } from "react"; -import { agentApiService } from "@/modules/agent"; -import type { TokenUser, TokenCreate, TokenUpdatePermissions, TokenPasswordReset } from "@/modules/agent"; -import { FiUsers, FiUserPlus, FiEdit2, FiTrash2, FiUnlock, FiLock, FiKey, FiX, FiCheck, FiSearch } from "react-icons/fi"; +import { AdminPanel } from "@/modules/admin"; -export const AdminPage: React.FC = () => { - const [users, setUsers] = useState([]); - const [inactiveUsers, setInactiveUsers] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - const [successMessage, setSuccessMessage] = useState(null); - const [activeTab, setActiveTab] = useState<"active" | "inactive">("active"); - const [searchQuery, setSearchQuery] = useState(""); - - // Modal states - const [showCreateModal, setShowCreateModal] = useState(false); - const [showEditModal, setShowEditModal] = useState(false); - const [showPasswordModal, setShowPasswordModal] = useState(false); - const [selectedUser, setSelectedUser] = useState(null); - - // Form states - const [createData, setCreateData] = useState({ - login: "", - name: "", - last_name: "", - password: "", - permission_admin: false, - permission_manage_agent: false, - permission_view: false, - is_active: false, - }); - - const [editData, setEditData] = useState({ - is_active: false, - permission_admin: false, - permission_manage_agent: false, - permission_view: false, - }); - - const [passwordData, setPasswordData] = useState({ - new_password: "", - }); - - const fetchUsers = useCallback(async () => { - setIsLoading(true); - setError(null); - try { - const [active, inactive] = await Promise.all([ - agentApiService.getUsers(), - agentApiService.getInactiveUsers(), - ]); - setUsers(active); - setInactiveUsers(inactive); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при загрузке пользователей"); - } finally { - setIsLoading(false); - } - }, []); - - useEffect(() => { - fetchUsers(); - }, [fetchUsers]); - - const handleCreateUser = async (e: React.FormEvent) => { - e.preventDefault(); - setError(null); - try { - await agentApiService.createUser(createData); - setSuccessMessage("Пользователь успешно создан"); - setShowCreateModal(false); - setCreateData({ - login: "", - name: "", - last_name: "", - password: "", - permission_admin: false, - permission_manage_agent: false, - permission_view: false, - is_active: false, - }); - await fetchUsers(); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при создании пользователя"); - } - }; - - const handleUpdatePermissions = async (e: React.FormEvent) => { - e.preventDefault(); - if (!selectedUser) return; - - setError(null); - try { - await agentApiService.updateUserPermissions(selectedUser.login, editData); - setSuccessMessage("Права пользователя обновлены"); - setShowEditModal(false); - await fetchUsers(); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при обновлении прав"); - } - }; - - const handleResetPassword = async (e: React.FormEvent) => { - e.preventDefault(); - if (!selectedUser) return; - - setError(null); - try { - await agentApiService.resetUserPassword(selectedUser.login, passwordData); - setSuccessMessage("Пароль изменен"); - setShowPasswordModal(false); - setPasswordData({ new_password: "" }); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при сбросе пароля"); - } - }; - - const handleActivateUser = async (login: string) => { - setError(null); - try { - await agentApiService.activateUser(login); - setSuccessMessage("Пользователь активирован"); - await fetchUsers(); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при активации пользователя"); - } - }; - - const handleDeactivateUser = async (login: string) => { - setError(null); - try { - await agentApiService.deactivateUser(login); - setSuccessMessage("Пользователь деактивирован"); - await fetchUsers(); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при деактивации пользователя"); - } - }; - - const handleDeleteUser = async (login: string) => { - if (!confirm(`Вы уверены, что хотите удалить пользователя ${login}?`)) return; - - setError(null); - try { - await agentApiService.deleteUser(login); - setSuccessMessage("Пользователь удален"); - await fetchUsers(); - } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при удалении пользователя"); - } - }; - - const openEditModal = (user: TokenUser) => { - setSelectedUser(user); - setEditData({ - is_active: user.is_active, - permission_admin: user.permission_admin, - permission_manage_agent: user.permission_manage_agent, - permission_view: user.permission_view, - }); - setShowEditModal(true); - }; - - const openPasswordModal = (user: TokenUser) => { - setSelectedUser(user); - setPasswordData({ new_password: "" }); - setShowPasswordModal(true); - }; - - const filteredUsers = (activeTab === "active" ? users : inactiveUsers).filter( - (user) => - user.login.toLowerCase().includes(searchQuery.toLowerCase()) || - user.name.toLowerCase().includes(searchQuery.toLowerCase()) || - user.last_name.toLowerCase().includes(searchQuery.toLowerCase()) - ); - - const inputStyle: React.CSSProperties = { - width: "100%", - padding: "10px 12px", - border: "1px solid var(--border)", - borderRadius: "8px", - backgroundColor: "var(--input-bg)", - color: "var(--text-primary)", - fontSize: "14px", - }; - - const labelStyle: React.CSSProperties = { - display: "block", - marginBottom: "8px", - color: "var(--text-secondary)", - fontSize: "14px", - fontWeight: 500, - }; - - const buttonBaseStyle: React.CSSProperties = { - padding: "8px 16px", - borderRadius: "8px", - border: "none", - fontSize: "14px", - fontWeight: 500, - cursor: "pointer", - display: "inline-flex", - alignItems: "center", - gap: "6px", - }; - - return ( -
-
- {/* Header */} -
-
-
- -
-
-

- Управление пользователями -

-

- Администрирование учетных записей -

-
-
-
- - {/* Messages */} - {successMessage && ( -
-
- {successMessage} - -
-
- )} - - {error && ( -
-
- {error} - -
-
- )} - - {/* Tabs and Actions */} -
-
- {/* Tabs */} -
- - -
- - {/* Create Button */} - -
- - {/* Search */} -
- - setSearchQuery(e.target.value)} - placeholder="Поиск по логину, имени или фамилии..." - className="w-full pl-10 pr-4 py-2.5 rounded-lg border" - style={{ - backgroundColor: "var(--input-bg)", - borderColor: "var(--border)", - color: "var(--text-primary)", - }} - /> -
-
- - {/* Users Table */} - {isLoading ? ( -
- Загрузка... -
- ) : filteredUsers.length === 0 ? ( -
- Пользователи не найдены -
- ) : ( -
- - - - - - - - - - - - - - {filteredUsers.map((user, index) => ( - - - - - - - - - - ))} - -
ЛогинИмяФамилияАдминУправлениеПросмотрДействия
{user.login}{user.name}{user.last_name} - {user.permission_admin ? ( - - ) : ( - - )} - - {user.permission_manage_agent ? ( - - ) : ( - - )} - - {user.permission_view ? ( - - ) : ( - - )} - -
- - - {activeTab === "active" ? ( - - ) : ( - - )} - -
-
-
- )} -
- - {/* Create User Modal */} - {showCreateModal && ( -
-
-
-

Создать пользователя

- -
- -
- - setCreateData({ ...createData, login: e.target.value })} - required - style={inputStyle} - /> -
-
- - setCreateData({ ...createData, name: e.target.value })} - required - style={inputStyle} - /> -
-
- - setCreateData({ ...createData, last_name: e.target.value })} - required - style={inputStyle} - /> -
-
- - setCreateData({ ...createData, password: e.target.value })} - required - style={inputStyle} - /> -
-
- - - - -
-
- - -
- -
-
- )} - - {/* Edit Permissions Modal */} - {showEditModal && selectedUser && ( -
-
-
-

- Редактировать: {selectedUser.login} -

- -
-
-
- - - - -
-
- - -
-
-
-
- )} - - {/* Reset Password Modal */} - {showPasswordModal && selectedUser && ( -
-
-
-

- Сброс пароля: {selectedUser.login} -

- -
-
-
- - setPasswordData({ new_password: e.target.value })} - required - style={inputStyle} - /> -
-
- - -
-
-
-
- )} -
- ); +export const AdminPage = () => { + return ; }; From 69ff617c3080c9304b272328e549fe71232ac5ed Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 18:20:52 +0300 Subject: [PATCH 22/48] fix: auth store --- .../src/modules/auth/store/useAuthStore.ts | 19 +++++++++---------- frontend/src/modules/auth/types/auth.types.ts | 4 ---- frontend/src/shared/api/axios.instance.ts | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/frontend/src/modules/auth/store/useAuthStore.ts b/frontend/src/modules/auth/store/useAuthStore.ts index 081f837..a961c5d 100644 --- a/frontend/src/modules/auth/store/useAuthStore.ts +++ b/frontend/src/modules/auth/store/useAuthStore.ts @@ -20,16 +20,15 @@ const login = async (credentials: LoginCredentials): Promise => { const register = async ( data: RegisterData, ): Promise> => { - const response = await apiClient.post>("/auth/token", { - login: data.login, - password: data.password, - name: data.firstName, - last_name: data.lastName, - is_active: data.is_active, - permission_admin: data.permission_admin, - permission_manage_agent: data.permission_manage_agent, - permission_view: data.permission_view, - }); + const response = await apiClient.post>( + "/auth/register", + { + login: data.login, + password: data.password, + name: data.firstName, + last_name: data.lastName, + }, + ); return response.data; }; diff --git a/frontend/src/modules/auth/types/auth.types.ts b/frontend/src/modules/auth/types/auth.types.ts index ff289a8..ca4e6d8 100644 --- a/frontend/src/modules/auth/types/auth.types.ts +++ b/frontend/src/modules/auth/types/auth.types.ts @@ -8,10 +8,6 @@ export interface RegisterData { password: string; firstName: string; lastName: string; - is_active?: boolean; - permission_admin?: boolean; - permission_manage_agent?: boolean; - permission_view?: boolean; } export interface LoginResponse { diff --git a/frontend/src/shared/api/axios.instance.ts b/frontend/src/shared/api/axios.instance.ts index 0b72df6..d61f9fe 100644 --- a/frontend/src/shared/api/axios.instance.ts +++ b/frontend/src/shared/api/axios.instance.ts @@ -16,7 +16,7 @@ class ApiClient { constructor() { this.axiosInstance = axios.create({ - baseURL: "http://194.113.106.59:8080/api/v1", + baseURL: "http://10.97.147.99:8080/api/v1", timeout: 10000, headers: { "Content-Type": "application/json", From c6a990782273f7dcb4e6f82dc1431c87ce5de1fc Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 19:49:37 +0300 Subject: [PATCH 23/48] feat --- .../app/providers/layout/sidebar/sidebar.tsx | 78 ++++------- .../app/providers/layout/store/agent.store.ts | 28 ++-- .../modules/agent/api/agent.api.service.ts | 23 ++-- .../src/modules/agent/types/agent.types.ts | 10 +- frontend/src/pages/graphs.page.tsx | 21 +-- frontend/src/pages/logs.page.tsx | 126 ++++++++++++++---- frontend/src/shared/api/websocket.service.ts | 8 +- 7 files changed, 171 insertions(+), 123 deletions(-) diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx index 780fb40..724b885 100644 --- a/frontend/src/app/providers/layout/sidebar/sidebar.tsx +++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx @@ -33,14 +33,14 @@ export const Sidebar: React.FC = ({ const [showTokenModal, setShowTokenModal] = useState(false); const [showGraphs, setShowGraphs] = useState(false); const [expandedAgents, setExpandedAgents] = useState>( - new Set(agents.map((a) => a.name)), + new Set(agents.map((a) => a.label)), ); - const toggleAgent = (name: string) => { + const toggleAgent = (label: string) => { setExpandedAgents((prev) => { const next = new Set(prev); - if (next.has(name)) next.delete(name); - else next.add(name); + if (next.has(label)) next.delete(label); + else next.add(label); return next; }); }; @@ -50,8 +50,8 @@ export const Sidebar: React.FC = ({ const query = searchQuery.toLowerCase(); return agents.filter( (agent) => - agent.name.toLowerCase().includes(query) || - agent.services.some((s) => s.name.toLowerCase().includes(query)), + agent.label.toLowerCase().includes(query) || + agent.services.some((s) => s.toLowerCase().includes(query)), ); }, [agents, searchQuery]); @@ -61,25 +61,25 @@ export const Sidebar: React.FC = ({ agents.forEach((agent) => { nodes.push({ - id: agent.name, - name: agent.name, + id: agent.label, + name: agent.label, type: "agent" as const, val: 8, - description: `Агент: ${agent.name}`, + description: `Агент: ${agent.label}`, }); agent.services.forEach((service) => { - const serviceId = `${agent.name}-${service.name}`; + const serviceId = `${agent.label}-${service}`; nodes.push({ id: serviceId, - name: service.name, + name: service, type: "service" as const, val: 12, - description: `Сервис: ${service.name} (${service.status})`, + description: `Сервис: ${service}`, }); links.push({ - source: agent.name, + source: agent.label, target: serviceId, type: "hosts", }); @@ -239,10 +239,10 @@ export const Sidebar: React.FC = ({ ) : (
{filteredAgents.map((agent) => { - const isExpanded = expandedAgents.has(agent.name); + const isExpanded = expandedAgents.has(agent.label); return (
= ({ {/* Agent header — кликабельный для сворачивания */}
toggleAgent(agent.name)} + onClick={() => toggleAgent(agent.label)} > {isExpanded ? ( @@ -269,13 +269,11 @@ export const Sidebar: React.FC = ({ className="text-sm font-medium flex-1 truncate" style={{ color: "var(--text-primary)" }} > - {agent.name} + {agent.label} - {/* Статус-индикатор агента (сколько сервисов запущено) */} + {/* Статус-индикатор агента (количество сервисов) */}
- {agent.services.filter( - (s) => s.status === "running", - ).length > 0 && ( + {agent.services.length > 0 && ( = ({ className="text-[10px]" style={{ color: "var(--text-muted)" }} > - { - agent.services.filter( - (s) => s.status === "running", - ).length - } - /{agent.services.length} + {agent.services.length}
{/* Кнопка удаления — появляется при наведении */} @@ -299,10 +292,10 @@ export const Sidebar: React.FC = ({ e.stopPropagation(); if ( window.confirm( - `Удалить агента "${agent.name}"?`, + `Удалить агента "${agent.label}"?`, ) ) { - removeAgent(agent.name); + removeAgent(agent.label); } }} className="opacity-0 group-hover:opacity-100 p-1 rounded transition-all flex-shrink-0" @@ -336,49 +329,32 @@ export const Sidebar: React.FC = ({ style={{ borderColor: "var(--border)" }} > {agent.services.map((service) => { - const isRunning = service.status === "running"; - const isError = service.status === "error"; - const isStopped = - service.status === "stopped" || !isRunning; - return (
- {service.name} + {service} {/* Status indicator */}
- {isRunning - ? "run" - : isError - ? "err" - : "stop"} + run
diff --git a/frontend/src/app/providers/layout/store/agent.store.ts b/frontend/src/app/providers/layout/store/agent.store.ts index fb00e96..e39f16e 100644 --- a/frontend/src/app/providers/layout/store/agent.store.ts +++ b/frontend/src/app/providers/layout/store/agent.store.ts @@ -12,30 +12,22 @@ interface AgentState { const mockAgents: AgentInfo[] = [ { - name: "agent-core-01", + label: "agent-core-01", token: "tok_a1b2c3d4e5f6g7h8", - services: [ - { name: "postgres", status: "running" }, - { name: "redis", status: "running" }, - { name: "log-collector", status: "running" }, - ], + services: ["postgres", "redis", "log-collector"], + connected_at: "2026-04-04 15:25:09", }, { - name: "agent-worker-02", + label: "agent-worker-02", token: "tok_x9y8z7w6v5u4t3s2", - services: [ - { name: "celery-worker", status: "running" }, - { name: "flower", status: "stopped" }, - ], + services: ["celery-worker", "flower"], + connected_at: "2026-04-04 15:25:09", }, { - name: "agent-monitor-03", + label: "agent-monitor-03", token: "tok_m1n2o3p4q5r6s7t8", - services: [ - { name: "prometheus", status: "running" }, - { name: "grafana", status: "running" }, - { name: "alertmanager", status: "stopped" }, - ], + services: ["prometheus", "grafana", "alertmanager"], + connected_at: "2026-04-04 15:25:09", }, ]; @@ -59,6 +51,6 @@ export const useAgentStore = create()((set, get) => ({ }, removeAgent: (name: string) => { - set({ agents: get().agents.filter((a) => a.name !== name) }); + set({ agents: get().agents.filter((a) => a.label !== name) }); }, })); diff --git a/frontend/src/modules/agent/api/agent.api.service.ts b/frontend/src/modules/agent/api/agent.api.service.ts index db258e8..14aacd2 100644 --- a/frontend/src/modules/agent/api/agent.api.service.ts +++ b/frontend/src/modules/agent/api/agent.api.service.ts @@ -45,17 +45,20 @@ class AgentApiService { } async searchLogs(filters?: LogFilters): Promise { - const response = await apiClient.get(this.logsBasePath, { - params: { - level: filters?.level, - service: filters?.service, - agent: filters?.agent, - date_from: filters?.date_from, - date_to: filters?.date_to, - limit: filters?.limit ?? 100, - offset: filters?.offset ?? 0, + const response = await apiClient.get( + `${this.logsBasePath}/mock`, + { + params: { + level: filters?.level, + service: filters?.service, + agent: filters?.agent, + date_from: filters?.date_from, + date_to: filters?.date_to, + limit: filters?.limit ?? 100, + offset: filters?.offset ?? 0, + }, }, - }); + ); return response.data; } diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts index 6b7b168..adec31b 100644 --- a/frontend/src/modules/agent/types/agent.types.ts +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -1,12 +1,8 @@ -export interface AgentService { - name: string; - status: string; -} - export interface AgentInfo { - name: string; - services: AgentService[]; token: string; + label: string; + services: string[]; + connected_at: string; } export interface LoginRequest { diff --git a/frontend/src/pages/graphs.page.tsx b/frontend/src/pages/graphs.page.tsx index 5879abd..eca7466 100644 --- a/frontend/src/pages/graphs.page.tsx +++ b/frontend/src/pages/graphs.page.tsx @@ -1,5 +1,10 @@ import { useMemo } from "react"; -import { Graph, type GraphData, type GraphNode, type GraphLink } from "@/modules/graph"; +import { + Graph, + type GraphData, + type GraphNode, + type GraphLink, +} from "@/modules/graph"; import { useAgentStore } from "@/app/providers/layout/store/agent.store"; const buildGraphFromAgents = (): GraphData => { @@ -10,26 +15,26 @@ const buildGraphFromAgents = (): GraphData => { agents.forEach((agent) => { // Агент как узел nodes.push({ - id: agent.name, - name: agent.name, + id: agent.label, + name: agent.label, type: "agent", val: 8, - description: `Агент: ${agent.name}`, + description: `Агент: ${agent.label}`, }); // Сервисы агента как узлы + связи agent.services.forEach((service) => { - const serviceId = `${agent.name}-${service.name}`; + const serviceId = `${agent.label}-${service}`; nodes.push({ id: serviceId, - name: service.name, + name: service, type: "service", val: 12, - description: `Сервис: ${service.name} (${service.status})`, + description: `Сервис: ${service}`, }); links.push({ - source: agent.name, + source: agent.label, target: serviceId, type: "hosts", }); diff --git a/frontend/src/pages/logs.page.tsx b/frontend/src/pages/logs.page.tsx index bedc742..6b2b824 100644 --- a/frontend/src/pages/logs.page.tsx +++ b/frontend/src/pages/logs.page.tsx @@ -21,11 +21,30 @@ const logLevelIcons: Record = { FATAL: , }; -const logLevelColors: Record = { - INFO: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)" }, - WARNING: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)" }, - ERROR: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)" }, - FATAL: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)" }, +const logLevelColors: Record< + string, + { bg: string; text: string; border: string } +> = { + INFO: { + bg: "var(--info-bg)", + text: "var(--info-text)", + border: "var(--info-border)", + }, + WARNING: { + bg: "var(--warning-bg)", + text: "var(--warning-text)", + border: "var(--warning-border)", + }, + ERROR: { + bg: "var(--error-bg)", + text: "var(--error-text)", + border: "var(--error-border)", + }, + FATAL: { + bg: "var(--fatal-bg)", + text: "var(--fatal-text)", + border: "var(--fatal-border)", + }, }; export const LogsPage: React.FC = () => { @@ -47,7 +66,9 @@ export const LogsPage: React.FC = () => { setLogs(data); setTotalLogs(data.length); } catch (err) { - setError(err instanceof Error ? err.message : "Ошибка при загрузке логов"); + setError( + err instanceof Error ? err.message : "Ошибка при загрузке логов", + ); } finally { setIsLoading(false); } @@ -112,7 +133,10 @@ export const LogsPage: React.FC = () => { className="w-14 h-14 rounded-xl flex items-center justify-center" style={{ backgroundColor: "var(--bg-secondary)" }} > - +

{ }} > {/* Table Header */} -
- +
+ Найдено: {totalLogs} записей
{isLoading ? ( -
+
Загрузка логов...
) : logs.length === 0 ? ( -
+
Логи не найдены
) : ( @@ -193,36 +232,58 @@ export const LogsPage: React.FC = () => { - - - - - {logs.map((log, index) => { - const colors = logLevelColors[log.level] || logLevelColors.INFO; + const colors = + logLevelColors[log.level] || logLevelColors.INFO; return ( - - - - @@ -255,7 +325,10 @@ export const LogsPage: React.FC = () => { {/* Pagination */} -
+
- + Показано {logs.length} записей (смещение: {offset})
{logs.map((log, index) => { + const level = log.level || "INFO"; const colors = - logLevelColors[log.level] || logLevelColors.INFO; + logLevelColors[level] || logLevelColors.INFO; return ( { borderColor: colors.border, }} > - {logLevelIcons[log.level]} - {log.level} + {logLevelIcons[level]} + {level} ); From bcca8fa2986ad843ab8d6eddf504f66bb9ba7c46 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sat, 4 Apr 2026 21:38:25 +0300 Subject: [PATCH 25/48] fix: 401 --- .../modules/agent/api/agent.api.service.ts | 35 +++++++++++++------ frontend/src/shared/api/axios.instance.ts | 2 +- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/frontend/src/modules/agent/api/agent.api.service.ts b/frontend/src/modules/agent/api/agent.api.service.ts index db258e8..906371e 100644 --- a/frontend/src/modules/agent/api/agent.api.service.ts +++ b/frontend/src/modules/agent/api/agent.api.service.ts @@ -22,14 +22,14 @@ class AgentApiService { async getAgents(): Promise { const response = await apiClient.get(this.basePath); - return response.data; + return Array.isArray(response.data) ? response.data : []; } async getUsers(): Promise { const response = await apiClient.get( `${this.authBasePath}/tokens`, ); - return response.data; + return Array.isArray(response.data) ? response.data : []; } async createUser(data: TokenCreate): Promise { @@ -47,15 +47,25 @@ class AgentApiService { async searchLogs(filters?: LogFilters): Promise { const response = await apiClient.get(this.logsBasePath, { params: { - level: filters?.level, - service: filters?.service, - agent: filters?.agent, - date_from: filters?.date_from, - date_to: filters?.date_to, + level: filters?.level || undefined, + service: filters?.service || undefined, + agent: filters?.agent || undefined, + date_from: filters?.date_from || undefined, + date_to: filters?.date_to || undefined, limit: filters?.limit ?? 100, offset: filters?.offset ?? 0, }, }); + + if (!Array.isArray(response.data)) { + console.error( + "[Logs] Unexpected response format:", + typeof response.data, + response.data, + ); + return []; + } + return response.data; } @@ -71,21 +81,21 @@ class AgentApiService { const response = await apiClient.get( `${this.logsBasePath}/agents`, ); - return response.data; + return Array.isArray(response.data) ? response.data : []; } async getDistinctLevels(): Promise { const response = await apiClient.get( `${this.logsBasePath}/levels`, ); - return response.data; + return Array.isArray(response.data) ? response.data : []; } async getDistinctServices(): Promise { const response = await apiClient.get( `${this.logsBasePath}/services`, ); - return response.data; + return Array.isArray(response.data) ? response.data : []; } // User management methods @@ -93,6 +103,9 @@ class AgentApiService { const response = await apiClient.get( `${this.authBasePath}/users/${login}`, ); + if (!response.data || typeof response.data !== "object") { + throw new Error(`User not found: ${login}`); + } return response.data; } @@ -100,7 +113,7 @@ class AgentApiService { const response = await apiClient.get( `${this.authBasePath}/users/inactive`, ); - return response.data; + return Array.isArray(response.data) ? response.data : []; } async updateUser(login: string, data: TokenUpdate): Promise { diff --git a/frontend/src/shared/api/axios.instance.ts b/frontend/src/shared/api/axios.instance.ts index d61f9fe..afd5aa1 100644 --- a/frontend/src/shared/api/axios.instance.ts +++ b/frontend/src/shared/api/axios.instance.ts @@ -22,7 +22,7 @@ class ApiClient { "Content-Type": "application/json", }, validateStatus: (status) => { - return status >= 200 && status < 500; + return status >= 200 && status < 400; }, }); From d46d0f8253f9c60a8547ef3b454d47066ea34a27 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 21:41:48 +0300 Subject: [PATCH 26/48] feat: adminka2 --- frontend/src/modules/admin/AdminPanel.tsx | 126 ++++++- frontend/src/modules/admin/api/admin.api.ts | 88 +++++ .../admin/components/CreateUserModal.tsx | 310 ++++++++++++++++++ .../src/modules/admin/components/UserCard.tsx | 125 ++++--- frontend/src/modules/admin/index.ts | 1 + .../src/modules/admin/store/useAdminStore.ts | 178 ++++++---- 6 files changed, 710 insertions(+), 118 deletions(-) create mode 100644 frontend/src/modules/admin/api/admin.api.ts create mode 100644 frontend/src/modules/admin/components/CreateUserModal.tsx diff --git a/frontend/src/modules/admin/AdminPanel.tsx b/frontend/src/modules/admin/AdminPanel.tsx index 4ee11a7..0fd035a 100644 --- a/frontend/src/modules/admin/AdminPanel.tsx +++ b/frontend/src/modules/admin/AdminPanel.tsx @@ -1,10 +1,26 @@ -import React from "react"; -import { FaUsers, FaShieldAlt } from "react-icons/fa"; +import React, { useEffect, useState } from "react"; +import { + FaUsers, + FaShieldAlt, + FaSpinner, + FaExclamationCircle, + FaPlus, +} from "react-icons/fa"; import { useAdminStore } from "./store/useAdminStore"; import { UserCard } from "./components/UserCard"; +import { CreateUserModal } from "./components/CreateUserModal"; export const AdminPanel: React.FC = () => { const users = useAdminStore((s) => s.users); + const loading = useAdminStore((s) => s.loading); + const error = useAdminStore((s) => s.error); + const fetchUsers = useAdminStore((s) => s.fetchUsers); + + const [showCreateModal, setShowCreateModal] = useState(false); + + useEffect(() => { + fetchUsers(); + }, []); const activeCount = users.filter((u) => u.is_active).length; @@ -45,24 +61,106 @@ export const AdminPanel: React.FC = () => { Управление пользователями - {activeCount} / {users.length} активных + {loading + ? "Загрузка..." + : `${activeCount} / ${users.length} активных`} + + + {/* Error */} + {error && ( +
+ + {error} +
+ )} + + {/* Loading */} + {loading && users.length === 0 && ( +
+ +
+ )} + {/* Users list */} -
- {users.map((user) => ( - - ))} -
+ {!loading && ( +
+ {users.map((user) => ( + + ))} +
+ )} + + {/* Empty state */} + {!loading && users.length === 0 && ( +
+

+ Нет зарегистрированных пользователей +

+
+ )} + + {/* Create user modal */} + setShowCreateModal(false)} + /> ); }; diff --git a/frontend/src/modules/admin/api/admin.api.ts b/frontend/src/modules/admin/api/admin.api.ts new file mode 100644 index 0000000..3b7a697 --- /dev/null +++ b/frontend/src/modules/admin/api/admin.api.ts @@ -0,0 +1,88 @@ +import { apiClient } from "@/shared/api/axios.instance"; + +const getAuthHeader = () => { + const raw = localStorage.getItem("auth-storage"); + if (raw) { + try { + const parsed = JSON.parse(raw); + if (parsed?.state?.token) return `bearer ${parsed.state.token}`; + } catch {} + } + return ""; +}; + +export interface AdminUserDto { + id: number; + login: string; + name: string; + last_name: string; + is_active: boolean; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; + token: string; +} + +export interface CreateUserPayload { + login: string; + name: string; + last_name: string; + password: string; + is_active: boolean; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; +} + +export interface PermissionsPayload { + is_active: boolean; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; +} + +export const adminApi = { + getUsers: async (): Promise => { + const res = await apiClient.get("/auth/tokens", { + headers: { Authorization: getAuthHeader() }, + }); + return res.data; + }, + + createUser: async (payload: CreateUserPayload): Promise => { + await apiClient.post("/auth/token", payload, { + headers: { Authorization: getAuthHeader() }, + }); + }, + + deleteUser: async (login: string): Promise => { + await apiClient.delete(`/auth/tokens/${login}`, { + headers: { Authorization: getAuthHeader() }, + }); + }, + + activateUser: async (login: string): Promise => { + await apiClient.post( + `/auth/users/${login}/activate`, + {}, + { headers: { Authorization: getAuthHeader() } }, + ); + }, + + deactivateUser: async (login: string): Promise => { + await apiClient.post( + `/auth/users/${login}/deactivate`, + {}, + { headers: { Authorization: getAuthHeader() } }, + ); + }, + + updatePermissions: async ( + login: string, + payload: PermissionsPayload, + ): Promise => { + await apiClient.put(`/auth/users/${login}/permissions`, payload, { + headers: { Authorization: getAuthHeader() }, + }); + }, +}; diff --git a/frontend/src/modules/admin/components/CreateUserModal.tsx b/frontend/src/modules/admin/components/CreateUserModal.tsx new file mode 100644 index 0000000..58eaca4 --- /dev/null +++ b/frontend/src/modules/admin/components/CreateUserModal.tsx @@ -0,0 +1,310 @@ +import React, { useState } from "react"; +import { FaTimes, FaPlus } from "react-icons/fa"; +import { useAdminStore } from "../store/useAdminStore"; + +interface CreateUserModalProps { + isOpen: boolean; + onClose: () => void; +} + +export const CreateUserModal: React.FC = ({ + isOpen, + onClose, +}) => { + const createUser = useAdminStore((s) => s.createUser); + + const [form, setForm] = useState({ + login: "", + name: "", + last_name: "", + password: "", + is_active: true, + permission_admin: false, + permission_manage_agent: false, + permission_view: true, + }); + + const [loading, setLoading] = useState(false); + + if (!isOpen) return null; + + const handleSubmit = async () => { + if (!form.login || !form.password) return; + setLoading(true); + await createUser(form); + setLoading(false); + setForm({ + login: "", + name: "", + last_name: "", + password: "", + is_active: true, + permission_admin: false, + permission_manage_agent: false, + permission_view: true, + }); + onClose(); + }; + + return ( +
+
e.stopPropagation()} + > +
+

+ Создать пользователя +

+ +
+ +
+ {/* Login */} +
+ + setForm({ ...form, login: e.target.value })} + style={{ + width: "100%", + padding: "8px", + backgroundColor: "var(--input-bg)", + border: "1px solid var(--border)", + borderRadius: "6px", + color: "var(--text-primary)", + fontSize: "13px", + outline: "none", + }} + /> +
+ + {/* Password */} +
+ + setForm({ ...form, password: e.target.value })} + style={{ + width: "100%", + padding: "8px", + backgroundColor: "var(--input-bg)", + border: "1px solid var(--border)", + borderRadius: "6px", + color: "var(--text-primary)", + fontSize: "13px", + outline: "none", + }} + /> +
+ + {/* Name + Last name */} +
+
+ + setForm({ ...form, name: e.target.value })} + style={{ + width: "100%", + padding: "8px", + backgroundColor: "var(--input-bg)", + border: "1px solid var(--border)", + borderRadius: "6px", + color: "var(--text-primary)", + fontSize: "13px", + outline: "none", + }} + /> +
+
+ + + setForm({ ...form, last_name: e.target.value }) + } + style={{ + width: "100%", + padding: "8px", + backgroundColor: "var(--input-bg)", + border: "1px solid var(--border)", + borderRadius: "6px", + color: "var(--text-primary)", + fontSize: "13px", + outline: "none", + }} + /> +
+
+ + {/* Permissions */} +
+ +
+ {[ + { key: "is_active", label: "Active" }, + { key: "permission_view", label: "View" }, + { key: "permission_manage_agent", label: "Manage Agent" }, + { key: "permission_admin", label: "Admin" }, + ].map(({ key, label }) => ( + + ))} +
+
+ + {/* Submit */} + +
+
+
+ ); +}; diff --git a/frontend/src/modules/admin/components/UserCard.tsx b/frontend/src/modules/admin/components/UserCard.tsx index d1ae490..8ffe552 100644 --- a/frontend/src/modules/admin/components/UserCard.tsx +++ b/frontend/src/modules/admin/components/UserCard.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { FaUser, FaCheck, FaTimes } from "react-icons/fa"; +import { FaUser, FaCheck, FaTrash } from "react-icons/fa"; import type { AdminUser, PermissionKey } from "../types"; import { useAdminStore } from "../store/useAdminStore"; @@ -14,8 +14,10 @@ const permissions: { key: PermissionKey; label: string }[] = [ ]; export const UserCard: React.FC = ({ user }) => { + const users = useAdminStore((s) => s.users); const toggleActive = useAdminStore((s) => s.toggleActive); const togglePermission = useAdminStore((s) => s.togglePermission); + const deleteUser = useAdminStore((s) => s.deleteUser); return (
= ({ user }) => { opacity: user.is_active ? 1 : 0.6, }} > - {/* Header: User info + Active toggle */} + {/* Header: User info + Active toggle + Delete */}
= ({ user }) => {
- {/* Active toggle */} -
- - {user.is_active ? "Active" : "Inactive"} - - +
+ + {/* Delete button */} + @@ -144,7 +176,7 @@ export const UserCard: React.FC = ({ user }) => { }} >
togglePermission(user.id, key)} + onClick={() => togglePermission(user.id, user.login, key, users)} style={{ width: "18px", height: "18px", @@ -160,7 +192,10 @@ export const UserCard: React.FC = ({ user }) => { }} > {user[key] && ( - + )}
{label} diff --git a/frontend/src/modules/admin/index.ts b/frontend/src/modules/admin/index.ts index b997e10..5a039a3 100644 --- a/frontend/src/modules/admin/index.ts +++ b/frontend/src/modules/admin/index.ts @@ -1,3 +1,4 @@ export { AdminPanel } from "./AdminPanel"; export { useAdminStore } from "./store/useAdminStore"; +export { adminApi } from "./api/admin.api"; export type { AdminUser } from "./types"; diff --git a/frontend/src/modules/admin/store/useAdminStore.ts b/frontend/src/modules/admin/store/useAdminStore.ts index cda4279..34dcb21 100644 --- a/frontend/src/modules/admin/store/useAdminStore.ts +++ b/frontend/src/modules/admin/store/useAdminStore.ts @@ -1,69 +1,129 @@ import { create } from "zustand"; import type { AdminUser, PermissionKey } from "../types"; - -const mockUsers: AdminUser[] = [ - { - id: "1", - login: "admin", - name: "Иван", - last_name: "Петров", - is_active: true, - permission_admin: true, - permission_manage_agent: true, - permission_view: true, - }, - { - id: "2", - login: "operator", - name: "Анна", - last_name: "Сидорова", - is_active: true, - permission_admin: false, - permission_manage_agent: true, - permission_view: true, - }, - { - id: "3", - login: "viewer", - name: "Сергей", - last_name: "Козлов", - is_active: true, - permission_admin: false, - permission_manage_agent: false, - permission_view: true, - }, - { - id: "4", - login: "dev_user", - name: "Мария", - last_name: "Новикова", - is_active: false, - permission_admin: false, - permission_manage_agent: true, - permission_view: true, - }, -]; +import { adminApi } from "../api/admin.api"; +import type { CreateUserPayload } from "../api/admin.api"; interface AdminState { users: AdminUser[]; - toggleActive: (id: string) => void; - togglePermission: (id: string, permission: PermissionKey) => void; + loading: boolean; + error: string | null; + fetchUsers: () => Promise; + createUser: (payload: CreateUserPayload) => Promise; + deleteUser: (id: string, login: string) => Promise; + toggleActive: (id: string, login: string, current: boolean) => Promise; + togglePermission: ( + id: string, + login: string, + permission: PermissionKey, + users: AdminUser[], + ) => Promise; } -export const useAdminStore = create((set) => ({ - users: mockUsers, +export const useAdminStore = create((set, get) => ({ + users: [], + loading: false, + error: null, - toggleActive: (id: string) => - set((state) => ({ - users: state.users.map((u) => - u.id === id ? { ...u, is_active: !u.is_active } : u, - ), - })), + fetchUsers: async () => { + set({ loading: true, error: null }); + try { + const data = await adminApi.getUsers(); + set({ + users: data.map((u) => ({ + id: String(u.id), + login: u.login, + name: u.name, + last_name: u.last_name, + is_active: u.is_active, + permission_admin: u.permission_admin, + permission_manage_agent: u.permission_manage_agent, + permission_view: u.permission_view, + })), + loading: false, + }); + } catch (e) { + set({ + error: e instanceof Error ? e.message : "Failed to fetch users", + loading: false, + }); + } + }, - togglePermission: (id: string, permission: PermissionKey) => - set((state) => ({ - users: state.users.map((u) => - u.id === id ? { ...u, [permission]: !u[permission] } : u, - ), - })), + createUser: async (payload) => { + try { + await adminApi.createUser(payload); + await get().fetchUsers(); + } catch (e) { + set({ error: e instanceof Error ? e.message : "Failed to create user" }); + } + }, + + deleteUser: async (id, login) => { + try { + await adminApi.deleteUser(login); + set((state) => ({ + users: state.users.filter((u) => u.id !== id), + })); + } catch (e) { + set({ error: e instanceof Error ? e.message : "Failed to delete user" }); + } + }, + + toggleActive: async (id, login, current) => { + try { + if (current) { + await adminApi.deactivateUser(login); + } else { + await adminApi.activateUser(login); + } + set((state) => ({ + users: state.users.map((u) => + u.id === id ? { ...u, is_active: !current } : u, + ), + })); + } catch (e) { + set({ + error: e instanceof Error ? e.message : "Failed to toggle active", + }); + } + }, + + togglePermission: async (id, login, permission, users) => { + const user = users.find((u) => u.id === id); + if (!user) return; + + const newPermissions = { + is_active: user.is_active, + permission_admin: + permission === "permission_admin" + ? !user.permission_admin + : user.permission_admin, + permission_manage_agent: + permission === "permission_manage_agent" + ? !user.permission_manage_agent + : user.permission_manage_agent, + permission_view: + permission === "permission_view" + ? !user.permission_view + : user.permission_view, + }; + + try { + await adminApi.updatePermissions(login, newPermissions); + set((state) => ({ + users: state.users.map((u) => + u.id === id + ? { + ...u, + [permission]: !u[permission], + } + : u, + ), + })); + } catch (e) { + set({ + error: e instanceof Error ? e.message : "Failed to update permissions", + }); + } + }, })); From c73035019fb00d4be9abcce8bcaae9f11c3864c8 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 4 Apr 2026 21:44:39 +0300 Subject: [PATCH 27/48] =?UTF-8?q?fix:=20hiden=20button=20'=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D1=8C'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/modules/graph/components/GraphControls.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/modules/graph/components/GraphControls.tsx b/frontend/src/modules/graph/components/GraphControls.tsx index ff53aab..2b15d5d 100644 --- a/frontend/src/modules/graph/components/GraphControls.tsx +++ b/frontend/src/modules/graph/components/GraphControls.tsx @@ -52,7 +52,7 @@ export const GraphControls: React.FC = ({ return (
{/* Режим создания связи */} - + */} {/* Зум + */}
-
- + {/* Error */} + {tokenError && (
- + )} + + {/* Label input */} + {!generatedToken && ( +
+ - {token && ( + Имя токена + + setTokenLabel(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter" && tokenLabel.trim()) { + handleGenerateToken(); + } + }} + placeholder="Введите имя..." + autoFocus + className="w-full px-3 py-2 rounded-lg border text-sm focus:outline-none transition-all" + style={{ + backgroundColor: "var(--input-bg)", + borderColor: "var(--border)", + color: "var(--text-primary)", + }} + /> +
+ )} + + {/* Generated token */} + {generatedToken && ( +
+ +
+ + {generatedToken} + - )} +
-
+ )} - + {/* Buttons */} +
+ {generatedToken && ( + + )} + +
diff --git a/frontend/src/modules/admin/api/admin.api.ts b/frontend/src/modules/admin/api/admin.api.ts index 3b7a697..3419ec9 100644 --- a/frontend/src/modules/admin/api/admin.api.ts +++ b/frontend/src/modules/admin/api/admin.api.ts @@ -85,4 +85,13 @@ export const adminApi = { headers: { Authorization: getAuthHeader() }, }); }, + + generateToken: async (label: string): Promise => { + const res = await apiClient.post<{ token: string }>( + "/agents/register-token", + { label }, + { headers: { Authorization: getAuthHeader() } }, + ); + return res.data.token; + }, }; From 43ea41f633954996bf766285487952e9dd0d99b2 Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sun, 5 Apr 2026 00:13:09 +0300 Subject: [PATCH 29/48] fix: logs filter --- .../modules/agent/store/logFilter.store.ts | 20 +++++++++---- .../src/modules/agent/types/agent.types.ts | 2 +- frontend/src/modules/agent/ui/LogFilters.tsx | 12 ++++---- frontend/src/pages/logs.page.tsx | 20 ++++++------- frontend/src/shared/api/axios.instance.ts | 29 ++++++++++++++++++- 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/frontend/src/modules/agent/store/logFilter.store.ts b/frontend/src/modules/agent/store/logFilter.store.ts index c736e60..320bc86 100644 --- a/frontend/src/modules/agent/store/logFilter.store.ts +++ b/frontend/src/modules/agent/store/logFilter.store.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; -export type LogLevel = "INFO" | "WARNING" | "ERROR" | "FATAL"; +export type LogLevel = "info" | "warning" | "error" | "fatal"; interface LogFilterState { searchQuery: string; @@ -22,7 +22,7 @@ interface LogFilterState { setOffset: (offset: number) => void; resetFilters: () => void; getFilters: () => { - level?: string; + level?: string | string[]; service?: string; agent?: string; date_from?: string; @@ -36,7 +36,7 @@ export const useLogFilterStore = create((set, get) => ({ searchQuery: "", startDate: null, endDate: null, - selectedLogLevels: ["INFO", "WARNING", "ERROR", "FATAL"], + selectedLogLevels: ["info", "warning", "error", "fatal"], selectedService: "", selectedAgent: "", limit: 100, @@ -63,7 +63,7 @@ export const useLogFilterStore = create((set, get) => ({ searchQuery: "", startDate: null, endDate: null, - selectedLogLevels: ["INFO", "WARNING", "ERROR", "FATAL"], + selectedLogLevels: ["info", "warning", "error", "fatal"], selectedService: "", selectedAgent: "", limit: 100, @@ -72,9 +72,17 @@ export const useLogFilterStore = create((set, get) => ({ }, getFilters: () => { - const { selectedLogLevels, selectedService, selectedAgent, startDate, endDate, limit, offset } = get(); + const { + selectedLogLevels, + selectedService, + selectedAgent, + startDate, + endDate, + limit, + offset, + } = get(); return { - level: selectedLogLevels.length > 0 ? selectedLogLevels.join(",") : undefined, + level: selectedLogLevels.length > 0 ? selectedLogLevels : undefined, service: selectedService || undefined, agent: selectedAgent || undefined, date_from: startDate ? startDate.toISOString() : undefined, diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts index adec31b..da132ab 100644 --- a/frontend/src/modules/agent/types/agent.types.ts +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -62,7 +62,7 @@ export interface InsertLogsRequest { } export interface LogFilters { - level?: string; + level?: string | string[]; service?: string; agent?: string; date_from?: string; diff --git a/frontend/src/modules/agent/ui/LogFilters.tsx b/frontend/src/modules/agent/ui/LogFilters.tsx index 36ba5fb..03e47fc 100644 --- a/frontend/src/modules/agent/ui/LogFilters.tsx +++ b/frontend/src/modules/agent/ui/LogFilters.tsx @@ -13,22 +13,22 @@ const logLevelColors: Record< LogLevel, { bg: string; text: string; border: string } > = { - INFO: { + info: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)", }, - WARNING: { + warning: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)", }, - ERROR: { + error: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)", }, - FATAL: { + fatal: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)", @@ -272,7 +272,7 @@ export const LogFilters: React.FC = ({
- {(["INFO", "WARNING", "ERROR", "FATAL"] as LogLevel[]).map( + {(["info", "warning", "error", "fatal"] as LogLevel[]).map( (level) => { const isSelected = selectedLogLevels.includes(level); const colors = logLevelColors[level]; @@ -291,7 +291,7 @@ export const LogFilters: React.FC = ({ {isSelected && ( )} - {level} + {level.toUpperCase()} ); }, diff --git a/frontend/src/pages/logs.page.tsx b/frontend/src/pages/logs.page.tsx index 0ec9256..bd26c3e 100644 --- a/frontend/src/pages/logs.page.tsx +++ b/frontend/src/pages/logs.page.tsx @@ -15,32 +15,32 @@ import { } from "react-icons/fi"; const logLevelIcons: Record = { - INFO: , - WARNING: , - ERROR: , - FATAL: , + info: , + warning: , + error: , + fatal: , }; const logLevelColors: Record< string, { bg: string; text: string; border: string } > = { - INFO: { + info: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)", }, - WARNING: { + warning: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)", }, - ERROR: { + error: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)", }, - FATAL: { + fatal: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)", @@ -306,9 +306,9 @@ export const LogsPage: React.FC = () => {
{logs.map((log, index) => { - const level = log.level || "INFO"; + const level = log.level?.toLowerCase() || "info"; const colors = - logLevelColors[level] || logLevelColors.INFO; + logLevelColors[level] || logLevelColors.info; return ( { return status >= 200 && status < 400; }, + // Добавляем кастомный сериализатор параметров + paramsSerializer: { + serialize: (params) => { + const parts: string[] = []; + + Object.entries(params).forEach(([key, value]) => { + if (value === undefined || value === null) return; + + if (Array.isArray(value)) { + // Преобразуем массив в множественные параметры: level=info&level=warning + value.forEach((item) => { + if (item !== undefined && item !== null) { + parts.push( + `${encodeURIComponent(key)}=${encodeURIComponent(item)}`, + ); + } + }); + } else { + parts.push( + `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`, + ); + } + }); + + return parts.join("&"); + }, + }, }); this.setupInterceptors(); From cf6065b55a1194a82746c5ddc63478ae29f8fd4b Mon Sep 17 00:00:00 2001 From: NikitaTorbenko <2015nekitciti@gmail.com> Date: Sun, 5 Apr 2026 00:55:05 +0300 Subject: [PATCH 30/48] feat: complete logs --- .../modules/agent/store/logFilter.store.ts | 23 ++--- .../src/modules/agent/types/agent.types.ts | 10 +- frontend/src/modules/agent/ui/LogFilters.tsx | 94 +++++++++++++++---- frontend/src/pages/logs.page.tsx | 40 +++++--- 4 files changed, 114 insertions(+), 53 deletions(-) diff --git a/frontend/src/modules/agent/store/logFilter.store.ts b/frontend/src/modules/agent/store/logFilter.store.ts index 320bc86..60be5e5 100644 --- a/frontend/src/modules/agent/store/logFilter.store.ts +++ b/frontend/src/modules/agent/store/logFilter.store.ts @@ -6,7 +6,7 @@ interface LogFilterState { searchQuery: string; startDate: Date | null; endDate: Date | null; - selectedLogLevels: LogLevel[]; + selectedLogLevel: LogLevel | null; selectedService: string; selectedAgent: string; limit: number; @@ -15,14 +15,14 @@ interface LogFilterState { setSearchQuery: (query: string) => void; setStartDate: (date: Date | null) => void; setEndDate: (date: Date | null) => void; - toggleLogLevel: (level: LogLevel) => void; + setSelectedLogLevel: (level: LogLevel | null) => void; setSelectedService: (service: string) => void; setSelectedAgent: (agent: string) => void; setLimit: (limit: number) => void; setOffset: (offset: number) => void; resetFilters: () => void; getFilters: () => { - level?: string | string[]; + level?: string; service?: string; agent?: string; date_from?: string; @@ -36,7 +36,7 @@ export const useLogFilterStore = create((set, get) => ({ searchQuery: "", startDate: null, endDate: null, - selectedLogLevels: ["info", "warning", "error", "fatal"], + selectedLogLevel: null, selectedService: "", selectedAgent: "", limit: 100, @@ -45,14 +45,7 @@ export const useLogFilterStore = create((set, get) => ({ setSearchQuery: (query) => set({ searchQuery: query }), setStartDate: (date) => set({ startDate: date }), setEndDate: (date) => set({ endDate: date }), - toggleLogLevel: (level) => { - const { selectedLogLevels } = get(); - if (selectedLogLevels.includes(level)) { - set({ selectedLogLevels: selectedLogLevels.filter((l) => l !== level) }); - } else { - set({ selectedLogLevels: [...selectedLogLevels, level] }); - } - }, + setSelectedLogLevel: (level) => set({ selectedLogLevel: level }), setSelectedService: (service) => set({ selectedService: service }), setSelectedAgent: (agent) => set({ selectedAgent: agent }), setLimit: (limit) => set({ limit }), @@ -63,7 +56,7 @@ export const useLogFilterStore = create((set, get) => ({ searchQuery: "", startDate: null, endDate: null, - selectedLogLevels: ["info", "warning", "error", "fatal"], + selectedLogLevel: null, selectedService: "", selectedAgent: "", limit: 100, @@ -73,7 +66,7 @@ export const useLogFilterStore = create((set, get) => ({ getFilters: () => { const { - selectedLogLevels, + selectedLogLevel, selectedService, selectedAgent, startDate, @@ -82,7 +75,7 @@ export const useLogFilterStore = create((set, get) => ({ offset, } = get(); return { - level: selectedLogLevels.length > 0 ? selectedLogLevels : undefined, + level: selectedLogLevel || undefined, service: selectedService || undefined, agent: selectedAgent || undefined, date_from: startDate ? startDate.toISOString() : undefined, diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts index da132ab..addeaea 100644 --- a/frontend/src/modules/agent/types/agent.types.ts +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -42,11 +42,11 @@ export interface TokenUser { } export interface LogEntry { - agent: string; - level: string; - message: string; - service: string; - timestamp: string; + Agent: string; + Level: string; + Message: string; + Service: string; + Timestamp: string; } export interface InsertLogRequest { diff --git a/frontend/src/modules/agent/ui/LogFilters.tsx b/frontend/src/modules/agent/ui/LogFilters.tsx index 03e47fc..7490251 100644 --- a/frontend/src/modules/agent/ui/LogFilters.tsx +++ b/frontend/src/modules/agent/ui/LogFilters.tsx @@ -14,14 +14,14 @@ const logLevelColors: Record< { bg: string; text: string; border: string } > = { info: { - bg: "var(--info-bg)", - text: "var(--info-text)", - border: "var(--info-border)", + bg: "rgba(59, 130, 246, 0.1)", + text: "#3b82f6", + border: "rgba(59, 130, 246, 0.3)", }, warning: { - bg: "var(--warning-bg)", - text: "var(--warning-text)", - border: "var(--warning-border)", + bg: "rgba(245, 158, 11, 0.1)", + text: "#f59e0b", + border: "rgba(245, 158, 11, 0.3)", }, error: { bg: "var(--error-bg)", @@ -29,9 +29,9 @@ const logLevelColors: Record< border: "var(--error-border)", }, fatal: { - bg: "var(--fatal-bg)", - text: "var(--fatal-text)", - border: "var(--fatal-border)", + bg: "rgba(168, 85, 247, 0.1)", + text: "#a855f7", + border: "rgba(168, 85, 247, 0.3)", }, }; @@ -50,13 +50,13 @@ export const LogFilters: React.FC = ({ searchQuery, startDate, endDate, - selectedLogLevels, + selectedLogLevel, selectedService, selectedAgent, setSearchQuery, setStartDate, setEndDate, - toggleLogLevel, + setSelectedLogLevel, setSelectedService, setSelectedAgent, resetFilters, @@ -67,6 +67,9 @@ export const LogFilters: React.FC = ({ const [localEndDate, setLocalEndDate] = useState(endDate); const [localService, setLocalService] = useState(selectedService); const [localAgent, setLocalAgent] = useState(selectedAgent); + const [localLevel, setLocalLevel] = useState( + selectedLogLevel, + ); useEffect(() => { setLocalSearchQuery(searchQuery); @@ -88,10 +91,15 @@ export const LogFilters: React.FC = ({ setLocalAgent(selectedAgent); }, [selectedAgent]); + useEffect(() => { + setLocalLevel(selectedLogLevel); + }, [selectedLogLevel]); + const handleApply = useCallback(() => { setSearchQuery(localSearchQuery); setStartDate(localStartDate); setEndDate(localEndDate); + setSelectedLogLevel(localLevel); setSelectedService(localService); setSelectedAgent(localAgent); onApply(); @@ -99,6 +107,7 @@ export const LogFilters: React.FC = ({ localSearchQuery, localStartDate, localEndDate, + localLevel, localService, localAgent, onApply, @@ -108,6 +117,7 @@ export const LogFilters: React.FC = ({ setLocalSearchQuery(""); setLocalStartDate(null); setLocalEndDate(null); + setLocalLevel(null); setLocalService(""); setLocalAgent(""); resetFilters(); @@ -121,7 +131,7 @@ export const LogFilters: React.FC = ({ if (endDate) count++; if (selectedService) count++; if (selectedAgent) count++; - if (selectedLogLevels.length < 4) count++; + if (selectedLogLevel) count++; return count; }; @@ -265,21 +275,18 @@ export const LogFilters: React.FC = ({ className="text-xs font-medium" style={{ color: "var(--text-secondary)" }} > - Уровни логов - - - ({selectedLogLevels.length}/4) + Уровень логов
{(["info", "warning", "error", "fatal"] as LogLevel[]).map( (level) => { - const isSelected = selectedLogLevels.includes(level); + const isSelected = localLevel === level; const colors = logLevelColors[level]; return (
)} + {selectedLogLevel && + (() => { + const colors = logLevelColors[selectedLogLevel]; + return ( +
+ + + Уровень: {selectedLogLevel.toUpperCase()} + + +
+ ); + })()} {selectedAgent && (
= { info: { - bg: "var(--info-bg)", - text: "var(--info-text)", - border: "var(--info-border)", + bg: "rgba(59, 130, 246, 0.1)", + text: "#3b82f6", + border: "rgba(59, 130, 246, 0.3)", }, warning: { - bg: "var(--warning-bg)", - text: "var(--warning-text)", - border: "var(--warning-border)", + bg: "rgba(245, 158, 11, 0.1)", + text: "#f59e0b", + border: "rgba(245, 158, 11, 0.3)", }, error: { bg: "var(--error-bg)", @@ -41,9 +41,9 @@ const logLevelColors: Record< border: "var(--error-border)", }, fatal: { - bg: "var(--fatal-bg)", - text: "var(--fatal-text)", - border: "var(--fatal-border)", + bg: "rgba(168, 85, 247, 0.1)", + text: "#a855f7", + border: "rgba(168, 85, 247, 0.3)", }, }; @@ -306,13 +306,13 @@ export const LogsPage: React.FC = () => {
{logs.map((log, index) => { - const level = log.level?.toLowerCase() || "info"; + const level = log.Level?.toLowerCase() || "info"; const colors = logLevelColors[level] || logLevelColors.info; return ( { ? "var(--card-bg)" : "var(--bg-secondary)", }} + onMouseEnter={(e) => { + e.currentTarget.style.backgroundColor = + "var(--border)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = + index % 2 === 0 + ? "var(--card-bg)" + : "var(--bg-secondary)"; + }} > ); From 07066ec8c06806a8fa92dfc4997bb4597a9d258f Mon Sep 17 00:00:00 2001 From: nikita Date: Sun, 5 Apr 2026 00:56:48 +0300 Subject: [PATCH 31/48] feat: request for tree --- frontend/src/modules/ide/IDE.tsx | 52 ++++- frontend/src/modules/ide/api/scripts.api.ts | 58 +++++ frontend/src/modules/ide/store/useIDEStore.ts | 216 ++++++++++++++---- frontend/src/pages/templates.page.tsx | 193 +++++++--------- frontend/src/shared/api/axios.instance.ts | 2 +- 5 files changed, 359 insertions(+), 162 deletions(-) create mode 100644 frontend/src/modules/ide/api/scripts.api.ts diff --git a/frontend/src/modules/ide/IDE.tsx b/frontend/src/modules/ide/IDE.tsx index 272fb2a..837d930 100644 --- a/frontend/src/modules/ide/IDE.tsx +++ b/frontend/src/modules/ide/IDE.tsx @@ -58,19 +58,39 @@ export const IDE: React.FC = ({ const createNewProject = useIDEStore((state) => state.createNewProject); const selectFile = useIDEStore((state) => state.selectFile); const updateFileContent = useIDEStore((state) => state.updateFileContent); + const saveActiveFile = useIDEStore((state) => state.saveActiveFile); const closeFile = useIDEStore((state) => state.closeFile); const closeAllFiles = useIDEStore((state) => state.closeAllFiles); const closeOtherFiles = useIDEStore((state) => state.closeOtherFiles); const initialize = useIDEStore((state) => state.initialize); const isInitialized = useIDEStore((state) => state.isInitialized); + const fetchTree = useIDEStore((state) => state.fetchTree); - // Инициализация файлов + // Обработка Ctrl+S + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if ((e.ctrlKey || e.metaKey) && e.key === "s") { + e.preventDefault(); + saveActiveFile(); + } + }; + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, [saveActiveFile]); + + // При загрузке пробуем загрузить дерево с сервера useEffect(() => { if (!isInitialized) { - const filesToInit = externalFiles || defaultInitialFiles; - initialize(filesToInit); + fetchTree().catch(() => { + // Только при ошибке — используем моковые данные + const state = useIDEStore.getState(); + if (!state.files) { + const filesToInit = externalFiles || defaultInitialFiles; + initialize(filesToInit); + } + }); } - }, [isInitialized, externalFiles, initialize]); + }, [isInitialized]); // Если проект не открыт if (!files) { @@ -249,10 +269,30 @@ export const IDE: React.FC = ({ )} {!onBack &&
} - {activeFile ? `${activeFile.name} - ` : ""} + {activeFile + ? `${activeFile.name}${activeFile.dirty ? " •" : ""} - ` + : ""} {files.name} -
+
+ {activeFile?.dirty && ( + + )} +
diff --git a/frontend/src/modules/ide/api/scripts.api.ts b/frontend/src/modules/ide/api/scripts.api.ts new file mode 100644 index 0000000..91c6c3e --- /dev/null +++ b/frontend/src/modules/ide/api/scripts.api.ts @@ -0,0 +1,58 @@ +import { apiClient } from "@/shared/api/axios.instance"; + +export interface ScriptNodeDto { + id: number; + name: string; + type: "file" | "folder"; + content?: string; + children?: string[]; + interpreter_id?: number; +} + +export interface ScriptResponse { + id: number; + content: string; + interpreter_id: number; + path: string; + created_at: string; + updated_at: string; +} + +export interface CreateScriptPayload { + content: string; + interpreter_id: number; + path: string; +} + +export interface UpdateScriptPayload { + content: string; + interpreter_id: number; + path: string; +} + +// apiClient уже имеет интерсептор для Authorization header +export const scriptsApi = { + getTree: async (): Promise => { + const res = await apiClient.get("/scripts/tree"); + return res.data; + }, + + createScript: async ( + payload: CreateScriptPayload, + ): Promise => { + const res = await apiClient.post("/scripts", payload); + return res.data; + }, + + updateScript: async ( + id: number, + payload: UpdateScriptPayload, + ): Promise => { + const res = await apiClient.put(`/scripts/${id}`, payload); + return res.data; + }, + + deleteScript: async (id: number): Promise => { + await apiClient.delete(`/scripts/${id}`); + }, +}; diff --git a/frontend/src/modules/ide/store/useIDEStore.ts b/frontend/src/modules/ide/store/useIDEStore.ts index 004637e..93dd972 100644 --- a/frontend/src/modules/ide/store/useIDEStore.ts +++ b/frontend/src/modules/ide/store/useIDEStore.ts @@ -8,6 +8,7 @@ import { addNode, renameNode, } from "../helpers/fileTree"; +import { scriptsApi } from "../api/scripts.api"; export const initialFiles: FileNode = { name: "my-project", @@ -38,11 +39,15 @@ export const initialFiles: FileNode = { ], }; +interface IDEFileNode extends FileNode { + dirty?: boolean; +} + interface IDEState { // Файловая система files: FileNode | null; - openFiles: FileNode[]; - activeFile: FileNode | null; + openFiles: IDEFileNode[]; + activeFile: IDEFileNode | null; expandedFolders: Set; searchQuery: string; showSearch: boolean; @@ -59,6 +64,7 @@ interface IDEState { // Действия с файлами selectFile: (node: FileNode) => void; updateFileContent: (content: string) => void; + saveActiveFile: () => Promise; closeFile: (file: FileNode) => void; closeAllFiles: () => void; closeOtherFiles: (file: FileNode) => void; @@ -72,6 +78,20 @@ interface IDEState { deleteRoot: () => void; createNewProject: () => void; + // API методы + fetchTree: () => Promise; + createScript: (payload: { + content: string; + interpreter_id: number; + path: string; + }) => Promise; + updateScript: ( + id: number, + payload: { content: string; interpreter_id: number; path: string }, + ) => Promise; + deleteScript: (id: number) => Promise; + saveActiveFile: () => Promise; + // Поиск setSearchQuery: (query: string) => void; toggleSearch: () => void; @@ -94,8 +114,8 @@ interface IDEState { initialize: (initialFiles: FileNode) => void; // Диалог подтверждения - handleDialogConfirm: (value: string) => void; - handleDeleteNode: (node: FileNode) => void; + handleDialogConfirm: (value: string) => Promise; + handleDeleteNode: (node: FileNode) => Promise; } export const useIDEStore = create((set, get) => ({ @@ -142,7 +162,7 @@ export const useIDEStore = create((set, get) => ({ updateFileContent: (content: string) => { const { activeFile, files } = get(); if (activeFile && files) { - const updatedFile = { ...activeFile, content }; + const updatedFile = { ...activeFile, content, dirty: true }; set({ activeFile: updatedFile }); set((state) => ({ openFiles: state.openFiles.map((f) => @@ -275,6 +295,113 @@ export const useIDEStore = create((set, get) => ({ }); }, + // API: загрузка дерева с сервера + fetchTree: async () => { + try { + const data = await scriptsApi.getTree(); + const nodeMap = new Map(); + + data.forEach((item) => { + nodeMap.set(item.name, { + id: item.id, + name: item.name, + type: item.type === "folder" ? "folder" : "file", + content: item.content || "", + path: item.name, + interpreter_id: item.interpreter_id, + children: item.type === "folder" ? [] : undefined, + }); + }); + + const hasParent = new Set(); + data.forEach((item) => { + if (item.children) { + item.children.forEach((childName: string) => { + hasParent.add(childName); + const parent = nodeMap.get(item.name); + const child = nodeMap.get(childName); + if (parent?.children && child) { + parent.children.push(child); + } + }); + } + }); + + const roots = [...nodeMap.entries()] + .filter(([name]) => !hasParent.has(name)) + .map(([, node]) => node); + + set({ + files: { + name: "scripts", + type: "folder", + children: roots, + }, + expandedFolders: new Set(), + isInitialized: true, + }); + } catch (e) { + console.error("Failed to fetch tree:", e); + throw e; + } + }, + + // API: создание скрипта + createScript: async (payload) => { + try { + await scriptsApi.createScript(payload); + await get().fetchTree(); + } catch (e) { + console.error("Failed to create script:", e); + throw e; + } + }, + + // API: обновление скрипта + updateScript: async (id, payload) => { + try { + await scriptsApi.updateScript(id, payload); + } catch (e) { + console.error("Failed to update script:", e); + throw e; + } + }, + + // API: удаление скрипта + deleteScript: async (id) => { + try { + await scriptsApi.deleteScript(id); + await get().fetchTree(); + } catch (e) { + console.error("Failed to delete script:", e); + throw e; + } + }, + + // API: сохранение активного файла + saveActiveFile: async () => { + const { activeFile } = get(); + if (!activeFile || !activeFile.id) return; + + try { + await scriptsApi.updateScript(activeFile.id, { + content: activeFile.content || "", + interpreter_id: activeFile.interpreter_id || 0, + path: activeFile.path || "", + }); + set((state) => ({ + activeFile: state.activeFile + ? { ...state.activeFile, dirty: false } + : null, + openFiles: state.openFiles.map((f) => + f.path === state.activeFile?.path ? { ...f, dirty: false } : f, + ), + })); + } catch (e) { + console.error("Failed to save file:", e); + } + }, + // Поиск setSearchQuery: (query: string) => { set({ searchQuery: query }); @@ -290,9 +417,8 @@ export const useIDEStore = create((set, get) => ({ setTabContextMenu: (menu) => set({ tabContextMenu: menu }), // Подтверждение диалога - handleDialogConfirm: (value: string) => { - const { dialog, files, refreshFiles, toggleFolder, autoExpandPaths } = - get(); + handleDialogConfirm: async (value: string) => { + const { dialog, files, toggleFolder, autoExpandPaths } = get(); if (!dialog) return; if (dialog.type === "rename" && dialog.node) { @@ -315,47 +441,34 @@ export const useIDEStore = create((set, get) => ({ value, ); if (newFiles) { - refreshFiles(newFiles); + set({ files: newFiles }); } set({ dialog: null }); return; } let parentPath: string; - if (!dialog.node) { - parentPath = files!.path || files!.name; + parentPath = ""; } else if (dialog.node.type === "folder") { parentPath = dialog.node.path || dialog.node.name; } else { const pathParts = (dialog.node.path || dialog.node.name).split("/"); pathParts.pop(); - parentPath = pathParts.join("/") || files!.path || files!.name; + parentPath = pathParts.join("/"); } - const parentNode = findNode(files!, parentPath); - if ( - parentNode?.children?.some( - (c) => c.name.toLowerCase() === value.toLowerCase(), - ) - ) { - alert(`"${value}" already exists in this folder.`); - set({ dialog: null }); - return; - } + const fullPath = parentPath ? `${parentPath}/${value}` : value; - let newFiles: FileNode | null = null; - let createdNode: FileNode | null = null; + try { + const result = await scriptsApi.createScript({ + content: "", + interpreter_id: 0, + path: fullPath, + }); - if (dialog.type === "newFile") { - createdNode = { name: value, type: "file", content: "" }; - newFiles = addNode(files!, parentPath, createdNode); - } else if (dialog.type === "newFolder") { - createdNode = { name: value, type: "folder", children: [] }; - newFiles = addNode(files!, parentPath, createdNode); - } + await get().fetchTree(); - if (newFiles) { const allParentPaths: string[] = []; let current = parentPath; while (current) { @@ -371,35 +484,38 @@ export const useIDEStore = create((set, get) => ({ }); autoExpandPaths(new Set(allParentPaths)); - if (createdNode && createdNode.type === "file") { - const findAndOpen = (node: FileNode, name: string): FileNode | null => { - if (node.name === name && node.type === "file") return node; - if (node.children) { - for (const child of node.children) { - const found = findAndOpen(child, name); - if (found) return found; - } - } - return null; + if (dialog.type === "newFile") { + const createdNode: FileNode = { + id: result.id, + name: value, + type: "file", + content: result.content, + path: result.path, + interpreter_id: result.interpreter_id, }; - const openedFile = findAndOpen(newFiles, value); - refreshFiles(newFiles, openedFile || undefined); - } else { - refreshFiles(newFiles); + get().selectFile(createdNode); } + } catch (e) { + console.error("Failed to create:", e); } + set({ dialog: null }); }, // Удаление узла - handleDeleteNode: (node: FileNode) => { - const { files, refreshFiles } = get(); + handleDeleteNode: async (node: FileNode) => { + const { files } = get(); const isRootNode = node.path === files?.path; if (isRootNode) { get().deleteRoot(); } else if (window.confirm(`Delete "${node.name}"?`)) { - const newFiles = deleteNode(files!, node.path || node.name); - if (newFiles) refreshFiles(newFiles); + if (node.id) { + try { + await get().deleteScript(node.id); + } catch (e) { + console.error("Failed to delete:", e); + } + } } }, })); diff --git a/frontend/src/pages/templates.page.tsx b/frontend/src/pages/templates.page.tsx index 68c6783..e43a334 100644 --- a/frontend/src/pages/templates.page.tsx +++ b/frontend/src/pages/templates.page.tsx @@ -1,117 +1,81 @@ +import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { FiEdit3, FiPlay } from "react-icons/fi"; +import { FaSpinner } from "react-icons/fa"; import { FilePicker, useFilePickerStore } from "../modules/ide"; import type { FileNode } from "../modules/ide"; +import { scriptsApi } from "../modules/ide/api/scripts.api"; -const mockFiles: FileNode = { - name: "templates", - type: "folder", - children: [ - { - name: "python-basic", - type: "folder", - children: [ - { - name: "src", - type: "folder", - children: [ - { - name: "main.py", - type: "file", - content: - 'print("Hello, World!")\n\ndef main():\n print("Welcome!")\n\nif __name__ == "__main__":\n main()', - }, - { - name: "utils.py", - type: "file", - content: "def helper():\n return 42", - }, - ], - }, - { - name: "README.md", - type: "file", - content: "# Python Project\n\nA basic Python project.", - }, - ], - }, - { - name: "react-starter", - type: "folder", - children: [ - { - name: "src", - type: "folder", - children: [ - { - name: "App.tsx", - type: "file", - content: - 'import React from "react";\n\nexport const App: React.FC = () => {\n return
Hello React!
;\n};', - }, - { - name: "index.tsx", - type: "file", - content: - 'import React from "react";\nimport { createRoot } from "react-dom/client";\nimport { App } from "./App";\n\ncreateRoot(document.getElementById("root")!).render();', - }, - ], - }, - { - name: "package.json", - type: "file", - content: '{\n "name": "react-project",\n "version": "1.0.0"\n}', - }, - ], - }, - { - name: "node-api", - type: "folder", - children: [ - { - name: "src", - type: "folder", - children: [ - { - name: "index.js", - type: "file", - content: - 'const express = require("express");\nconst app = express();\nconst PORT = 3000;\n\napp.get("/", (req, res) => {\n res.json({ message: "Hello!" });\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});', - }, - ], - }, - { - name: "package.json", - type: "file", - content: - '{\n "name": "api-project",\n "dependencies": {\n "express": "^4.18.0"\n }\n}', - }, - ], - }, - { - name: "html-css", - type: "folder", - children: [ - { - name: "index.html", - type: "file", - content: - '\n\n\n My Landing\n \n\n\n

Welcome!

\n\n', - }, - { - name: "styles.css", - type: "file", - content: - "body {\n font-family: sans-serif;\n margin: 0;\n padding: 2rem;\n background: #f5f5f5;\n}\n\nh1 {\n color: #333;\n}", - }, - ], - }, - ], +const convertTreeToFileNode = (data: any[]): FileNode => { + const nodeMap = new Map(); + const childrenMap = new Map(); + + // Создаём все узлы + data.forEach((item) => { + nodeMap.set(item.name, { + id: item.id, + name: item.name, + type: item.type === "folder" ? "folder" : "file", + content: item.content || "", + path: item.name, + interpreter_id: item.interpreter_id, + children: item.type === "folder" ? [] : undefined, + }); + + if (item.children && item.children.length > 0) { + childrenMap.set(item.name, item.children); + } + }); + + // Строим дерево + const roots: FileNode[] = []; + const hasParent = new Set(); + + childrenMap.forEach((children, parentName) => { + const parentNode = nodeMap.get(parentName); + if (!parentNode) return; + + children.forEach((childName: string) => { + hasParent.add(childName); + const childNode = nodeMap.get(childName); + if (childNode && parentNode.children) { + parentNode.children.push(childNode); + } + }); + }); + + // Корневые элементы — те у кого нет родителя + nodeMap.forEach((node, name) => { + if (!hasParent.has(name)) { + roots.push(node); + } + }); + + return { + name: "templates", + type: "folder", + children: roots, + }; }; export const TemplatesPage = () => { const navigate = useNavigate(); const selectedPaths = useFilePickerStore((s) => s.selectedPaths); + const [files, setFiles] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + scriptsApi + .getTree() + .then((data) => { + setFiles(convertTreeToFileNode(data)); + }) + .catch((e) => { + console.error("Failed to load tree:", e); + setFiles({ name: "templates", type: "folder", children: [] }); + }) + .finally(() => setLoading(false)); + }, []); return (
{ {/* File Picker */}
- + {loading ? ( +
+ +
+ ) : files ? ( + + ) : null}
); diff --git a/frontend/src/shared/api/axios.instance.ts b/frontend/src/shared/api/axios.instance.ts index afd5aa1..4c7ba74 100644 --- a/frontend/src/shared/api/axios.instance.ts +++ b/frontend/src/shared/api/axios.instance.ts @@ -16,7 +16,7 @@ class ApiClient { constructor() { this.axiosInstance = axios.create({ - baseURL: "http://10.97.147.99:8080/api/v1", + baseURL: "http://213.165.213.170:8080/api/v1", timeout: 10000, headers: { "Content-Type": "application/json", From e024f91111a9b2df57c1a1effb5af7bfaab25c3a Mon Sep 17 00:00:00 2001 From: nikita Date: Sun, 5 Apr 2026 01:07:03 +0300 Subject: [PATCH 32/48] fix: render files --- frontend/src/modules/ide/store/useIDEStore.ts | 37 ++++++-------- frontend/src/pages/templates.page.tsx | 50 ++++++------------- 2 files changed, 31 insertions(+), 56 deletions(-) diff --git a/frontend/src/modules/ide/store/useIDEStore.ts b/frontend/src/modules/ide/store/useIDEStore.ts index 93dd972..47ee7e3 100644 --- a/frontend/src/modules/ide/store/useIDEStore.ts +++ b/frontend/src/modules/ide/store/useIDEStore.ts @@ -299,37 +299,32 @@ export const useIDEStore = create((set, get) => ({ fetchTree: async () => { try { const data = await scriptsApi.getTree(); - const nodeMap = new Map(); - data.forEach((item) => { - nodeMap.set(item.name, { + const convertItem = (item: any): FileNode => { + const node: FileNode = { id: item.id, name: item.name, type: item.type === "folder" ? "folder" : "file", content: item.content || "", path: item.name, interpreter_id: item.interpreter_id, - children: item.type === "folder" ? [] : undefined, - }); - }); + }; - const hasParent = new Set(); - data.forEach((item) => { - if (item.children) { - item.children.forEach((childName: string) => { - hasParent.add(childName); - const parent = nodeMap.get(item.name); - const child = nodeMap.get(childName); - if (parent?.children && child) { - parent.children.push(child); - } - }); + if (item.type === "folder") { + node.children = []; + if (item.children && Array.isArray(item.children)) { + node.children = item.children.map((child: any) => { + const childNode = convertItem(child); + childNode.path = `${item.name}/${child.name}`; + return childNode; + }); + } } - }); - const roots = [...nodeMap.entries()] - .filter(([name]) => !hasParent.has(name)) - .map(([, node]) => node); + return node; + }; + + const roots = data.map((item) => convertItem(item)); set({ files: { diff --git a/frontend/src/pages/templates.page.tsx b/frontend/src/pages/templates.page.tsx index e43a334..ee95823 100644 --- a/frontend/src/pages/templates.page.tsx +++ b/frontend/src/pages/templates.page.tsx @@ -7,54 +7,34 @@ import type { FileNode } from "../modules/ide"; import { scriptsApi } from "../modules/ide/api/scripts.api"; const convertTreeToFileNode = (data: any[]): FileNode => { - const nodeMap = new Map(); - const childrenMap = new Map(); - - // Создаём все узлы - data.forEach((item) => { - nodeMap.set(item.name, { + const convertItem = (item: any): FileNode => { + const node: FileNode = { id: item.id, name: item.name, type: item.type === "folder" ? "folder" : "file", content: item.content || "", path: item.name, interpreter_id: item.interpreter_id, - children: item.type === "folder" ? [] : undefined, - }); + }; - if (item.children && item.children.length > 0) { - childrenMap.set(item.name, item.children); - } - }); - - // Строим дерево - const roots: FileNode[] = []; - const hasParent = new Set(); - - childrenMap.forEach((children, parentName) => { - const parentNode = nodeMap.get(parentName); - if (!parentNode) return; - - children.forEach((childName: string) => { - hasParent.add(childName); - const childNode = nodeMap.get(childName); - if (childNode && parentNode.children) { - parentNode.children.push(childNode); + if (item.type === "folder") { + node.children = []; + if (item.children && Array.isArray(item.children)) { + node.children = item.children.map((child: any) => { + const childNode = convertItem(child); + childNode.path = `${item.name}/${child.name}`; + return childNode; + }); } - }); - }); - - // Корневые элементы — те у кого нет родителя - nodeMap.forEach((node, name) => { - if (!hasParent.has(name)) { - roots.push(node); } - }); + + return node; + }; return { name: "templates", type: "folder", - children: roots, + children: data.map((item) => convertItem(item)), }; }; From f71a3b1a03d03b004c397607f4cf25218bfee0fd Mon Sep 17 00:00:00 2001 From: nikita Date: Sun, 5 Apr 2026 01:37:10 +0300 Subject: [PATCH 33/48] feat: save files --- frontend/src/modules/ide/components/TabBar.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frontend/src/modules/ide/components/TabBar.tsx b/frontend/src/modules/ide/components/TabBar.tsx index 797332e..6b51daf 100644 --- a/frontend/src/modules/ide/components/TabBar.tsx +++ b/frontend/src/modules/ide/components/TabBar.tsx @@ -106,6 +106,17 @@ export const TabBar: React.FC = ({ > {file.name} + {file.dirty && ( + + )}
-
- - - {files.name} - -
- {showSearch && (
= ({ )}
- {filteredFiles ? ( - + {filteredFiles.length > 0 ? ( + filteredFiles.map((child, idx) => ( + + )) ) : (
= ({ files }) => { backgroundColor: "var(--bg-primary)", }} > - + {(files.children || []).map((child, idx) => ( + + ))}
); }; diff --git a/frontend/src/modules/ide/store/useIDEStore.ts b/frontend/src/modules/ide/store/useIDEStore.ts index 47ee7e3..7c566aa 100644 --- a/frontend/src/modules/ide/store/useIDEStore.ts +++ b/frontend/src/modules/ide/store/useIDEStore.ts @@ -442,6 +442,7 @@ export const useIDEStore = create((set, get) => ({ return; } + // Определяем родительский путь let parentPath: string; if (!dialog.node) { parentPath = ""; @@ -453,17 +454,44 @@ export const useIDEStore = create((set, get) => ({ parentPath = pathParts.join("/"); } - const fullPath = parentPath ? `${parentPath}/${value}` : value; + // Проверяем наличие расширения + const hasExtension = + value.includes(".") && value.split(".").pop() !== value; + let finalName = value; + let isFile = false; + + // Если диалог создания файла + if (dialog.type === "newFile") { + isFile = true; + // Если нет расширения — добавляем .txt + if (!hasExtension) { + finalName = `${value}.txt`; + } + } else if (dialog.type === "newFolder") { + // Если диалог создания папки — но имя с расширением, считаем файлом + if (hasExtension) { + isFile = true; + } + } + + const fullPath = parentPath ? `${parentPath}/${finalName}` : finalName; + + // Сохраняем раскрытые папки ДО перезагрузки дерева + const savedExpandedFolders = new Set(get().expandedFolders); try { const result = await scriptsApi.createScript({ content: "", - interpreter_id: 0, + interpreter_id: 1, path: fullPath, }); await get().fetchTree(); + // Восстанавливаем раскрытые папки + set({ expandedFolders: savedExpandedFolders }); + + // Собираем все пути от корня до родительской папки const allParentPaths: string[] = []; let current = parentPath; while (current) { @@ -472,17 +500,14 @@ export const useIDEStore = create((set, get) => ({ parts.pop(); current = parts.join("/"); } - allParentPaths.forEach((p) => { - if (!get().expandedFolders.has(p)) { - toggleFolder(p); - } - }); + + // Раскрываем родительскую цепочку autoExpandPaths(new Set(allParentPaths)); - if (dialog.type === "newFile") { + if (isFile) { const createdNode: FileNode = { id: result.id, - name: value, + name: finalName, type: "file", content: result.content, path: result.path, From 178c3b53f7e012d206f902988806f8af3df6d57c Mon Sep 17 00:00:00 2001 From: nikita Date: Sun, 5 Apr 2026 03:28:31 +0300 Subject: [PATCH 35/48] feat: remove folders & create folder --- frontend/src/modules/ide/IDE.tsx | 6 + frontend/src/modules/ide/api/scripts.api.ts | 17 +++ .../modules/ide/components/FileExplorer.tsx | 18 ++- .../modules/ide/components/InputDialog.tsx | 60 +++++++- frontend/src/modules/ide/store/useIDEStore.ts | 133 +++++++++++++----- frontend/src/modules/ide/types.ts | 10 ++ 6 files changed, 206 insertions(+), 38 deletions(-) diff --git a/frontend/src/modules/ide/IDE.tsx b/frontend/src/modules/ide/IDE.tsx index 837d930..010ae06 100644 --- a/frontend/src/modules/ide/IDE.tsx +++ b/frontend/src/modules/ide/IDE.tsx @@ -65,6 +65,12 @@ export const IDE: React.FC = ({ const initialize = useIDEStore((state) => state.initialize); const isInitialized = useIDEStore((state) => state.isInitialized); const fetchTree = useIDEStore((state) => state.fetchTree); + const fetchInterpreters = useIDEStore((state) => state.fetchInterpreters); + + // Загружаем интерпретаторы при инициализации + useEffect(() => { + fetchInterpreters(); + }, []); // Обработка Ctrl+S useEffect(() => { diff --git a/frontend/src/modules/ide/api/scripts.api.ts b/frontend/src/modules/ide/api/scripts.api.ts index 91c6c3e..61d235b 100644 --- a/frontend/src/modules/ide/api/scripts.api.ts +++ b/frontend/src/modules/ide/api/scripts.api.ts @@ -1,4 +1,5 @@ import { apiClient } from "@/shared/api/axios.instance"; +import type { Interpreter } from "../types"; export interface ScriptNodeDto { id: number; @@ -32,6 +33,11 @@ export interface UpdateScriptPayload { // apiClient уже имеет интерсептор для Authorization header export const scriptsApi = { + getInterpreters: async (): Promise => { + const res = await apiClient.get("/scripts/interpreters"); + return res.data; + }, + getTree: async (): Promise => { const res = await apiClient.get("/scripts/tree"); return res.data; @@ -55,4 +61,15 @@ export const scriptsApi = { deleteScript: async (id: number): Promise => { await apiClient.delete(`/scripts/${id}`); }, + + createFolder: async (path: string): Promise<{ path: string }> => { + const res = await apiClient.post<{ path: string }>("/scripts/folder", { + path, + }); + return res.data; + }, + + deleteFolder: async (path: string): Promise => { + await apiClient.delete(`/scripts/folder`, { data: { path } }); + }, }; diff --git a/frontend/src/modules/ide/components/FileExplorer.tsx b/frontend/src/modules/ide/components/FileExplorer.tsx index 529dd40..17d3856 100644 --- a/frontend/src/modules/ide/components/FileExplorer.tsx +++ b/frontend/src/modules/ide/components/FileExplorer.tsx @@ -46,6 +46,10 @@ export const FileExplorer: React.FC = ({ const handleEmptyContextMenu = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); + // Загружаем интерпретаторы перед открытием меню + if (store.interpreters.length === 0) { + store.fetchInterpreters(); + } store.setContextMenu({ x: e.clientX, y: e.clientY, node: null }); }; @@ -55,6 +59,13 @@ export const FileExplorer: React.FC = ({ store.setContextMenu({ x: e.clientX, y: e.clientY, node }); }; + // Загружаем интерпретаторы при монтировании компонента + useEffect(() => { + if (store.interpreters.length === 0) { + store.fetchInterpreters(); + } + }, []); + const filteredFiles = store.searchQuery ? (files.children || []) .map((child) => filterTree(child, store.searchQuery)) @@ -320,8 +331,13 @@ export const FileExplorer: React.FC = ({ ? store.dialog.node.name : "" } - onConfirm={store.handleDialogConfirm} + onConfirm={(value, interpreterId) => { + store.handleDialogConfirm(value, interpreterId); + }} onCancel={() => store.setDialog(null)} + interpreters={ + store.dialog.type === "newFile" ? store.interpreters : undefined + } /> )}
diff --git a/frontend/src/modules/ide/components/InputDialog.tsx b/frontend/src/modules/ide/components/InputDialog.tsx index 38270e9..3005c57 100644 --- a/frontend/src/modules/ide/components/InputDialog.tsx +++ b/frontend/src/modules/ide/components/InputDialog.tsx @@ -1,10 +1,12 @@ import React, { useState, useRef, useEffect } from "react"; +import type { Interpreter } from "../types"; interface InputDialogProps { title: string; initialValue?: string; - onConfirm: (value: string) => void; + onConfirm: (value: string, interpreterId?: number) => void; onCancel: () => void; + interpreters?: Interpreter[]; } export const InputDialog: React.FC = ({ @@ -12,8 +14,12 @@ export const InputDialog: React.FC = ({ initialValue = "", onConfirm, onCancel, + interpreters, }) => { const [value, setValue] = useState(initialValue); + const [interpreterId, setInterpreterId] = useState( + interpreters?.[0]?.id, + ); const inputRef = useRef(null); useEffect(() => { @@ -21,6 +27,8 @@ export const InputDialog: React.FC = ({ inputRef.current?.select(); }, []); + const showInterpreterDropdown = interpreters && interpreters.length > 0; + return (
= ({ {title}

- Enter a new name + Enter a name

= ({ value={value} onChange={(e) => setValue(e.target.value)} onKeyDown={(e) => - e.key === "Enter" && value.trim() && onConfirm(value.trim()) + e.key === "Enter" && + value.trim() && + onConfirm(value.trim(), interpreterId) } style={{ width: "100%", @@ -77,10 +87,48 @@ export const InputDialog: React.FC = ({ borderRadius: "6px", color: "#ccc", fontSize: "14px", - marginBottom: "20px", + marginBottom: showInterpreterDropdown ? "12px" : "20px", outline: "none", }} /> + + {/* Interpreter dropdown */} + {showInterpreterDropdown && ( +
+ + +
+ )} +
@@ -99,7 +147,9 @@ export const InputDialog: React.FC = ({ Cancel )}
diff --git a/frontend/src/modules/ide/store/useFilePickerStore.ts b/frontend/src/modules/ide/store/useFilePickerStore.ts index e6b9e74..35badac 100644 --- a/frontend/src/modules/ide/store/useFilePickerStore.ts +++ b/frontend/src/modules/ide/store/useFilePickerStore.ts @@ -1,19 +1,23 @@ import { create } from "zustand"; +import { scriptsApi } from "../api/scripts.api"; interface FilePickerState { selectedPaths: Set; expandedFolders: Set; + runningScripts: Map; toggleSelection: (path: string) => void; selectAll: (paths: string[]) => void; clearSelection: () => void; toggleFolder: (path: string) => void; getSelectedPaths: () => string[]; + runScript: (path: string) => Promise; } export const useFilePickerStore = create((set, get) => ({ selectedPaths: new Set(), expandedFolders: new Set(), + runningScripts: new Map(), toggleSelection: (path: string) => { set((state) => { @@ -54,4 +58,17 @@ export const useFilePickerStore = create((set, get) => ({ getSelectedPaths: () => { return Array.from(get().selectedPaths); }, + + runScript: async (path: string) => { + try { + const result = await scriptsApi.run(path); + set((state) => { + const newMap = new Map(state.runningScripts); + newMap.set(path, result); + return { runningScripts: newMap }; + }); + } catch (e) { + console.error("Failed to run script:", e); + } + }, })); diff --git a/frontend/src/pages/templates.page.tsx b/frontend/src/pages/templates.page.tsx index ee95823..be9cf0e 100644 --- a/frontend/src/pages/templates.page.tsx +++ b/frontend/src/pages/templates.page.tsx @@ -41,6 +41,8 @@ const convertTreeToFileNode = (data: any[]): FileNode => { export const TemplatesPage = () => { const navigate = useNavigate(); const selectedPaths = useFilePickerStore((s) => s.selectedPaths); + const runningScripts = useFilePickerStore((s) => s.runningScripts); + const runScript = useFilePickerStore((s) => s.runScript); const [files, setFiles] = useState(null); const [loading, setLoading] = useState(true); @@ -57,6 +59,12 @@ export const TemplatesPage = () => { .finally(() => setLoading(false)); }, []); + const handleRun = async (path: string) => { + await runScript(path); + }; + + const runningCount = runningScripts.size; + return (
{ > - {selectedPaths.size} script{selectedPaths.size !== 1 ? "s" : ""}{" "} - running + {runningCount} script{runningCount !== 1 ? "s" : ""} running
@@ -145,7 +152,7 @@ export const TemplatesPage = () => { />
) : files ? ( - + ) : null}
From 2bc3da21fd216fe59a7ac927df1431c6cd836dac Mon Sep 17 00:00:00 2001 From: nikita Date: Sun, 5 Apr 2026 06:54:33 +0300 Subject: [PATCH 38/48] feat: launch scripts --- frontend/.qwen/settings.json | 3 +- .../app/providers/layout/store/agent.store.ts | 23 +- frontend/src/modules/ide/api/scripts.api.ts | 36 +- .../src/modules/ide/components/FilePicker.tsx | 3 - .../modules/ide/components/FilePickerItem.tsx | 22 +- .../modules/ide/components/RunScriptModal.tsx | 309 ++++++++++++++++++ .../modules/ide/store/useFilePickerStore.ts | 17 - .../terminal/components/TerminalOutput.tsx | 262 +++++++++++++++ frontend/src/modules/terminal/index.ts | 1 + .../terminal/store/useTerminalStore.ts | 75 +++++ frontend/src/pages/templates.page.tsx | 130 +++++--- 11 files changed, 774 insertions(+), 107 deletions(-) create mode 100644 frontend/src/modules/ide/components/RunScriptModal.tsx create mode 100644 frontend/src/modules/terminal/components/TerminalOutput.tsx create mode 100644 frontend/src/modules/terminal/index.ts create mode 100644 frontend/src/modules/terminal/store/useTerminalStore.ts diff --git a/frontend/.qwen/settings.json b/frontend/.qwen/settings.json index e8c96d2..e06f6ef 100644 --- a/frontend/.qwen/settings.json +++ b/frontend/.qwen/settings.json @@ -8,7 +8,8 @@ "Bash(dir)", "Bash(move *)", "Bash(findstr *)", - "Bash(del *)" + "Bash(del *)", + "Bash(mkdir *)" ] }, "$version": 3 diff --git a/frontend/src/app/providers/layout/store/agent.store.ts b/frontend/src/app/providers/layout/store/agent.store.ts index e39f16e..2cb8ebf 100644 --- a/frontend/src/app/providers/layout/store/agent.store.ts +++ b/frontend/src/app/providers/layout/store/agent.store.ts @@ -10,29 +10,8 @@ interface AgentState { removeAgent: (name: string) => void; } -const mockAgents: AgentInfo[] = [ - { - label: "agent-core-01", - token: "tok_a1b2c3d4e5f6g7h8", - services: ["postgres", "redis", "log-collector"], - connected_at: "2026-04-04 15:25:09", - }, - { - label: "agent-worker-02", - token: "tok_x9y8z7w6v5u4t3s2", - services: ["celery-worker", "flower"], - connected_at: "2026-04-04 15:25:09", - }, - { - label: "agent-monitor-03", - token: "tok_m1n2o3p4q5r6s7t8", - services: ["prometheus", "grafana", "alertmanager"], - connected_at: "2026-04-04 15:25:09", - }, -]; - export const useAgentStore = create()((set, get) => ({ - agents: mockAgents, + agents: [], isLoading: false, error: null, diff --git a/frontend/src/modules/ide/api/scripts.api.ts b/frontend/src/modules/ide/api/scripts.api.ts index c71fdc4..6059082 100644 --- a/frontend/src/modules/ide/api/scripts.api.ts +++ b/frontend/src/modules/ide/api/scripts.api.ts @@ -31,6 +31,26 @@ export interface UpdateScriptPayload { path: string; } +export interface RunScriptPayload { + stdin?: string; + token: string; +} + +export interface RunScriptResponse { + command: string[]; + id: number; + wait_url: string; +} + +export interface JobWaitResponse { + command: string[]; + id: number; + status: number; + stderr: string; + stdin: string; + stdout: string; +} + // apiClient уже имеет интерсептор для Authorization header export const scriptsApi = { getInterpreters: async (): Promise => { @@ -84,11 +104,19 @@ export const scriptsApi = { return res.data; }, - run: async (path: string): Promise<{ id: number; status: string }> => { - const res = await apiClient.post<{ id: number; status: string }>( - "/scripts/run", - { path }, + runScript: async ( + id: number, + payload: RunScriptPayload, + ): Promise => { + const res = await apiClient.post( + `/scripts/${id}/run`, + payload, ); return res.data; }, + + waitJob: async (id: number): Promise => { + const res = await apiClient.post(`/jobs/${id}/wait`); + return res.data; + }, }; diff --git a/frontend/src/modules/ide/components/FilePicker.tsx b/frontend/src/modules/ide/components/FilePicker.tsx index 944f866..1eb984f 100644 --- a/frontend/src/modules/ide/components/FilePicker.tsx +++ b/frontend/src/modules/ide/components/FilePicker.tsx @@ -14,12 +14,10 @@ const FilePickerTree: React.FC<{ onRun?: (path: string) => void; }> = ({ node, level, onRun }) => { const expandedFolders = useFilePickerStore((s) => s.expandedFolders); - const runningScripts = useFilePickerStore((s) => s.runningScripts); const toggleFolder = useFilePickerStore((s) => s.toggleFolder); const nodePath = node.path || node.name; const isExpanded = expandedFolders.has(nodePath); - const isRunning = node.type === "file" && runningScripts.has(nodePath); if (node.type === "file") { return ( @@ -27,7 +25,6 @@ const FilePickerTree: React.FC<{ name={node.name} type="file" path={nodePath} - isSelected={isRunning} level={level} onRun={onRun} /> diff --git a/frontend/src/modules/ide/components/FilePickerItem.tsx b/frontend/src/modules/ide/components/FilePickerItem.tsx index bf6479f..7a9d113 100644 --- a/frontend/src/modules/ide/components/FilePickerItem.tsx +++ b/frontend/src/modules/ide/components/FilePickerItem.tsx @@ -11,7 +11,6 @@ interface FilePickerItemProps { name: string; type: "file" | "folder"; path: string; - isSelected?: boolean; isExpanded?: boolean; children?: React.ReactNode; level: number; @@ -24,7 +23,6 @@ export const FilePickerItem: React.FC = ({ name, type, path, - isSelected, isExpanded, children, level, @@ -131,12 +129,10 @@ export const FilePickerItem: React.FC = ({ alignItems: "center", justifyContent: "center", padding: "4px", - backgroundColor: isSelected ? "#238636" : "transparent", - border: isSelected - ? "1px solid #2ea043" - : "1px solid transparent", + backgroundColor: "transparent", + border: "1px solid transparent", borderRadius: "3px", - color: isSelected ? "#ffffff" : "var(--text-secondary)", + color: "var(--text-secondary)", cursor: "pointer", flexShrink: 0, transition: "all 0.15s", @@ -151,15 +147,9 @@ export const FilePickerItem: React.FC = ({ e.currentTarget.style.borderColor = "#2ea043"; }} onMouseLeave={(e) => { - e.currentTarget.style.backgroundColor = isSelected - ? "#238636" - : "transparent"; - e.currentTarget.style.color = isSelected - ? "#ffffff" - : "var(--text-secondary)"; - e.currentTarget.style.borderColor = isSelected - ? "#2ea043" - : "transparent"; + e.currentTarget.style.backgroundColor = "transparent"; + e.currentTarget.style.color = "var(--text-secondary)"; + e.currentTarget.style.borderColor = "transparent"; }} title="Run script" > diff --git a/frontend/src/modules/ide/components/RunScriptModal.tsx b/frontend/src/modules/ide/components/RunScriptModal.tsx new file mode 100644 index 0000000..d68d6b3 --- /dev/null +++ b/frontend/src/modules/ide/components/RunScriptModal.tsx @@ -0,0 +1,309 @@ +import React, { useState, useRef, useEffect } from "react"; +import { MdClose } from "react-icons/md"; +import { scriptsApi } from "../api/scripts.api"; +import { useTerminalStore } from "@/modules/terminal/store/useTerminalStore"; +import { useAgentStore } from "@/app/providers/layout/store/agent.store"; + +interface RunScriptModalProps { + scriptPath: string; + scriptId: number; + onClose: () => void; +} + +export const RunScriptModal: React.FC = ({ + scriptPath, + scriptId, + onClose, +}) => { + const [selectedAgentIdx, setSelectedAgentIdx] = useState(0); + const [stdinValue, setStdinValue] = useState(""); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const inputRef = useRef(null); + + const agents = useAgentStore((s) => s.agents); + const addJob = useTerminalStore((s) => s.addJob); + const openTerminal = useTerminalStore((s) => s.openTerminal); + + const selectedAgent = agents[selectedAgentIdx]; + + useEffect(() => { + inputRef.current?.focus(); + }, []); + + const handleRun = async () => { + if (!selectedAgent) { + setError("No agents available"); + return; + } + + setLoading(true); + setError(null); + + try { + // 1. Запускаем скрипт + const runResult = await scriptsApi.runScript(scriptId, { + stdin: stdinValue, + token: selectedAgent.token, + }); + + // 2. Добавляем джоб в терминал + addJob({ + id: runResult.id, + scriptPath, + command: runResult.command, + }); + + // 3. Открываем терминал + openTerminal(); + + // 4. Ждём завершения по id + const jobResult = await scriptsApi.waitJob(runResult.id); + + // 5. Обновляем джоб + addJob({ + id: jobResult.id, + scriptPath, + command: jobResult.command, + stdin: jobResult.stdin, + }); + + // Обновляем с финальным статусом + const terminalStore = useTerminalStore.getState(); + terminalStore.updateJob(jobResult.id, { + status: jobResult.status, + stdout: jobResult.stdout, + stderr: jobResult.stderr, + stdin: jobResult.stdin, + isRunning: false, + }); + + onClose(); + } catch (e: any) { + console.error("Failed to run script:", e); + setError(e?.response?.data?.detail || "Failed to run script"); + } finally { + setLoading(false); + } + }; + + return ( +
+
e.stopPropagation()} + > + {/* Header */} +
+

+ Run Script +

+ +
+ + {/* Content */} +
+ {/* Script path */} +
+ +
+ {scriptPath} +
+
+ + {/* Agent selector */} +
+ + +
+ + {/* Stdin (optional) */} +
+ +
+ Время + Уровень + Сервис + Агент + Сообщение
+ {formatTimestamp(log.timestamp)} @@ -238,13 +299,22 @@ export const LogsPage: React.FC = () => { {log.level} + {log.service} + {log.agent} + {log.message}
- {log.service} + {log.service || "—"} - {log.agent} + {log.agent || "—"} - {log.message} + {log.message || "—"}
- {formatTimestamp(log.timestamp)} + {formatTimestamp(log.Timestamp)} { className="px-4 py-3 text-sm" style={{ color: "var(--text-primary)" }} > - {log.service || "—"} + {log.Service || "—"} - {log.agent || "—"} + {log.Agent || "—"} - {log.message || "—"} + {log.Message || "—"}