diff --git a/apps/desktop/electron/core/auth.ts b/apps/desktop/electron/core/auth.ts index 8565477..c1d6518 100644 --- a/apps/desktop/electron/core/auth.ts +++ b/apps/desktop/electron/core/auth.ts @@ -4,5 +4,5 @@ import { machineIdSync } from "node-machine-id"; export const getMachineId = async () => { const id = await machineIdSync(); - console.log(id); + console.warn("机器码id: ", id); }; diff --git a/apps/desktop/electron/core/db.ts b/apps/desktop/electron/core/db.ts index 91e775f..890bb35 100644 --- a/apps/desktop/electron/core/db.ts +++ b/apps/desktop/electron/core/db.ts @@ -3,36 +3,51 @@ import { JSONFilePreset } from "lowdb/node"; import { app } from "electron"; import { Low } from "node_modules/lowdb/lib/core/Low"; import { StructuredMetadata } from "./dicom"; +import { existsSync } from "node:fs"; +import { merge } from "lodash"; -interface ICreateDatabase { +export interface ICreateDatabase { name: string; } -type SeriesTableType = StructuredMetadata & { +export type SeriesTableType = StructuredMetadata & { createTime?: number; updateTime?: number; }; -interface DbTable { +export type SettingTableType = { + /** + * 推理硬件默认是GPU、可选CPU、NPU + * @default GPU + */ + inferDevice: string; + /** + * 用户文件位置 + * @description 用于存储算法输出、应用生成的产物的路径 + */ + outputPath: string; +}; + +export interface DbTable { series: SeriesTableType[]; + setting: SettingTableType; } -const defaultData: DbTable = { series: [] }; -export let db: Low<{ series: SeriesTableType[] }>; +const defaultTable: DbTable = { + series: [], + setting: { + inferDevice: "gpu", + outputPath: path.join(app.getPath("userData"), "output"), + }, +}; + +export let db: Low; export const createDatabase = async (config: ICreateDatabase) => { const { name } = config; - db = await JSONFilePreset( - path.join(app.getPath("userData"), name), - defaultData - ); + const dbJsonFilePath = path.join(app.getPath("userData"), name); + db = await JSONFilePreset(dbJsonFilePath, defaultTable); + // 表结构更新,增量合并 + db.data = merge({}, defaultTable, db.data); + await db.write(); }; - -// Update db.json -// await db.update(({ posts }) => posts.push("hello world")); - -// Alternatively you can call db.write() explicitely later to write to db.json -// db.data.posts.push("hello world"); -// await db.write(); - -// console.log(db); diff --git a/apps/desktop/electron/ipcMainHandlers.ts b/apps/desktop/electron/ipcMainHandlers.ts index b0f26c6..60c129d 100644 --- a/apps/desktop/electron/ipcMainHandlers.ts +++ b/apps/desktop/electron/ipcMainHandlers.ts @@ -1,4 +1,4 @@ -import { app, dialog, ipcMain } from "electron"; +import { app, dialog, ipcMain, shell } from "electron"; import os from "os"; import { findDcmFiles, @@ -9,6 +9,8 @@ import { import { db } from "./core/db"; import axios from "axios"; import path from "node:path"; +import { mkdirSync, statSync } from "fs"; +import { mkdir, stat } from "fs/promises"; /** * 渲染进程和主进程的事件调度 @@ -82,22 +84,12 @@ const registerIpcMainHandlers = (mainWindow: Electron.BrowserWindow | null) => { const overallDuration = (overallEndTime - overallStartTime) / 1000; // 总耗时 console.log(`All dicoms processed in ${overallDuration} seconds.`); }); - - // const img_path = - // const { - // img_path, - // save_path, - // pu = "GPU", - // module = "root", - // turbo = true, - // } = data; }); /** * 显示选择文件夹的dialog */ ipcMain.on("import-dicom-dialog-visible", async (event) => { - console.log(1111); const result = await dialog.showOpenDialog({ properties: ["openDirectory"], }); @@ -140,6 +132,31 @@ const registerIpcMainHandlers = (mainWindow: Electron.BrowserWindow | null) => { const seriesList = db.data.series; event.reply("db:series:select:response", seriesList); }); + + /** + * 用户配置保存 + */ + ipcMain.on("setInferDevice", async (event, device) => { + await db.update(({ setting }) => ({ ...setting, inferDevice: device })); + event.reply("setInferDevice:response", `推理硬件修改为${device}`); + }); + + /** + * 打开输出文件夹目录 + */ + ipcMain.on("openOutputPath", async () => { + await db.read(); + const optPath = db.data.setting.outputPath; + const resolvedPath = path.resolve(optPath); + try { + // 检查路径是否存在 + const stats = await stat(resolvedPath); + if (stats.isDirectory()) shell.openPath(resolvedPath); + } catch (error: any) { + await mkdir(resolvedPath, { recursive: true }); + shell.openPath(resolvedPath); + } + }); }; export default registerIpcMainHandlers; diff --git a/apps/desktop/electron/main.ts b/apps/desktop/electron/main.ts index 2198cc2..3ce9e89 100644 --- a/apps/desktop/electron/main.ts +++ b/apps/desktop/electron/main.ts @@ -9,7 +9,6 @@ import { // import { createRequire } from "node:module"; import { fileURLToPath } from "node:url"; import path from "node:path"; -// import registerIpcMainHandlers from "./ipcMainHandlers"; import { createDatabase } from "./core/db"; import { getMachineId } from "./core/auth"; import registerIpcMainHandlers from "./ipcMainHandlers"; @@ -39,6 +38,8 @@ const themeTitleBarStyles = { light: {}, }; +const platform = process.platform === "darwin" ? "macos" : "windows"; + function createWindow() { win = new BrowserWindow({ width: 1280, @@ -54,10 +55,12 @@ function createWindow() { }, }); - // Test active push message to Renderer-process. + /** + * 渲染进程加载完成 + */ win.webContents.on("did-finish-load", () => { - win?.webContents.send("main-process-message", { - platform: process.platform === "darwin" ? "macos" : "windows", + win?.webContents.send("mount", { + platform, theme, }); }); @@ -65,18 +68,23 @@ function createWindow() { if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL); registerIpcMainHandlers(win); - python_process = spawn(path.join(process.env.VITE_PUBLIC!, "main.exe")); + if (platform !== "macos") { + python_process = spawn(path.join(process.env.VITE_PUBLIC!, "main.exe")); + } } else { win.loadFile(path.join(RENDERER_DIST, "index.html")).then(() => { if (process.argv.length >= 2) { const folderPath = process.argv[2]; - win?.webContents.send("open-folder", folderPath); + win?.webContents.send("context-menu-launch", folderPath); registerIpcMainHandlers(win); } }); } } +/** + * 通知区域/状态栏的小图标 + */ function createTray() { if (tray) tray.destroy(); const iconPath = path.join(process.env.VITE_PUBLIC, "AI.png"); // 使用 PNG 图标 @@ -102,14 +110,11 @@ function createTray() { }, ]); - tray.setToolTip("My Electron App"); + tray.setToolTip("Cvpilot Tool"); tray.setContextMenu(contextMenu); - tray.on("click", () => { - if (win) { - win.isVisible() ? win.hide() : win.show(); - } - }); + const toggle = () => win && (win.isVisible() ? win.hide() : win.show()); + tray.on("click", () => toggle); } function registerGlobalShortcuts() { @@ -122,8 +127,7 @@ function registerGlobalShortcuts() { } app.on("window-all-closed", async () => { - console.log(python_process?.pid); - if (process.platform !== "darwin") { + if (platform !== "macos") { app.quit(); win = null; } @@ -145,10 +149,10 @@ app.whenReady().then(() => { createTray(); registerGlobalShortcuts(); createDatabase({ name: "cvpilot.json" }); - console.log(path.join(app.getPath("userData"))); + console.log("userData路径:", path.join(app.getPath("userData"))); // 设置 Dock 图标 - if (process.platform === "darwin") { + if (platform === "macos") { const dockIconPath = path.join(process.env.VITE_PUBLIC, "girl.png"); const dockIcon = nativeImage.createFromPath(dockIconPath); app.dock.setIcon(dockIcon); diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 41e25ab..7f3c524 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -63,7 +63,7 @@ "tailwindcss-animate": "^1.0.7", "zod": "3.23.8", "axios": "1.7.7", - "fkill": "9.0.0" + "lodash": "4.17.21" }, "devDependencies": { "@radix-ui/react-icons": "^1.3.0", @@ -84,6 +84,7 @@ "typescript": "^5.2.2", "vite": "^5.1.6", "vite-plugin-electron": "^0.28.6", - "vite-plugin-electron-renderer": "^0.14.5" + "vite-plugin-electron-renderer": "^0.14.5", + "@types/lodash": "4.17.7" } } diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 21295fe..0499faa 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -13,8 +13,14 @@ function App() { | "dark" | "light"; + /** + * 等待渲染完成再显示窗口 + */ useEffect(() => { window.ipcRenderer.send("ipc-loaded"); + return () => { + window.ipcRenderer.off("ipc-loaded", () => {}); + }; }, []); return ( diff --git a/apps/desktop/src/components/base/MenuBar/constant.tsx b/apps/desktop/src/components/base/MenuBar/constant.tsx new file mode 100644 index 0000000..cd65c6d --- /dev/null +++ b/apps/desktop/src/components/base/MenuBar/constant.tsx @@ -0,0 +1,19 @@ +import { inferDeviceType } from "./type"; + +export const inferDevices: inferDeviceType[] = [ + { + key: "gpu", + name: "GPU", + checked: true, + }, + { + key: "cpu", + name: "CPU", + checked: false, + }, + { + key: "npu", + name: "NPU", + checked: false, + }, +]; diff --git a/apps/desktop/src/components/base/MenuBar/index.tsx b/apps/desktop/src/components/base/MenuBar/index.tsx new file mode 100644 index 0000000..d9dd406 --- /dev/null +++ b/apps/desktop/src/components/base/MenuBar/index.tsx @@ -0,0 +1,280 @@ +import { + Menubar, + MenubarCheckboxItem, + MenubarContent, + MenubarItem, + MenubarMenu, + MenubarRadioGroup, + MenubarRadioItem, + MenubarSeparator, + MenubarShortcut, + MenubarSub, + MenubarSubContent, + MenubarSubTrigger, + MenubarTrigger, +} from "@/components/ui/menubar"; +import { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { inferDeviceType } from "./type"; +import { inferDevices } from "./constant"; +import { useToast } from "@/components/ui/use-toast"; +import { ToastAction } from "@/components/ui/toast"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Progress } from "@/components/ui/progress"; +import { RocketIcon } from "@radix-ui/react-icons"; + +interface ScanProgress { + percentage: number; +} + +const defaultProgress = { + percentage: 0, +}; + +export const MenuBar = () => { + const { toast } = useToast(); + const navigate = useNavigate(); + const [progress, setProgress] = useState(defaultProgress); + const [inferOption, setInferOption] = + useState(inferDevices); + + const [, setResult] = useState<[]>([]); + + const [importDialogVisible, setImportDialogVisible] = useState(false); + + useEffect(() => { + const handleScanProgress = ( + _event: Electron.IpcRendererEvent, + data: any + ) => { + setProgress(data); + if (data.error) return; + }; + window.ipcRenderer.on("scan-progress", handleScanProgress); + return () => { + window.ipcRenderer.off("scan-progress", handleScanProgress); + }; + }, []); + + useEffect(() => { + window.ipcRenderer.once("scan-start", () => { + setImportDialogVisible(true); + }); + }, []); + + useEffect(() => { + const handleScanFinished = ( + _event: Electron.IpcRendererEvent, + data: any + ) => { + const { scanDuration, structDicom } = data; + console.log(data); + setResult(structDicom); + setImportDialogVisible(false); + + if (data.error) { + return toast({ + variant: "destructive", + title: "Uh oh! Something went wrong.", + description: "There was a problem with your request.", + action: 重试, + }); + } else { + toast({ + variant: "default", + title: "完成", + description: `本次操作共导入${structDicom.length}组序列数据,耗时:${( + scanDuration / 1000 + ).toFixed(2)} s`, + action: ( + handleTasks(structDicom)} + > + 分析 + + ), + duration: 30 * 1000, + }); + window.ipcRenderer.send("db:series:select"); + } + }; + window.ipcRenderer.on("scan-progress-done", handleScanFinished); + return () => { + window.ipcRenderer.off("scan-progress-done", handleScanFinished); + }; + }, [toast]); + + useEffect(() => { + if (!importDialogVisible) { + setProgress(defaultProgress); + } + }, [importDialogVisible]); + + const handleImportDicom = () => { + navigate("datasource"); + window.ipcRenderer.send("import-dicom-dialog-visible"); + }; + + /** + * 切换设备 + */ + const handleSwtichInferDevice = (item: inferDeviceType) => { + setInferOption((p) => + p.map((i) => ({ ...i, checked: i.key === item.key })) + ); + window.ipcRenderer.send("setInferDevice", item.key); + }; + + useEffect(() => { + const actionToast = ( + _event: Electron.IpcRendererEvent, + response: string + ) => { + toast({ + title: "操作成功", + description: response, + }); + }; + window.ipcRenderer.on("setInferDevice:response", actionToast); + return () => { + window.ipcRenderer.off("setInferDevice:response", actionToast); + }; + }, [toast]); + + const handleOpenOutputPath = () => { + window.ipcRenderer.send("openOutputPath"); + }; + + const handleTasks = (structDicoms: any) => { + localStorage.setItem("selectDicoms", JSON.stringify(structDicoms)); + navigate("/", { state: { selectDicoms: structDicoms } }); + }; + + return ( + <> + + + 文件 + + + 批量导入Dicom⌘T + + + 打开输出文件夹⌘N + + New Incognito Window + + + 推理硬件 + + {inferOption.map((item) => ( + handleSwtichInferDevice(item)} + checked={item.checked} + > + {item.name} + + ))} + + + + + 打印⌘P + + + + + Edit + + + Undo ⌘Z + + + Redo ⇧⌘Z + + + + Find + + Search the web + + Find... + Find Next + Find Previous + + + + Cut + Copy + Paste + + + + View + + Always Show Bookmarks Bar + + Always Show Full URLs + + + + Reload ⌘R + + + Force Reload ⇧⌘R + + + Toggle Fullscreen + + Hide Sidebar + + + + Profiles + + + Andy + Benoit + Luis + + + Edit... + + Add Profile... + + + + {/* 导入数据dialog */} + + + + 导入数据 + + 如果扫描速度很慢,请取消本次扫描,并缩小导入数据的体量 + + +
+ + + 扫描进度 + + + + +
+
+
+ + ); +}; diff --git a/apps/desktop/src/components/base/MenuBar/type.ts b/apps/desktop/src/components/base/MenuBar/type.ts new file mode 100644 index 0000000..0a8a0ac --- /dev/null +++ b/apps/desktop/src/components/base/MenuBar/type.ts @@ -0,0 +1,7 @@ +import { ReactNode } from "react"; + +export type inferDeviceType = { + key: string; + name: string | ReactNode; + checked: boolean; +}; diff --git a/apps/desktop/src/components/base/SideBarLeft/constant.tsx b/apps/desktop/src/components/base/SideBarLeft/constant.tsx new file mode 100644 index 0000000..3f334be --- /dev/null +++ b/apps/desktop/src/components/base/SideBarLeft/constant.tsx @@ -0,0 +1,11 @@ +import { MenuItem } from "./type"; +import { BrainCircuit, Package, HardDrive, Wrench } from "lucide-react"; + +export const menuItems: MenuItem[] = [ + { to: "/", name: "自动分析", icon: }, + { to: "/datasource", name: "数据列表", icon: }, + { to: "/models", name: "模型管理", icon: }, + { to: "/tools", name: "小工具", icon: }, + // { to: "/help", name: "帮助", icon: }, + // { to: "/setting", name: "设置", icon: }, +]; diff --git a/apps/desktop/src/pages/LeftDocker.tsx b/apps/desktop/src/components/base/SideBarLeft/index.tsx similarity index 52% rename from apps/desktop/src/pages/LeftDocker.tsx rename to apps/desktop/src/components/base/SideBarLeft/index.tsx index 7918df8..634a749 100644 --- a/apps/desktop/src/pages/LeftDocker.tsx +++ b/apps/desktop/src/components/base/SideBarLeft/index.tsx @@ -1,31 +1,8 @@ import { Link, useLocation } from "react-router-dom"; -import { - IoCubeOutline, - IoHammerOutline, - IoListOutline, - IoPlayOutline, - IoSettingsOutline, -} from "react-icons/io5"; -import "./LeftDocker.css"; +import { menuItems } from "./constant"; +import { MenuItem } from "./type"; -import { ReactNode } from "react"; - -type MenuItem = { - to: string; - name: string; - icon: ReactNode; -}; - -const menuItems: MenuItem[] = [ - { to: "/", name: "自动分析", icon: }, - { to: "/datasource", name: "数据列表", icon: }, - { to: "/models", name: "模型管理", icon: }, - { to: "/tools", name: "小工具", icon: }, - // { to: "/help", name: "帮助", icon: }, - { to: "/setting", name: "设置", icon: }, -]; - -export const LeftDocker = () => { +export const SideBarLeft = () => { const location = useLocation(); const handleClick = (item: MenuItem) => { diff --git a/apps/desktop/src/components/base/SideBarLeft/type.ts b/apps/desktop/src/components/base/SideBarLeft/type.ts new file mode 100644 index 0000000..19a401e --- /dev/null +++ b/apps/desktop/src/components/base/SideBarLeft/type.ts @@ -0,0 +1,7 @@ +import { ReactNode } from "react"; + +export type MenuItem = { + to: string; + name: string; + icon: ReactNode; +}; diff --git a/apps/desktop/src/main.tsx b/apps/desktop/src/main.tsx index a13a138..d2d0eea 100644 --- a/apps/desktop/src/main.tsx +++ b/apps/desktop/src/main.tsx @@ -2,10 +2,10 @@ import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import "@/style/global.css"; -window.ipcRenderer.on("main-process-message", (_event, message) => { - const { platform, theme } = message - document.querySelector('html')?.setAttribute('platform', platform) - document.querySelector('html')?.setAttribute('theme', theme) +window.ipcRenderer.on("mount", (_event, message) => { + const { platform, theme } = message; + document.querySelector("html")?.setAttribute("platform", platform); + document.querySelector("html")?.setAttribute("theme", theme); ReactDOM.createRoot(document.getElementById("root")!).render(); }); diff --git a/apps/desktop/src/pages/Boot/index.tsx b/apps/desktop/src/pages/Boot/index.tsx index 47fc8ae..6c5cea4 100644 --- a/apps/desktop/src/pages/Boot/index.tsx +++ b/apps/desktop/src/pages/Boot/index.tsx @@ -1,20 +1,11 @@ import { Button } from "@/components/ui/button"; import { motion } from "framer-motion"; import { useEffect, useState } from "react"; -import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { Progress } from "@/components/ui/progress"; -import { ToastAction } from "@/components/ui/toast"; + + import { useToast } from "@/components/ui/use-toast"; -import { RocketIcon } from "@radix-ui/react-icons"; import { useLocation } from "react-router-dom"; -import { SparkleIcon } from "lucide-react"; +import { SparkleIcon, Trash2 } from "lucide-react"; import { ResizableHandle, ResizablePanel, @@ -22,17 +13,10 @@ import { } from "@/components/ui/resizable"; import { Card } from "@/components/ui/card"; -import { CarouselApi } from "@/components/ui/carousel"; import { Series } from "../Datasource/SeriesTable"; import { ScrollArea } from "@/components/ui/scroll-area"; -interface ScanProgress { - percentage: number; -} -const defaultProgress = { - percentage: 0, -}; const Boot = () => { const location = useLocation(); @@ -44,89 +28,28 @@ const Boot = () => { * windows系统右键启动应用菜单的入口路径 */ const [bootDirectoryPath, setBootDirectoryPath] = useState(""); + const [tasks, setTasks] = useState(selectDicoms); - const [progress, setProgress] = useState(defaultProgress); - const { toast } = useToast(); - const [, setResult] = useState<[]>([]); - - const [importDialogVisible, setImportDialogVisible] = useState(false); - - useEffect(() => { - const handleScanProgress = ( - _event: Electron.IpcRendererEvent, - data: any - ) => { - setProgress(data); - if (data.error) return; - }; - window.ipcRenderer.on("scan-progress", handleScanProgress); - return () => { - window.ipcRenderer.off("scan-progress", handleScanProgress); - }; - }, []); - - useEffect(() => { - window.ipcRenderer.once("scan-start", () => { - setImportDialogVisible(true); - }); - }, []); - - useEffect(() => { - const handleScanFinished = ( - _event: Electron.IpcRendererEvent, - data: any - ) => { - const { scanDuration, structDicom } = data; - console.log(structDicom); - setResult(structDicom); - setImportDialogVisible(false); - - if (data.error) { - return toast({ - variant: "destructive", - title: "Uh oh! Something went wrong.", - description: "There was a problem with your request.", - action: 重试, - }); - } else { - toast({ - variant: "default", - title: "完成", - description: `本次操作共导入${structDicom.length}组序列数据,耗时:${( - scanDuration / 1000 - ).toFixed(2)} s`, - action: 启动AI测量, - duration: 30 * 1000, - }); - window.ipcRenderer.send("db:series:select"); - } - }; - window.ipcRenderer.on("scan-progress-done", handleScanFinished); - return () => { - window.ipcRenderer.off("scan-progress-done", handleScanFinished); - }; - }, [toast]); - - useEffect(() => { - if (!importDialogVisible) { - setProgress(defaultProgress); - } - }, [importDialogVisible]); /** * 上传到electron主进程 */ const handleTasks = () => { - window.ipcRenderer.send("ai:task", { selectDicoms }); + window.ipcRenderer.send("ai:task", { selectDicoms: tasks }); }; useEffect(() => { - window.ipcRenderer.on("open-folder", (_, data) => { + window.ipcRenderer.on("context-menu-launch", (_, data) => { console.log("右键菜单拉起启动文件夹路径", data); setBootDirectoryPath(data); }); }, []); + const handleEmptyTasks = () => { + setTasks([]); + localStorage.removeItem("selectDicoms"); + }; + return ( {
- {selectDicoms.map((dicom: Series, index: number) => ( + {tasks.map((dicom: Series, index: number) => ( { ))}
-
+
+
- {/* 导入数据dialog */} - - - - 导入数据 - - 如果扫描速度很慢,请取消本次扫描,并缩小导入数据的体量 - - -
- - - 扫描进度 - - - - -
-
-
); }; diff --git a/apps/desktop/src/pages/Layout.css b/apps/desktop/src/pages/Layout.css deleted file mode 100644 index 9c57f74..0000000 --- a/apps/desktop/src/pages/Layout.css +++ /dev/null @@ -1,18 +0,0 @@ -/* Layout.css */ -.custom-tab-strip { - border-bottom-color: hsl(var(--border)); - padding-left: 0; - - .flexlayout__tabset_tabbar_inner_tab_container { - border-top: 0; - padding-left: 0; - } - - .flexlayout__tab_button--selected { - background: hsl(var(--secondary)); - } - - .flexlayout__tabset-selected { - background: transparent; - } -} diff --git a/apps/desktop/src/pages/Layout.tsx b/apps/desktop/src/pages/Layout.tsx index eebfcbe..f9fe96d 100644 --- a/apps/desktop/src/pages/Layout.tsx +++ b/apps/desktop/src/pages/Layout.tsx @@ -1,13 +1,11 @@ import { Toaster } from "@/components/ui/toaster"; -import { LeftDocker } from "./LeftDocker"; import { Outlet } from "react-router-dom"; -import { MenuBar } from "./MenuBar"; +import { MenuBar } from "@/components/base/MenuBar"; +import { SideBarLeft } from "@/components/base/SideBarLeft"; const LayoutMain = () => { const platform = document.querySelector("html")?.getAttribute("platform") ?? "macos"; - // const titleBarStyles = - // platform === "macos" ? "pl-[5rem] pr-[.5rem]" : "pl-[.5rem]"; const titleBarStyles = platform === "macos" ? "pl-[80px]" : "pl-[.5rem]"; return ( @@ -16,13 +14,12 @@ const LayoutMain = () => {
{platform !== "macos" && } - {/* CVPilot Tool */}
- +
diff --git a/apps/desktop/src/pages/LeftDocker.css b/apps/desktop/src/pages/LeftDocker.css deleted file mode 100644 index e69de29..0000000 diff --git a/apps/desktop/src/pages/MenuBar.tsx b/apps/desktop/src/pages/MenuBar.tsx deleted file mode 100644 index 6e1f85d..0000000 --- a/apps/desktop/src/pages/MenuBar.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { - Menubar, - MenubarCheckboxItem, - MenubarContent, - MenubarItem, - MenubarMenu, - MenubarRadioGroup, - MenubarRadioItem, - MenubarSeparator, - MenubarShortcut, - MenubarSub, - MenubarSubContent, - MenubarSubTrigger, - MenubarTrigger, -} from "@/components/ui/menubar"; -import { useNavigate } from "react-router-dom"; - -export const MenuBar = () => { - const navigate = useNavigate(); - - const handleImportDicom = () => { - navigate("/"); - window.ipcRenderer.send("import-dicom-dialog-visible"); - }; - - return ( - - - 文件 - - - 批量导入Dicom⌘T - - - New Window ⌘N - - New Incognito Window - - - Share - - Email link - Messages - Notes - - - - - Print... ⌘P - - - - - Edit - - - Undo ⌘Z - - - Redo ⇧⌘Z - - - - Find - - Search the web - - Find... - Find Next - Find Previous - - - - Cut - Copy - Paste - - - - View - - Always Show Bookmarks Bar - - Always Show Full URLs - - - - Reload ⌘R - - - Force Reload ⇧⌘R - - - Toggle Fullscreen - - Hide Sidebar - - - - Profiles - - - Andy - Benoit - Luis - - - Edit... - - Add Profile... - - - - ); -}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67b295b..f05786c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,15 +106,15 @@ importers: embla-carousel-react: specifier: ^8.2.0 version: 8.2.0(react@18.3.1) - fkill: - specifier: 9.0.0 - version: 9.0.0 flexlayout-react: specifier: ^0.7.15 version: 0.7.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1) framer-motion: specifier: ^11.3.24 version: 11.3.30(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lodash: + specifier: 4.17.21 + version: 4.17.21 lowdb: specifier: ^7.0.1 version: 7.0.1 @@ -173,6 +173,9 @@ importers: '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.3.1) + '@types/lodash': + specifier: 4.17.7 + version: 4.17.7 '@types/node': specifier: 22.5.2 version: 22.5.2 @@ -1509,6 +1512,9 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} @@ -1654,10 +1660,6 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - aggregate-error@5.0.0: - resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} - engines: {node: '>=18'} - ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -1946,10 +1948,6 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-stack@5.2.0: - resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} - engines: {node: '>=14.16'} - cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -2275,10 +2273,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} @@ -2333,14 +2327,6 @@ packages: events-intercept@2.0.0: resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} - execa@6.1.0: - resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - exenv@1.2.2: resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} @@ -2404,10 +2390,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - fkill@9.0.0: - resolution: {integrity: sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==} - engines: {node: '>=18'} - flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2520,14 +2502,6 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -2652,14 +2626,6 @@ packages: resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} - human-signals@3.0.1: - resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} - engines: {node: '>=12.20.0'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -2687,10 +2653,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -2757,10 +2719,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is@3.3.0: resolution: {integrity: sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==} @@ -2960,10 +2918,6 @@ packages: engines: {node: '>=4.0.0'} hasBin: true - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -3077,10 +3031,6 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3096,10 +3046,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - onnx-proto@4.0.4: resolution: {integrity: sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==} @@ -3175,10 +3121,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3203,10 +3145,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pid-port@1.0.0: - resolution: {integrity: sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ==} - engines: {node: '>=18'} - pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -3272,10 +3210,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - process-exists@5.0.0: - resolution: {integrity: sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -3305,10 +3239,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - ps-list@8.1.1: - resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} @@ -3808,9 +3738,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3905,10 +3832,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -3981,10 +3904,6 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - taskkill@5.0.0: - resolution: {integrity: sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==} - engines: {node: '>=14.16'} - teeny-request@9.0.0: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} @@ -5565,6 +5484,8 @@ snapshots: dependencies: '@types/node': 22.5.2 + '@types/lodash@4.17.7': {} + '@types/long@4.0.2': {} '@types/ms@0.7.34': {} @@ -5754,11 +5675,6 @@ snapshots: transitivePeerDependencies: - supports-color - aggregate-error@5.0.0: - dependencies: - clean-stack: 5.2.0 - indent-string: 5.0.0 - ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -5862,7 +5778,7 @@ snapshots: app-builder-bin@4.0.0: {} - app-builder-lib@24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): + app-builder-lib@24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.2.1 @@ -5876,7 +5792,7 @@ snapshots: builder-util-runtime: 9.2.4 chromium-pickle-js: 0.2.0 debug: 4.3.6 - dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) ejs: 3.1.10 electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) electron-publish: 24.13.1 @@ -6173,10 +6089,6 @@ snapshots: classnames@2.5.1: {} - clean-stack@5.2.0: - dependencies: - escape-string-regexp: 5.0.0 - cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 @@ -6366,9 +6278,9 @@ snapshots: dlv@1.1.3: {} - dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): dependencies: - app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) builder-util: 24.13.1 builder-util-runtime: 9.2.4 fs-extra: 10.1.0 @@ -6436,7 +6348,7 @@ snapshots: electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): dependencies: - app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) archiver: 5.3.2 builder-util: 24.13.1 fs-extra: 10.1.0 @@ -6446,11 +6358,11 @@ snapshots: electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): dependencies: - app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) builder-util: 24.13.1 builder-util-runtime: 9.2.4 chalk: 4.1.2 - dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -6557,8 +6469,6 @@ snapshots: escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -6641,30 +6551,6 @@ snapshots: events-intercept@2.0.0: {} - execa@6.1.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 3.0.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - exenv@1.2.2: {} expand-template@2.0.3: {} @@ -6731,15 +6617,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - fkill@9.0.0: - dependencies: - aggregate-error: 5.0.0 - execa: 8.0.1 - pid-port: 1.0.0 - process-exists: 5.0.0 - ps-list: 8.1.1 - taskkill: 5.0.0 - flat-cache@3.2.0: dependencies: flatted: 3.3.1 @@ -6853,10 +6730,6 @@ snapshots: dependencies: pump: 3.0.0 - get-stream@6.0.1: {} - - get-stream@8.0.1: {} - github-from-package@0.0.0: {} glob-parent@5.1.2: @@ -7046,10 +6919,6 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@3.0.1: {} - - human-signals@5.0.0: {} - hyphenate-style-name@1.1.0: {} iconv-corefoundation@1.1.7: @@ -7073,8 +6942,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@5.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -7127,8 +6994,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@3.0.0: {} - is@3.3.0: {} isarray@1.0.0: {} @@ -7299,8 +7164,6 @@ snapshots: mime@2.6.0: {} - mimic-fn@4.0.0: {} - mimic-function@5.0.1: {} mimic-response@1.0.1: {} @@ -7382,10 +7245,6 @@ snapshots: normalize-url@6.1.0: {} - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -7397,10 +7256,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - onnx-proto@4.0.4: dependencies: protobufjs: 6.11.4 @@ -7480,8 +7335,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.11.1: @@ -7503,10 +7356,6 @@ snapshots: picomatch@2.3.1: {} - pid-port@1.0.0: - dependencies: - execa: 8.0.1 - pify@2.3.0: {} pirates@4.0.6: {} @@ -7573,10 +7422,6 @@ snapshots: prelude-ls@1.2.1: {} - process-exists@5.0.0: - dependencies: - ps-list: 8.1.1 - process-nextick-args@2.0.1: {} progress@2.0.3: {} @@ -7629,8 +7474,6 @@ snapshots: proxy-from-env@1.1.0: {} - ps-list@8.1.1: {} - pump@2.0.1: dependencies: end-of-stream: 1.4.4 @@ -8254,8 +8097,6 @@ snapshots: shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-concat@1.0.1: {} @@ -8357,8 +8198,6 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-final-newline@3.0.0: {} - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -8475,10 +8314,6 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - taskkill@5.0.0: - dependencies: - execa: 6.1.0 - teeny-request@9.0.0: dependencies: http-proxy-agent: 5.0.0