From 767bb8b29778c4f38208aad77ff39afd9e94412c Mon Sep 17 00:00:00 2001 From: YoungestSongMo <2130460579@qq.com> Date: Wed, 3 Jun 2026 15:00:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E8=88=B9?= =?UTF-8?q?=E9=95=BF=C2=B7HeiXiu=20=E6=A1=8C=E9=9D=A2=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=EF=BC=88=E9=94=99=E8=AF=AF=E6=98=AFsvg?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Electron + React 19 + TypeScript + Ant Design 6 + Tailwind CSS 4 【核心架构】 - Electron 主进程(窗口管理、平台检测、图标适配) - Vite 构建链(双产物 dist/ + dist-electron/) - 共享层 shared/(类型、常量、工具函数) - IPC 通信框架 + 安全守卫 【主题系统】 - 蓝紫渐变主题(亮色/暗色双模式) - Ant Design ConfigProvider 适配(lightAlgorithm / darkAlgorithm) - Tailwind CSS 4 @theme 指令 + CSS 变量 - 设计令牌三处同步(tokens.ts / globals.css / antd-theme.ts) 【导航栏】 - 自定义 H5 导航栏替代系统菜单 - 个人版/企业版双布局 - 未登录拦截 + 事件总线驱动登录弹窗 【登录注册】 - Modal 弹层(Portal)+ Tabs 切换 - 登录/注册表单动态字段渲染 - 记住密码 / 自动登录 / 用户协议 【更新系统】 - 自定义 API 版本检查(替代 electron-updater generic provider) - 手动下载 + SHA512 校验 + spawn NSIS 安装 - 渲染进程更新状态机 Hook(useUpdater) - 检查更新按钮 + 下载进度展示 【构建工具链】 - build.mjs 构建总管(--win/--mac/--linux --personal/--enterprise --build/--clean/--sign/--upload/--publish) - scripts/ 自动化脚本(clean / generate-update-info / upload-oss / publish-release) - electron-builder NSIS 安装器(可选路径、多版本打包) - update-info.json 自动生成(fileSize/sha512/changelog/releaseDate) 【代码质量】 - ESLint + TypeScript strict + Prettier - husky + lint-staged(提交前自动检查) - commitlint(规范提交信息) - Playwright E2E + Vitest 单元测试框架 - rollup-plugin-visualizer 打包体积分析 【文档】 - README.md(快速开始 + 目录结构 + 命令速查) - UpdateA.md(发布手册:API/签名/发版流程/数据库) - CHANGELOG.md(更新日志) - .env.example(构建环境变量模板) --- .env.development | 16 + .env.example | 49 + .env.production | 9 + .eslintrc.cjs | 19 + .gitattributes | 32 + .gitignore | 35 + .npmrc | 1 + .prettierrc | 19 + CHANGELOG.md | 20 + CLAUDE.md | 3 + PROJECT.md | 180 + README.md | 162 + UpdateA.md | 284 + build.mjs | 324 + electron/electron-env.d.ts | 27 + electron/main.ts | 126 + electron/main/menu/index.ts | 58 + electron/main/updater.ts | 316 + electron/main/utils/logo.ts | 100 + electron/main/utils/platform.ts | 53 + electron/preload.ts | 24 + eslint.config.mjs | 40 + index.html | 15 + null | 1 + package-lock.json | 9535 +++++++++++++++++ package.json | 115 + playwright.config.ts | 19 + pnpm-lock.yaml | 4107 +++++++ pnpm-workspace.yaml | 3 + scripts/clean.mjs | 25 + scripts/generate-update-info.mjs | 170 + scripts/publish-release.mjs | 130 + scripts/upload-oss.mjs | 161 + shared/constants/app.ts | 59 + shared/constants/ipc-channels.ts | 43 + shared/constants/version.ts | 9 + shared/types/index.ts | 71 + shared/utils/index.ts | 75 + src/App.tsx | 323 + src/assets/header_actions/account.svg | 1 + src/assets/header_actions/announcements.svg | 1 + src/assets/header_actions/billing.svg | 1 + .../header_actions/compliance_assets.svg | 1 + src/assets/header_actions/membership.svg | 1 + src/assets/header_actions/order_details.svg | 1 + .../header_actions/project_management.svg | 1 + src/assets/header_actions/recharge.svg | 1 + src/assets/header_actions/settings.svg | 1 + src/assets/header_actions/sign_out.svg | 1 + src/assets/header_actions/task_back_logo.svg | 30 + src/assets/header_actions/wechat_work.svg | 1 + src/assets/legal/用户服务协议.txt | 274 + src/assets/legal/积分充值服务协议.txt | 73 + src/assets/logo/HX.png | Bin 0 -> 62269 bytes src/assets/logo/HX2.png | Bin 0 -> 45928 bytes src/assets/logo/heixiu.icns | Bin 0 -> 6641 bytes src/assets/logo/heixiu.ico | Bin 0 -> 109526 bytes src/components/AppProvider.tsx | 61 + src/components/ThemeProvider.tsx | 72 + src/components/common/LegalTextModal.tsx | 77 + src/components/navbar/AnnouncementDrawer.tsx | 147 + src/components/navbar/NavBar.tsx | 135 + src/components/navbar/NavItem.tsx | 52 + src/components/navbar/index.ts | 3 + src/components/navbar/nav-config.ts | 198 + src/components/navbar/types.ts | 41 + src/contexts/app-context.ts | 35 + src/hooks/use-theme.ts | 61 + src/hooks/use-updater.ts | 136 + src/main.tsx | 30 + src/pages/login/components/FormField.tsx | 92 + src/pages/login/components/LoginForm.tsx | 216 + src/pages/login/components/RegisterForm.tsx | 258 + src/pages/login/config/login-fields.ts | 40 + src/pages/login/config/register-fields.ts | 116 + src/pages/login/config/validators.ts | 136 + src/pages/login/hooks/use-auth-state.ts | 131 + src/pages/login/index.tsx | 149 + src/pages/login/types.ts | 52 + src/services/modules/announcement.ts | 38 + src/services/modules/index.ts | 11 + src/services/request.ts | 285 + src/services/types.ts | 71 + src/theme/antd-theme.ts | 312 + src/theme/globals.css | 257 + src/theme/tokens.ts | 117 + src/utils/event-bus.ts | 47 + src/utils/ipc.ts | 43 + src/utils/logo.ts | 53 + src/utils/platform.ts | 89 + src/vite-env.d.ts | 14 + tsconfig.json | 31 + tsconfig.node.json | 14 + tsconfig.node.tsbuildinfo | 1 + vite.config.ts | 47 + 95 files changed, 20814 insertions(+) create mode 100644 .env.development create mode 100644 .env.example create mode 100644 .env.production create mode 100644 .eslintrc.cjs create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierrc create mode 100644 CHANGELOG.md create mode 100644 CLAUDE.md create mode 100644 PROJECT.md create mode 100644 README.md create mode 100644 UpdateA.md create mode 100644 build.mjs create mode 100644 electron/electron-env.d.ts create mode 100644 electron/main.ts create mode 100644 electron/main/menu/index.ts create mode 100644 electron/main/updater.ts create mode 100644 electron/main/utils/logo.ts create mode 100644 electron/main/utils/platform.ts create mode 100644 electron/preload.ts create mode 100644 eslint.config.mjs create mode 100644 index.html create mode 100644 null create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 playwright.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 scripts/clean.mjs create mode 100644 scripts/generate-update-info.mjs create mode 100644 scripts/publish-release.mjs create mode 100644 scripts/upload-oss.mjs create mode 100644 shared/constants/app.ts create mode 100644 shared/constants/ipc-channels.ts create mode 100644 shared/constants/version.ts create mode 100644 shared/types/index.ts create mode 100644 shared/utils/index.ts create mode 100644 src/App.tsx create mode 100644 src/assets/header_actions/account.svg create mode 100644 src/assets/header_actions/announcements.svg create mode 100644 src/assets/header_actions/billing.svg create mode 100644 src/assets/header_actions/compliance_assets.svg create mode 100644 src/assets/header_actions/membership.svg create mode 100644 src/assets/header_actions/order_details.svg create mode 100644 src/assets/header_actions/project_management.svg create mode 100644 src/assets/header_actions/recharge.svg create mode 100644 src/assets/header_actions/settings.svg create mode 100644 src/assets/header_actions/sign_out.svg create mode 100644 src/assets/header_actions/task_back_logo.svg create mode 100644 src/assets/header_actions/wechat_work.svg create mode 100644 src/assets/legal/用户服务协议.txt create mode 100644 src/assets/legal/积分充值服务协议.txt create mode 100644 src/assets/logo/HX.png create mode 100644 src/assets/logo/HX2.png create mode 100644 src/assets/logo/heixiu.icns create mode 100644 src/assets/logo/heixiu.ico create mode 100644 src/components/AppProvider.tsx create mode 100644 src/components/ThemeProvider.tsx create mode 100644 src/components/common/LegalTextModal.tsx create mode 100644 src/components/navbar/AnnouncementDrawer.tsx create mode 100644 src/components/navbar/NavBar.tsx create mode 100644 src/components/navbar/NavItem.tsx create mode 100644 src/components/navbar/index.ts create mode 100644 src/components/navbar/nav-config.ts create mode 100644 src/components/navbar/types.ts create mode 100644 src/contexts/app-context.ts create mode 100644 src/hooks/use-theme.ts create mode 100644 src/hooks/use-updater.ts create mode 100644 src/main.tsx create mode 100644 src/pages/login/components/FormField.tsx create mode 100644 src/pages/login/components/LoginForm.tsx create mode 100644 src/pages/login/components/RegisterForm.tsx create mode 100644 src/pages/login/config/login-fields.ts create mode 100644 src/pages/login/config/register-fields.ts create mode 100644 src/pages/login/config/validators.ts create mode 100644 src/pages/login/hooks/use-auth-state.ts create mode 100644 src/pages/login/index.tsx create mode 100644 src/pages/login/types.ts create mode 100644 src/services/modules/announcement.ts create mode 100644 src/services/modules/index.ts create mode 100644 src/services/request.ts create mode 100644 src/services/types.ts create mode 100644 src/theme/antd-theme.ts create mode 100644 src/theme/globals.css create mode 100644 src/theme/tokens.ts create mode 100644 src/utils/event-bus.ts create mode 100644 src/utils/ipc.ts create mode 100644 src/utils/logo.ts create mode 100644 src/utils/platform.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.node.tsbuildinfo create mode 100644 vite.config.ts diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..96b5b4e --- /dev/null +++ b/.env.development @@ -0,0 +1,16 @@ +# ============================================================ +# 开发环境 — 连接测试服务器 +# 环境变量模板 — 复制为 .env.development / .env.production 后填入实际值 +# Vite 仅暴露 VITE_ 前缀的变量给客户端代码(import.meta.env.VITE_xxx) +# ============================================================ + +# API 基础地址(测试服务器) +VITE_API_BASE_URL=http://8.160.179.64:8000 + +# 版本类型:personal(个人版)| enterprise(企业版) +VITE_EDITION=personal +# VITE_EDITION=enterprise + +# 应用标题后缀(可选,覆盖默认构建标题) +VITE_APP_TITLE=船长·HeiXiu + diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3009369 --- /dev/null +++ b/.env.example @@ -0,0 +1,49 @@ +# ============================================================ +# HeiXiu 构建时环境变量 +# +# 用法:复制此文件为 .env(注意:.env 已加入 .gitignore,不会提交) +# cp .env.example .env +# +# 优先级:终端 export > CI/CD Secret > .env 文件 > 默认值 +# ============================================================ + +# -------- 更新 API -------- +# 版本检查 API 基地址 +UPDATE_API_URL=https://www.heixiu.com + +# 发布 API 鉴权 Key(publish-release.mjs 使用) +# UPDATE_API_KEY=your-api-key-here + +# -------- OSS 上传 -------- +# 阿里云 OSS endpoint +# OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com + +# 阿里云 OSS bucket 名称 +# OSS_BUCKET=heixiu + +# 阿里云 AccessKey +# OSS_ACCESS_KEY_ID=your-access-key-id +# OSS_ACCESS_KEY_SECRET=your-access-key-secret + +# OSS 内基路径(默认 releases) +# OSS_BASE_PATH=releases + +# 预判 URL 模式时的下载基地址(generate-update-info.mjs 使用) +# UPDATE_DOWNLOAD_BASE=https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases + +# -------- 代码签名 -------- +# 证书文件路径(.pfx / .p12) +# CSC_LINK=/path/to/certificate.pfx + +# 证书密码 +# CSC_KEY_PASSWORD=your-cert-password + +# -------- 更新元数据 -------- +# 强制更新标记 +# UPDATE_FORCE=false + +# 最低兼容版本(低于此版本必须强制升级) +UPDATE_MIN_VERSION=0.1.1 + +# 覆盖 CHANGELOG.md 中的日志(CI/CD 场景) +# UPDATE_CHANGELOG=## 0.1.0\n- 新增 xxx\n- 修复 xxx diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..174f76e --- /dev/null +++ b/.env.production @@ -0,0 +1,9 @@ +# ============================================================ +# 生产环境 +# ============================================================ + +# 生产服务器 API 地址 +VITE_API_BASE_URL=https://www.heixiu.net + +# 生产版本(构建时可通过命令行 EDITION=enterprise 覆盖) +VITE_EDITION=personal diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..81f1906 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + root: true, + env: {browser: true, es2020: true}, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + {allowConstantExport: true}, + ], + "semi": ["error", "always"] + }, +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..46505a0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,32 @@ +# 自动检测文本文件,并规范化换行符为 LF(提交到仓库时统一为 LF) +* text=auto + +# 明确指定以下文件使用 LF(适用于大多数代码文本文件) +*.js text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.json text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.html text eol=lf +*.md text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.sh text eol=lf # Shell 脚本必须为 LF +*.py text eol=lf + +# Windows 批处理文件必须使用 CRLF +*.bat text eol=crlf +*.cmd text eol=crlf + +# 二进制文件(防止 Git 错误地修改它们) +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.zip binary +*.tar.gz binary +*.exe binary +*.dmg binary +*.AppImage binary \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59eb8b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +# vite打包输出 +dist +# electron打包输出 +dist-electron +# electron-builder输出 +release +e2e +test-results +dist-ssr +*.local + +# 环境变量 +.env # 构建时环境变量(从 .env.example 复制,含 OSS Key 等) +.env.production # Vite 生产环境变量(含 API 地址) + +# Editor directories and files +.vscode +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..7252df1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +# electron_mirror=https://npmmirror.com/mirrors/electron/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..9eeee3c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,19 @@ +{ + "printWidth": 100, + "tabWidth": 3, + "useTabs": false, + "semi": true, + "singleQuote": true, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "all", + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "always", + "endOfLine": "lf", + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "proseWrap": "preserve", + "vueIndentScriptAndStyle": false +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..976620d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,20 @@ +# 更新日志 + +> 每次发版前修改此文件,`npm run build:win` 打包后会自动读取生成 update-info.json。 + +--- + +## 0.0.1(2026-06-03) + +- 初始版本 +- 蓝紫渐变主题(亮色 + 暗色) +- 自定义 H5 导航栏 +- 登录 / 注册 Modal +- 公告系统 +- 自动更新检查 + +--- + +## 格式说明 + +每个版本以 `## x.y.z(日期)` 开头,内容为无序列表。打包脚本会提取最新版本的日志填入 update-info.json。 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c45f890 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,3 @@ +# 回答语言 + +- 所有交互、解释、代码注释与生成内容均使用简体中文,专有技术名词可保留英文,但需附带中文说明 diff --git a/PROJECT.md b/PROJECT.md new file mode 100644 index 0000000..57ec59a --- /dev/null +++ b/PROJECT.md @@ -0,0 +1,180 @@ +# 项目概览 + +- 本项目使用 Vite + React 19 + TypeScript + Electron 重构现有 Python Qt + 桌面应用,打造跨平台(Windows/macOS)的多窗口桌面程序。 +- 核心界面为单页应用(SPA),同时支持通过 Electron 打开独立窗口以承载子功能。 + +# 核心需求 + +- 完整还原原有 Qt 应用的业务逻辑与视觉体验,并对交互进行现代化改造。 + +- 必须支持 多窗口(主窗口 + 可动态创建的辅助窗口),窗口间需通过事件/消息进行低耦合通信。 + +- 适配 Windows 与 macOS,处理好快捷键、托盘、菜单、窗口边框等平台差异。 + +- 采用 离线优先 架构,保障本地数据处理性能,合理使用本地存储(如 electron-store 或 SQLite)。 + +- 所有对系统底层能力的调用必须通过 Electron 主进程,严禁在渲染进程直接使用 Node.js API(除非通过 preload 安全暴露)。 + +# 技术架构 + +## 整体分层 + +- 主进程(Main Process):Electron 主进程,管理窗口生命周期、系统菜单、托盘、IPC 事件调度、本地文件/数据库操作。 + +- 预加载脚本(Preload):桥接渲染进程与主进程,使用 contextBridge 安全暴露有限 API。 + +- 渲染进程(Renderer):基于 React 19 的 SPA(主窗口)与独立窗口的 React 入口,负责 UI 展示与用户交互。 + +- 共享层(Shared):进程间共享的 TypeScript 类型、常量、工具函数、事件名称枚举。 + +## 前端架构原则 + +- 组件化:以函数组件 + Hooks 为唯一组件形式,UI 拆分为展示组件与容器组件(若无特殊需求,可使用 Hooks 直接连接 Redux)。 + +- 单向数据流:全局状态使用 Redux Toolkit,严格遵循 Action → Reducer → Store → View 单向流动。组件内部状态使用 + useState/useReducer,不污染全局 Store。 + +- 事件驱动(EDA): + 1. 主进程与渲染进程通信基于 Electron IPC(ipcMain/ipcRenderer),定义明确的事件通道与载荷类型。 + + 2. 渲染进程内跨组件通信优先使用 Redux;需要解耦的场景可借助自定义事件总线(如 mitt),但严禁滥用。 + + 3. 窗口间通信统一通过主进程转发(或使用 MessagePort 等 Electron 支持的机制),保持窗口独立性。 + +- 路由与导航:主窗口为 单页应用,使用 React Router v7+ 管理页面切换,支持嵌套路由。 + +- 辅助窗口(设置、预览、导入导出等)为独立 BrowserWindow,加载独立的 HTML 入口(可根据路由参数或 windowId 决定内部路由),不与主窗口共享 + DOM。 + +# 目录结构 + +```md +├── electron/ # Electron 主进程与预加载脚本 +│ ├── main/ # 主进程代码 +│ │ ├── index.ts # 入口,初始化应用 +│ │ ├── windowManager.ts # 多窗口管理器(创建、销毁、聚焦) +│ │ ├── ipc/ # IPC 事件注册与处理 +│ │ ├── menu/ # 系统菜单模板(按平台拆分) +│ │ └── utils/ # 平台判断、路径处理等 +│ └── preload/ # 预加载脚本 +│ ├── index.ts # 主窗口预加载 +│ └── subWindow.ts # 辅助窗口预加载 +├── src/ # 渲染进程(React 应用) +│ ├── main/ # 主窗口 SPA 入口 +│ │ ├── index.html # HTML 入口 +│ │ ├── main.tsx # React 挂载点 +│ │ └── App.tsx # 根组件(路由、主题) +│ ├── sub/ # 辅助窗口独立入口(一个窗口对应一个子目录) +│ │ ├── settings/ # 设置窗口示例 +│ │ │ ├── index.html +│ │ │ └── main.tsx +│ │ └── preview/ # 预览窗口示例 +│ ├── components/ # 通用 UI 组件 +│ ├── containers/ # 业务容器组件(连接 Redux) +│ ├── store/ # Redux Toolkit 配置 +│ │ ├── index.ts # Store 创建 +│ │ ├── slices/ # 按功能拆分 Slice +│ │ └── hooks.ts # 类型化 useAppSelector/useAppDispatch +│ ├── hooks/ # 自定义 Hooks +│ ├── theme/ # 主题适配器与定制 +│ │ ├── adapters/ # Ant Design 主题配置、Tailwind 扩展 +│ │ ├── tokens.ts # 设计令牌(颜色、圆角、阴影等) +│ │ └── globals.css # Tailwind 指令 + 全局样式 +│ ├── router/ # 路由配置(主窗口) +│ ├── utils/ # 纯函数工具 +│ │ └── platform.ts # 平台判定工具(process.platform 封装) +│ └── types/ # 渲染进程专用类型 +├── shared/ # 主进程 & 渲染进程共享 +│ ├── types/ # IPC 通道、载荷类型、通用接口 +│ ├── constants/ # 事件名称、配置常量 +│ └── utils/ # 通用逻辑(如版本比较) +├── package.json +├── vite.config.ts # Vite 配置(多入口) +├── tailwind.config.ts # Tailwind 主题扩展 +├── tsconfig.json +└── electron-builder.yml # 打包配置(跨平台适配) +``` + +# 多窗口与平台判定 + +- windowManager.ts 负责统一创建 BrowserWindow,根据环境变量/参数加载不同入口(如 src/main/index.html 或 + src/sub/settings/index.html)。 + +- src/utils/platform.ts 提供 isMacOS、isWindows 等函数(基于 navigator.userAgent 或 preload 暴露的 process.platform)。在主进程的 + electron/main/utils/platform.ts 中直接使用 Node.js API。 + +- 打包配置 (electron-builder.yml) 须针对平台设置不同的图标、签名策略、安装包格式。 + +# 代码风格 + +## TypeScript + +- 所有语句必须以分号 ; 结尾,缺失分号将被视为错误。 + +- 启用 strict 模式,禁止隐式 any,优先使用 interface 定义对象类型,复杂类型可适度使用 type。 + +- 文件名使用小写短横线连接(kebab-case),如 use-window-state.ts;组件文件名与组件名保持一致(PascalCase),如 + ThemeAdapter.tsx。 + +- 导入顺序:第三方库 → 项目内共享模块 → 相对路径模块,中间用空行分隔。 + +## React + +- 只允许函数组件与 Hooks,禁止使用类组件。 + +- 每个组件必须有明确的 Props 类型,使用 React.FC 或直接标注函数参数类型(推荐直接标注)。 + +- 事件处理函数命名以 handle 开头(如 handleClick),自定义 Hook 以 use 开头。 + +- 避免直接操作 DOM,除非封装在自定义 Hook 中(如焦点管理)。 + +- 使用 React.memo、useMemo、useCallback 优化性能,但不要过早优化。 + +## Redux + +- 使用 Redux Toolkit 的 createSlice 管理状态,异步逻辑使用 createAsyncThunk。 + +- Slice 按业务领域划分,每个 Slice 文件导出 actions 与 reducer。 + +- 组件中通过自定义 Hooks (useAppSelector, useAppDispatch) 访问 Store,避免直接使用 useDispatch/useSelector。 + +# 样式与主题 + +- 优先使用 Tailwind 工具类 完成布局与常规样式,自定义设计令牌应映射为 Tailwind 扩展(在 tailwind.config.ts 中配置 + theme.extend)。 + +- Ant Design 组件样式通过 ConfigProvider 的 theme 属性覆盖,确保与 Tailwind 主题令牌同步。在 src/theme/adapters/ 中创建 + antd-theme.ts,导出主题配置对象,引用 tokens.ts 中的设计变量。 + +- 禁止在组件中硬编码颜色、字号等设计令牌,一律使用主题变量或 Tailwind 类名。 + +- 全局样式文件 globals.css 只引入 Tailwind 指令和必要的重置样式,不堆积组件样式。 + +# 事件与 IPC + +- 所有 IPC 通道名称定义在 shared/constants/ipc-channels.ts 中,避免魔法字符串。 + +- 主进程事件处理函数需做好错误捕获与日志记录,渲染进程调用 IPC 时使用 try-catch 并处理超时。 + +- 窗口间通信走主进程转发:发送窗口 ipcRenderer.send,主进程接收后定位目标窗口并 webContents.send。 + +# 开发与构建命令 + +- 开发模式:npm run dev 或 yarn dev(同时启动 Vite 与 Electron,支持热重载)。 + +- 构建:npm run build 编译渲染进程 → 打包 Electron 应用。 + +- 代码检查:npm run lint(ESLint + Prettier,规则已配置为强制分号、单引号等)。 + +- 类型检查:npm run typecheck(tsc --noEmit)。 + +# 与其他 AI 协作的补充说明 + +- 所有生成的代码片段必须放在完整的文件上下文中,并注明所属文件路径。 + +- 若涉及跨平台逻辑,必须同时给出 Windows 与 macOS 的兼容实现或判断分支。 + +- 新增窗口时,需同步说明窗口入口、预加载脚本、主进程创建逻辑及 IPC 通道注册。 + +- 修改主题令牌时,需同步更新 tokens.ts、tailwind.config.ts 及 antd-theme.ts,确保三处一致。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..2252908 --- /dev/null +++ b/README.md @@ -0,0 +1,162 @@ +# 船长·HeiXiu + +> 桌面效率工作台 — Electron + React 19 + TypeScript + Ant Design + Tailwind CSS + +--- + +## 技术栈 + +| 层 | 技术 | +| ---- | ------------------------------ | +| 框架 | Electron 42 | +| 前端 | React 19 + TypeScript + Vite 8 | +| UI | Ant Design 6 + Tailwind CSS 4 | +| 主题 | 蓝紫渐变(亮色 / 暗色) | +| 更新 | 自定义 API + 阿里云 OSS | +| 打包 | electron-builder + NSIS | + +--- + +## 快速开始 + +```bash +# 安装依赖 +npm install + +# 开发模式(Electron + HMR) +npm run dev + +# 打包(Windows 个人版) +npm run build:win +``` + +--- + +## 构建命令 + +### 打包 + +```bash +npm run build:win # Windows 个人版 +npm run build:win:enterprise # Windows 企业版 +npm run build:mac # macOS 个人版 +npm run build:linux # Linux 个人版 +``` + +### 构建总管 `build.mjs` + +所有打包命令最终调用 `build.mjs`,支持灵活组合操作: + +```bash +# 查看帮助 +node build.mjs --help + +# 仅打包 +node build.mjs --win --personal + +# 打包 + 上传 OSS + 发布到 API +node build.mjs --win --personal --upload --publish + +# 全流程(清理 → 构建 → 签名 → 上传 → 发布) +node build.mjs --win --enterprise --all + +# 带签名打包 +node build.mjs --win --personal --sign --cert ./cert.pfx --cert-password xxx + +# 先清理再构建 +node build.mjs --win --personal --clean --build +``` + +| 操作 | 说明 | +| ----------- | -------------------------------------------------------------- | +| `--build` | 构建(默认:tsc + vite + electron-builder + update-info.json) | +| `--clean` | 构建前清理 release/ dist/ dist-electron/ | +| `--sign` | 代码签名(需配合 `--cert` 或 `CSC_LINK` 环境变量) | +| `--upload` | 上传安装包到 OSS | +| `--publish` | POST 版本信息到后端 API | +| `--all` | 全流程 | + +### 工具命令 + +```bash +npm run build:clean # 清理所有构建产物 +node scripts/upload-oss.mjs win32 personal 0.1.0 # 手动上传 OSS +node scripts/publish-release.mjs win32 personal 0.1.0 # 手动发布到 API +node scripts/generate-update-info.mjs win32 personal 0.1.0 # 重新生成 info +``` + +--- + +## 目录结构 + +``` +ele-heixiu/ +├ build.mjs # 构建总管 +├ CHANGELOG.md # 更新日志 +├ UpdateA.md # 发布手册(后端 API / 签名 / 发版流程) +├ package.json # 项目配置 +├ electron-builder.json5 # 打包配置 +├ electron/ # Electron 主进程 +│ ├ main.ts # 入口 +│ ├ preload.ts # 预加载脚本 +│ └ main/ +│ ├ updater.ts # 自动更新模块 +│ ├ menu/ # 菜单 +│ └ utils/ # 工具函数 +├ src/ # 渲染进程 +│ ├ App.tsx # 根组件 +│ ├ main.tsx # 渲染入口 +│ ├ components/ # 组件 +│ │ ├ navbar/ # 自定义导航栏 +│ │ └ LegalTextModal.tsx # 协议弹窗 +│ ├ pages/ +│ │ └ login/ # 登录 / 注册 +│ ├ hooks/ # Hooks +│ │ ├ use-theme.tsx # 主题切换 +│ │ ├ use-updater.ts # 更新状态 +│ │ └ ... +│ ├ theme/ # 主题配置 +│ │ ├ tokens.ts # 设计令牌 +│ │ ├ globals.css # Tailwind + CSS 变量 +│ │ └ adapters/ # Ant Design 适配 +│ ├ services/ # API 服务(axios) +│ ├ utils/ # 工具函数 +│ └ assets/ # 静态资源 +├ shared/ # 主进程 & 渲染进程共享 +│ ├ types/ # 类型定义 +│ ├ constants/ # 常量 +│ └ utils/ # 通用工具 +├ scripts/ # 构建辅助脚本 +│ ├ clean.mjs # 清理产物 +│ ├ generate-update-info.mjs # 生成 API 信息 JSON +│ ├ upload-oss.mjs # OSS 上传 +│ └ publish-release.mjs # 发布到 API +└ release/ # 构建产物 + └ {version}/ + ├ xxx-Setup.exe + └ xxx-update-info.json +``` + +--- + +## 环境变量 + +| 变量 | 默认值 | 用途 | +| ----------------------- | ------------------------------------------------------ | --------------- | +| `UPDATE_API_URL` | `https://www.heixiu.com` | 版本检查 API | +| `UPDATE_API_KEY` | — | 发布 API 鉴权 | +| `UPDATE_DOWNLOAD_BASE` | `https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases` | OSS 下载基地址 | +| `OSS_ENDPOINT` | — | OSS endpoint | +| `OSS_BUCKET` | — | OSS bucket | +| `OSS_ACCESS_KEY_ID` | — | OSS AccessKey | +| `OSS_ACCESS_KEY_SECRET` | — | OSS Secret | +| `CSC_LINK` | — | 签名证书路径 | +| `CSC_KEY_PASSWORD` | — | 签名证书密码 | +| `VITE_API_BASE_URL` | `http://8.160.179.64:8000`(dev) | 业务 API 基地址 | + +--- + +## 相关文档 + +- [发布手册](./UpdateA.md) — API 接口、发版流程、签名指南、数据库设计 +- [项目架构](./PROJECT.md) — 详细的技术方案与设计决策 diff --git a/UpdateA.md b/UpdateA.md new file mode 100644 index 0000000..9ad1944 --- /dev/null +++ b/UpdateA.md @@ -0,0 +1,284 @@ +# HeiXiu 构建 & 发布手册 + +> 面向前端发版 + 后端 API 对接 + +--- + +## 一、整体架构 + +``` +┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ +│ 客户端 (Electron)│ │ ECS (API 服务) │ │ OSS (阿里云) │ +│ │ GET │ │ │ │ +│ 版本检查 ─────────┼────────▶│ /api/v1/update/ │ │ │ +│ │ │ check │ │ │ +│ │◀────────│ 返回 JSON │ │ │ +│ │ │ │ │ │ +│ 下载安装包 ───────┼─────────┼──────────────────┼────────▶│ 静态文件托管 │ +│ │◀────────┼──────────────────┼─────────│ .exe / .dmg │ +│ │ │ │ │ │ +│ 安装 (spawn) │ │ │ │ │ +│ → app.quit() │ │ │ │ │ +└──────────────────┘ └──────────────────┘ └──────────────────┘ +``` + +| 角色 | 技术 | 职责 | +| ------ | -------------------------- | ------------------------------------------ | +| 客户端 | Electron + `net.request()` | 调用 API → 下载安装包 → 校验 SHA512 → 安装 | +| ECS | 任意后端语言 | 提供版本检查 API | +| OSS | 阿里云对象存储 | 托管 .exe / .dmg / .AppImage | + +--- + +## 二、项目脚本速查 + +### 总入口:`build.mjs` + +```bash +node build.mjs --help # 查看完整帮助 +npm run build:win # 打包 Windows 个人版(快捷命令) +``` + +### npm 命令速查 + +```bash +# 构建(仅打包,不上传/发布) +npm run build:win # Windows 个人版 +npm run build:win:enterprise # Windows 企业版 +npm run build:mac # macOS 个人版 +npm run build:linux # Linux 个人版 + +# 工具 +npm run build:clean # 清理 release/ + dist/ + dist-electron/ +node build.mjs --win --personal --help # 查看完整 CLI 指南 + +# 独立脚本(需传参数) +node scripts/generate-update-info.mjs <平台> <版本类型> [版本号] [--url ] +node scripts/upload-oss.mjs <平台> <版本类型> [版本号] +node scripts/publish-release.mjs <平台> <版本类型> [版本号] [--url ] +``` + +### `build.mjs` 操作组合 + +| 操作 | 说明 | +| ----------- | -------------------------------------------------------- | +| `--build` | 构建(tsc + vite + electron-builder + update-info.json) | +| `--clean` | 清理旧产物 | +| `--sign` | 代码签名(配合 `--cert` 或环境变量) | +| `--upload` | 上传 OSS | +| `--publish` | POST 版本信息到后端 API | +| `--all` | 全流程 = clean + build + sign + upload + publish | + +--- + +## 三、发版工作流 + +### 路径 A:快速打包(日常开发 / 内部测试) + +```bash +# 1. 修改版本号 +# package.json → "version": "0.1.0" + +# 2. 写更新日志 +# CHANGELOG.md → 顶部新增 ## 0.1.0(2026-xx-xx)... + +# 3. 打包 +npm run build:win && npm run build:win:enterprise + +# 4. 产物在 release/0.1.0/ 下: +# - xxx-Setup.exe(安装包) +# - xxx-update-info.json(所有 API 字段,downloadUrl 为预判 URL) + +# 5. 手动上传 exe 到 OSS releases/0.1.0/ +# 6. 将 update-info.json 内容录入数据库 releases 表 +``` + +### 路径 B:先上传再确定 URL + +```bash +# 打包 +npm run build:win + +# 上传到 OSS(自动打印实际 URL) +node scripts/upload-oss.mjs win32 personal 0.1.0 + +# 用实际 URL 重新生成 update-info.json +node scripts/generate-update-info.mjs win32 personal 0.1.0 \ + --url "https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases/0.1.0/xxx.exe" + +# 将 update-info.json 录入数据库 +``` + +### 路径 C:全自动(上传 + 发布一条龙) + +```bash +# 一步到位(需先配置环境变量) +OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com \ +OSS_BUCKET=heixiu \ +OSS_ACCESS_KEY_ID=xxx \ +OSS_ACCESS_KEY_SECRET=xxx \ +UPDATE_API_KEY=xxx \ +node build.mjs --win --personal --upload --publish +``` + +--- + +## 四、代码签名 + +### 证书获取 + +| 平台 | 格式 | 渠道 | 年费 | +| ------- | ----------------- | ------------------------------- | -------- | +| Windows | `.pfx` / `.p12` | DigiCert / Sectigo / GlobalSign | $200-700 | +| macOS | `.p12` / Keychain | Apple Developer Program | $99 | + +> EV 证书立即消除 SmartScreen 警告;OV 证书需积累下载量。 + +### 签名方式 + +```bash +# 方式 1:build.mjs 参数 +node build.mjs --win --personal --sign --cert ./cert.pfx --cert-password xxx + +# 方式 2:环境变量(CI/CD 友好) +CSC_LINK=/path/to/cert.pfx CSC_KEY_PASSWORD=xxx npm run build:win +``` + +> SHA512 校验值会在签名后自动计算(签名改变文件字节,必须先签后校)。 + +--- + +## 五、API 接口 + +### `GET /api/v1/update/check` + +**参数**:`platform`(win32/darwin/linux)、`version`(三段式 semver)、`edition`(personal/enterprise) + +**有更新**: + +```json +{ + "code": 0, + "data": { + "hasUpdate": true, + "latestVersion": "0.1.0", + "downloadUrl": "https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases/0.1.0/xxx.exe", + "fileSize": 98765432, + "sha512": "Base64...", + "changelog": "更新日志...", + "releaseDate": "2026-06-03", + "forceUpdate": false, + "minimumVersion": "0.0.0" + } +} +``` + +**无更新**: + +```json +{ "code": 0, "data": { "hasUpdate": false } } +``` + +### `POST /api/v1/releases`(发布用) + +```json +{ + "platform": "win32", + "edition": "personal", + "latestVersion": "0.1.0", + "downloadUrl": "https://...", + "fileSize": 112910987, + "sha512": "Base64...", + "changelog": "...", + "releaseDate": "2026-06-03", + "forceUpdate": false, + "minimumVersion": "0.0.0" +} +``` + +> Header: `Authorization: Bearer ` + +--- + +## 六、数据库 + +```sql +CREATE TABLE releases ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + platform VARCHAR(10) NOT NULL COMMENT 'win32 / darwin / linux', + edition VARCHAR(10) NOT NULL COMMENT 'personal / enterprise', + version VARCHAR(20) NOT NULL COMMENT '三段式 semver', + file_url VARCHAR(500) NOT NULL COMMENT 'OSS HTTPS 地址', + file_size BIGINT NOT NULL COMMENT '字节数', + sha512 VARCHAR(128) NOT NULL COMMENT 'Base64 编码', + changelog TEXT, + force_update TINYINT(1) DEFAULT 0, + min_version VARCHAR(20) DEFAULT '', + release_date DATE NOT NULL, + status VARCHAR(10) DEFAULT 'draft' COMMENT 'draft / published / deprecated', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + UNIQUE KEY uk_platform_edition_version (platform, edition, version), + INDEX idx_platform_edition_status (platform, edition, status) +); +``` + +--- + +## 七、客户端行为 + +| 场景 | 行为 | +| -------- | ---------------------------------------------------- | +| 启动 | 5 秒后静默检查更新(仅生产环境) | +| 手动检查 | 点击按钮 → 调用 API → 反馈结果 | +| 下载 | 流式写入临时目录,SHA512 实时校验,每 250ms 推送进度 | +| 安装 | 用户确认 → spawn NSIS /S → app.quit() | +| 强制更新 | `forceUpdate=true` 时不可跳过 | +| 开发模式 | 跳过所有更新检查 | + +--- + +## 八、环境变量速查 + +| 变量 | 默认值 | 用途 | +| ----------------------- | ------------------------------------------------------ | ----------------------- | +| `UPDATE_API_URL` | `https://www.heixiu.com` | 版本检查 API 基地址 | +| `UPDATE_API_KEY` | — | 发布 API 鉴权 Key | +| `UPDATE_DOWNLOAD_BASE` | `https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases` | 预判 URL 基地址 | +| `OSS_ENDPOINT` | — | 阿里云 OSS endpoint | +| `OSS_BUCKET` | — | 阿里云 OSS bucket | +| `OSS_ACCESS_KEY_ID` | — | 阿里云 AccessKey ID | +| `OSS_ACCESS_KEY_SECRET` | — | 阿里云 AccessKey Secret | +| `OSS_BASE_PATH` | `releases` | OSS 内基路径 | +| `CSC_LINK` | — | 签名证书路径 | +| `CSC_KEY_PASSWORD` | — | 签名证书密码 | +| `UPDATE_FORCE` | `false` | 强制更新标记(打包时) | +| `UPDATE_CHANGELOG` | 读取 CHANGELOG.md | 覆盖更新日志(CI/CD) | + +--- + +## 九、文件结构 + +``` +ele-heixiu/ +├ build.mjs ← 构建总管(npm run build 入口) +├ CHANGELOG.md ← 更新日志(打包时自动提取) +├ UpdateA.md ← 本文档 +├ package.json ← 仅保留简短的 npm 快捷命令 +├ scripts/ +│ ├ clean.mjs ← 清理产物 +│ ├ generate-update-info.mjs ← 生成 API 信息 JSON +│ ├ upload-oss.mjs ← 上传 OSS +│ └ publish-release.mjs ← 发布到 API(axios) +├ release/ ← 构建产物目录(按版本分) +│ └ 0.1.0/ +│ ├ xxx-Setup.exe +│ └ xxx-update-info.json +├ dist/ ← Vite 前端产物(构建输入) +└ dist-electron/ ← Electron 主进程产物(构建输入) +``` + +--- + +_如有接口或流程变更,请同步更新此文档。_ diff --git a/build.mjs b/build.mjs new file mode 100644 index 0000000..a131ec3 --- /dev/null +++ b/build.mjs @@ -0,0 +1,324 @@ +// ============================================================ +// build.mjs — 构建总管 +// +// 用法:node build.mjs [选项] +// +// 平台(必选其一): +// --win Windows +// --mac macOS +// --linux Linux +// +// 版本(可选,默认 personal): +// --personal 个人版 +// --enterprise 企业版 +// +// 操作(可选组合,默认只执行 --build): +// --build 仅构建(默认) +// --clean 构建前清理 release/ dist/ dist-electron/ +// --sign 代码签名 +// --upload 上传安装包到 OSS +// --publish 发布版本信息到后端 API +// --all 全流程(clean + build + sign + upload + publish) +// +// 签名(仅 --sign 时可用): +// --cert 证书文件路径 (.pfx) +// --cert-password

证书密码 +// +// 示例: +// node build.mjs --win --personal # 仅打包 +// node build.mjs --win --personal --upload --publish # 打包 + 上传 + 发布 +// node build.mjs --win --enterprise --all # 全流程 +// node build.mjs --win --personal --sign --cert ./cert.pfx --cert-password xxx +// ============================================================ + +import { spawn } from 'node:child_process'; +import { readFileSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = __dirname; + +// ANSI 颜色工具(在其它代码之前定义,因为 printHelp() 在参数解析时就会调用) +const c = (code, text) => `\x1b[${code}m${text}\x1b[0m`; +const dim = (t) => c(2, t); +const bold = (t) => c(1, t); +const cyan = (t) => c(36, t); +const green = (t) => c(32, t); +const yellow = (t) => c(33, t); + +// ---------- 参数解析 ---------- + +const args = process.argv.slice(2); + +const opts = { + win: false, + mac: false, + linux: false, + personal: false, + enterprise: false, + clean: false, + build: false, + sign: false, + upload: false, + publish: false, + cert: '', + certPassword: '', +}; + +let i = 0; +while (i < args.length) { + const a = args[i]; + switch (a) { + case '--win': opts.win = true; break; + case '--mac': opts.mac = true; break; + case '--linux': opts.linux = true; break; + case '--personal': opts.personal = true; break; + case '--enterprise': opts.enterprise = true; break; + case '--clean': opts.clean = true; break; + case '--build': opts.build = true; break; + case '--sign': opts.sign = true; break; + case '--upload': opts.upload = true; break; + case '--publish': opts.publish = true; break; + case '--all': + opts.clean = opts.build = opts.sign = opts.upload = opts.publish = true; + break; + case '--cert': + opts.cert = args[++i] || ''; + break; + case '--cert-password': + opts.certPassword = args[++i] || ''; + break; + case '--help': // fallthrough + case '-h': + printHelp(); + process.exit(0); + break; // eslint 友好 + default: + // 忽略未知参数 + break; + } + i++; +} + +// ---------- 校验 ---------- + +const platformCount = [opts.win, opts.mac, opts.linux].filter(Boolean).length; +if (platformCount !== 1) { + console.error('错误: 请指定且仅指定一个平台(--win / --mac / --linux)'); + process.exit(1); +} + +const editionCount = [opts.personal, opts.enterprise].filter(Boolean).length; +if (editionCount === 0) { + opts.personal = true; // 默认个人版 +} else if (editionCount > 1) { + console.error('错误: --personal 和 --enterprise 不能同时使用'); + process.exit(1); +} + +// 默认执行 build +if (!opts.clean && !opts.build && !opts.sign && !opts.upload && !opts.publish) { + opts.build = true; +} + +const platform = opts.win ? 'win32' : opts.mac ? 'darwin' : 'linux'; +const edition = opts.personal ? 'personal' : 'enterprise'; + +const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf-8')); +const version = pkg.version; + +// ---------- 工具函数 ---------- + +function run(cmd, args, opts = {}) { + return new Promise((resolve, reject) => { + const child = spawn(cmd, args, { + cwd: ROOT, + stdio: 'inherit', + shell: true, + ...opts, + env: { ...process.env, ...(opts.env || {}) }, + }); + child.on('close', (code) => { + if (code === 0) resolve(); + else reject(new Error(`${cmd} ${args.join(' ')} 退出码: ${code}`)); + }); + child.on('error', reject); + }); +} + +function runScript(name, ...args) { + const scriptPath = join(ROOT, 'scripts', `${name}.mjs`); + return run('node', [scriptPath, ...args]); +} + +function step(title) { + console.log(`\n${'='.repeat(60)}`); + console.log(` ${title}`); + console.log(`${'='.repeat(60)}\n`); +} + +// ---------- 主流程 ---------- + +async function main() { + const electronBuilderPlatform = opts.win ? '--win' : opts.mac ? '--mac' : '--linux'; + const editionEnv = { EDITION: edition }; + + console.log('┌──────────────────────────────────────┐'); + console.log(`│ HeiXiu 构建 v${version} ${platform}/${edition}`.padEnd(45) + '│'); + console.log('└──────────────────────────────────────┘'); + console.log(`操作: ${[ + opts.clean && '清理', + opts.build && '构建', + opts.sign && '签名', + opts.upload && '上传', + opts.publish && '发布', + ].filter(Boolean).join(' → ')}`); + + // ── Step 1: 清理 ── + if (opts.clean) { + step('1/ 清理构建产物'); + await runScript('clean'); + } + + // ── Step 2: 构建 ── + if (opts.build) { + step('2/ 构建应用'); + + // 签名环境变量(electron-builder 原生支持 CSC_LINK / CSC_KEY_PASSWORD) + const signEnv = {}; + if (opts.sign) { + if (opts.cert) signEnv.CSC_LINK = opts.cert; + if (opts.certPassword) signEnv.CSC_KEY_PASSWORD = opts.certPassword; + console.log(opts.cert ? `签名证书: ${opts.cert}` : '签名: 使用系统证书存储'); + } + + // 2a. TypeScript 编译 + console.log('[tsc] 类型检查...'); + await run('npx', ['tsc'], { env: editionEnv }); + + // 2b. Vite 构建 + console.log('[vite] 打包前端 + Electron...'); + await run('npx', ['vite', 'build'], { env: editionEnv }); + + // 2c. electron-builder 打包 + console.log(`[electron-builder] ${electronBuilderPlatform} 打包...`); + await run('npx', ['electron-builder', electronBuilderPlatform], { + env: { ...editionEnv, ...signEnv }, + }); + + // 2d. 生成 update-info.json + console.log('[info] 生成 update-info.json...'); + await runScript('generate-update-info', platform, edition, version); + } + + // ── Step 3: 上传 OSS ── + if (opts.upload) { + step('3/ 上传 OSS'); + await runScript('upload-oss', platform, edition, version); + } + + // ── Step 4: 发布到 API ── + if (opts.publish) { + step('4/ 发布版本到 API'); + await runScript('publish-release', platform, edition, version); + } + + console.log('\n✅ 全部完成'); +} + +function printHelp() { + const W = 62; + const box = (title) => { + const pad = Math.max(0, W - 4 - title.length); + console.log(`\n${cyan('┌')}${cyan('─'.repeat(W - 2))}${cyan('┐')}`); + console.log(`${cyan('│')} ${bold(title)}${' '.repeat(pad)}${cyan('│')}`); + console.log(`${cyan('└')}${cyan('─'.repeat(W - 2))}${cyan('┘')}`); + }; + const row = (flag, desc) => { + console.log(` ${green(flag.padEnd(22))}${dim(desc)}`); + }; + const hdr = (t) => console.log(`\n ${bold(yellow(t))}`); + + console.log(''); + console.log(cyan(' ╔') + cyan('═══════════════════════════════════════════════════') + cyan('╗')); + console.log(cyan(' ║') + bold(' 船长·HeiXiu — 构建工具') + ' ' + cyan('║')); + console.log(cyan(' ╚') + cyan('═══════════════════════════════════════════════════') + cyan('╝')); + + // 用法 + box('用法'); + console.log(` ${bold('node build.mjs')} ${dim('<平台> [版本] [操作...]')}`); + console.log(` ${bold('npm run build:win')} ${dim('— 等效快捷命令')}`); + + // 平台 + hdr('平台(必选其一)'); + row('--win', 'Windows'); + row('--mac', 'macOS'); + row('--linux', 'Linux'); + + // 版本 + hdr('版本(可选,默认 --personal)'); + row('--personal', '个人版'); + row('--enterprise', '企业版'); + + // 操作 + hdr('操作(可选组合,不指定则默认 --build)'); + row('--build', '构建应用(tsc + vite + electron-builder + info)'); + row('--clean', '构建前清理 release/ dist/ dist-electron/'); + row('--sign', '代码签名(需配合 --cert 或环境变量)'); + row('--upload', '上传安装包到 OSS'); + row('--publish', '发布版本信息到后端 API'); + row('--all', '全流程 = clean + build + sign + upload + publish'); + + // 签名 + hdr('签名参数(配合 --sign)'); + row('--cert ', '证书文件路径(.pfx / .p12)'); + row('--cert-password

', '证书密码'); + console.log(` ${dim('也可通过 CSC_LINK / CSC_KEY_PASSWORD 环境变量设置')}`); + + // 示例 + box('示例'); + console.log(` ${dim('# 日常开发')}`); + console.log(` ${bold('node build.mjs --win --personal')}`); + console.log(` ${bold('npm run build:win')} ${dim('— 等效')}`); + console.log(''); + console.log(` ${dim('# 打包 + 上传 OSS + 发布到 API')}`); + console.log(` ${bold('node build.mjs --win --personal --upload --publish')}`); + console.log(''); + console.log(` ${dim('# 全流程(清理 → 构建 → 签名 → 上传 → 发布)')}`); + console.log(` ${bold('node build.mjs --win --enterprise --all --cert ./cert.pfx --cert-password xxx')}`); + console.log(''); + console.log(` ${dim('# 仅清理')}`); + console.log(` ${bold('npm run build:clean')}`); + + // 环境变量 + box('环境变量'); + console.log(` ${yellow('UPDATE_API_URL')} ${dim('版本检查 API 基地址')}`); + console.log(` ${yellow('UPDATE_API_KEY')} ${dim('发布 API 鉴权 Key')}`); + console.log(` ${yellow('UPDATE_DOWNLOAD_BASE')} ${dim('OSS 下载基地址(预判 URL 用)')}`); + console.log(` ${yellow('OSS_ENDPOINT')} ${dim('阿里云 OSS endpoint')}`); + console.log(` ${yellow('OSS_BUCKET')} ${dim('阿里云 OSS bucket 名称')}`); + console.log(` ${yellow('OSS_ACCESS_KEY_ID')} ${dim('阿里云 AccessKey ID')}`); + console.log(` ${yellow('OSS_ACCESS_KEY_SECRET')} ${dim('阿里云 AccessKey Secret')}`); + console.log(` ${yellow('CSC_LINK')} ${dim('签名证书路径(与 --cert 等效)')}`); + console.log(` ${yellow('CSC_KEY_PASSWORD')} ${dim('签名证书密码(与 --cert-password 等效)')}`); + + // 快捷命令 + box('npm 快捷命令'); + console.log(` ${bold('npm run build:win')} ${dim('→ node build.mjs --win --personal --build')}`); + console.log(` ${bold('npm run build:win:enterprise')} ${dim('→ node build.mjs --win --enterprise --build')}`); + console.log(` ${bold('npm run build:mac')} ${dim('→ node build.mjs --mac --personal --build')}`); + console.log(` ${bold('npm run build:linux')} ${dim('→ node build.mjs --linux --personal --build')}`); + console.log(` ${bold('npm run build:clean')} ${dim('→ node scripts/clean.mjs')}`); + console.log(` ${bold('npm run upload:oss')} ${dim('→ node scripts/upload-oss.mjs')}`); + console.log(` ${bold('npm run publish:release')} ${dim('→ node scripts/publish-release.mjs')}`); + + console.log(''); +} + +// ---------- 入口 ---------- + +main().catch((err) => { + console.error(`\n❌ 构建失败: ${err.message}`); + process.exit(1); +}); diff --git a/electron/electron-env.d.ts b/electron/electron-env.d.ts new file mode 100644 index 0000000..015370f --- /dev/null +++ b/electron/electron-env.d.ts @@ -0,0 +1,27 @@ +/// + +declare namespace NodeJS { + interface ProcessEnv { + /** + * The built directory structure + * + * ```tree + * ├─┬─┬ dist + * │ │ └── index.html + * │ │ + * │ ├─┬ dist-electron + * │ │ ├── main.js + * │ │ └── preload.js + * │ + * ``` + */ + APP_ROOT: string; + /** /dist/ or /public/ */ + VITE_PUBLIC: string; + } +} + +// Used in Renderer process, expose in `preload.ts` +interface Window { + ipcRenderer: import('electron').IpcRenderer; +} diff --git a/electron/main.ts b/electron/main.ts new file mode 100644 index 0000000..2f1fe6d --- /dev/null +++ b/electron/main.ts @@ -0,0 +1,126 @@ +import { app, BrowserWindow } from 'electron'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; + +import { getPlatform, isMacOS } from './main/utils/platform'; +import { getWindowIconPath } from './main/utils/logo'; +import { buildWindowTitle, parseEdition } from '../shared/constants/app'; +import { initUpdater, registerUpdateIpcHandlers } from './main/updater'; +import { setupAppMenu } from './main/menu'; + +createRequire(import.meta.url); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +process.env.APP_ROOT = path.join(__dirname, '..'); + +export const VITE_DEV_SERVER_URL = process.env['VITE_DEV_SERVER_URL']; +export const MAIN_DIST = path.join(process.env.APP_ROOT, 'dist-electron'); +export const RENDERER_DIST = path.join(process.env.APP_ROOT, 'dist'); + +process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL + ? path.join(process.env.APP_ROOT, 'public') + : RENDERER_DIST; + +// ---------- 平台 & 版本信息 ---------- +const currentPlatform = getPlatform(); +const currentEdition = parseEdition(process.env.EDITION); +const WINDOW_TITLE = buildWindowTitle(currentPlatform, currentEdition); + +// ============================================================ +// 窗口引用 +// ============================================================ + +let mainWindow: BrowserWindow | null = null; + +// ============================================================ +// 主窗口 +// ============================================================ + +function createMainWindow(): BrowserWindow { + const iconPath = getWindowIconPath(app.getAppPath()); + + mainWindow = new BrowserWindow({ + title: WINDOW_TITLE, + icon: iconPath, + width: 1280, + height: 800, + minWidth: 960, + minHeight: 600, + show: false, + ...(isMacOS() ? { titleBarStyle: 'hiddenInset' as const } : {}), + webPreferences: { + preload: path.join(__dirname, 'preload.mjs'), + contextIsolation: true, + nodeIntegration: false, + }, + }); + + mainWindow.setTitle(WINDOW_TITLE); + + if (VITE_DEV_SERVER_URL) { + mainWindow.webContents.openDevTools(); + } + + // macOS 全屏事件 + if (isMacOS()) { + mainWindow.on('enter-full-screen', () => + mainWindow?.webContents.send('window-fullscreen-changed', true), + ); + mainWindow.on('leave-full-screen', () => + mainWindow?.webContents.send('window-fullscreen-changed', false), + ); + } + + mainWindow.webContents.on('did-finish-load', () => { + mainWindow?.webContents.send('main-process-message', new Date().toLocaleString()); + mainWindow?.webContents.send('platform-info', { + platform: currentPlatform, + edition: currentEdition, + }); + }); + + // ready-to-show 后显示,避免白屏闪烁 + mainWindow.once('ready-to-show', () => { + mainWindow?.show(); + }); + + if (VITE_DEV_SERVER_URL) { + mainWindow.loadURL(VITE_DEV_SERVER_URL); + } else { + mainWindow.loadFile(path.join(RENDERER_DIST, 'index.html')); + } + + return mainWindow; +} + +// ============================================================ +// 应用生命周期 +// ============================================================ + +app.on('window-all-closed', () => { + if (!isMacOS()) { + app.quit(); + } +}); + +app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createMainWindow(); + } +}); + +app.on('before-quit', () => { + // 清理工作 +}); + +app.whenReady().then(() => { + setupAppMenu(); + app.setName(WINDOW_TITLE); + registerUpdateIpcHandlers(); + + // 始终打开主窗口 + // 登录/注册由渲染进程内的 Modal 弹层处理,不再新开窗口 + const win = createMainWindow(); + initUpdater(win); +}); diff --git a/electron/main/menu/index.ts b/electron/main/menu/index.ts new file mode 100644 index 0000000..222f759 --- /dev/null +++ b/electron/main/menu/index.ts @@ -0,0 +1,58 @@ +// ============================================================ +// 最小化系统菜单 +// +// 策略:已全面采用 H5 自定义导航栏,系统菜单仅保留 macOS 必需的 Edit 菜单 +// (否则 Cmd+C/V/A 等系统级快捷键会失效)。 +// +// macOS → 仅 Edit 菜单(undo/redo/cut/copy/paste/selectAll) +// Windows → 完全移除系统菜单栏 +// Linux → 完全移除系统菜单栏 +// ============================================================ + +import { app, Menu, type MenuItemConstructorOptions } from 'electron'; +import { isMacOS } from '../utils/platform'; +import { APP_NAME } from '../../../shared/constants/app'; +import { APP_VERSION } from '../../../shared/constants/version'; + +/** + * macOS 最小 Edit 菜单 + * 必须保留,否则 Cmd+C / Cmd+V / Cmd+A / Cmd+Z 等快捷键全部失效 + */ +function buildMinimalEditMenu(): MenuItemConstructorOptions { + return { + label: 'Edit', + submenu: [ + { label: '撤销', accelerator: 'Cmd+Z', role: 'undo' }, + { label: '重做', accelerator: 'Shift+Cmd+Z', role: 'redo' }, + { type: 'separator' }, + { label: '剪切', accelerator: 'Cmd+X', role: 'cut' }, + { label: '复制', accelerator: 'Cmd+C', role: 'copy' }, + { label: '粘贴', accelerator: 'Cmd+V', role: 'paste' }, + { label: '全选', accelerator: 'Cmd+A', role: 'selectAll' }, + ], + }; +} + +/** + * 设置应用菜单 + * macOS → 最小 Edit 菜单 + * Windows/Linux → 无菜单(导航栏由 H5 组件实现) + */ +export function setupAppMenu(): void { + if (isMacOS()) { + const template: MenuItemConstructorOptions[] = [buildMinimalEditMenu()]; + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + } else { + // Windows / Linux:完全移除菜单栏 + Menu.setApplicationMenu(null); + } + + // 关于面板信息(macOS 原生 About / Windows 自定义) + app.setAboutPanelOptions({ + applicationName: APP_NAME, + applicationVersion: APP_VERSION, + version: '', + credits: 'Powered by Electron + React 19 + TypeScript', + }); +} diff --git a/electron/main/updater.ts b/electron/main/updater.ts new file mode 100644 index 0000000..6a43725 --- /dev/null +++ b/electron/main/updater.ts @@ -0,0 +1,316 @@ +// ============================================================ +// 自动更新模块 — 自定义 API 版本检查 + OSS 文件下载 +// +// 架构: +// 客户端 → GET /api/v1/update/check → ECS (API) → 返回 JSON +// 客户端 → GET → OSS → 下载安装包 +// 下载完成 → SHA512 校验 → spawn 安装器 → app.quit() +// +// 与旧版 (electron-updater generic provider) 的区别: +// - 版本检查走自定义 API,后端可做灰度/强更/统计 +// - 不再依赖 latest.yml 静态文件 +// - 安装包仍托管于 OSS,下载地址由 API 动态返回 +// +// 环境变量: +// UPDATE_API_URL — 版本检查 API 基地址(默认 https://www.heixiu.com) +// ============================================================ + +import { BrowserWindow, net, app, ipcMain } from 'electron'; +import { createWriteStream } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { createHash } from 'node:crypto'; +import { spawn } from 'node:child_process'; +import { unlink } from 'node:fs/promises'; + +import type { UpdateCheckResult } from '../../shared/types'; +import { APP_VERSION } from '../../shared/constants/version'; + +// ---------- IPC 通道(对渲染进程暴露,与旧版兼容)---------- + +export const UPDATE_CHANNELS = { + UPDATE_AVAILABLE: 'update-available', + UPDATE_PROGRESS: 'update-progress', + UPDATE_DOWNLOADED: 'update-downloaded', + UPDATE_ERROR: 'update-error', + UPDATE_NOT_AVAILABLE: 'update-not-available', + INSTALL_UPDATE: 'install-update', + CHECK_FOR_UPDATE: 'check-for-update', +} as const; + +// ---------- 配置 ---------- + +function getApiBaseUrl(): string { + return process.env.UPDATE_API_URL || 'https://www.heixiu.com'; +} + +// ---------- 状态 ---------- + +let updateWindow: BrowserWindow | null = null; +let updateChecked = false; +/** 当前正在下载的临时文件路径(用于安装后清理) */ +let pendingInstallerPath: string | null = null; + +// ============================================================ +// 初始化 +// ============================================================ + +export function initUpdater(mainWindow: BrowserWindow): void { + updateWindow = mainWindow; + + if (import.meta.env.DEV) { + console.log('[Updater] 开发模式,跳过自动检查更新。API:', getApiBaseUrl()); + return; + } + + // 启动 5 秒后静默检查 + setTimeout(() => { + checkForUpdates(); + }, 5000); +} + +// ============================================================ +// 版本检查(调用 API) +// ============================================================ + +async function fetchUpdateInfo(): Promise { + const platform = process.platform; // 'win32' | 'darwin' | 'linux' + const edition = process.env.EDITION || 'personal'; + const apiUrl = `${getApiBaseUrl()}/api/v1/update/check?platform=${platform}&version=${APP_VERSION}&edition=${edition}`; + + console.log('[Updater] 请求版本检查 API:', apiUrl); + + return new Promise((resolve, reject) => { + const req = net.request({ method: 'GET', url: apiUrl }); + + req.on('response', (response) => { + let body = ''; + response.on('data', (chunk) => (body += chunk.toString())); + response.on('end', () => { + try { + const json = JSON.parse(body); + + // 兼容两种 API 响应格式: + // 格式 A: { code: 0, data: UpdateCheckResult } + // 格式 B: UpdateCheckResult 直接返回 + const data: UpdateCheckResult = json.data ?? json; + + if (!data.hasUpdate) { + console.log('[Updater] 当前已是最新版本'); + return resolve(null); + } + + console.log('[Updater] 发现新版本:', data.latestVersion); + resolve(data); + } catch (err) { + reject(new Error(`API 响应解析失败: ${(err as Error).message}`)); + } + }); + }); + + req.on('error', (err) => reject(new Error(`API 请求失败: ${err.message}`))); + req.end(); + }); +} + +// ============================================================ +// 下载安装包 +// ============================================================ + +async function downloadInstaller(info: UpdateCheckResult): Promise { + const ext = + process.platform === 'win32' ? '.exe' : process.platform === 'darwin' ? '.dmg' : '.AppImage'; + const tempPath = join(tmpdir(), `HeiXiu-${info.latestVersion}-update${ext}`); + + console.log('[Updater] 开始下载:', info.downloadUrl); + console.log('[Updater] 临时文件:', tempPath); + + return new Promise((resolve, reject) => { + const req = net.request({ method: 'GET', url: info.downloadUrl }); + const fileStream = createWriteStream(tempPath); + const hash = createHash('sha512'); + const totalSize = info.fileSize || 0; + let downloadedSize = 0; + let lastReportTime = 0; + + req.on('response', (response) => { + const statusCode = response.statusCode; + if (statusCode !== 200) { + fileStream.close(); + unlink(tempPath).catch(() => {}); + return reject(new Error(`下载失败,HTTP ${statusCode}`)); + } + + response.on('data', (chunk: Buffer) => { + fileStream.write(chunk); + hash.update(chunk); + downloadedSize += chunk.length; + + // 限频:最多每 250ms 推送一次进度 + const now = Date.now(); + if (totalSize > 0 && now - lastReportTime >= 250) { + lastReportTime = now; + const percent = Math.round((downloadedSize / totalSize) * 100); + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_PROGRESS, { + percent, + bytesPerSecond: 0, // 简化处理,不计算实时速度 + transferred: downloadedSize, + total: totalSize, + }); + } + }); + + response.on('end', () => { + fileStream.end(); + fileStream.on('finish', () => { + // SHA512 校验 + const actualSha512 = hash.digest('base64'); + if (info.sha512 && actualSha512 !== info.sha512) { + unlink(tempPath).catch(() => {}); + return reject( + new Error( + `SHA512 校验失败\n期望: ${info.sha512.slice(0, 16)}...\n实际: ${actualSha512.slice(0, 16)}...`, + ), + ); + } + + console.log('[Updater] 下载完成,SHA512 校验通过'); + pendingInstallerPath = tempPath; + resolve(tempPath); + }); + }); + + response.on('error', (err) => { + fileStream.close(); + unlink(tempPath).catch(() => {}); + reject(new Error(`下载中断: ${err.message}`)); + }); + }); + + req.on('error', (err) => { + fileStream.close(); + unlink(tempPath).catch(() => {}); + reject(new Error(`下载请求失败: ${err.message}`)); + }); + + req.end(); + }); +} + +// ============================================================ +// 操作方法 +// ============================================================ + +export async function checkForUpdates(): Promise { + if (updateChecked) { + console.log('[Updater] 已检查过更新,跳过'); + return; + } + + if (import.meta.env.DEV) { + console.log('[Updater] 开发模式,跳过更新检查'); + return; + } + + try { + updateChecked = true; + const info = await fetchUpdateInfo(); + + if (!info) { + // 无更新,不发通知(静默) + return; + } + + // 通知渲染进程:有新版本 + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_AVAILABLE, { + version: info.latestVersion, + releaseDate: info.releaseDate, + releaseNotes: info.changelog, + forceUpdate: info.forceUpdate, + }); + + // 自动开始下载 + await downloadInstaller(info); + + // 下载完成 → 通知渲染进程 + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_DOWNLOADED); + } catch (error) { + console.error('[Updater] 更新流程失败:', (error as Error).message); + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_ERROR, { + message: (error as Error).message || '更新检查失败', + }); + updateChecked = false; + } +} + +export async function checkForUpdatesManual(): Promise { + try { + updateChecked = false; + const info = await fetchUpdateInfo(); + + if (!info) { + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_NOT_AVAILABLE); + return; + } + + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_AVAILABLE, { + version: info.latestVersion, + releaseDate: info.releaseDate, + releaseNotes: info.changelog, + forceUpdate: info.forceUpdate, + }); + + await downloadInstaller(info); + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_DOWNLOADED); + } catch (error) { + console.error('[Updater] 手动更新失败:', (error as Error).message); + updateWindow?.webContents.send(UPDATE_CHANNELS.UPDATE_ERROR, { + message: (error as Error).message || '检查更新失败', + }); + } +} + +export function installUpdateNow(): void { + if (!pendingInstallerPath) { + console.error('[Updater] 没有待安装的更新文件'); + return; + } + + console.log('[Updater] 开始安装更新:', pendingInstallerPath); + + if (process.platform === 'win32') { + // Windows: NSIS 安装器,/S 静默安装 + spawn(pendingInstallerPath, ['/S'], { + detached: true, + stdio: 'ignore', + }); + } else if (process.platform === 'darwin') { + // macOS: 挂载 DMG + spawn('hdiutil', ['attach', pendingInstallerPath], { + detached: true, + stdio: 'ignore', + }); + } else { + // Linux: AppImage,chmod +x 后执行(通常需要手动替换) + console.log('[Updater] Linux 更新请手动替换 AppImage 文件'); + } + + // 退出应用,让安装器接管 + setImmediate(() => { + app.quit(); + }); +} + +// ============================================================ +// IPC 注册 +// ============================================================ + +export function registerUpdateIpcHandlers(): void { + ipcMain.handle(UPDATE_CHANNELS.CHECK_FOR_UPDATE, async () => { + await checkForUpdatesManual(); + }); + + ipcMain.on(UPDATE_CHANNELS.INSTALL_UPDATE, () => { + installUpdateNow(); + }); +} diff --git a/electron/main/utils/logo.ts b/electron/main/utils/logo.ts new file mode 100644 index 0000000..c76df55 --- /dev/null +++ b/electron/main/utils/logo.ts @@ -0,0 +1,100 @@ +// ============================================================ +// 主进程 Logo 自适应工具 +// 根据平台返回正确的图标路径,处理 .ico / .png / .icns 格式差异 +// ============================================================ + +import path from 'node:path'; +import { isMacOS, isWindows } from './platform'; + +// Logo 资源目录(相对于构建后的 dist-electron 目录或开发时的 electron/ 目录) +// 开发时 app.getAppPath() 指向项目根目录 +// 生产时指向 app.asar 所在目录 + +/** Logo 目录在项目中的相对路径 */ +const LOGO_DIR = 'src/assets/logo'; + +/** + * 获取 Logo 资源目录的绝对路径 + * @param appPath - Electron app.getAppPath() 的返回值 + */ +export function getLogoDir(appPath: string): string { + return path.join(appPath, LOGO_DIR); +} + +/** + * 按平台获取窗口图标路径 + * + * 平台格式要求: + * Windows → .ico(支持多尺寸) + * macOS → .icns(首选)或 .png(回退) + * Linux → .png + * + * @param appPath - Electron app.getAppPath() + * @returns 图标文件的绝对路径 + */ +export function getWindowIconPath(appPath: string): string { + const logoDir = path.join(appPath, LOGO_DIR); + + if (isWindows()) { + // Windows 首选 .ico + return path.join(logoDir, 'heixiu.ico'); + } + + if (isMacOS()) { + return path.join(logoDir, 'heixiu.icns'); + } + + // Linux 使用 .png + return path.join(logoDir, 'HX.png'); +} + +/** + * 按平台获取系统托盘图标路径 + * 托盘图标通常用 .png(跨平台通用),且尺寸较小 + * + * @param appPath - Electron app.getAppPath() + * @returns 托盘图标绝对路径 + */ +export function getTrayIconPath(appPath: string): string { + const logoDir = path.join(appPath, LOGO_DIR); + + if (isWindows()) { + // Windows 托盘可用 .ico 或小尺寸 .png + return path.join(logoDir, 'heixiu.ico'); + } + + // macOS / Linux 托盘用 .png + return path.join(logoDir, 'HX.png'); +} + +/** + * 按平台获取应用安装包图标路径 + * electron-builder 打包时使用,各平台格式不同: + * Windows → .ico + * macOS → .icns + * Linux → .png(通常 256x256 或 512x512) + * + * @param appPath - 应用根目录路径 + * @returns 安装包图标的绝对路径 + */ +export function getInstallerIconPath(appPath: string): string { + const logoDir = path.join(appPath, LOGO_DIR); + + if (isWindows()) { + return path.join(logoDir, 'heixiu.ico'); + } + + if (isMacOS()) { + return path.join(logoDir, 'heixiu.icns'); + } + + // Linux + return path.join(logoDir, 'HX.png'); +} + +/** + * 获取通用 PNG Logo(不区分平台,用于 About 对话框等) + */ +export function getPngLogoPath(appPath: string): string { + return path.join(appPath, LOGO_DIR, 'HX.png'); +} diff --git a/electron/main/utils/platform.ts b/electron/main/utils/platform.ts new file mode 100644 index 0000000..9a17723 --- /dev/null +++ b/electron/main/utils/platform.ts @@ -0,0 +1,53 @@ +// ============================================================ +// 主进程平台判定工具 —— 直接使用 Node.js process.platform +// ============================================================ + +import type { Platform } from '../../../shared/types'; + +/** 获取当前平台标识 */ +export function getPlatform(): Platform { + return process.platform as Platform; +} + +/** 是否为 macOS */ +export function isMacOS(): boolean { + return process.platform === 'darwin'; +} + +/** 是否为 Windows */ +export function isWindows(): boolean { + return process.platform === 'win32'; +} + +/** 是否为 Linux */ +export function isLinux(): boolean { + return process.platform === 'linux'; +} + +/** 获取平台名称(中文) */ +export function getPlatformName(): string { + if (isMacOS()) return 'macOS'; + if (isWindows()) return 'Windows'; + if (isLinux()) return 'Linux'; + return '未知平台'; +} + +/** 获取平台专用的快捷键修饰符描述(macOS 用 ⌘,Windows/Linux 用 Ctrl) */ +export function getShortcutModifier(): string { + return isMacOS() ? 'Cmd' : 'Ctrl'; +} + +/** 判断是否需要在任务栏显示图标(macOS 不需要,Windows/Linux 需要) */ +export function shouldShowTaskbarIcon(): boolean { + return !isMacOS(); +} + +/** 获取用户数据目录的基础路径 */ +export function getUserDataPath(): string { + // Electron app.getPath('userData') 在各平台自动适配 + // 此处仅作为工具函数的补充 + const home = process.env.HOME || process.env.USERPROFILE || ''; + if (isMacOS()) return `${home}/Library/Application Support`; + if (isWindows()) return process.env.APPDATA || `${home}\\AppData\\Roaming`; + return `${home}/.config`; +} diff --git a/electron/preload.ts b/electron/preload.ts new file mode 100644 index 0000000..f2ef8ca --- /dev/null +++ b/electron/preload.ts @@ -0,0 +1,24 @@ +import { ipcRenderer, contextBridge } from 'electron'; + +// --------- Expose some API to the Renderer process --------- +contextBridge.exposeInMainWorld('ipcRenderer', { + on(...args: Parameters) { + const [channel, listener] = args; + return ipcRenderer.on(channel, (event, ...args) => listener(event, ...args)); + }, + off(...args: Parameters) { + const [channel, ...omit] = args; + return ipcRenderer.off(channel, ...omit); + }, + send(...args: Parameters) { + const [channel, ...omit] = args; + return ipcRenderer.send(channel, ...omit); + }, + invoke(...args: Parameters) { + const [channel, ...omit] = args; + return ipcRenderer.invoke(channel, ...omit); + }, + + // You can expose other APTs you need here. + // ... +}); diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..4d7cf7f --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,40 @@ +import tseslint from '@typescript-eslint/eslint-plugin'; +import tsparser from '@typescript-eslint/parser'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; + +export default [ + { + ignores: ['dist/**', 'dist-electron/**', 'release/**', 'node_modules/**', '.eslintrc.cjs'], + }, + { + files: ['**/*.{ts,tsx}'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + // ESLint 推荐规则 + ...tseslint.configs.recommended.rules, + // React Hooks 规则(关闭 set-state-in-effect — 挂载时拉数据/弹窗是正常模式) + ...reactHooks.configs.recommended.rules, + 'react-hooks/set-state-in-effect': 'off', + // React Refresh + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + // 自定义 + 'semi': ['warn', 'always'], + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + }, + }, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000..aaf19c3 --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + + + 船长·HeiXiu + + +

+ + + diff --git a/null b/null new file mode 100644 index 0000000..ce3e5ba --- /dev/null +++ b/null @@ -0,0 +1 @@ +Active code page: 65001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b1f82ec --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9535 @@ +{ + "name": "ele-heixiu", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ele-heixiu", + "version": "0.0.1", + "dependencies": { + "antd": "^6.4.3", + "axios": "^1.16.1", + "react": "^19.2.7", + "react-dom": "^19.2.7" + }, + "devDependencies": { + "@commitlint/cli": "^21.0.2", + "@commitlint/config-conventional": "^21.0.2", + "@playwright/test": "^1.60.0", + "@tailwindcss/vite": "^4.3.0", + "@types/electron": "^1.4.38", + "@types/node": "^25.9.1", + "@types/react": "^19.2.16", + "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.60.1", + "@typescript-eslint/parser": "^8.60.1", + "@vitejs/plugin-react": "^6.0.0", + "autoprefixer": "^10.5.0", + "cross-env": "^10.1.0", + "electron": "42.3.0", + "electron-builder": "^26.8.1", + "eslint": "^10.4.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "husky": "^9.1.7", + "lint-staged": "^17.0.7", + "postcss": "^8.5.15", + "prettier": "^3.8.3", + "rollup-plugin-visualizer": "^7.0.1", + "tailwindcss": "^4.3.0", + "typescript": "^6.0.3", + "vite": "8.0.16", + "vite-plugin-electron": "^1.0.0", + "vite-plugin-electron-renderer": "^1.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.1.tgz", + "integrity": "sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^3.0.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-2.1.2.tgz", + "integrity": "sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-2.1.2.tgz", + "integrity": "sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^2.1.2", + "@babel/runtime": "^7.23.2", + "@rc-component/util": "^1.4.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.1.tgz", + "integrity": "sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==", + "license": "MIT", + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.2.5.tgz", + "integrity": "sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^8.0.1", + "@ant-design/icons-svg": "^4.4.2", + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-2.0.0.tgz", + "integrity": "sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "clsx": "^2.1.1", + "json2mq": "^0.2.0", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@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/core/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/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@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.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/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/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-21.0.2.tgz", + "integrity": "sha512-YMmfLbqBg+ZRvvmPhc+cilSQFrh/AgzVgCT1U/OifmUZEwPbvCtA8rN//YNaF9d5eoZphxVMGYtmwA2QgQORgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^21.0.1", + "@commitlint/lint": "^21.0.2", + "@commitlint/load": "^21.0.2", + "@commitlint/read": "^21.0.2", + "@commitlint/types": "^21.0.1", + "tinyexec": "^1.0.0", + "yargs": "^18.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/cli/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@commitlint/cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-21.0.2.tgz", + "integrity": "sha512-P/ZRhryQmkj0Z0dY9FOoRwe3xkwJyyAdtXwt01NT2kuZttcG2CNYp1q5Ci3u+nDT2jcbJRw2kt13Czl1qKNPfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "conventional-changelog-conventionalcommits": "^9.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.0.1.tgz", + "integrity": "sha512-Zd2UFdndeMMaW2O96HK0tdfT4gOImUvidMpAd/pws2zZ4m1nrAZ/9b/v2JYuE8fs86GpXv9F7LNaIuCIWhY+pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/ensure": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.0.1.tgz", + "integrity": "sha512-jJ1037967wU7YN/xkv+iRlOBlmaOXPhPO5KQSqya6GyXzBlwuLzELBFao16DVg9dZyqmNrhewzwZ3SAibetHBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "es-toolkit": "^1.46.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-21.0.1.tgz", + "integrity": "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/format": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.0.1.tgz", + "integrity": "sha512-ksmG2+cHGtuDPQQbhBbC4unwm444+6TiPw0d1bKf67hntgZqZ8E0g1MuYKUuyT5IH4IMmXZhKq22/Z3jBvtQIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.0.2.tgz", + "integrity": "sha512-H5z4t8PC9tUsmZ/o+EptM3Nq8sTFtskAShdcqxCoyzklW5eaVT5xbrDAET2uypzir9Vsj4ZZmBtyKjYe2XqgeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/lint": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.0.2.tgz", + "integrity": "sha512-PnUmLYGeGLfW8oVatR9KpNxSHYAnJOEWlMZzfdeFOUq6WUrFx1fGQaWCWJqMoIll/xPM+GdfJV+tKHZVHhl0Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^21.0.2", + "@commitlint/parse": "^21.0.2", + "@commitlint/rules": "^21.0.2", + "@commitlint/types": "^21.0.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/load": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.0.2.tgz", + "integrity": "sha512-lwUE70hN0/qE/ZRROhbaX65ly/FF12DrqfReLCESo37M0OQCFAf2jRS+2tSCSORq+bm4Kdju7qNDj46uc1QzTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^21.0.1", + "@commitlint/execute-rule": "^21.0.1", + "@commitlint/resolve-extends": "^21.0.1", + "@commitlint/types": "^21.0.1", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "es-toolkit": "^1.46.0", + "is-plain-obj": "^4.1.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/message": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-21.0.2.tgz", + "integrity": "sha512-5n4aqHGD/FNnom/D5L8i7cYtV+xjuXcBL832C3w9VglEsZzIsoHpJsvxzJ7cgiOsOdc/2jU4t5+7qMHh7GBX3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/parse": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.0.2.tgz", + "integrity": "sha512-QVZJhGHTm+oiuWyEKOCTQ0ZM3mfJ0eGWFeHuj7WzSKEth+UukcCHac9GD8pgdFlg/qGkFWOtyaNd1T8REgagaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "conventional-changelog-angular": "^8.2.0", + "conventional-commits-parser": "^6.3.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/read": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.0.2.tgz", + "integrity": "sha512-BtsrnLVycSSKf4Q0gMch4giCj5NNlmcbhc8ra5vONgGtP2IjRDo33bEFtr5Pm+2N+5fXGWb2MksWPrspPfdhdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^21.0.2", + "@commitlint/types": "^21.0.1", + "git-raw-commits": "^5.0.0", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.0.1.tgz", + "integrity": "sha512-0DhjYWL6uYrY16Efa032fYk3woGJDU4AGWiG1XXltT9AMUNYKyb5cIZU2ivbaMZ3+kKFqUjikD2cjh66Sbh/Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^21.0.1", + "@commitlint/types": "^21.0.1", + "es-toolkit": "^1.46.0", + "global-directory": "^5.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/rules": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.0.2.tgz", + "integrity": "sha512-k6tQ69Td7t2qUSIbik8D3TL1q3ZJpkEbV+yLogDzCRAdOxJm4ndhtBNREsLA1/puRfWvzS9eioF2w43WT+hHgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^21.0.1", + "@commitlint/message": "^21.0.2", + "@commitlint/to-lines": "^21.0.1", + "@commitlint/types": "^21.0.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-21.0.1.tgz", + "integrity": "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/top-level": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-21.0.2.tgz", + "integrity": "sha512-s9KKM+e+mXgFeIh4n7KmOGAVT3mkJ3Fp1bBYHIK5pjeUwlEMzp/tZfb5u0Poa680AsQTXMEMRxZi1vQ9m2X5ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/types": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.0.1.tgz", + "integrity": "sha512-4u7w8jcoCUFWhjWnASYzZHAP34OqOtuFBN87nQmFvqda03YU0T6z+yB4w0gSAMpekiRqqGk5rt+qSlW+a2vSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-parser": "^6.3.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/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/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/fuses/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/get": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/get/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/undici": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.0.tgz", + "integrity": "sha512-+t2Z/GwkZQDtu00813aP66ygViGtPHKhhoFZpQKpKrE+9jIgES+Zw+mFNaDWOVRKiuJjuqKHzD3B1sfGg8+ZOQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", + "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/windows-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, + "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/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.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/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/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/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/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.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/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "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.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz", + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/cascader": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.15.0.tgz", + "integrity": "sha512-ZzpMtwFCRo3fbXHuDnncARJMZQjdqA2w7aDuPofNQt+aDx39st1hgfIpEwTBLhe2Hqsvs/zOr8RTtgxTkCPySw==", + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.6.0", + "@rc-component/tree": "~1.3.0", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/checkbox": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/checkbox/-/checkbox-2.0.0.tgz", + "integrity": "sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/collapse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/collapse/-/collapse-1.2.0.tgz", + "integrity": "sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-3.1.1.tgz", + "integrity": "sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^3.0.1", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz", + "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/dialog": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.9.0.tgz", + "integrity": "sha512-zbAAogkg4kkKum79sLE6M+vq1jSAW25zdkafrahgcTP9t9S//SD634Znd1A4c8F2Gc12ZKnehGLsVaaOvZzD2A==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.3", + "@rc-component/portal": "^2.1.0", + "@rc-component/util": "^1.9.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/drawer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@rc-component/drawer/-/drawer-1.4.2.tgz", + "integrity": "sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.1.3", + "@rc-component/util": "^1.9.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/dropdown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.2.tgz", + "integrity": "sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==", + "license": "MIT", + "dependencies": { + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/@rc-component/form": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.8.2.tgz", + "integrity": "sha512-ZidCvOLmM9Xr+3vzk4UAoR7Aj1W/5IHyrzlBB7sNkygpTeRVrohQSo4TN7W/nARTH+nt8zSAPsn4BEl4zLEO2g==", + "license": "MIT", + "dependencies": { + "@rc-component/async-validator": "^5.1.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/image": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.9.0.tgz", + "integrity": "sha512-khF7w7xkBH5B1bsBcI1FSUZdkyd1aqpl2eYyILCqCzzQH3XdfehGUaZTnptyaJJfs09/R5hv9jXWyazOMFIClQ==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.0.0", + "@rc-component/portal": "^2.1.2", + "@rc-component/util": "^1.10.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/input": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.3.1.tgz", + "integrity": "sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==", + "license": "MIT", + "dependencies": { + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@rc-component/input-number": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@rc-component/input-number/-/input-number-1.6.2.tgz", + "integrity": "sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==", + "license": "MIT", + "dependencies": { + "@rc-component/mini-decimal": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mentions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.9.0.tgz", + "integrity": "sha512-WUwfFKDSOF5S9UPsNsXcLYtzjTxBGsftTXWRbZuxX6BYrsySISTnujfJNgaaQ6qVzaCDJ35QUkZKvsYxip1C5g==", + "license": "MIT", + "dependencies": { + "@rc-component/input": "~1.3.0", + "@rc-component/menu": "~1.3.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/menu": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.3.1.tgz", + "integrity": "sha512-pSZl9nBPgKgxN0aaW7NilIBEwWsc+43S+ulGdWAg9afak96dNOGWsGx0DLLBB1VQsAJvo6bQMTDzXoPlEHsBEw==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.3.tgz", + "integrity": "sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/motion": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.2.tgz", + "integrity": "sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz", + "integrity": "sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/notification": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-2.0.7.tgz", + "integrity": "sha512-nqZzpf6BPdaj+3ILx7si79LLmqPKyUmQoXa+/9gg0SkH0v1DbD66oJgRMSBEVnd/zUT3D4gwxWIHUKebYf2ZXQ==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/overflow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.1.tgz", + "integrity": "sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/pagination": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz", + "integrity": "sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/picker": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.10.0.tgz", + "integrity": "sha512-vVOXP2RVWozwpERGUFAehVH1Jz6o/uRrAb9qSZm1LC+iJs8rvEwFo1bzz2jlOYV+uWwu0dIuG86tnDui14Ea0w==", + "license": "MIT", + "dependencies": { + "@rc-component/overflow": "^1.0.0", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/trigger": "^3.6.15", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/@rc-component/portal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.0.tgz", + "integrity": "sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/progress": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.2.tgz", + "integrity": "sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz", + "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/rate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/rate/-/rate-1.0.1.tgz", + "integrity": "sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/resize-observer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz", + "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/segmented": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/segmented/-/segmented-1.3.0.tgz", + "integrity": "sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@rc-component/select": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.6.15.tgz", + "integrity": "sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g==", + "license": "MIT", + "dependencies": { + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.3.0", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/slider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz", + "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/steps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.2.tgz", + "integrity": "sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/switch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/switch/-/switch-1.0.3.tgz", + "integrity": "sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/table": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.10.2.tgz", + "integrity": "sha512-b3PjqB9Gp25p5t/zq+9QrbXbodkptT8/zvLmwgd2FNPUUtaYyDnQqfxeD5a7ao8E8lpinLHsi2u2vdfPhyNvAw==", + "license": "MIT", + "dependencies": { + "@rc-component/context": "^2.0.1", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/tabs": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.9.1.tgz", + "integrity": "sha512-6mY08Fce6aNOHuGsxbzT+f2ekgL9mg1cGGHkittMlVGymjGg+kGupu5v90sRxcUd/paRU9jclLLXtF/PkK1FUA==", + "license": "MIT", + "dependencies": { + "@rc-component/dropdown": "~1.0.0", + "@rc-component/menu": "~1.3.0", + "@rc-component/motion": "^1.1.3", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tooltip": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz", + "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==", + "license": "MIT", + "dependencies": { + "@rc-component/trigger": "^3.7.1", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.4.0.tgz", + "integrity": "sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==", + "license": "MIT", + "dependencies": { + "@rc-component/portal": "^2.2.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.7.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tree": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.3.2.tgz", + "integrity": "sha512-bJFj46wEkpBPnWyTm18XmgAgNQ/4YvprxMOPPY2a6rmhGJYxLuNKEFiL5Qej4Qctu9wHJm8WW+v2SYskafE0kA==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.0.0", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/tree-select": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.9.0.tgz", + "integrity": "sha512-GXcFe15a+trUl1/J3OHWQhsVWFpwFpGFK2cqYWZ1sK22Zs3KZTvMwDpzr75PIo1s6QVioVxpE/pRwRopkeDQ6w==", + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.6.0", + "@rc-component/tree": "~1.3.0", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/trigger": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.1.tgz", + "integrity": "sha512-LNsYvz60mrLJ/kRvKcHE7boUvcQfVMCfRqZ71x3Fo9AOiZ1KKIEqkzMA8DNvz2V3Bcvir/vwQNn7JF1NPODQ7Q==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.2.0", + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/upload": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.1.tgz", + "integrity": "sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/util": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.11.1.tgz", + "integrity": "sha512-awVlI3ub2vqfqkYxOBc/uQ0efm3jw0wcrhtO/YWLyZfxiKXczKwNbVuhlnyxytDt7H9pbbVQiqr+O6MLATtRYg==", + "license": "MIT", + "dependencies": { + "is-mobile": "^5.0.0", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/virtual-list": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.2.0.tgz", + "integrity": "sha512-iavRm1Jo4GDbASQwdGa7jFyk93RvSOo9xHyBT4QL1pgFJj/Fdf1G+3RErH7/7BmAMvx2AkF62mjGYxDbXsK9TQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz", + "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "tailwindcss": "4.3.0" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/electron": { + "version": "1.4.38", + "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.4.38.tgz", + "integrity": "sha512-Cu6laqBamT6VSPi0LLlF9vE9Os8EbTaI/5eJSsd7CPoLUG3Znjh04u9TxMhQYPF1wGFM14Z8TFQ2914JZ+rGLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "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/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/react": { + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", + "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", + "dev": true, + "license": "MIT", + "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/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", + "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/type-utils": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "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.60.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", + "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", + "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.1", + "@typescript-eslint/types": "^8.60.1", + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", + "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1" + }, + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", + "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", + "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", + "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.1", + "@typescript-eslint/tsconfig-utils": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "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.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "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/utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", + "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1" + }, + "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.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", + "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "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/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "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/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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", + "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/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "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/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/antd": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-6.4.3.tgz", + "integrity": "sha512-6H2avkxCGfxcF67r3J2mwm9Ck50el1pks/73vfM1wDsPL/tPtj5vHuauMgJFnrqmq7CH3g8aoZ0VBQbt+jpAsw==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^8.0.1", + "@ant-design/cssinjs": "^2.1.2", + "@ant-design/cssinjs-utils": "^2.1.2", + "@ant-design/fast-color": "^3.0.1", + "@ant-design/icons": "^6.2.3", + "@ant-design/react-slick": "~2.0.0", + "@babel/runtime": "^7.29.2", + "@rc-component/cascader": "~1.15.0", + "@rc-component/checkbox": "~2.0.0", + "@rc-component/collapse": "~1.2.0", + "@rc-component/color-picker": "~3.1.1", + "@rc-component/dialog": "~1.9.0", + "@rc-component/drawer": "~1.4.2", + "@rc-component/dropdown": "~1.0.2", + "@rc-component/form": "~1.8.1", + "@rc-component/image": "~1.9.0", + "@rc-component/input": "~1.3.0", + "@rc-component/input-number": "~1.6.2", + "@rc-component/mentions": "~1.9.0", + "@rc-component/menu": "~1.3.0", + "@rc-component/motion": "^1.3.2", + "@rc-component/mutate-observer": "^2.0.1", + "@rc-component/notification": "~2.0.7", + "@rc-component/pagination": "~1.2.0", + "@rc-component/picker": "~1.10.0", + "@rc-component/progress": "~1.0.2", + "@rc-component/qrcode": "~1.1.1", + "@rc-component/rate": "~1.0.1", + "@rc-component/resize-observer": "^1.1.2", + "@rc-component/segmented": "~1.3.0", + "@rc-component/select": "~1.6.15", + "@rc-component/slider": "~1.0.1", + "@rc-component/steps": "~1.2.2", + "@rc-component/switch": "~1.0.3", + "@rc-component/table": "~1.10.0", + "@rc-component/tabs": "~1.9.0", + "@rc-component/tooltip": "~1.4.0", + "@rc-component/tour": "~2.4.0", + "@rc-component/tree": "~1.3.1", + "@rc-component/tree-select": "~1.9.0", + "@rc-component/trigger": "^3.9.0", + "@rc-component/upload": "~1.1.0", + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1", + "dayjs": "^1.11.11", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/app-builder-bin": { + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.8.1", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.8.1", + "electron-builder-squirrel-windows": "26.8.1" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/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/app-builder-lib/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/app-builder-lib/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/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/app-builder-lib/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/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-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", + "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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", + "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": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "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/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "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/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "integrity": "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "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/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, + "node_modules/cosmiconfig-typescript-loader/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, + "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/cross-spawn/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/cross-spawn/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/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/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "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-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "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/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/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/dmg-builder": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "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/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "42.3.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-42.3.0.tgz", + "integrity": "sha512-9ZiLdRXk+WDxW1OgIUz8J2rIQ5TYU9o629gCOjU48Q3dQiOmym7osWsH5Ubs/Jh4uuFLn6m6SBD2rmRXLAPz9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-publish": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.364.tgz", + "integrity": "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", + "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/electron/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", + "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "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-toolkit": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", + "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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-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": "10.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", + "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@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", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.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", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "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 || ^10.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": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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/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/eslint/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/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/eslint/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/eslint/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/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/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/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/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "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==", + "dev": true, + "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/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "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/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/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.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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/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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/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/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "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/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "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/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "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/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "optional": true + }, + "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/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/import-fresh/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/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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-mobile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", + "license": "MIT" + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "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/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "libc": [ + "glibc" + ], + "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" + ], + "dev": true, + "libc": [ + "musl" + ], + "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" + ], + "dev": true, + "libc": [ + "glibc" + ], + "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" + ], + "dev": true, + "libc": [ + "musl" + ], + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "17.0.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.0.7.tgz", + "integrity": "sha512-JrSobt+tW3rH8IOMi8tDZd3foorM5yPEkLD/V2NxobgHrFfHWGee4MOLVuZeScgxftEwbHrPHIFA/ZL+nUJeuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "listr2": "^10.2.1", + "picomatch": "^4.0.4", + "string-argv": "^0.3.2", + "tinyexec": "^1.2.4" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=22.22.1" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + }, + "optionalDependencies": { + "yaml": "^2.9.0" + } + }, + "node_modules/listr2": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", + "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", + "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "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/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "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/node-abi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", + "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "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.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "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/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.0.1.tgz", + "integrity": "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^11.0.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^18.0.0" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "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/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "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/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.16", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "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==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "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/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz", + "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "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.18", + "esbuild": "^0.27.0 || ^0.28.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/vite-plugin-electron": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-1.0.0.tgz", + "integrity": "sha512-05oTapZl917xRq2GtLFuxdXKDGFaa5qn+XJhmTWXQo1NdFq8GZs32uU6BjWzx4KHhdXgUQWs1zC1yQF5Rw/bYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.2.1" + }, + "peerDependencies": { + "vite-plugin-electron-renderer": "*" + }, + "peerDependenciesMeta": { + "vite-plugin-electron-renderer": { + "optional": true + } + } + }, + "node_modules/vite-plugin-electron-renderer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-1.0.0.tgz", + "integrity": "sha512-/9CBdUqnCgwWXn61v5PErWnR5q3Bfne2oI52uHzgJnKnlaoNgEKvxOzS0/XssDXWMK3ElStM2+J/Ko4Q63XhMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..95b05fc --- /dev/null +++ b/package.json @@ -0,0 +1,115 @@ +{ + "name": "ele-heixiu", + "private": true, + "version": "0.0.1", + "description": "船长·HeiXiu — 桌面效率工作台", + "author": "HeiXiu 杨烨", + "type": "module", + "scripts": { + "dev": "chcp 65001 > null && cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ vite", + "build": "node build.mjs --win --personal --build", + "build:win": "node build.mjs --win --personal --build", + "build:win:enterprise": "node build.mjs --win --enterprise --build", + "build:mac": "node build.mjs --mac --personal --build", + "build:mac:enterprise": "node build.mjs --mac --enterprise --build", + "build:linux": "node build.mjs --linux --personal --build", + "build:linux:enterprise": "node build.mjs --linux --enterprise --build", + "build:clean": "node scripts/clean.mjs", + "upload:oss": "node scripts/upload-oss.mjs", + "publish:release": "node scripts/publish-release.mjs", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "format": "prettier --write \"src/**/*.{ts,tsx,css}\" \"electron/**/*.ts\" \"shared/**/*.ts\"", + "format:check": "prettier --check \"src/**/*.{ts,tsx,css}\" \"electron/**/*.ts\" \"shared/**/*.ts\"", + "test": "vitest run", + "test:watch": "vitest", + "test:e2e": "playwright test" + }, + "dependencies": { + "antd": "^6.4.3", + "axios": "^1.16.1", + "react": "^19.2.7", + "react-dom": "^19.2.7" + }, + "build": { + "appId": "com.heixiu.electron", + "productName": "船长·HeiXiu", + "asar": true, + "directories": { + "output": "release/${version}" + }, + "files": [ + "dist", + "dist-electron" + ], + "electronDownload": { + "mirror": "https://npmmirror.com/mirrors/electron/" + }, + "publish": { + "provider": "generic", + "url": "https://update.heixiu.com" + }, + "win": { + "icon": "src/assets/logo/heixiu.ico", + "target": [ + { + "target": "NSIS", + "arch": [ + "x64" + ] + } + ], + "artifactName": "${productName}-Windows-${version}-${env.EDITION}-Setup.${ext}" + }, + "mac": { + "icon": "src/assets/logo/heixiu.icns", + "target": [ + "dmg" + ], + "artifactName": "${productName}-Mac-${version}-${env.EDITION}-Installer.${ext}" + }, + "linux": { + "icon": "src/assets/logo/HX.png", + "target": [ + "AppImage" + ], + "artifactName": "${productName}-Linux-${version}-${env.EDITION}.${ext}" + }, + "nsis": { + "oneClick": false, + "perMachine": false, + "allowToChangeInstallationDirectory": true, + "deleteAppDataOnUninstall": false, + "installerIcon": "src/assets/logo/heixiu.ico", + "uninstallerIcon": "src/assets/logo/heixiu.ico" + } + }, + "devDependencies": { + "@playwright/test": "^1.60.0", + "@tailwindcss/vite": "^4.3.0", + "@types/electron": "^1.4.38", + "@types/node": "^25.9.1", + "@types/react": "^19.2.16", + "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.60.1", + "@typescript-eslint/parser": "^8.60.1", + "@vitejs/plugin-react": "^6.0.0", + "autoprefixer": "^10.5.0", + "cross-env": "^10.1.0", + "electron": "42.3.0", + "electron-builder": "^26.8.1", + "eslint": "^10.4.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "postcss": "^8.5.15", + "prettier": "^3.8.3", + "rollup-plugin-visualizer": "^7.0.1", + "tailwindcss": "^4.3.0", + "typescript": "^6.0.3", + "vite": "8.0.16", + "vite-plugin-electron": "^1.0.0", + "vite-plugin-electron-renderer": "^1.0.0" + }, + "main": "dist-electron/main.js" +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..430ba3b --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: './e2e', + timeout: 30000, + retries: 1, + use: { + // Electron 应用通过自定义 fixture 启动,不走 browser 配置 + trace: 'on-first-retry', + screenshot: 'only-on-failure', + }, + // 仅列出涉及的项目类型,实际 Electron 启动在 fixture 中处理 + projects: [ + { + name: 'electron', + // Electron E2E 不需要 playwright 的 browser,由 electron 命令启动 + }, + ], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..1415037 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4107 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/react': + specifier: ^18.2.64 + version: 18.3.29 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.7(@types/react@18.3.29) + '@typescript-eslint/eslint-plugin': + specifier: ^7.1.1 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^7.1.1 + version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.7.0(vite@5.4.21(@types/node@25.9.1)) + electron: + specifier: ^30.0.1 + version: 30.5.1 + electron-builder: + specifier: ^24.13.3 + version: 24.13.3(electron-builder-squirrel-windows@24.13.3) + eslint: + specifier: ^8.57.0 + version: 8.57.1 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.1) + eslint-plugin-react-refresh: + specifier: ^0.4.5 + version: 0.4.26(eslint@8.57.1) + typescript: + specifier: ^5.2.2 + version: 5.9.3 + vite: + specifier: ^5.1.6 + version: 5.4.21(@types/node@25.9.1) + vite-plugin-electron: + specifier: ^0.28.6 + version: 0.28.8(vite-plugin-electron-renderer@0.14.7) + vite-plugin-electron-renderer: + specifier: ^0.14.5 + version: 0.14.7 + +packages: + + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/notarize@2.2.1': + resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.0.5': + resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.5.1': + resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} + engines: {node: '>=8.6'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.1': + resolution: {integrity: sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==} + engines: {node: '>= 10'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@20.19.41': + resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.29': + resolution: {integrity: sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + engines: {node: '>=14.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} + + app-builder-lib@24.13.3: + resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 24.13.3 + electron-builder-squirrel-windows: 24.13.3 + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.32: + resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + engines: {node: '>=6.0.0'} + hasBin: true + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.4: + resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} + engines: {node: '>=12.0.0'} + + builder-util@24.13.1: + resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dmg-builder@24.13.3: + resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@24.13.3: + resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} + + electron-builder@24.13.3: + resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.13.1: + resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} + + electron-to-chromium@1.5.363: + resolution: {integrity: sha512-VjUKPyWzGnT1fujlkEGC/BvN70Hh70KXtAqcmniXviYlJC/ivcT+BWGPyxWVbJZLfvtKR6dqg1L7T7pgAMBtWA==} + + electron@30.5.1: + resolution: {integrity: sha512-AhL7+mZ8Lg14iaNfoYTkXQ2qee8mmsQyllKdqxlpv/zrKgfxz6jNVtcRRbQtLxtF8yzcImWdfTQROpYiPumdbw==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + 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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + node-releases@2.0.46: + resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + engines: {node: '>=18'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + plist@3.1.1: + resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} + engines: {node: '>=10.4.0'} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.4: + resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + vite-plugin-electron-renderer@0.14.7: + resolution: {integrity: sha512-hHBMKuZ24MB2SIxG7U7ix+DDEnvxou7Bgy/TdhYxNz3S5N3Yh7Hjvj9blfMeGEJ0oaZJn7y5z0V/RyDmJ5OuCA==} + + vite-plugin-electron@0.28.8: + resolution: {integrity: sha512-ir+B21oSGK9j23OEvt4EXyco9xDCaF6OGFe0V/8Zc0yL2+HMyQ6mmNQEIhXsEsZCSfIowBpwQBeHH4wVsfraeg==} + peerDependencies: + vite-plugin-electron-renderer: '*' + peerDependenciesMeta: + vite-plugin-electron-renderer: + optional: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + +snapshots: + + 7zip-bin@5.2.0: {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.15.0 + ajv-keywords: 3.5.2(ajv@6.15.0) + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.5 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.2.1': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.0.5': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.5.1': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.5 + plist: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.15.0 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.18.1 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/rollup-android-arm-eabi@4.60.4': + optional: true + + '@rollup/rollup-android-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-x64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.4': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.1': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 20.19.41 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.8': {} + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 25.9.1 + + '@types/http-cache-semantics@4.2.0': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.19.41 + + '@types/ms@2.1.0': {} + + '@types/node@20.19.41': + dependencies: + undici-types: 6.21.0 + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 + + '@types/plist@3.0.5': + dependencies: + '@types/node': 25.9.1 + xmlbuilder: 15.1.1 + optional: true + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.29)': + dependencies: + '@types/react': 18.3.29 + + '@types/react@18.3.29': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.19.41 + + '@types/verror@1.10.11': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.19.41 + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.3 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.9 + semver: 7.8.1 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.1': {} + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.9.1))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@25.9.1) + transitivePeerDependencies: + - supports-color + + '@xmldom/xmldom@0.9.10': {} + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.15.0): + dependencies: + ajv: 6.15.0 + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + app-builder-bin@4.0.0: {} + + app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.2.1 + '@electron/osx-sign': 1.0.5 + '@electron/universal': 1.5.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chromium-pickle-js: 0.2.0 + debug: 4.4.3 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + ejs: 3.1.10 + electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) + electron-publish: 24.13.1 + form-data: 4.0.5 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.7 + js-yaml: 4.1.1 + lazy-val: 1.0.5 + minimatch: 5.1.9 + read-config-file: 6.3.2 + sanitize-filename: 1.6.4 + semver: 7.8.1 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assert-plus@1.0.0: + optional: true + + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.32: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird-lst@1.0.9: + dependencies: + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.32 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.363 + node-releases: 2.0.46 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer-crc32@0.2.13: {} + + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builder-util-runtime@9.2.4: + dependencies: + debug: 4.4.3 + sax: 1.6.0 + transitivePeerDependencies: + - supports-color + + builder-util@24.13.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.13 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.1 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001793: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@5.1.0: {} + + compare-version@0.1.2: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + config-file-ts@0.2.6: + dependencies: + glob: 10.5.0 + typescript: 5.9.3 + + convert-source-map@2.0.0: {} + + core-util-is@1.0.2: + optional: true + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + detect-node@2.1.0: + optional: true + + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.5 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.15.0 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.1 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + 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) + archiver: 5.3.2 + builder-util: 24.13.1 + fs-extra: 10.1.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@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) + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@24.13.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron-to-chromium@1.5.363: {} + + electron@30.5.1: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.19.41 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + es6-error@4.1.1: + optional: true + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react-refresh@0.4.26(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.1 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.4.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.8.1 + serialize-error: 7.0.1 + optional: true + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.1 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isarray@1.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lazy-val@1.0.5: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.flatten@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.union@4.6.0: {} + + lodash@4.18.1: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.1 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.3: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + node-addon-api@1.7.2: + optional: true + + node-releases@2.0.46: {} + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-cancelable@2.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-type@4.0.0: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + plist@3.1.1: + dependencies: + '@xmldom/xmldom': 0.9.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-refresh@0.17.0: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-config-file@6.3.2: + dependencies: + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + rollup@4.60.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.4: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.6.0: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.8.1: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.8.1 + + slash@3.0.0: {} + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: + optional: true + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: + optional: true + + stat-mode@1.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + text-table@0.2.0: {} + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.7 + + tmp@0.2.7: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + ts-api-utils@1.4.3(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.13.1: + optional: true + + type-fest@0.20.2: {} + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + undici-types@7.24.6: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + + vite-plugin-electron-renderer@0.14.7: {} + + vite-plugin-electron@0.28.8(vite-plugin-electron-renderer@0.14.7): + optionalDependencies: + vite-plugin-electron-renderer: 0.14.7 + + vite@5.4.21(@types/node@25.9.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.15 + rollup: 4.60.4 + optionalDependencies: + '@types/node': 25.9.1 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..7548d0a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + electron: true + esbuild: true diff --git a/scripts/clean.mjs b/scripts/clean.mjs new file mode 100644 index 0000000..d693753 --- /dev/null +++ b/scripts/clean.mjs @@ -0,0 +1,25 @@ +// ============================================================ +// 清理所有构建产物 +// npm run build:clean +// ============================================================ + +import { rmSync, existsSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); + +const dirs = ['release', 'dist', 'dist-electron']; + +for (const dir of dirs) { + const p = join(ROOT, dir); + if (existsSync(p)) { + rmSync(p, { recursive: true, force: true }); + console.log(`已清理: ${dir}/`); + } else { + console.log(`跳过(不存在): ${dir}/`); + } +} + +console.log('\n清理完成。'); diff --git a/scripts/generate-update-info.mjs b/scripts/generate-update-info.mjs new file mode 100644 index 0000000..bff7d05 --- /dev/null +++ b/scripts/generate-update-info.mjs @@ -0,0 +1,170 @@ +// ============================================================ +// 打包后自动生成 update-info.json +// +// 用法: +// node scripts/generate-update-info.mjs [version] [--url ] +// +// 两种用法: +// 方式 A(预判 URL):打包后自动拼接 URL → 适用于 OSS 路径可预测时 +// node scripts/generate-update-info.mjs win32 personal +// +// 方式 B(指定 URL):上传后用实际 URL 重新生成 → 适用于上传后才知道 URL 时 +// node scripts/generate-update-info.mjs win32 personal 0.1.0 --url "https://oss.../xxx.exe" +// +// 环境变量(可选): +// UPDATE_DOWNLOAD_BASE — 方式 A 的 URL 基地址,默认 https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases +// UPDATE_FORCE — 是否强制更新,默认 false +// UPDATE_MIN_VERSION — 最低兼容版本,默认 0.0.0 +// UPDATE_CHANGELOG — 覆盖 CHANGELOG.md 中的日志内容 +// ============================================================ + +import { readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createHash } from 'node:crypto'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); + +// ---------- 参数解析 ---------- + +const args = process.argv.slice(2); + +// 提取 --url 参数 +let urlOverride = ''; +const positional = []; +for (let i = 0; i < args.length; i++) { + if (args[i] === '--url' && args[i + 1]) { + urlOverride = args[++i]; + } else if (!args[i].startsWith('--')) { + positional.push(args[i]); + } +} + +const platform = positional[0]; +const edition = positional[1]; + +if (!platform || !edition) { + console.error('用法: node scripts/generate-update-info.mjs [version] [--url ]'); + console.error('示例: node scripts/generate-update-info.mjs win32 personal'); + console.error(' node scripts/generate-update-info.mjs win32 personal 0.1.0 --url "https://..."'); + process.exit(1); +} + +const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf-8')); +const version = positional[2] || pkg.version; +const productName = pkg.build?.productName || '船长·HeiXiu'; + +// ---------- 查找安装包 ---------- + +const releaseDir = join(ROOT, 'release', version); + +let installerPath; +try { + const files = readdirSync(releaseDir); + // 按扩展名找安装包 + const exts = platform === 'win32' ? ['.exe'] : platform === 'darwin' ? ['.dmg'] : ['.AppImage']; + const match = files.find((f) => exts.some((ext) => f.endsWith(ext))); + if (!match) { + console.error(`未在 ${releaseDir} 中找到安装包文件`); + process.exit(1); + } + installerPath = join(releaseDir, match); + console.log(`找到安装包: ${match}`); +} catch { + console.error(`目录不存在: ${releaseDir}\n请先执行构建(如 npm run build:win)`); + process.exit(1); +} + +// ---------- 计算文件信息 ---------- + +const fileBuffer = readFileSync(installerPath); +const stats = statSync(installerPath); + +// SHA512(Base64 编码,与 certutil 输出一致) +const sha512 = createHash('sha512').update(fileBuffer).digest('base64').replace(/\r?\n/g, ''); +const fileSize = stats.size; + +console.log(`文件大小: ${(fileSize / 1024 / 1024).toFixed(2)} MB`); +console.log(`SHA512: ${sha512.slice(0, 32)}...`); + +// ---------- 构建下载 URL ---------- + +const fileName = installerPath.split(/[/\\]/).pop(); + +let downloadUrl; +if (urlOverride) { + // 方式 B:使用指定的 URL + downloadUrl = urlOverride; + console.log(`下载 URL(手动指定): ${downloadUrl}`); +} else { + // 方式 A:根据基地址 + 版本号 + 文件名拼接(预判 URL) + const downloadBase = process.env.UPDATE_DOWNLOAD_BASE || 'https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases'; + downloadUrl = `${downloadBase.replace(/\/+$/, '')}/${version}/${encodeURI(fileName)}`; + console.log(`下载 URL(自动拼接): ${downloadUrl}`); +} + +// ---------- 读取更新日志 ---------- + +let changelog; +if (process.env.UPDATE_CHANGELOG) { + // 环境变量覆盖(适用于 CI/CD 流水线) + changelog = process.env.UPDATE_CHANGELOG; +} else { + // 从 CHANGELOG.md 提取最新版本的日志 + const changelogPath = join(ROOT, 'CHANGELOG.md'); + try { + const changelogContent = readFileSync(changelogPath, 'utf-8'); + // 匹配最新版本块:## x.y.z(日期) ... ## 或 EOF + const versionSection = changelogContent.match( + /^##\s+(\d+\.\d+\.\d+)[^\n]*\n([\s\S]*?)(?=^##\s|\Z)/m, + ); + if (versionSection) { + changelog = versionSection[0].trim(); + } else { + changelog = `## ${version}\n\n更新内容待补充`; + } + console.log(`更新日志: 已从 CHANGELOG.md 提取`); + } catch { + changelog = `## ${version}\n\n更新内容待补充`; + } +} + +// ---------- 其他配置 ---------- + +const forceUpdate = process.env.UPDATE_FORCE === 'true'; +const minimumVersion = process.env.UPDATE_MIN_VERSION || '0.0.0'; +const releaseDate = new Date().toISOString().slice(0, 10); + +// ---------- 生成 JSON ---------- + +const updateInfo = { + // --- 必填:API 返回字段 --- + hasUpdate: true, + latestVersion: version, + downloadUrl, + fileSize, + sha512, + changelog, + releaseDate, + forceUpdate, + minimumVersion, + + // --- 附加:方便后端录入 --- + _meta: { + platform, + edition, + fileName, + generatedAt: new Date().toISOString(), + }, +}; + +const outputPath = join( + releaseDir, + `${productName}-${platform}-${edition}-v${version}-update-info.json`, +); + +writeFileSync(outputPath, JSON.stringify(updateInfo, null, 2), 'utf-8'); + +console.log(`\n✅ 已生成: ${outputPath}`); +console.log(JSON.stringify(updateInfo, null, 2)); diff --git a/scripts/publish-release.mjs b/scripts/publish-release.mjs new file mode 100644 index 0000000..834a220 --- /dev/null +++ b/scripts/publish-release.mjs @@ -0,0 +1,130 @@ +// ============================================================ +// 发布版本信息到后端 API +// +// 用法: +// node scripts/publish-release.mjs [version] [--url ] +// +// 环境变量: +// UPDATE_API_URL — API 基地址(默认 https://www.heixiu.com) +// UPDATE_API_KEY — API 鉴权 Key(通过 Authorization: Bearer 头传递) +// ============================================================ + +import { readFileSync, readdirSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import axios from 'axios'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); + +// ---------- 参数 ---------- + +const args = process.argv.slice(2); +const positional = []; +let urlOverride = ''; +let jsonOverride = ''; + +for (let i = 0; i < args.length; i++) { + if (args[i] === '--url' && args[i + 1]) { + urlOverride = args[++i]; + } else if (args[i] === '--json' && args[i + 1]) { + jsonOverride = args[++i]; + } else if (!args[i].startsWith('--')) { + positional.push(args[i]); + } +} + +const platform = positional[0]; +const edition = positional[1]; + +if (!platform || !edition) { + console.error('用法: node scripts/publish-release.mjs [version] [--url ]'); + console.error('示例: node scripts/publish-release.mjs win32 personal 0.1.0'); + process.exit(1); +} + +const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf-8')); +const version = positional[2] || pkg.version; + +// ---------- 读取 update-info.json ---------- + +let updateInfo; + +if (jsonOverride) { + try { + updateInfo = JSON.parse(jsonOverride); + } catch { + console.error('错误: --json 参数不是有效的 JSON'); + process.exit(1); + } +} else { + const releaseDir = join(ROOT, 'release', version); + let infoFile; + try { + const all = readdirSync(releaseDir); + infoFile = all.find((f) => + f.includes(platform) && f.includes(edition) && f.endsWith('-update-info.json'), + ); + if (!infoFile) console.error(`未找到 ${platform}+${edition} 的 update-info.json`); + } catch (err) { + console.error(`错误: ${releaseDir} — ${err.message}`); + process.exit(1); + } + updateInfo = JSON.parse(readFileSync(join(releaseDir, infoFile), 'utf-8')); + if (urlOverride) updateInfo.downloadUrl = urlOverride; +} + +// ---------- 发送到 API ---------- + +const apiBase = (process.env.UPDATE_API_URL || 'https://www.heixiu.com').replace(/\/+$/, ''); +const apiKey = process.env.UPDATE_API_KEY || ''; + +const payload = { + platform, + edition, + latestVersion: updateInfo.latestVersion || version, + downloadUrl: updateInfo.downloadUrl, + fileSize: updateInfo.fileSize, + sha512: updateInfo.sha512, + changelog: updateInfo.changelog, + releaseDate: updateInfo.releaseDate, + forceUpdate: updateInfo.forceUpdate || false, + minimumVersion: updateInfo.minimumVersion || '0.0.0', +}; + +const endpoint = `${apiBase}/api/v1/releases`; + +console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); +console.log('📡 发布版本到 API'); +console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); +console.log(`POST ${endpoint}`); +console.log(`版本: ${version} (${platform}/${edition})`); +console.log(`URL: ${payload.downloadUrl}\n`); + +try { + const response = await axios.post(endpoint, payload, { + headers: { + 'Content-Type': 'application/json', + ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}), + }, + timeout: 30000, + }); + + console.log('✅ 发布成功'); + console.log(`响应: ${JSON.stringify(response.data, null, 2)}`); +} catch (err) { + const status = err.response?.status; + const data = err.response?.data; + + if (status) { + console.error(`❌ 发布失败 HTTP ${status}: ${JSON.stringify(data)}`); + } else { + console.error(`❌ 请求失败: ${err.message}`); + } + + console.log('\n💡 手动备选 — 把以下 JSON 发给后端:'); + console.log(JSON.stringify(payload, null, 2)); + process.exit(1); +} + +console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); diff --git a/scripts/upload-oss.mjs b/scripts/upload-oss.mjs new file mode 100644 index 0000000..b8e3d7d --- /dev/null +++ b/scripts/upload-oss.mjs @@ -0,0 +1,161 @@ +// ============================================================ +// 上传安装包到阿里云 OSS +// +// 用法: +// node scripts/upload-oss.mjs [version] +// +// 环境变量(使用 Node.js 直传时需要): +// OSS_ENDPOINT — OSS endpoint(如 oss-cn-hangzhou.aliyuncs.com) +// OSS_BUCKET — Bucket 名称 +// OSS_ACCESS_KEY_ID — AccessKey ID +// OSS_ACCESS_KEY_SECRET — AccessKey Secret +// OSS_BASE_PATH — Bucket 内基路径,默认 releases +// +// 不传 OSS 环境变量时 → 打印手动上传命令(ossutil / 控制台) +// +// 示例: +// # 仅打印上传命令 +// node scripts/upload-oss.mjs win32 personal 0.1.0 +// +// # 直接上传 +// OSS_BUCKET=heixiu OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com \ +// OSS_ACCESS_KEY_ID=xxx OSS_ACCESS_KEY_SECRET=xxx \ +// node scripts/upload-oss.mjs win32 personal 0.1.0 +// ============================================================ + +import {readFileSync, readdirSync} from 'node:fs'; +import {join, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {createHmac} from 'node:crypto'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); + +// ---------- 参数 ---------- + +const platform = process.argv[2]; +const edition = process.argv[3]; + +if (!platform || !edition) { + console.error('用法: node scripts/upload-oss.mjs [version]'); + console.error('示例: node scripts/upload-oss.mjs win32 personal 0.1.0'); + process.exit(1); +} + +const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf-8')); +const version = process.argv[4] || pkg.version; + +// ---------- 查找安装包 ---------- + +const releaseDir = join(ROOT, 'release', version); + +let installerName; +try { + const all = readdirSync(releaseDir); + const exts = platform === 'win32' ? ['.exe'] : platform === 'darwin' ? ['.dmg'] : ['.AppImage']; + installerName = all.find((f) => exts.some((e) => f.endsWith(e))); + if (!installerName) console.error(`错误: ${releaseDir} — 未找到安装包`); +} catch (err) { + console.error(`错误: ${releaseDir} — ${err.message}`); + process.exit(1); +} + +const installerPath = join(releaseDir, installerName); + +// ---------- OSS 配置 ---------- + +const { + OSS_ENDPOINT, + OSS_BUCKET, + OSS_ACCESS_KEY_ID, + OSS_ACCESS_KEY_SECRET, +} = process.env; + +const basePath = (process.env.OSS_BASE_PATH || 'releases').replace(/^\/+|\/+$/g, ''); +const objectKey = `${basePath}/${version}/${installerName}`; + +// ---------- 模式 A:无 OSS 配置 → 打印手动命令 ---------- + +if (!OSS_ENDPOINT || !OSS_BUCKET || !OSS_ACCESS_KEY_ID) { + const exampleBucket = OSS_BUCKET || ''; + const exampleEndpoint = OSS_ENDPOINT || ''; + const downloadUrl = `https://${exampleBucket}.${exampleEndpoint}/${objectKey}`; + + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + console.log('📦 上传安装包(手动)'); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + console.log(`文件: ${installerPath}`); + console.log(`大小: ${(readFileSync(installerPath).length / 1024 / 1024).toFixed(2)} MB\n`); + + console.log('方式 1 — ossutil CLI(推荐):'); + console.log(` ossutil cp "${installerPath}" oss://${exampleBucket}/${objectKey}\n`); + + console.log('方式 2 — 阿里云控制台:'); + console.log(` 登录 OSS 控制台 → ${exampleBucket} → 上传 → 目标路径: ${objectKey}\n`); + + console.log('上传后执行以下命令,用实际 URL 重新生成 info:'); + console.log(` node scripts/generate-update-info.mjs ${platform} ${edition} ${version} --url "${downloadUrl}"\n`); + + console.log('或直接发布到后端 API:'); + console.log(` node scripts/publish-release.mjs ${platform} ${edition} ${version} --url "${downloadUrl}"`); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + process.exit(0); +} + +// ---------- 模式 B:Node.js 直传 OSS ---------- + +const fileBuffer = readFileSync(installerPath); +const contentType = platform === 'win32' + ? 'application/vnd.microsoft.portable-executable' + : 'application/octet-stream'; + +const date = new Date().toUTCString(); + +// 阿里云 OSS Authorization 签名 +const stringToSign = [ + 'PUT', + '', + contentType, + date, + `/${OSS_BUCKET}/${objectKey}`, +].join('\n'); + +const signature = createHmac('sha1', OSS_ACCESS_KEY_SECRET) + .update(stringToSign) + .digest('base64'); + +const authHeader = `OSS ${OSS_ACCESS_KEY_ID}:${signature}`; +const downloadUrl = `https://${OSS_BUCKET}.${OSS_ENDPOINT}/${objectKey}`; + +console.log(`上传中: ${installerName} (${(fileBuffer.length / 1024 / 1024).toFixed(2)} MB)`); +console.log(`目标: oss://${OSS_BUCKET}/${objectKey}`); + +try { + const response = await fetch(downloadUrl, { + method: 'PUT', + headers: { + 'Content-Type': contentType, + 'Content-Length': String(fileBuffer.length), + 'Date': date, + 'Authorization': authHeader, + }, + body: fileBuffer, + }); + + if (response.ok) { + console.log(`✅ 上传成功`); + console.log(`下载 URL: ${downloadUrl}\n`); + console.log('接下来:'); + console.log(` # 重新生成 update-info.json:`); + console.log(` node scripts/generate-update-info.mjs ${platform} ${edition} ${version} --url "${downloadUrl}"`); + console.log(`\n # 或直接发布到后端:`); + console.log(` node scripts/publish-release.mjs ${platform} ${edition} ${version} --url "${downloadUrl}"`); + } else { + const body = await response.text(); + console.error(`❌ 上传失败 HTTP ${response.status}: ${body}`); + process.exit(1); + } +} catch (err) { + console.error(`❌ 上传失败: ${err.message}`); + process.exit(1); +} diff --git a/shared/constants/app.ts b/shared/constants/app.ts new file mode 100644 index 0000000..fe4fa2a --- /dev/null +++ b/shared/constants/app.ts @@ -0,0 +1,59 @@ +// ============================================================ +// 应用常量 —— 版本号、版本类型、窗口标题 +// 主进程 & 渲染进程共享 +// ============================================================ + +import type { Edition, Platform } from '../types'; +import { APP_VERSION } from './version'; + +/** 应用显示名称 */ +export const APP_NAME = '船长·HeiXiu'; + +// APP_VERSION 从 ./version.ts 导入(读取 package.json),不再硬编码 + +// ============================================================ +// 版本类型(企业版 / 个人版) +// ============================================================ + +/** + * 解析版本类型字符串 + * @param raw - 环境变量值,如 "enterprise" / undefined + * @returns 版本类型,默认 personal + */ +export function parseEdition(raw: string | undefined): Edition { + if (raw === 'enterprise') return 'enterprise'; + return 'personal'; +} + +/** 版本中文名称 */ +export function getEditionName(edition: Edition): string { + return edition === 'enterprise' ? '企业版' : '个人版'; +} + +// ============================================================ +// 窗口标题构建 +// ============================================================ + +/** 平台中文名称(简写) */ +function platformShortName(platform: Platform): string { + if (platform === 'darwin') return 'MAC'; + if (platform === 'win32') return 'Windows'; + return 'Linux'; +} + +/** + * 构建完整窗口标题 + * 格式:船长·HeiXiu V{版本号} {平台}{版本} + * 示例:"船长·HeiXiu V0.0.1 MAC企业版" + * "船长·HeiXiu V0.0.1 Windows个人版" + * + * @param platform - 当前操作系统平台 + * @param edition - 版本类型 + * @param version - 可选覆盖版本号(默认 APP_VERSION) + */ +export function buildWindowTitle(platform: Platform, edition: Edition, version?: string): string { + const ver = version ?? APP_VERSION; + const os = platformShortName(platform); + const edName = getEditionName(edition); + return `${APP_NAME} V${ver} ${os}${edName}`; +} diff --git a/shared/constants/ipc-channels.ts b/shared/constants/ipc-channels.ts new file mode 100644 index 0000000..f229741 --- /dev/null +++ b/shared/constants/ipc-channels.ts @@ -0,0 +1,43 @@ +// ============================================================ +// IPC 通道名称常量 —— 避免魔法字符串 +// ============================================================ + +/** 主进程 → 渲染进程 */ +export const MAIN_TO_RENDERER = { + /** 主进程消息推送 */ + MAIN_PROCESS_MESSAGE: 'main-process-message', + /** 主题变更通知 */ + THEME_CHANGED: 'theme-changed', + /** 窗口聚焦通知 */ + WINDOW_FOCUSED: 'window-focused', + /** 窗口失焦通知 */ + WINDOW_BLURRED: 'window-blurred', +} as const; + +/** 渲染进程 → 主进程 */ +export const RENDERER_TO_MAIN = { + /** 打开子窗口 */ + OPEN_SUB_WINDOW: 'open-sub-window', + /** 关闭子窗口 */ + CLOSE_SUB_WINDOW: 'close-sub-window', + /** 设置窗口标题 */ + SET_WINDOW_TITLE: 'set-window-title', + /** 获取平台信息 */ + GET_PLATFORM_INFO: 'get-platform-info', + /** 最小化窗口 */ + MINIMIZE_WINDOW: 'minimize-window', + /** 最大化/还原窗口 */ + TOGGLE_MAXIMIZE: 'toggle-maximize', + /** 关闭窗口 */ + CLOSE_WINDOW: 'close-window', +} as const; + +/** 双向通信通道 */ +export const BIDIRECTIONAL = { + /** 读取应用配置 */ + READ_CONFIG: 'read-config', + /** 写入应用配置 */ + WRITE_CONFIG: 'write-config', + /** 文件对话框 */ + FILE_DIALOG: 'file-dialog', +} as const; diff --git a/shared/constants/version.ts b/shared/constants/version.ts new file mode 100644 index 0000000..4f729c2 --- /dev/null +++ b/shared/constants/version.ts @@ -0,0 +1,9 @@ +// ============================================================ +// 版本号 — 从 package.json 动态读取,保持单一数据源 +// 主进程(Node.js)和渲染进程(Vite 打包)均可正常导入 JSON 模块 +// ============================================================ + +import pkg from '../../package.json'; + +/** 应用版本号,与 package.json 的 version 字段自动同步 */ +export const APP_VERSION: string = pkg.version; diff --git a/shared/types/index.ts b/shared/types/index.ts new file mode 100644 index 0000000..b7ef91c --- /dev/null +++ b/shared/types/index.ts @@ -0,0 +1,71 @@ +// ============================================================ +// 共享类型定义 —— 主进程 & 渲染进程通用 +// ============================================================ + +/** 平台类型 */ +export type Platform = 'win32' | 'darwin' | 'linux'; + +/** 窗口标识 */ +export interface WindowIdentity { + /** 窗口唯一 ID */ + id: number; + /** 窗口类型标识 */ + type: 'main' | 'settings' | 'preview' | 'custom'; + /** 窗口标题 */ + title: string; +} + +/** IPC 响应包装 */ +export interface IpcResponse { + success: boolean; + data?: T; + error?: string; +} + +/** 主题模式 */ +export type ThemeMode = 'light' | 'dark' | 'system'; + +/** 版本类型 */ +export type Edition = 'enterprise' | 'personal'; + +/** 应用配置 */ +export interface AppConfig { + themeMode: ThemeMode; + language: string; + autoLaunch: boolean; + minimizeToTray: boolean; +} + +// ============================================================ +// 更新相关类型 +// ============================================================ + +/** 更新检查请求参数 */ +export interface UpdateCheckParams { + platform: Platform; + version: string; + edition: Edition; + channel?: 'stable' | 'beta' | 'alpha'; +} + +/** 更新检查响应(API 返回的 data 字段) */ +export interface UpdateCheckResult { + /** 是否有可用更新 */ + hasUpdate: boolean; + /** 最新版本号 */ + latestVersion: string; + /** 安装包下载地址 */ + downloadUrl: string; + /** 安装包大小(字节) */ + fileSize: number; + /** SHA512 校验值 */ + sha512: string; + /** 更新日志(支持 Markdown) */ + changelog: string; + /** 发布日期 */ + releaseDate: string; + /** 是否强制更新 */ + forceUpdate: boolean; + /** 最低兼容版本(低于此版本必须强制更新) */ + minimumVersion: string; +} diff --git a/shared/utils/index.ts b/shared/utils/index.ts new file mode 100644 index 0000000..e0ff0e8 --- /dev/null +++ b/shared/utils/index.ts @@ -0,0 +1,75 @@ +// ============================================================ +// 共享工具函数 —— 主进程 & 渲染进程通用(纯函数,不依赖平台 API) +// ============================================================ + +/** + * 简单防抖函数 + * @param fn 目标函数 + * @param delay 延迟毫秒数 + */ +export function debounce void>( + fn: T, + delay: number, +): (...args: Parameters) => void { + let timer: ReturnType | null = null; + return (...args: Parameters) => { + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(() => { + fn(...args); + timer = null; + }, delay); + }; +} + +/** + * 节流函数 + * @param fn 目标函数 + * @param interval 间隔毫秒数 + */ +export function throttle void>( + fn: T, + interval: number, +): (...args: Parameters) => void { + let lastTime = 0; + return (...args: Parameters) => { + const now = Date.now(); + if (now - lastTime >= interval) { + lastTime = now; + fn(...args); + } + }; +} + +/** + * 语义化版本号比较 + * @returns 1 (v1 > v2), -1 (v1 < v2), 0 (相等) + */ +export function compareVersions(v1: string, v2: string): number { + const parts1 = v1.split('.').map(Number); + const parts2 = v2.split('.').map(Number); + const maxLen = Math.max(parts1.length, parts2.length); + + for (let i = 0; i < maxLen; i++) { + const a = parts1[i] || 0; + const b = parts2[i] || 0; + if (a > b) return 1; + if (a < b) return -1; + } + return 0; +} + +/** + * 深拷贝(JSON 安全类型) + */ +export function deepClone(obj: T): T { + return JSON.parse(JSON.stringify(obj)); +} + +/** + * 生成唯一 ID(简易版,不依赖 crypto) + */ +export function generateId(): string { + return `${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 9)}`; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..80a2dcd --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,323 @@ +import { useState, useEffect, useCallback } from 'react'; +import { + Button, + Card, + Space, + Tag, + Typography, + Switch as AntSwitch, + Slider, + Progress, + theme as antTheme, +} from 'antd'; +import { + ApiOutlined, + ThunderboltOutlined, + BulbOutlined, + BulbFilled, + DownloadOutlined, + SyncOutlined, + CheckCircleOutlined, + ExclamationCircleOutlined, + RocketOutlined, +} from '@ant-design/icons'; + +import { getPlatformName, isDev } from './utils/platform'; +import { gradientPrimary } from './theme/tokens'; +import { useTheme } from './hooks/use-theme'; +import { useUpdater } from './hooks/use-updater'; +import { useAppContext } from './contexts/app-context'; +import { NavBar } from './components/navbar'; +import { LoginPage } from './pages/login'; +import { on, off, EVENTS } from './utils/event-bus'; + +const { Title, Text } = Typography; + +/** + * 根组件 — 主窗口 + * 未登录时弹出登录 Modal;已登录显示主页 + * axios 返回 401 → 事件总线触发 → Modal 再次弹出 + */ +function App() { + const { isDark, toggleTheme } = useTheme(); + const { platform, edition, isLoggedIn, logout } = useAppContext(); + const { token } = antTheme.useToken(); + const [progress, setProgress] = useState(65); + const { + status: updateStatus, + progress: updateProgress, + info: updateInfo, + error: updateError, + checkForUpdates, + installUpdate, + } = useUpdater(); + + // 登录 Modal 状态 + const [loginOpen, setLoginOpen] = useState(false); + + // 首次加载时未登录 → 弹出 + useEffect(() => { + if (!isLoggedIn) { + setLoginOpen(true); + } + }, [isLoggedIn]); + + // 监听事件总线:401 → 弹出登录 / 导航栏点击登录 → 弹出登录 + useEffect(() => { + const handler = () => setLoginOpen(true); + on(EVENTS.AUTH_REQUIRED, handler); + on(EVENTS.SHOW_LOGIN, handler); + return () => { + off(EVENTS.AUTH_REQUIRED, handler); + off(EVENTS.SHOW_LOGIN, handler); + }; + }, []); + + const handleLoginClose = useCallback(() => { + setLoginOpen(false); + }, []); + + return ( + <> + {/* 登录 Modal — 可关闭,关闭后主页可操作 */} + + + {/* ========== 主页 ========== */} +
+ {/* ======== 自定义导航栏(替代系统菜单) ======== */} + + + {/* ======== 页面内容 ======== */} +
+
+ {/* ---- 标题区 + 主题开关 ---- */} +
+
+ + HeiXiu · 桌面工作台 + + } + unCheckedChildren={} + title={isDark ? '切换亮色模式' : '切换暗色模式'} + /> +
+ + Electron + React 19 + TypeScript + Ant Design + Tailwind CSS + +
+ + + {isDark ? '🌙 暗色' : '☀️ 亮色'} + + + {edition === 'enterprise' ? '企业版' : '个人版'} + + {isLoggedIn ? ( + <> + 已登录 + + + ) : ( + 未登录 + )} + +
+ + {/* ---- 导航栏状态提示 ---- */} + + + 💡 当前使用 H5 自定义导航栏 替代系统菜单。 + {platform === 'darwin' + ? ' macOS 保留了最小 Edit 菜单以支持 Cmd+C/V 等快捷键。' + : ' Windows/Linux 已完全移除系统菜单栏。'} + + + + {/* ---- 主题色预览 ---- */} + + + {/* 渐变展示 */} +
+ 品牌渐变 +
+
+ 135° 渐变 +
+
+ 90° 渐变 +
+
+
+ + {/* 组件示例 */} +
+ Ant Design 组件 + + + + + + + +
+ + {/* 滑块 + 进度条 */} +
+ 交互组件 +
+ + 进度: + + + +
+
+
+
+ + {/* ---- 平台信息 ---- */} + + +
+ + 运行平台: + {getPlatformName()} +
+
+ + 运行环境: + + {isDev() ? '开发模式' : '生产模式'} + +
+
+ + 当前导航: + + H5 自定义导航栏({edition === 'enterprise' ? '企业版' : '个人版'} + 布局) + +
+
+
+ + {/* ---- 版本更新 ---- */} + + + {/* 状态提示 */} + {updateStatus === 'checking' && ( +
+ + 正在检查更新... +
+ )} + {updateStatus === 'no-update' && ( +
+ + 已是最新版本 +
+ )} + {updateStatus === 'error' && ( +
+ + {updateError?.message || '检查更新失败'} +
+ )} + + {/* 发现新版本 */} + {(updateStatus === 'available' || updateStatus === 'downloading') && ( + <> +
+ + 发现新版本:{updateInfo?.version} + {updateInfo?.forceUpdate && 强制更新} +
+ {updateInfo?.releaseNotes && ( + + {updateInfo.releaseNotes} + + )} + + )} + + {/* 下载进度 */} + {updateStatus === 'downloading' && ( + + )} + + {/* 下载完成 */} + {updateStatus === 'downloaded' && ( + <> +
+ + 更新已下载完毕,点击按钮安装并重启 +
+ + + )} + + {/* 操作按钮 */} +
+ + {isDev() && ( + + (生产环境启动 5 秒后自动检查) + + )} +
+
+
+
+
+
+ + ); +} + +export default App; diff --git a/src/assets/header_actions/account.svg b/src/assets/header_actions/account.svg new file mode 100644 index 0000000..6e1ef0a --- /dev/null +++ b/src/assets/header_actions/account.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/announcements.svg b/src/assets/header_actions/announcements.svg new file mode 100644 index 0000000..8bd7935 --- /dev/null +++ b/src/assets/header_actions/announcements.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/billing.svg b/src/assets/header_actions/billing.svg new file mode 100644 index 0000000..02a52ed --- /dev/null +++ b/src/assets/header_actions/billing.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/compliance_assets.svg b/src/assets/header_actions/compliance_assets.svg new file mode 100644 index 0000000..11746b8 --- /dev/null +++ b/src/assets/header_actions/compliance_assets.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/membership.svg b/src/assets/header_actions/membership.svg new file mode 100644 index 0000000..f8db5ce --- /dev/null +++ b/src/assets/header_actions/membership.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/order_details.svg b/src/assets/header_actions/order_details.svg new file mode 100644 index 0000000..0fe2e5e --- /dev/null +++ b/src/assets/header_actions/order_details.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/project_management.svg b/src/assets/header_actions/project_management.svg new file mode 100644 index 0000000..32330d5 --- /dev/null +++ b/src/assets/header_actions/project_management.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/recharge.svg b/src/assets/header_actions/recharge.svg new file mode 100644 index 0000000..8dae13b --- /dev/null +++ b/src/assets/header_actions/recharge.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/settings.svg b/src/assets/header_actions/settings.svg new file mode 100644 index 0000000..eba13fd --- /dev/null +++ b/src/assets/header_actions/settings.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/sign_out.svg b/src/assets/header_actions/sign_out.svg new file mode 100644 index 0000000..7453725 --- /dev/null +++ b/src/assets/header_actions/sign_out.svg @@ -0,0 +1 @@ + diff --git a/src/assets/header_actions/task_back_logo.svg b/src/assets/header_actions/task_back_logo.svg new file mode 100644 index 0000000..1b69c38 --- /dev/null +++ b/src/assets/header_actions/task_back_logo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/header_actions/wechat_work.svg b/src/assets/header_actions/wechat_work.svg new file mode 100644 index 0000000..a34cd48 --- /dev/null +++ b/src/assets/header_actions/wechat_work.svg @@ -0,0 +1 @@ + diff --git a/src/assets/legal/用户服务协议.txt b/src/assets/legal/用户服务协议.txt new file mode 100644 index 0000000..8233bdb --- /dev/null +++ b/src/assets/legal/用户服务协议.txt @@ -0,0 +1,274 @@ +为了更好地为您提供服务,请您仔细阅读《用户服务协议》(以下简称“本协议”)。在您开始使用“船长Heixiu”平台及相关服务之前,请您务必认真阅读并充分理解本协议,特别是涉及免除或者限制责任的条款、权利许可和限制责任的条款、同意开通服务的条款、法律适用和争议解决的条款等。其中,免除或者限制责任条款等重要内容将以加粗形式提示您注意,您应重点阅读。如您未满18周岁,请您在法定监护人陪同下仔细阅读并充分理解本协议,并征得法定监护人的同意后使用“船长Heixiu”平台及相关服务。 + +除非您完全接受本协议的全部内容,否则您无权注册、登录、使用(以下统称“使用”)“船长Heixiu”产品,或者通过任何方式使用“船长Heixiu”服务及获得“船长Heixiu”平台提供的任何服务及产品(本协议中统称“服务”)。若您使用“船长Heixiu”平台及相关服务,则视为您已充分理解本协议并承诺作为本协议的一方当事人接受协议的约束。 + +一、适用范围 +1.1 本协议是您与[船长Heixiu](以下简称“我们”或“公司”)之间就您注册、登录、使用“船长Heixiu”产品,并获得“船长Heixiu”平台提供的相关服务所订立的协议。我们有权依“船长Heixiu”平台及相关服务或运营的需要单方决定,安排或指定其关联方或公司认可的第三方继续运营“船长Heixiu”平台。并且,就本协议项下涉及的某些服务,可能会由公司的关联方或公司认可的第三方向您提供。您知晓并同意接受相关服务内容,即视为接受相关权利义务关系亦接受本协议约束。 + +1.2 “用户”指所有直接或间接获取和使用“船长Heixiu”平台及相关服务的使用者,包括自然人、法人和其他组织等。在本协议中称为“用户”或称“您”。 + +1.3 “船长Heixiu”指由我们合法拥有并运营的、标注名称为“船长Heixiu”的应用程序。公司有权对应用程序名称单方变更(包括但不限于更名、新增等)。公司发出更名公告后,本协议所有约定适用更名后的应用程序。 + +1.4 本协议内容同时包括公司已经发布及后续可能不断发布的关于“船长Heixiu”平台及相关服务的相关协议、规则、说明等内容。前述内容一经正式发布,公司将以适当的方式(包括但不限于电话、短信、公告、系统通知等)提醒您及时阅读。前述相关协议、规则构成是本协议不可分割的组成部分,您使用或继续使用“船长Heixiu”平台视为您同意遵守前述相关协议、规则等内容。 + +二、使用“船长Heixiu”平台及相关服务 +2.1 您使用“船长Heixiu”平台及相关服务,可以访问“船长Heixiu”相关产品。若您并非从公司或经公司授权的第三方获取本平台的,公司无法保证非官方版本的“船长Heixiu”平台能够正常使用或没有其他风险,您因此遭受的损失与公司无关。 + +2.2 您知悉并同意,“船长Heixiu”所提供的服务系网络虚拟商品,采用先收费后服务的方式,您为购买的服务所支付的款项非预付款或者存款、定金、储蓄卡等性质,服务一经开通后不可转让或退款(如因服务存在重大瑕疵导致您完全无法使用或法律法规要求必须退款或我们判断后认为可以退款的情形除外)。为了保证您的用户权益,请您通过官方渠道购买我们的服务,一切通过非官方公布渠道取得的产品服务均不获保护,并且我们有权中止或终止对您的服务,由此给您带来的损失,我们无须承担责任。 + +2.3公司可能为不同的终端设备开发了不同的应用程序平台版本,您可自行根据需要使用“船长Heixiu”平台及相关服务或更新“船长Heixiu”版本,如您不再需要使用“船长Heixiu”平台及相关服务可自行卸载。 + +2.4 为更好的提升用户体验及服务,公司将不定期提供平台更新或改变(包括但不限于平台修改、升级、功能强化、开发新服务等)。为保证“船长Heixiu”平台及相关服务安全、提升用户体验度,本平台及相关服务更新或部分服务内容更新后,在可能的情况下,公司将以包括但不限于弹窗、邮件、短信、系统提示、公告、站内信等方式提示用户,用户有权选择是否接受更新版本或服务,如用户不接受,由于旧版本平台公司可能不再维护,有可能无法使用新功能或部分功能将受到限制或不能继续使用,后果由用户自行承担。 + +2.5 除非得到明示事先书面授权,您不得以任何形式对“船长Heixiu”平台及相关服务进行包括但不限于改编、复制、传播、垂直搜索、镜像或交易等未经授权的访问或使用,您违法使用造成的一切后果由您承担。 + +2.6 您理解,您使用“船长Heixiu”平台及相关服务需自行准备与平台及相关服务有关的终端设备(如电脑、手机等装置),一旦您在其终端设备中打开“船长Heixiu”平台或访问船长Heixiu相关产品,即视为您使用“船长Heixiu”平台及相关服务。为充分实现“船长Heixiu”的全部功能,您可能需要将其终端设备联网,且您清楚由您自行承担所需要的费用(如流量费、上网费等)。 + +2.7 公司许可您个人的、可撤销的、不可转让的、非独占地和非商业的合法使用“船长Heixiu”平台及相关服务的权利。本协议未明示授权的其他一切权利仍由公司保留,您在行使该些权利时须另行获得公司的书面许可,同时公司如未行使前述任何权利,并不构成对该权利的放弃。 + +2.8 如您发现“船长Heixiu”平台内存在任何侵犯您权利的内容,请立即通过客服邮箱2006410116@dididiketang.com 通知公司,提供您有相关权利的初步证据,公司将会在15个工作日内处理您的投诉。如您在“船长Heixiu”内存在或涉及内容被相关权利人投诉侵权,您也可以通过向客服邮箱2006410116@dididiketang.com提交反馈通知书及相关权利证明材料,来向公司进行申诉,公司同样将会在15个工作日内处理您的申诉。如您收到通知后未能在2个工作日内提供相关申诉材料,则本公司有权依法采取暂停传输、封闭账号等措施。 + +三、关于“账号” +3.1 注册、登录“船长Heixiu”和相关服务 + +(1)当您注册、登录“船长Heixiu”及相关服务时,您可以通过手机号创建账号,我们将通过发送短信验证码来验证您的身份是否有效,收集这些信息是为了帮助您完成注册。 + +(2)您也可以使用第三方账号(如微信等)登录进入船长Heixiu,您此时将授权我们获取您在第三方平台注册的公开信息(头像、昵称等),并在您同意本协议后将您的第三方账号与您的船长Heixiu账户绑定,使您可以通过第三方账号直接登录并使用本产品和相关服务。 + +(3)请您妥善保管您的任何信息,因账号遗失、泄露等造成的损失由您自行承担。 + +3.2 账号注销 + +在您需要终止使用“船长Heixiu”账号服务时,您可向“船长Heixiu”客服邮箱2006410116@dididiketang.com 申请注销您本人的账号,但您仍应对您在注销账号前且使用“船长Heixiu”服务期间的行为承担相应责任。注销成功后,我们将停止为您提供产品或服务,并且您的账号记录、数据等将被删除,无法恢复或提供,法律法规另有规定的除外。具体注销事宜可查看《账号注销协议》。 + +3.3 您理解并承诺,您所设置的账号不得违反国家法律法规及公司的相关规则,您的账号名称、头像等注册信息及其他个人信息中不得出现违法和不良信息,未经他人许可不得用他人名义(包括但不限于冒用他人姓名、名称、字号、头像等足以让人引起混淆的方式)开设账号,不得恶意注册“船长Heixiu”账号(包括但不限于频繁注册、批量注册账号等行为)。您在账号注册及使用过程中需遵守相关法律法规,不得实施任何侵害国家利益、损害其他公民权益、有害社会道德风尚的行为。公司有权对您提交的注册信息进行审核。 + +3.4 您在“船长Heixiu”中的注册账号仅限于您本人使用,您对您的账号仅享有使用权,未经公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他方式许可他人使用该账号。如果公司发现或者有合理理由认为使用者并非账号初始注册人,为保障账号安全,公司有权立即暂停或终止向该注册账号提供服务,或注销该账号。 + +3.5 您有责任维护您的个人账号的安全性与保密性,您的注册账号下产生的任何活动均视为您自身的行为,您应对此承担全部法律责任,包括但不限于您在“船长Heixiu”上进行的款项支付等操作行为。您应高度重视对账号的保密,在任何情况下不向他人透露账号及密码。若发现他人未经许可使用您的账号或发生其他任何安全漏洞问题时,您应当立即通知公司。 + +3.6 您的账号在丢失或遗忘密码后,可联系客服邮箱2006410116@dididiketang.com申诉,按照客服要求完成验证找回账号或密码。公司特别提醒您应妥善保管您的账号和密码。当您使用完毕后,应安全退出。因其他人恶意攻击或您自身原因或其他不可抗力因素而导致账号被盗、丢失,公司不承担任何责任。 + +3.7 在注册、使用和管理账号时,您应保证注册账号时填写的身份信息的真实性,请您在注册、管理账号时使用真实、准确、合法、有效的相关身份证明材料及必要信息(包括但不限于您的联系电话等)。依照国家法律法规的规定,为使用本平台及服务的部分功能,您需要填写真实的身份信息,请您按照相关法律规定完成实名认证,并注意及时更新上述相关信息。若您提交的材料或提供的信息不准确、不真实、不规范、不合法或者公司有理由怀疑为错误、不实或不合法,则公司有权拒绝为您提供相关服务或您可能无法使用“船长Heixiu”平台及相关服务或在使用过程中部分功能受到限制。 + +3.8 除自行注册“船长Heixiu”账号外,您也可选择通过授权使用您合法拥有的包括但不限于公司和/或其关联公司、其他平台用户账号注册并登录使用“船长Heixiu”平台及相关服务,但第三方平台或平台对此有限制或禁止的除外。当您以前述已有账号登录使用的,应保证相应账号已进行实名注册登记,并同意适用本协议中的相关约定。 + +3.9 如您通过“船长Heixiu”已注册的账号登录本公司的关联公司或合作方运营的系列客户端平台产品及产品时,应遵守该平台产品及产品自身的《用户协议》及其他协议条款的规定。 + +四、用户个人信息保护 +4.1 我们非常重视用户信息的保护,保护用户个人信息是公司的基本原则之一。 + +4.2 在使用“船长Heixiu”平台及相关服务的过程中,您可能需要提供您的个人信息,以便公司向您提供更好的服务和相应的技术支持。您理解并同意,公司有权在更好的为您提供服务和遵守法律法规、本协议以及《船长Heixiu隐私政策》的前提下,收集、使用(含商业合作使用)、存储和分享您的个人信息。同时,我们将依法保护您浏览、修改、删除相关个人信息以及撤回同意的权利。更多关于用户个人信息保护的内容,请参看《船长Heixiu隐私政策》。 + +五、 用户行为规范 +5.1 用户行为要求 + +您应对使用本产品及相关服务的行为负责,除非法律允许或者经公司事先书面许可,您使用“船长Heixiu”平台及相关服务不得具有下列行为: + +5.1.1 使用未经公司授权或许可的任何插件、外挂、系统或第三方工具对“船长Heixiu”平台及相关服务的正常运行进行干扰、破坏、修改或施加其他影响。 + +5.1.2 利用或针对“船长Heixiu”平台及相关服务进行任何危害计算机网络安全的行为,包括但不限于: + +(1)非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动; + +(2)提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具; + +(3)明知他人从事危害网络安全的活动的,为其提供技术支持、广告推广、支付结算等帮助; + +(4)使用未经许可的数据或进入未经许可的服务器/账号; + +(5)未经允许进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息; + +(6)未经许可,企图探查、扫描、测试“船长Heixiu”系统或网络的弱点或其它实施破坏网络安全的行为; + +(7)企图干涉、破坏“船长Heixiu”系统或产品的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为; + +(8)伪造TCP/IP数据包名称或部分名称。 + +5.1.3 对“船长Heixiu”平台进行反向工程、反向汇编、编译或者以其他方式尝试发现本平台的源代码。 + +5.1.4 恶意注册“船长Heixiu”账号,包括但不限于频繁、批量注册账号。 + +5.1.5 违反法律法规、本协议、公司的相关规则及侵犯他人合法权益的其他行为。 + +在任何情况下,如果公司有理由认为您的任何行为违反或可能违反上述约定的,公司可独立进行判断并处理,且在任何时候有权在不进行任何事先通知的情况下终止向用户提供服务,并追究相关责任。 + +5.2 信息内容规范 + +5.2.1 用户按规定完成实名认证后,可以注册账号登录“船长Heixiu”平台使用我们提供的服务。 + +5.2.2 用户制作、传播的内容应自觉遵守法律法规、社会主义制度、国家利益、公民合法权益、社会公共秩序、道德风尚和信息真实性等“七条底线”要求,否则公司将立即采取限制功能、暂停服务、关闭账号等处理措施。用户不得发表下列信息: + +(1)反对宪法确定的基本原则的; + +(2)危害国家安全,泄露国家秘密; + +(3)颠覆国家政权,推翻社会主义制度,煽动分裂国家,破坏国家统一的; + +(4)损害国家荣誉和利益的; + +(5)宣扬恐怖主义、极端主义的; + +(6)宣扬民族仇恨、民族歧视,破坏民族团结的; + +(7)煽动地域歧视、地域仇恨的; + +(8)破坏国家宗教政策,宣扬邪教和迷信的; + +(9)编造、散布谣言、虚假信息,扰乱社会秩序、破坏社会稳定的; + +(10)散布、传播淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的; + +(11)危害网络安全、利用网络从事危害国家安全、荣誉和利益的; + +(12)侮辱或者诽谤他人,侵害他人合法权益的; + +(13)对他人进行暴力恐吓、威胁,实施人肉搜索的; + +(14)涉及他人隐私、个人信息或资料的; + +(15)散布污言秽语,损害社会公序良俗的; + +(16)侵犯他人隐私权、名誉权、肖像权、知识产权等合法权益内容的; + +(17)散布商业广告,或类似的商业招揽信息、过度营销信息及垃圾信息; + +(18)使用本产品常用语言文字以外的其他语言文字评论的; + +(19)与所评论的信息毫无关系的; + +(20)所发表的信息毫无意义的,或刻意使用字符组合以逃避技术审核的; + +(21)侵害未成年人合法权益或者损害未成年人身心健康的; + +(22)未获他人允许,偷拍、偷录他人,侵害他人合法权利的; + +(23)包含恐怖、暴力血腥、高危险性、危害表演者自身或他人身心健康内容的,包括但不限于以下情形: + +1)任何暴力和/或自残行为内容; + +2)任何威胁生命健康、利用刀具等危险器械表演的危及自身或他人人身或财产权利的内容; + +3)怂恿、诱导他人参与可能会造成人身伤害或导致死亡的危险或违法活动的内容。 + +(24)其他违反法律法规、政策及公序良俗禁止的信息; + +(25)干扰“船长Heixiu”正常运营或侵犯其他用户或第三方合法权益内容的其他信息。 + +六、信息内容使用规范 +6.1 未经公司书面许可,用户不得自行或授权、允许、协助任何第三人对本协议“船长Heixiu”平台及相关服务中信息内容进行如下行为: + +(1)复制、读取、采用“船长Heixiu”平台及相关服务的信息内容,用于包括但不限于宣传、增加阅读量、浏览量等商业用途; + +(2)擅自编辑、整理、编排“船长Heixiu”平台及相关服务的信息内容后在船长Heixiu平台及相关服务的源页面以外的渠道进行展示; + +(3)采用包括但不限于特殊标识、特殊代码等任何形式的识别方法,自行或协助第三人对“船长Heixiu”平台及相关服务的信息或内容产生流量、转移、劫持等不利影响; + +(4)其他非法获取“船长Heixiu”平台及相关服务的信息内容的行为。 + +6.2 经公司书面许可后,用户对“船长Heixiu”平台的分享等行为,还应符合以下规范: + +(1)对抓取、统计、获得的相关数据,未经公司事先书面同意,不得将数据以任何方式公示、提供、泄露给任何第三人; + +(2)不得对“船长Heixiu”平台及相关服务的源网页进行任何形式的任何改动,包括但不限于“船长Heixiu”平台及相关服务的首页链接入口,也不得对“船长Heixiu”平台及相关服务的源页面的展示进行任何形式的遮挡、插入、弹窗等妨碍; + +(3)应当采取安全、有效、严密的措施,防止“船长Heixiu”平台及相关服务的信息内容被第三方通过包括但不限于“蜘蛛”(spider)程序等任何形式进行非法获取; + +(4)不得把相关数据内容用于公司书面许可范围之外的目的,进行任何形式的销售和商业使用,或向第三方泄露、提供或允许第三方以任何方式的使用。 + +七、生成合成内容标识 +船长Heixiu将遵守适用法律对人工智能生成合成内容进行显示或隐式标识,请您仔细阅读并理解相关的标识管理要求。 + +7.1 船长Heixiu中生成合成内容将会标识 "船长Heixiu AI生成"或其他我们不时更新且符合法律法规要求的标识. + +7.2 未经我们允许您不得擅自删除、篡改、伪造或隐匿船长Heixiu的任何人工智能生成合成内容标识。 + +7.3 如果您为付费用户,你将根据付费权益享有要求生成合成内容不添加显示标识的权利,我们将根据您的要求提供不含显式标识的生成合成内容。但是,请您了解并承诺,如您使用网络信息内容传播服务发布 船长Heixiu 生成合成内容的,应当主动声明此内容为人工智能生成合成内容,并使用我们提供的标识功能进行标识。 + +7.4 您承诺并同意,您在自主标识生成合成内容的过程中会严格遵守相关法律法规的要求真实准确的使用标识,不会通过不正当标识手段损害我们或他人的合法权益。 + +八、违约处理 +8.1 针对您违反本协议或其他服务条款的行为,公司有权独立判断并视情况采取预先警示、限制账号部分或者全部功能直至永久关闭账号等措施。公司有权公告处理结果,且有权根据实际情况决定是否恢复使用。对涉嫌违反法律法规、涉嫌违法犯罪的行为将保存有关记录,并依法向有关主管部门报告、配合有关主管部门调查。对已删除内容公司有权不予恢复及返还。 + +8.2 因您违反本协议或其他服务条款规定,引起第三方投诉或诉讼索赔的,您应当自行承担全部法律责任。因您的违法或违约行为导致公司及其关联方向任何第三方赔偿或遭受国家机关处罚的,您还应足额赔偿造成的全部损失。 + +8.3 公司尊重并保护法人、公民的知识产权、名誉权、姓名权、隐私权等合法权益。您保证,使用“船长Heixiu”平台及相关服务生成的作品等不侵犯任何第三方的知识产权、名誉权、姓名权、肖像权、隐私权等权利及合法权益。否则,公司有权在收到权利方或者相关方通知的情况下移除该涉嫌侵权内容。针对第三方提出的全部权利主张,您应自行承担全部法律责任;如因您的侵权行为导致公司及其关联公司、控制公司、继承公司遭受损失的(包括但不限于经济、商誉等损失),您还应足额赔偿。 + +8.4 您清楚并同意,任何情况下,公司对您的违约及赔偿总额,不超过您使用公司服务已支付的全部费用总额。 + +九、服务的变更、中断和终止 +9.1 您理解并同意,公司提供的“船长Heixiu”平台及相关服务是按照现有技术和条件所能达到的现状提供的。公司会尽最大努力向您提供服务,确保服务的连贯性和安全性。您理解,公司不能随时预见和防范法律、技术以及其他风险,包括但不限于不可抗力、病毒、木马、黑客攻击、系统不稳定、第三方服务瑕疵及其他各种安全问题的侵扰等原因可能导致的服务中断、数据丢失以及其他的损失和风险。 + +9.2 您理解并同意,公司基于经营策略的调整或运营需要,有权在公告通知后修改、中断、中止或终止“船长Heixiu”平台及相关服务,而无须向用户负责或承担任何赔偿责任。 + +9.3 您理解并同意,服务中止或终止后,公司没有义务向您提供或返还任何数据。 + +9.4 若用户申请注销账户,开通套餐激活软件时所部署的积分,不予退还。 + +十、知识产权 +10.1 公司在“船长Heixiu”平台及相关服务中提供的内容(包括但不限于平台、技术、程序、网页、文字、图片、图像、图表、版面设计、电子文档等)的知识产权属于公司或合法第三方所有。公司提供本服务时所依托的平台著作权、专利权及其他知识产权均归公司所有。未经权利人许可,您无权擅自使用(包括但不限于通过任何机器人、蜘蛛等程序或设备监视、复制、传播、展示、镜像、上载、下载)“船长Heixiu”平台及相关服务中的任何内容,否则您应自行承担全部后果,且本公司或第三方权利人有权追究您的法律责任。 + +10.2 您理解并同意,您在使用“船长Heixiu”平台及相关服务时上传的文字、图片等均由您所有或已获合法授权(含转授权),不会违反法律法规的规定,或侵犯任何第三方的合法权益。您通过“船长Heixiu”上传、合成并保存的任何内容的知识产权归属您或原始著作权人所有,如因此引起任何纠纷等由您自行承担全部责任,给公司造成损失的,公司有权向您追索赔偿。 + +10.3 内容授权 + +(1)您知悉、理解并同意,对于您通过“船长Heixiu”平台上传及合成的全部内容(包括但不限文字、图片、图像等),若您将内容在船长Heixiu平台内主动发布(包括公开可见或者部分用户可见等形式的发布),则视为您在此授予公司及其关联方一项全球范围内、免费、非独家、可再许可(通过多层次)的权利(包括但不限于复制权、翻译权、汇编权、信息网络传播权、改编权、制作衍生品等),使用范围包括但不限于在当前或其他产品、应用程序、产品或终端设备等。您在此确认并同意,上述权利的授予包括在与“船长Heixiu”、公司和/或公司品牌有关的任何推广、广告、营销宣传中使用和以其他方式开发内容(全部或部分)的权利和许可。为避免疑惑,您同意,上述权利的授予包括使用、复制和展示您拥有或被许可使用并植入内容中的个人形象、肖像、姓名、商标、服务标志、品牌、名称、标识和公司标记(如有)以及任何其他品牌、营销或推广资产的权利和许可。 + +(2)您知悉、理解并同意,若您通过“船长Heixiu”平台上传及合成的内容(包括但不限文字、图片、图像等)后,未在平台内进行发布,仅在本地保存或在服务器内临时存储,则公司及关联方不享有任何使用该内容的权利,亦不会对该内容进行任何形式的展示、传播、改编或开发利用。但平台会对您生成的内容进行一定期间的临时存储。存储期限届满后,平台将通过技术手段自动删除该内容,删除后将无法恢复。您可在存储期限内自行导出或备份该内容,因逾期未备份导致的内容丢失,公司不承担责任。 + +10.4 公司为“船长Heixiu”开发、运营提供技术支持,并对“船长Heixiu”平台及相关服务的开发和运营等过程中产生的所有数据和信息等享有全部权利。 + +10.5 请您在任何情况下都不要私自使用公司的包括但不限于“船长Heixiu”的任何商标、服务标记、商号、域名、产品名称或其他显著品牌特征等(以下统称为“标识”)。未经公司事先书面同意,您不得将本条款前述标识以单独或结合任何方式展示、使用或申请注册商标、进行域名注册等,也不得实施向他人明示或暗示有权展示、使用或其他有权处理该些标识的行为。由于您违反本协议使用公司上述商标、标识等给公司或他人造成损失的,由您承担全部法律责任。 + +十一、免责声明 +11.1 您理解并同意,“船长Heixiu”平台及相关服务可能会受多种因素的影响或干扰,公司不对下述事项向您作出任何保证(包括但不限于): + +11.1.1 公司的平台及相关服务完全符合用户的使用要求; + +11.1.2 公司不受干扰,及时、安全、可靠或不出现错误;用户经由公司取得的任何平台、服务或其他材料符合用户的期望; + +11.1.3 平台中任何错误都将能得到更正。 + +11.2 对于涉及财产的网络信息、账户密码、广告或推广等信息的,用户请谨慎对待并自行进行判断,基于前述原因您因此遭受的利润、商业信誉、资料损失或其他有形或无形损失,公司不承担任何直接、间接、附带、特别、衍生性或惩罚性的赔偿责任。 + +11.3 用户理解并同意,在使用“船长Heixiu”平台及相关服务过程中,可能遇到不可抗力等因素(不可抗力是指不能预见、不能克服并不能避免的客观事件),包括但不限于政府行为、自然灾害、网络原因、黑客攻击、战争或任何其它类似事件。出现不可抗力情况时,公司将努力在第一时间及时修复,但因不可抗力给用户造成了损失,用户同意公司不承担责任。 + +11.4 公司依据本协议约定获得处理违法违规内容的权利,该权利不构成公司的义务或承诺,公司不能保证及时发现违法行为或进行相应处理。 + +11.5 用户明确了解并同意:关于本协议服务,公司不提供任何种类的明示或暗示担保或条件,包括但不限于商业适售性、特定用途适用性等。您对本协议平台及相关服务的使用行为必须自行承担相应风险。 + +11.6 用户明确了解并同意,本协议是在保障遵守国家法律法规、维护公序良俗、保护他人合法权益,公司在能力范围内尽最大的努力按照相关法律法规进行判断,但并不保证公司判断完全与司法机关、行政机关的判断一致,如因此产生的后果用户已经理解并同意自行承担。 + +十二、未成年人使用条款 +12.1 我们的产品主要是面向成年人,若您是未满18周岁的未成年人,在使用“船长Heixiu”平台及相关服务前,应在您的父母或其他监护人监护、指导下阅读并同意本协议。 + +12.2 公司重视对未成年人个人信息的保护,未成年用户在填写个人信息时,请加强个人保护意识并谨慎对待,并在监护人指导下正确使用“船长Heixiu”平台及相关服务。 + +12.3 如未成年用户违反法律法规、本协议内容,未成年人的监护人应依照法律规定承担因此而导致的一切后果。 + +12.4 未成年人用户特别提示 + +12.4.1 青少年及使用“船长Heixiu” 平台及相关服务应该在其监护人的监督指导下,在合理范围内正确学习使用网络,避免沉迷虚拟的网络空间,养成良好上网习惯。 + +12.4.2 青少年用户必须遵守《全国青少年网络文明公约》: + +(1)要善于网上学习,不浏览不良信息; + +(2)要诚实友好交流,不侮辱欺诈他人; + +(3)要增强自护意识,不随意约会网友; + +(4)要维护网络安全,不破坏网络秩序; + +(5)要有益身心健康,不沉溺虚拟时空。 + +12.4.3 为更好的保护未成年人隐私权益,未成年人使用“船长Heixiu”平台开通付费会员或其他同等类型服务的,应在监护人陪同下操作。公司提醒用户慎重上传包含未成年人素材的内容,一经上传,即视为用户同意“船长Heixiu”展示未成年人的信息、肖像、声音等,且允许“船长Heixiu”依据本协议使用、处理该等与未成年人相关的内容。有此产生的责任由您自行承担。 + +十三、其他 +13.1 本协议的成立、生效、履行、解释及争议的解决均应适用中华人民共和国大陆地区法律。本协议的签署地点为中华人民共和国重庆市,若您与公司发生争议的,双方应尽量友好协商解决,协商不成,您同意应将争议提交至本协议签订地(即重庆渝中区)有管辖权的人民法院管辖。 + +13.2 公司有权依据国家政策、技术条件、产品功能等变化需要而进行修改本协议,公司会将修改后的协议予以发布。前述内容一经正式发布,公司将以适当的方式(短信、公告、弹窗、系统通知等)提醒您更新的内容,以便您及时了解本协议的最新版本。修改后的内容将构成本协议不可分割的组成部分,您应同样遵守。您对修改后的协议有异议的,请立即停止登录、使用“船长Heixiu”平台及相关服务,若您登录或继续使用“船长Heixiu”平台及相关服务,视为认可修改后的协议。 + +13.3 您和公司均是独立的主体,在任何情况下本协议不构成公司对用户的任何形式的明示、暗示担保或条件,双方之间亦不构成代理、合伙、合营或雇佣关系。 + +13.4 本协议中的标题仅为方便及阅读而设,并不影响本协议中任何规定的含义或解释。 diff --git a/src/assets/legal/积分充值服务协议.txt b/src/assets/legal/积分充值服务协议.txt new file mode 100644 index 0000000..fe4f9fb --- /dev/null +++ b/src/assets/legal/积分充值服务协议.txt @@ -0,0 +1,73 @@ +积分充值服务协议 +本《积分充值服务协议》(以下简称 "本协议")由您与【重庆森焱启智科技有限责任公司】(以下简称 "我们")共同订立,旨在明确您使用我们提供的积分充值服务时双方的权利和义务。请您在使用积分充值服务前,仔细阅读本协议全部内容。如您对本协议内容有任何疑问,可向我们的客服咨询。当您使用积分充值服务时,即表示您已充分理解并自愿接受本协议的全部内容。 + +一、定义 +1.积分:指由我们为您提供的,用于存储资金、进行交易支付等操作的电子虚拟账户。 + +2.充值:指您通过我们支持的支付渠道,将资金存入积分账户的行为。 + +3.支付渠道:包括但不限于第三方支付平台、网上银行、快捷支付等我们与相关合作机构共同提供的支付方式。 + +二、服务提供方的权利与义务 +1.我们有权根据法律法规、监管要求、业务发展等情况,对积分充值服务的功能、支付渠道、充值限额等进行调整,并通过官方网站、短信、邮箱等一种或多种方式通知您。如您继续使用充值服务,即视为接受调整后的内容。 + +2.我们承诺采取合理的技术和管理措施,保障积分充值服务的正常运行,保护您的资金安全和个人信息安全。但因不可抗力、通信网络故障、第三方支付渠道问题等非我们原因导致的服务中断、资金损失等情况,我们不承担责任,但会尽力协助您解决问题。 + +3.我们有权对您的充值行为进行监测和管理,如发现异常充值行为(包括但不限于涉嫌洗钱、诈骗、套现等违法违规行为),我们有权暂停或终止为您提供充值服务,并有权采取相应的风险控制措施,包括但不限于冻结您的积分账户资金、限制交易等,并将相关情况报告监管部门。 + +4.我们应按照约定及时处理您的充值请求,并在充值成功后,及时更新您积分账户的余额信息。 + +三、用户的权力与义务 +1.您有权在遵守本协议及相关法律法规的前提下,使用我们提供的积分充值服务,并在充值成功后,合法合理地使用积分账户内的资金。 + +2.您应确保提供的注册信息、身份信息等资料真实、准确、完整、有效,并及时更新。如因您提供的信息不真实、不准确、不完整或未及时更新,导致无法使用充值服务或产生其他不利后果,由您自行承担责任。 + +3.您应妥善保管自己的积分账户信息(包括但不限于账户名、密码、验证码等)及支付工具信息(如银行卡号、支付密码等),不得将其泄露给任何第三方。如因您自身原因导致账户信息或支付工具信息泄露,造成资金损失的,由您自行承担责任。 + +4.您应按照我们规定的充值流程和要求进行充值操作,并确认充值金额、支付方式等信息无误后提交充值请求。如因您操作失误导致充值错误(如充错账户、重复充值等),我们将根据实际情况协助您处理,但不保证一定能够追回资金或进行退款,相关损失由您自行承担。 + +5.您承诺使用充值服务进行的交易活动均符合法律法规、社会公德及本协议的约定,不得利用积分充值服务从事任何违法违规、损害他人合法权益或违反公序良俗的行为。如您违反上述规定,我们有权采取相应措施追究您的责任,包括但不限于终止服务、要求您承担赔偿责任等,并将相关情况报告监管部门。 + +四、充值操作与交易规则 +1.充值方式:您可通过我们支持的支付渠道进行充值,不同支付渠道可能有不同的到账时间,具体以充值页面展示的信息为准。 + +2.充值限额:为保障您的资金安全和防范风险,我们对单笔充值金额、单日充值金额、单月充值金额等设置了限额。如您需要调整充值限额,可按照我们规定的流程申请,但我们有权根据您的账户情况、风险评估结果等决定是否同意您的申请。 + +3.到账时间:充值资金一般会在您提交充值请求并支付成功后的一定时间内到账,具体到账时间以各支付渠道的实际处理时间为准。如遇网络繁忙、系统维护、支付渠道故障等特殊情况,到账时间可能会延迟。如您的充值资金长时间未到账,请及时联系我们的客服人员进行查询和处理。 + +4.交易凭证:您的充值记录将作为交易凭证,您可以在订单明细中查询充值历史记录。如对充值交易有疑问,您应在充值交易发生后的7个工作日内我们提出异议,并提供相关证明材料。我们将在收到您的异议后进行核实,并在规定时间内将处理结果告知您。 + +五、资金管理与安全 +1.您积分账户内的资金属于您所有,我们不会将您的资金用于除本协议约定用途之外的其他任何目的。 + +2.我们将采取多种安全技术和措施保障您积分账户资金的安全,包括但不限于数据加密、身份认证、风险监控等。但由于互联网存在诸多不确定性,如您发现积分账户存在异常交易或资金被盗用等情况,请立即联系我们的客服人员,并配合我们进行调查和处理。我们将在核实情况后,根据实际情况采取相应措施保障您的资金安全,如冻结账户、协助追回资金等。但如因您自身原因导致资金损失(如未妥善保管账户信息等),我们不承担赔偿责任。 + +六、协议的变更与终止 +1.我们有权根据法律法规变化、业务调整等情况对本协议内容进行变更。变更后的协议将通过官方网站、短信、邮件等一种或多种方式通知您。如您在变更后的协议生效后继续使用积分充值服务,即视为您已充分阅读、理解并接受变更后的协议内容;如您不同意变更后的协议内容,您应立即停止使用积分充值服务。 + +2.在以下情况下,我们有权单方面终止本协议,并停止为您提供积分充值服务: + +您违反本协议约定,从事违法违规、损害他人合法权益或违反公序良俗的行为; + +您的账户存在异常交易行为或涉嫌洗钱、诈骗、套现等违法违规风险,经我们调查核实后情况属实; + +因不可抗力、法律法规变化、监管要求等原因,导致我们无法继续提供积分充值服务。 + +3.本协议终止后,我们将停止为您提供充值服务,并根据法律法规规定和本协议约定处理您积分账户内的剩余资金。如您的账户不存在未处理的交易纠纷、违法违规行为等情况,我们将按照您指定的方式退还您账户内的剩余资金;如您的账户存在未处理的交易纠纷、违法违规行为等情况,我们将在纠纷解决或违规行为处理完毕后,再按照上述方式处理剩余资金。 + +七、争议解决 +如您与我们在本协议履行过程中发生争议,应首先通过友好协商解决;协商不成的,任何一方均有权向重庆市渝中区人民法院提起诉讼。 + +八、其他条款 +1.本协议自您使用积分充值服务之日起生效,对您和我们均具有法律约束力。 + +2.本协议的任何条款被认定为无效或不可执行,不影响其他条款的效力和执行。 + +3.我们未行使或延迟行使本协议项下的任何权利,不构成对该权利的放弃;我们对您的任何违约行为给予任何宽限或延缓,均不影响我们对您后续违约行为追究责任的权利。 + +4.为了提升服务质量,缩短充值到账时间,我们特此委托济南煜邦炫盛智能科技有限责任公司代为收取您的充值金额,特此告知。 + +九、如何联系我们 +1.本协议版权为我们所有,在法律允许的范围内,我们拥有解释和修改的权利。 + +2.如您在使用我们的产品与/或服务时对协议有任何问题、举报或投诉,可通过我们的客服及相关负责人邮箱2006410116@dididiketang.com联系我们。 diff --git a/src/assets/logo/HX.png b/src/assets/logo/HX.png new file mode 100644 index 0000000000000000000000000000000000000000..fd84031f5c1521678296a23acab8e0588f788ac9 GIT binary patch literal 62269 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 HG=2GBN^hhZ literal 0 HcmV?d00001 diff --git a/src/assets/logo/heixiu.icns b/src/assets/logo/heixiu.icns new file mode 100644 index 0000000000000000000000000000000000000000..fcc3873910207140c897fa8803c7bc7d6b19e6d6 GIT binary patch literal 6641 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 + const [edition] = useState(() => { + return parseEdition(import.meta.env.VITE_EDITION); + }); + const [isLoggedIn, setIsLoggedIn] = useState(false); + + const login = useCallback(() => { + // TODO: 接入真实登录流程 + setIsLoggedIn(true); + }, []); + + const logout = useCallback(() => { + // TODO: 清理 token、用户状态等 + setIsLoggedIn(false); + }, []); + + // 监听主进程推送的平台/版本信息 + useEffect(() => { + const handler = (_event: unknown, info: unknown) => { + const data = info as { platform?: string; edition?: string } | undefined; + if (data) { + if (isDev()) { + console.log('[AppContext] 主进程平台信息:', data); + } + } + }; + safeIpcOn('platform-info', handler); + return () => { + safeIpcOff('platform-info', handler); + }; + }, []); + + const value: AppContextValue = { + platform, + edition, + isLoggedIn, + login, + logout, + isDevMode: isDev(), + }; + + return {children}; +} diff --git a/src/components/ThemeProvider.tsx b/src/components/ThemeProvider.tsx new file mode 100644 index 0000000..a03a6f6 --- /dev/null +++ b/src/components/ThemeProvider.tsx @@ -0,0 +1,72 @@ +// ============================================================ +// ThemeProvider — 主题 Provider 组件 +// ============================================================ + +import { useState, useEffect, useCallback, type ReactNode } from 'react'; +import { ConfigProvider } from 'antd'; + +import { getThemeConfig } from '../theme/antd-theme'; +import { + ThemeContext, + readStoredTheme, + writeStoredTheme, + applyHtmlTheme, + STORAGE_KEY, +} from '../hooks/use-theme'; +import type { ThemeContextValue } from '../hooks/use-theme'; + +interface ThemeProviderProps { + children: ReactNode; +} + +export function ThemeProvider({ children }: ThemeProviderProps) { + const [isDark, setIsDark] = useState(readStoredTheme); + + // 挂载时同步 + useEffect(() => { + applyHtmlTheme(isDark); + }, []); // eslint-disable-line react-hooks/exhaustive-deps + + const toggleTheme = useCallback(() => { + setIsDark((prev) => { + const next = !prev; + writeStoredTheme(next); + applyHtmlTheme(next); + return next; + }); + }, []); + + const setLight = useCallback(() => { + setIsDark(false); + writeStoredTheme(false); + applyHtmlTheme(false); + }, []); + + const setDark = useCallback(() => { + setIsDark(true); + writeStoredTheme(true); + applyHtmlTheme(true); + }, []); + + // 监听系统主题变化(仅用户从未手动切换时跟随) + useEffect(() => { + const mq = window.matchMedia('(prefers-color-scheme: dark)'); + const handleChange = (e: MediaQueryListEvent) => { + const stored = localStorage.getItem(STORAGE_KEY); + if (stored === null) { + setIsDark(e.matches); + applyHtmlTheme(e.matches); + } + }; + mq.addEventListener('change', handleChange); + return () => mq.removeEventListener('change', handleChange); + }, []); + + const ctx: ThemeContextValue = { isDark, toggleTheme, setLight, setDark }; + + return ( + + {children} + + ); +} diff --git a/src/components/common/LegalTextModal.tsx b/src/components/common/LegalTextModal.tsx new file mode 100644 index 0000000..f4a30a8 --- /dev/null +++ b/src/components/common/LegalTextModal.tsx @@ -0,0 +1,77 @@ +// ============================================================ +// LegalTextModal — 协议/法律文本展示弹窗 +// 从 src/assets/legal/ 加载 .txt 文件,主题适配渲染 +// ============================================================ + +import { Modal, Typography } from 'antd'; +import { FileTextOutlined } from '@ant-design/icons'; + +import { useTheme } from '@/hooks/use-theme'; + +// Vite ?raw 导入:将 .txt 内容作为字符串直接内联 +import serviceAgreement from '@/assets/legal/用户服务协议.txt?raw'; +import pointsAgreement from '@/assets/legal/积分充值服务协议.txt?raw'; + +const { Paragraph } = Typography; + +/** 协议名称 → 文本内容映射 */ +const legalTexts: Record = { + service: { title: '用户服务协议', content: serviceAgreement }, + points: { title: '积分充值服务协议', content: pointsAgreement }, +}; + +interface LegalTextModalProps { + open: boolean; + /** 协议标识:'service' | 'points' */ + type: 'service' | 'points'; + onClose: () => void; +} + +export function LegalTextModal({ open, type, onClose }: LegalTextModalProps) { + const { isDark } = useTheme(); + const legal = legalTexts[type]; + + if (!legal) return null; + + return ( + + + {legal.title} + + } + styles={{ + body: { + maxHeight: '60vh', + overflowY: 'auto', + padding: '20px 24px', + background: isDark ? '#1A1730' : '#FFFFFF', + color: isDark ? '#E8E6F0' : '#1E1B4B', + fontSize: 14, + lineHeight: 2, + whiteSpace: 'pre-wrap', + wordBreak: 'break-word', + fontFamily: 'var(--font-family-base)', + }, + }} + > + + {legal.content} + + + ); +} diff --git a/src/components/navbar/AnnouncementDrawer.tsx b/src/components/navbar/AnnouncementDrawer.tsx new file mode 100644 index 0000000..fe8fd11 --- /dev/null +++ b/src/components/navbar/AnnouncementDrawer.tsx @@ -0,0 +1,147 @@ +// ============================================================ +// AnnouncementDrawer — 公告侧拉抽屉(SPA 内部弹出) +// 数据来源:GET /api/v1/announcements +// ============================================================ + +import { useEffect, useState, useCallback } from 'react'; +import { Drawer, List, Typography, Empty, Tag, Spin } from 'antd'; +import { NotificationOutlined } from '@ant-design/icons'; + +import { fetchAnnouncements, type Announcement } from '@/services/modules'; + +const { Text, Paragraph } = Typography; + +// ---------- 辅助 ---------- + +/** 公告类型 → Tag 颜色映射 */ +const typeColorMap: Record = { + system: 'blue', + feature: 'purple', + activity: 'orange', + maintenance: 'red', +}; + +/** 公告类型 → 中文标签 */ +const typeLabelMap: Record = { + system: '系统', + feature: '功能', + activity: '活动', + maintenance: '维护', +}; + +/** 格式化日期(YYYY-MM-DD) */ +function formatDate(iso: string): string { + try { + return new Date(iso).toLocaleDateString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }); + } catch { + return iso; + } +} + +// ---------- 组件 ---------- + +interface AnnouncementDrawerProps { + open: boolean; + onClose: () => void; +} + +export function AnnouncementDrawer({ open, onClose }: AnnouncementDrawerProps) { + const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + // 打开抽屉时请求公告列表 + const loadAnnouncements = useCallback(async () => { + setLoading(true); + setError(null); + try { + const data = await fetchAnnouncements(); + // 仅展示有效公告 + setList(data.filter((item) => item.is_active)); + } catch (err) { + setError((err as Error).message || '加载公告失败'); + setList([]); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + if (open) { + loadAnnouncements(); + } + }, [open, loadAnnouncements]); + + // ---- 渲染 ---- + + return ( + + + 公告 + + } + placement="right" + size={380} + open={open} + onClose={onClose} + styles={{ body: { padding: 0 } }} + > + {loading ? ( +
+ +
+ ) : error ? ( +
+ +
+ ) : list.length === 0 ? ( +
+ +
+ ) : ( + ( + +
+ {/* 标题 + 类型标签 */} +
+ + {item.pinned && '📌 '} + {item.title} + + + {typeLabelMap[item.type] || item.type} + +
+ + {/* 内容 */} + + {item.content} + + + {/* 日期 */} + + {formatDate(item.created_at)} + +
+
+ )} + /> + )} +
+ ); +} diff --git a/src/components/navbar/NavBar.tsx b/src/components/navbar/NavBar.tsx new file mode 100644 index 0000000..0e6b427 --- /dev/null +++ b/src/components/navbar/NavBar.tsx @@ -0,0 +1,135 @@ +// ============================================================ +// NavBar — 自定义顶部导航栏(替代系统菜单) +// +// 逻辑: +// - 所有导航项默认全部显示(不再按登录状态隐藏) +// - 未登录时点击需登录的项 → 弹出提示"请先登录"并触发登录 Modal +// - 登录/注册 与 退出登录 仍按登录状态互斥显示 +// ============================================================ + +import { useState, useCallback, useMemo } from 'react'; +import { App } from 'antd'; + +import { useAppContext } from '@/contexts/app-context'; +import { useTheme } from '@/hooks/use-theme'; +import { emit, EVENTS } from '@/utils/event-bus.ts'; +import { NavItem } from './NavItem'; +import { AnnouncementDrawer } from './AnnouncementDrawer'; +import { personalLeft, personalRight, enterpriseLeft, enterpriseRight } from './nav-config'; +import type { NavItemConfig } from './types'; + +const NAVBAR_HEIGHT = 56; + +export function NavBar() { + const { platform, edition, isLoggedIn, logout } = useAppContext(); + const { isDark } = useTheme(); + const { message } = App.useApp(); + + const [drawerOpen, setDrawerOpen] = useState(false); + + // 根据版本选择导航项 + const { leftItems, rightItems } = useMemo(() => { + const isEnterprise = edition === 'enterprise'; + return { + leftItems: isEnterprise ? enterpriseLeft : personalLeft, + rightItems: isEnterprise ? enterpriseRight : personalRight, + }; + }, [edition]); + + // 过滤规则: + // requireGuest → 仅未登录时可见(登录/注册) + // "退出登录" → 仅已登录时可见 + // 其他所有项 → 始终可见,未登录点击时弹"请先登录" + const visibleLeft = useMemo( + () => + leftItems.filter((item) => { + if (item.requireGuest && isLoggedIn) return false; + return !(item.key === 'logout' && !isLoggedIn); + }), + [leftItems, isLoggedIn], + ); + const visibleRight = useMemo( + () => + rightItems.filter((item) => { + if (item.requireGuest && isLoggedIn) return false; + return !(item.key === 'logout' && !isLoggedIn); + }), + [rightItems, isLoggedIn], + ); + + // 点击导航项 + const handleNavClick = useCallback( + (item: NavItemConfig) => { + // 需要登录但未登录 → 提示并弹出登录 Modal + if (item.requireLogin && !isLoggedIn) { + message.warning('请先登录'); + emit(EVENTS.SHOW_LOGIN); + return; + } + + switch (item.action) { + case 'drawer': + if (item.key === 'announcements') { + setDrawerOpen(true); + } + break; + + case 'button': + if (item.key === 'logout') { + logout(); + } + break; + + case 'external': + if (item.target) { + window.open(item.target, '_blank'); + } + break; + + case 'navigate': + case 'spa': + if (item.key === 'auth') { + emit(EVENTS.SHOW_LOGIN); + } else { + console.log('[NavBar] 导航至:', item.target); + } + break; + } + }, + [isLoggedIn, logout, message], + ); + + const macPaddingLeft = platform === 'darwin' ? 80 : 12; + + return ( + <> +
+
+ {visibleLeft.map((item) => ( + + ))} +
+ +
+ {visibleRight.map((item) => ( + + ))} +
+
+ + setDrawerOpen(false)} /> + + ); +} diff --git a/src/components/navbar/NavItem.tsx b/src/components/navbar/NavItem.tsx new file mode 100644 index 0000000..d0dc3ee --- /dev/null +++ b/src/components/navbar/NavItem.tsx @@ -0,0 +1,52 @@ +// ============================================================ +// NavItem — 单个导航按钮 +// 布局:图标(SVG)在上,文字在下 +// ============================================================ + +import { useTheme } from '@/hooks/use-theme.ts'; +import type { NavItemConfig } from './types'; + +interface NavItemProps { + item: NavItemConfig; + onClick: (item: NavItemConfig) => void; +} + +export function NavItem({ item, onClick }: NavItemProps) { + const { isDark } = useTheme(); + const isLogout = item.key === 'logout'; + + return ( + + ); +} diff --git a/src/components/navbar/index.ts b/src/components/navbar/index.ts new file mode 100644 index 0000000..858c68e --- /dev/null +++ b/src/components/navbar/index.ts @@ -0,0 +1,3 @@ +export { NavBar } from './NavBar'; +export { AnnouncementDrawer } from './AnnouncementDrawer'; +export type { NavItemConfig, NavBarConfig, NavAction } from './types'; diff --git a/src/components/navbar/nav-config.ts b/src/components/navbar/nav-config.ts new file mode 100644 index 0000000..3b266a4 --- /dev/null +++ b/src/components/navbar/nav-config.ts @@ -0,0 +1,198 @@ +// ============================================================ +// 导航栏配置 —— 按版本(个人版 / 企业版)定义导航项 +// 每个导航项的 iconSrc 指向 src/assets/header_actions/ 下的 SVG 图标 +// ============================================================ + +import type { NavItemConfig } from './types'; + +// ---------- SVG 图标导入(?raw = 内联渲染,使 currentColor 生效)---------- +import complianceAssetsSvg from '@/assets/header_actions/compliance_assets.svg?raw'; +import announcementsSvg from '@/assets/header_actions/announcements.svg?raw'; +import accountSvg from '@/assets/header_actions/account.svg?raw'; +import membershipSvg from '@/assets/header_actions/membership.svg?raw'; +import rechargeSvg from '@/assets/header_actions/recharge.svg?raw'; +import billingSvg from '@/assets/header_actions/billing.svg?raw'; +import orderDetailsSvg from '@/assets/header_actions/order_details.svg?raw'; +import wechatWorkSvg from '@/assets/header_actions/wechat_work.svg?raw'; +import settingsSvg from '@/assets/header_actions/settings.svg?raw'; +import signOutSvg from '@/assets/header_actions/sign_out.svg?raw'; +import projectManagementSvg from '@/assets/header_actions/project_management.svg?raw'; + +// ============================================================ +// 个人版导航项 +// ============================================================ + +/** 个人版 — 左侧 */ +const personalLeft: NavItemConfig[] = [ + { + key: 'compliance-assets', + label: '合规素材库', + iconSrc: complianceAssetsSvg, + action: 'navigate', + target: '/compliance-assets', + position: 'left', + }, +]; + +/** 个人版 — 右侧(从左至右排列) */ +const personalRight: NavItemConfig[] = [ + { + key: 'announcements', + label: '公告', + iconSrc: announcementsSvg, + action: 'drawer', + position: 'right', + }, + { + key: 'account', + label: '查帐户', + iconSrc: accountSvg, + action: 'navigate', + target: '/account', + position: 'right', + requireLogin: true, + }, + { + key: 'vip-activate', + label: '开会员/激活', + iconSrc: membershipSvg, + action: 'navigate', + target: '/vip', + position: 'right', + }, + { + key: 'recharge-points', + label: '充值积分', + iconSrc: rechargeSvg, + action: 'navigate', + target: '/recharge', + position: 'right', + requireLogin: true, + }, + { + key: 'billing-history', + label: '消费记录', + iconSrc: billingSvg, + action: 'navigate', + target: '/billing', + position: 'right', + requireLogin: true, + }, + { + key: 'order-details', + label: '订单明细', + iconSrc: orderDetailsSvg, + action: 'navigate', + target: '/orders', + position: 'right', + requireLogin: true, + }, + { + key: 'wechat-work', + label: '企业微信', + iconSrc: wechatWorkSvg, + action: 'external', + target: 'https://work.weixin.qq.com/', + position: 'right', + }, + { + key: 'settings', + label: '设置', + iconSrc: settingsSvg, + action: 'navigate', + target: '/settings', + position: 'right', + }, + { + key: 'auth', + label: '登录/注册', + iconSrc: accountSvg, + action: 'navigate', + target: '/login', + position: 'right', + requireGuest: true, + }, + { + key: 'logout', + label: '退出登录', + iconSrc: signOutSvg, + action: 'button', + position: 'right', + requireLogin: true, + }, +]; + +// ============================================================ +// 企业版导航项 +// ============================================================ + +/** 企业版 — 左侧 */ +const enterpriseLeft: NavItemConfig[] = [ + { + key: 'compliance-assets', + label: '合规素材库', + iconSrc: complianceAssetsSvg, + action: 'navigate', + target: '/compliance-assets', + position: 'left', + }, + { + key: 'project-management', + label: '项目管理', + iconSrc: projectManagementSvg, + action: 'navigate', + target: '/projects', + position: 'left', + }, +]; + +/** 企业版 — 右侧(从左至右排列) */ +const enterpriseRight: NavItemConfig[] = [ + { + key: 'announcements', + label: '公告', + iconSrc: announcementsSvg, + action: 'drawer', + position: 'right', + }, + { + key: 'quota-check', + label: '查配额', + iconSrc: accountSvg, + action: 'navigate', + target: '/quota', + position: 'right', + requireLogin: false, + }, + { + key: 'settings', + label: '设置', + iconSrc: settingsSvg, + action: 'navigate', + target: '/settings', + position: 'right', + }, + { + key: 'auth', + label: '登录/注册', + iconSrc: accountSvg, + action: 'navigate', + target: '/login', + position: 'right', + requireGuest: true, + }, + { + key: 'logout', + label: '退出登录', + iconSrc: signOutSvg, + action: 'button', + position: 'right', + requireLogin: true, + }, +]; + +// ============================================================ +// 导出 +// ============================================================ + +export { personalLeft, personalRight, enterpriseLeft, enterpriseRight }; diff --git a/src/components/navbar/types.ts b/src/components/navbar/types.ts new file mode 100644 index 0000000..b2beec0 --- /dev/null +++ b/src/components/navbar/types.ts @@ -0,0 +1,41 @@ +// ============================================================ +// 导航栏类型定义 +// ============================================================ + +import type { Edition } from '@shared/types'; + +/** 导航项的行为类型 */ +export type NavAction = + | 'navigate' // 新开窗口 + | 'spa' // 单页应用内导航(当前窗口) + | 'drawer' // 侧拉抽屉(公告等) + | 'button' // 纯按钮行为(退出登录) + | 'external'; // 外部链接 + +/** 单个导航项配置 */ +export interface NavItemConfig { + /** 唯一标识 */ + key: string; + /** 显示文字 */ + label: string; + /** SVG 图标资源路径(Vite import 后的 URL) */ + iconSrc?: string; + /** 行为类型 */ + action: NavAction; + /** 点击回调 / 路由路径 / 外部 URL(取决于 action) */ + target?: string; + /** 仅在指定版本下显示 */ + edition?: Edition | Edition[]; + /** 仅已登录时显示 */ + requireLogin?: boolean; + /** 仅未登录时显示 */ + requireGuest?: boolean; + /** 排列位置 */ + position: 'left' | 'right'; +} + +/** 导航栏配置(按版本分组) */ +export interface NavBarConfig { + left: NavItemConfig[]; + right: NavItemConfig[]; +} diff --git a/src/contexts/app-context.ts b/src/contexts/app-context.ts new file mode 100644 index 0000000..a92832b --- /dev/null +++ b/src/contexts/app-context.ts @@ -0,0 +1,35 @@ +// ============================================================ +// AppContext — 全局应用状态 +// ============================================================ + +import { createContext, useContext } from 'react'; +import type { Platform, Edition } from '@shared/types'; + +// ---------- Context 类型 ---------- + +export interface AppContextValue { + /** 当前操作系统平台 */ + platform: Platform; + /** 产品版本(个人版 / 企业版) */ + edition: Edition; + /** 用户是否已登录 */ + isLoggedIn: boolean; + /** 登录(TODO: 接入真实认证) */ + login: () => void; + /** 退出登录 */ + logout: () => void; + /** 是否为开发环境 */ + isDevMode: boolean; +} + +export const AppContext = createContext(null); + +// ---------- Consumer Hook ---------- + +export function useAppContext(): AppContextValue { + const ctx = useContext(AppContext); + if (!ctx) { + throw new Error('useAppContext() 必须在 内部调用'); + } + return ctx; +} diff --git a/src/hooks/use-theme.ts b/src/hooks/use-theme.ts new file mode 100644 index 0000000..fcce294 --- /dev/null +++ b/src/hooks/use-theme.ts @@ -0,0 +1,61 @@ +// ============================================================ +// useTheme — 亮/暗主题切换 Hook +// ============================================================ + +import { createContext, useContext } from 'react'; + +// ---------- Context 类型 ---------- + +export interface ThemeContextValue { + isDark: boolean; + toggleTheme: () => void; + setLight: () => void; + setDark: () => void; +} + +export const ThemeContext = createContext(null); + +// ---------- 工具函数 ---------- + +export const STORAGE_KEY = 'ele-heixiu-theme'; + +export function readStoredTheme(): boolean { + try { + const stored = localStorage.getItem(STORAGE_KEY); + if (stored === 'dark') return true; + if (stored === 'light') return false; + } catch { + /* 静默忽略 */ + } + if (typeof window !== 'undefined' && window.matchMedia) { + return window.matchMedia('(prefers-color-scheme: dark)').matches; + } + return false; +} + +export function writeStoredTheme(isDark: boolean): void { + try { + localStorage.setItem(STORAGE_KEY, isDark ? 'dark' : 'light'); + } catch { + /* 静默忽略 */ + } +} + +export function applyHtmlTheme(isDark: boolean): void { + document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light'); + if (isDark) { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } +} + +// ---------- Consumer Hook ---------- + +export function useTheme(): ThemeContextValue { + const ctx = useContext(ThemeContext); + if (!ctx) { + throw new Error('useTheme() 必须在 内部调用'); + } + return ctx; +} diff --git a/src/hooks/use-updater.ts b/src/hooks/use-updater.ts new file mode 100644 index 0000000..398ab66 --- /dev/null +++ b/src/hooks/use-updater.ts @@ -0,0 +1,136 @@ +// ============================================================ +// useUpdater — 渲染进程中的更新状态管理 +// +// 用法: +// const { status, progress, checkForUpdates, installUpdate } = useUpdater(); +// +// 状态机:idle → checking → (no-update | available → downloading → downloaded → idle) +// ============================================================ + +import { useState, useEffect, useCallback, useRef } from 'react'; + +import { safeIpcInvoke, safeIpcOn, safeIpcOff, safeIpcSend } from '@/utils/ipc'; + +// ---------- 类型 ---------- + +export type UpdaterStatus = + | 'idle' // 空闲 + | 'checking' // 正在检查 + | 'no-update' // 已是最新 + | 'available' // 发现新版本,准备下载 + | 'downloading' // 下载中 + | 'downloaded' // 下载完成,待安装 + | 'error'; // 出错 + +export interface UpdateInfo { + version: string; + releaseDate?: string; + releaseNotes?: string; + forceUpdate?: boolean; +} + +export interface UpdateProgress { + percent: number; + bytesPerSecond?: number; + transferred?: number; + total?: number; +} + +export interface UpdateError { + message: string; +} + +// ---------- IPC 通道名(与主进程 updater.ts 保持一致)---------- + +const CH = { + UPDATE_AVAILABLE: 'update-available', + UPDATE_PROGRESS: 'update-progress', + UPDATE_DOWNLOADED: 'update-downloaded', + UPDATE_ERROR: 'update-error', + UPDATE_NOT_AVAILABLE: 'update-not-available', + INSTALL_UPDATE: 'install-update', + CHECK_FOR_UPDATE: 'check-for-update', +} as const; + +// ---------- Hook ---------- + +export function useUpdater() { + const [status, setStatus] = useState('idle'); + const [info, setInfo] = useState(null); + const [progress, setProgress] = useState({ percent: 0 }); + const [error, setError] = useState(null); + + // 防止 StrictMode 双重监听 + const registered = useRef(false); + + useEffect(() => { + if (registered.current) return; + registered.current = true; + + safeIpcOn(CH.UPDATE_AVAILABLE, (_event: unknown, ...args: unknown[]) => { + setInfo(args[0] as UpdateInfo); + setStatus('available'); + }); + + safeIpcOn(CH.UPDATE_PROGRESS, (_event: unknown, ...args: unknown[]) => { + setStatus('downloading'); + setProgress(args[0] as UpdateProgress); + }); + + safeIpcOn(CH.UPDATE_DOWNLOADED, () => { + setStatus('downloaded'); + }); + + safeIpcOn(CH.UPDATE_ERROR, (_event: unknown, ...args: unknown[]) => { + setError(args[0] as UpdateError); + setStatus('error'); + }); + + safeIpcOn(CH.UPDATE_NOT_AVAILABLE, () => { + setStatus('no-update'); + }); + + return () => { + safeIpcOff(CH.UPDATE_AVAILABLE, () => {}); + safeIpcOff(CH.UPDATE_PROGRESS, () => {}); + safeIpcOff(CH.UPDATE_DOWNLOADED, () => {}); + safeIpcOff(CH.UPDATE_ERROR, () => {}); + safeIpcOff(CH.UPDATE_NOT_AVAILABLE, () => {}); + }; + }, []); + + /** 手动检查更新 */ + const checkForUpdates = useCallback(async () => { + setStatus('checking'); + setError(null); + try { + await safeIpcInvoke(CH.CHECK_FOR_UPDATE); + } catch (err) { + setStatus('error'); + setError({ message: (err as Error).message || '检查更新失败' }); + } + }, []); + + /** 确认安装更新(退出 → 安装 → 重启) */ + const installUpdate = useCallback(() => { + safeIpcSend(CH.INSTALL_UPDATE); + }, []); + + /** 重置状态 */ + const reset = useCallback(() => { + setStatus('idle'); + setInfo(null); + setProgress({ percent: 0 }); + setError(null); + }, []); + + return { + status, + info, + progress, + error, + checkForUpdates, + installUpdate, + reset, + } as const; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..514c635 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { App as AntdApp } from 'antd'; + +import App from './App'; +import { ThemeProvider } from './components/ThemeProvider'; +import { AppProvider } from './components/AppProvider'; +// 全局样式(包含 Tailwind 指令 + 主题扩展 + 重置) +import './theme/globals.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + {/* AppProvider — 全局应用状态(平台/版本/登录态) */} + + {/* ThemeProvider 内部管理 ConfigProvider(亮色/暗色切换) */} + + {/* AntdApp 提供 message / notification / modal 的静态方法上下文 */} + + + + + + , +); + +// 仅在 Electron 环境中监听主进程消息(浏览器预览时跳过) +import { safeIpcOn } from './utils/ipc'; +safeIpcOn('main-process-message', (_event: unknown, message: unknown) => { + console.log('[Main Process Message]:', message); +}); diff --git a/src/pages/login/components/FormField.tsx b/src/pages/login/components/FormField.tsx new file mode 100644 index 0000000..26c6570 --- /dev/null +++ b/src/pages/login/components/FormField.tsx @@ -0,0 +1,92 @@ +// ============================================================ +// FormField — 单个表单字段(数据驱动渲染) +// 根据 FieldConfig 自动选择 Input / Input.Password 及附加操作按钮 +// ============================================================ + +import { useCallback } from 'react'; +import { Input, Button, Form } from 'antd'; +import type { FieldConfig } from '../types'; + +interface FormFieldProps { + config: FieldConfig; + value: string; + onChange: (name: string, value: string) => void; + errors: string[]; + /** 发送短信验证码回调 */ + onSendSms?: () => void; + /** 验证码按钮冷却中 */ + smsCooldown?: boolean; + /** 冷却剩余秒数 */ + smsSecondsLeft?: number; +} + +export function FormField({ + config, + value, + onChange, + errors, + onSendSms, + smsCooldown, + smsSecondsLeft, +}: FormFieldProps) { + const hasError = errors.length > 0; + const isPassword = config.inputType === 'password'; + + const handleChange = useCallback( + (e: React.ChangeEvent) => { + onChange(config.name, e.target.value); + }, + [config.name, onChange], + ); + + return ( + + {config.label} + {config.optional && (选填)} + + } + validateStatus={hasError ? 'error' : undefined} + help={hasError ? errors[0] : undefined} + className="!mb-3" + > + {isPassword ? ( + + ) : config.extraAction === 'send-sms' ? ( +
+ + +
+ ) : ( + + )} +
+ ); +} diff --git a/src/pages/login/components/LoginForm.tsx b/src/pages/login/components/LoginForm.tsx new file mode 100644 index 0000000..a2de23f --- /dev/null +++ b/src/pages/login/components/LoginForm.tsx @@ -0,0 +1,216 @@ +// ============================================================ +// LoginForm — 登录表单 +// ============================================================ + +import { useState, useCallback } from 'react'; +import { Input, Button, Checkbox, Typography } from 'antd'; +import { UserOutlined, LockOutlined } from '@ant-design/icons'; + +import { loginFields } from '../config/login-fields'; +import { validateForm } from '../config/validators'; +import { LegalTextModal } from '@/components/common/LegalTextModal'; +import type { LoginFormValues } from '../types'; + +const { Text } = Typography; + +interface LoginFormProps { + initialUsername?: string; + initialPassword?: string; + initialRemember?: boolean; + initialAutoLogin?: boolean; + submitting?: boolean; + onSubmit: (values: LoginFormValues) => void; + onRememberChange: (checked: boolean) => void; + onAutoLoginChange: (checked: boolean) => void; +} + +export function LoginForm({ + initialUsername, + initialPassword, + initialRemember = false, + initialAutoLogin = false, + submitting = false, + onSubmit, + onRememberChange, + onAutoLoginChange, +}: LoginFormProps) { + const [username, setUsername] = useState(initialUsername || ''); + const [password, setPassword] = useState(initialPassword || ''); + const [remember, setRemember] = useState(initialRemember); + const [autoLogin, setAutoLogin] = useState(initialAutoLogin); + const [agreed, setAgreed] = useState(false); + const [errors, setErrors] = useState>({}); + + // 协议弹窗 + const [legalType, setLegalType] = useState<'service' | 'points' | null>(null); + + const clearError = (name: string) => + setErrors((p) => { + const n = { ...p }; + delete n[name]; + return n; + }); + + const handleSubmit = useCallback(() => { + const values = { username, password }; + const fieldErrors = validateForm(values, loginFields); + if (Object.keys(fieldErrors).length > 0) { + setErrors(fieldErrors); + return; + } + if (!agreed) { + setErrors({ _agreement: ['请先阅读并同意用户协议'] }); + return; + } + setErrors({}); + onSubmit({ username, password, remember, autoLogin: remember && autoLogin }); + }, [username, password, remember, autoLogin, agreed, onSubmit]); + + return ( + <> +
+ {/* 用户名 */} +
+ } + placeholder="用户名" + value={username} + onChange={(e) => { + setUsername(e.target.value); + clearError('username'); + }} + status={errors.username ? 'error' : undefined} + allowClear + /> + {errors.username && ( + + {errors.username[0]} + + )} +
+ + {/* 密码 */} +
+ } + placeholder="密码" + value={password} + onChange={(e) => { + setPassword(e.target.value); + clearError('password'); + }} + status={errors.password ? 'error' : undefined} + allowClear + /> + {errors.password && ( + + {errors.password[0]} + + )} +
+ + {/* 记住密码 / 自动登录 / 忘记密码 */} +
+
+ { + const checked = e.target.checked; + setRemember(checked); + onRememberChange(checked); + // 取消记住密码 → 同时取消自动登录 + if (!checked) { + setAutoLogin(false); + onAutoLoginChange(false); + } + }} + className="text-xs" + > + 记住密码 + + { + const checked = e.target.checked; + setAutoLogin(checked); + onAutoLoginChange(checked); + // 勾选自动登录 → 同时勾选记住密码 + if (checked && !remember) { + setRemember(true); + onRememberChange(true); + } + }} + className="text-xs" + > + 自动登录 + +
+ { + /* TODO: 忘记密码流程 */ + }} + > + 忘记密码? + +
+ + {/* 用户协议 */} +
+ { + setAgreed(e.target.checked); + clearError('_agreement'); + }} + className="text-xs" + > + 已阅读并同意 + { + e.stopPropagation(); + setLegalType('service'); + }} + > + 《用户服务协议》 + + 和 + { + e.stopPropagation(); + setLegalType('points'); + }} + > + 《积分充值服务协议》 + + + {errors._agreement && ( + + {errors._agreement[0]} + + )} +
+ + {/* 登录按钮 */} + +
+ + {/* 协议弹窗 */} + {legalType && setLegalType(null)} />} + + ); +} diff --git a/src/pages/login/components/RegisterForm.tsx b/src/pages/login/components/RegisterForm.tsx new file mode 100644 index 0000000..fffe8bd --- /dev/null +++ b/src/pages/login/components/RegisterForm.tsx @@ -0,0 +1,258 @@ +// ============================================================ +// RegisterForm — 注册表单(仅个人版) +// ============================================================ + +import { useState, useCallback, useRef } from 'react'; +import { Input, Button, Checkbox, Typography } from 'antd'; + +import { LegalTextModal } from '@/components/common/LegalTextModal'; +import { + UserOutlined, + LockOutlined, + PhoneOutlined, + SafetyCertificateOutlined, + LaptopOutlined, + TagOutlined, + SmileOutlined, + GiftOutlined, +} from '@ant-design/icons'; + +import { registerFields } from '../config/register-fields'; +import { validateForm } from '../config/validators'; +import type { RegisterFormValues } from '../types'; + +const { Text } = Typography; + +interface RegisterFormProps { + submitting?: boolean; + onSubmit: (values: RegisterFormValues) => void; + onSendSms?: (phone: string) => void; +} + +/** 字段名 → 图标映射 */ +const iconMap: Record = { + username: , + password: , + confirmPassword: , + phone: , + sms_code: , + device_id: , + device_label: , + display_name: , + referral_code: , +}; + +export function RegisterForm({ submitting = false, onSubmit, onSendSms }: RegisterFormProps) { + const [values, setValues] = useState>({}); + const [agreed, setAgreed] = useState(false); + const [errors, setErrors] = useState>({}); + const [legalType, setLegalType] = useState<'service' | 'points' | null>(null); + + // 验证码冷却 + const [smsCooldown, setSmsCooldown] = useState(false); + const [smsSeconds, setSmsSeconds] = useState(0); + const smsTimer = useRef | null>(null); + + // 字段值变更 + const handleChange = useCallback((name: string, value: string) => { + setValues((p) => ({ ...p, [name]: value })); + setErrors((p) => { + const n = { ...p }; + delete n[name]; + return n; + }); + }, []); + + // 发送验证码 + const handleSendSms = useCallback(() => { + const phone = values.phone || ''; + const phoneConfig = registerFields.find((f) => f.name === 'phone')!; + const phoneErrors = validateForm({ phone }, [phoneConfig]); + if (Object.keys(phoneErrors).length > 0) { + setErrors((p) => ({ ...p, phone: phoneErrors.phone })); + return; + } + setSmsCooldown(true); + setSmsSeconds(60); + smsTimer.current = setInterval(() => { + setSmsSeconds((prev) => { + if (prev <= 1) { + clearInterval(smsTimer.current!); + setSmsCooldown(false); + return 0; + } + return prev - 1; + }); + }, 1000); + onSendSms?.(phone); + }, [values.phone, onSendSms]); + + // 跨字段校验 + const crossValidators = { + confirmPassword: (val: string) => { + if (!val) return '请再次输入密码'; + if (val !== values.password) return '两次密码不一致'; + return null; + }, + }; + + // 提交 + const handleSubmit = useCallback(() => { + const fieldErrors = validateForm(values, registerFields, crossValidators); + if (Object.keys(fieldErrors).length > 0) { + setErrors(fieldErrors); + return; + } + if (!agreed) { + setErrors({ _agreement: ['请先阅读并同意用户协议'] }); + return; + } + setErrors({}); + onSubmit(values as unknown as RegisterFormValues); + }, [values, agreed, onSubmit]); + + // 渲染单个字段 + const renderField = (field: (typeof registerFields)[number]) => { + const val = values[field.name] || ''; + const err = errors[field.name]; + const isPassword = field.inputType === 'password'; + const hasSms = field.extraAction === 'send-sms'; + + return ( +
+ {hasSms ? ( +
+ handleChange(field.name, e.target.value)} + status={err ? 'error' : undefined} + className="flex-1" + allowClear + /> + +
+ ) : isPassword ? ( + handleChange(field.name, e.target.value)} + status={err ? 'error' : undefined} + allowClear + /> + ) : ( + handleChange(field.name, e.target.value)} + status={err ? 'error' : undefined} + allowClear + /> + )} + {err && ( + + {err[0]} + + )} +
+ ); + }; + + const requiredFields = registerFields.filter((f) => !f.optional); + const optionalFields = registerFields.filter((f) => f.optional); + + return ( + <> +
+ {/* 必填字段 */} + {requiredFields.map(renderField)} + + {/* 选填字段 */} + {optionalFields.length > 0 && ( + <> + + —— 以下为选填信息 —— + + {optionalFields.map(renderField)} + + )} + + {/* 邀请码说明 */} + + 填写邀请码可触发邀请佣金逻辑,审核通过后获得奖励 + + + {/* 用户协议 */} +
+ { + setAgreed(e.target.checked); + setErrors((p) => { + const n = { ...p }; + delete n._agreement; + return n; + }); + }} + className="text-xs" + > + 已阅读并同意 + { + e.stopPropagation(); + setLegalType('service'); + }} + > + 《用户服务协议》 + + 和 + { + e.stopPropagation(); + setLegalType('points'); + }} + > + 《积分充值服务协议》 + + + {errors._agreement && ( + + {errors._agreement[0]} + + )} +
+ + {/* 注册按钮 */} + +
+ + {/* 协议弹窗 */} + {legalType && setLegalType(null)} />} + + ); +} diff --git a/src/pages/login/config/login-fields.ts b/src/pages/login/config/login-fields.ts new file mode 100644 index 0000000..2b48131 --- /dev/null +++ b/src/pages/login/config/login-fields.ts @@ -0,0 +1,40 @@ +// ============================================================ +// 登录表单 — 字段配置(纯数据,驱动 UI 渲染) +// 修改校验规则或字段属性只需改此文件,无需动 UI 代码 +// ============================================================ + +import type { FieldConfig } from '../types'; + +export const loginFields: FieldConfig[] = [ + { + name: 'username', + label: '用户名', + placeholder: '请输入用户名', + inputType: 'text', + rules: [ + { required: true, message: '请输入用户名' }, + { minLen: 3, message: '用户名至少 3 位' }, + { maxLen: 64, message: '用户名最多 64 位' }, + { pattern: /^[a-zA-Z0-9\-_.]+$/, message: '仅允许字母、数字、-、_、.' }, + ], + }, + { + name: 'password', + label: '密码', + placeholder: '请输入密码', + inputType: 'password', + rules: [ + { required: true, message: '请输入密码' }, + { minLen: 6, message: '密码至少 6 位' }, + { maxLen: 128, message: '密码最多 128 位' }, + ], + }, +]; + +/** 登录表单初始值 */ +export const loginInitialValues = { + username: '', + password: '', + remember: false, + autoLogin: false, +}; diff --git a/src/pages/login/config/register-fields.ts b/src/pages/login/config/register-fields.ts new file mode 100644 index 0000000..d349990 --- /dev/null +++ b/src/pages/login/config/register-fields.ts @@ -0,0 +1,116 @@ +// ============================================================ +// 注册表单 — 字段配置(纯数据,驱动 UI 渲染) +// 修改校验规则或字段属性只需改此文件,无需动 UI 代码 +// ============================================================ + +import type { FieldConfig } from '../types'; + +export const registerFields: FieldConfig[] = [ + { + name: 'username', + label: '用户名', + placeholder: '3~64位,字母/数字/-/_/.', + inputType: 'text', + rules: [ + { required: true, message: '请输入用户名' }, + { minLen: 3, message: '用户名至少 3 位' }, + { maxLen: 64, message: '用户名最多 64 位' }, + { pattern: /^[a-zA-Z0-9\-_.]+$/, message: '仅允许字母、数字、-、_、.' }, + ], + }, + { + name: 'password', + label: '密码', + placeholder: '6~128位', + inputType: 'password', + rules: [ + { required: true, message: '请输入密码' }, + { minLen: 6, message: '密码至少 6 位' }, + { maxLen: 128, message: '密码最多 128 位' }, + ], + }, + { + name: 'confirmPassword', + label: '确认密码', + placeholder: '请再次输入密码', + inputType: 'password', + rules: [{ required: true, message: '请再次输入密码' }], + }, + { + name: 'phone', + label: '手机号', + placeholder: '请输入手机号', + inputType: 'tel', + rules: [ + { required: true, message: '请输入手机号' }, + { minLen: 5, message: '手机号至少 5 位' }, + { maxLen: 32, message: '手机号最多 32 位' }, + { pattern: /^\+?[0-9]+$/, message: '手机号格式不正确' }, + ], + }, + { + name: 'sms_code', + label: '短信验证码', + placeholder: '请输入验证码', + inputType: 'text', + rules: [ + { required: true, message: '请输入验证码' }, + { minLen: 4, message: '验证码至少 4 位' }, + { maxLen: 8, message: '验证码最多 8 位' }, + { pattern: /^[0-9]+$/, message: '验证码仅允许数字' }, + ], + extraAction: 'send-sms', + cooldown: 60, + }, + { + name: 'device_id', + label: '设备标识', + placeholder: '网卡MAC地址', + inputType: 'text', + rules: [ + { required: true, message: '请输入设备标识' }, + { minLen: 8, message: '设备标识至少 8 位' }, + { maxLen: 128, message: '设备标识最多 128 位' }, + ], + }, + { + name: 'device_label', + label: '设备标签', + placeholder: '如"办公电脑"(可选)', + inputType: 'text', + optional: true, + rules: [{ maxLen: 64, message: '设备标签最多 64 位' }], + }, + { + name: 'display_name', + label: '个人昵称', + placeholder: '如何称呼您(可选)', + inputType: 'text', + optional: true, + rules: [{ maxLen: 32, message: '昵称最多 32 位' }], + }, + { + name: 'referral_code', + label: '邀请码', + placeholder: '如有邀请码请填写(可选)', + inputType: 'text', + optional: true, + rules: [ + { maxLen: 32, message: '邀请码最多 32 位' }, + { pattern: /^[a-zA-Z0-9]*$/, message: '仅允许字母和数字' }, + ], + }, +]; + +/** 注册表单初始值 */ +export const registerInitialValues = { + username: '', + password: '', + confirmPassword: '', + phone: '', + sms_code: '', + device_id: '', + device_label: '', + display_name: '', + referral_code: '', +}; diff --git a/src/pages/login/config/validators.ts b/src/pages/login/config/validators.ts new file mode 100644 index 0000000..ae6be6a --- /dev/null +++ b/src/pages/login/config/validators.ts @@ -0,0 +1,136 @@ +// ============================================================ +// 校验函数 — 纯函数,与 UI 层解耦 +// 每个校验器返回 string(错误信息)或 null(通过) +// ============================================================ + +type ValidateResult = string | null; + +/** 用户名:3~64 位,仅允许字母、数字、-、_、. */ +export function validateUsername(value: string): ValidateResult { + if (!value || !value.trim()) return '请输入用户名'; + if (value.length < 3) return '用户名至少 3 位'; + if (value.length > 64) return '用户名最多 64 位'; + if (!/^[a-zA-Z0-9\-_.]+$/.test(value)) return '仅允许字母、数字、-、_、.'; + return null; +} + +/** 密码:6~128 位 */ +export function validatePassword(value: string): ValidateResult { + if (!value) return '请输入密码'; + if (value.length < 6) return '密码至少 6 位'; + if (value.length > 128) return '密码最多 128 位'; + return null; +} + +/** 确认密码:与密码一致 */ +export function validateConfirmPassword(value: string, password: string): ValidateResult { + if (!value) return '请再次输入密码'; + if (value !== password) return '两次输入的密码不一致'; + return null; +} + +/** 手机号:5~32 位数字(可含 + 前缀) */ +export function validatePhone(value: string): ValidateResult { + if (!value) return '请输入手机号'; + if (value.length < 5) return '手机号至少 5 位'; + if (value.length > 32) return '手机号最多 32 位'; + if (!/^\+?[0-9]+$/.test(value)) return '手机号格式不正确'; + return null; +} + +/** 短信验证码:4~8 位数字 */ +export function validateSmsCode(value: string): ValidateResult { + if (!value) return '请输入验证码'; + if (value.length < 4) return '验证码至少 4 位'; + if (value.length > 8) return '验证码最多 8 位'; + if (!/^[0-9]+$/.test(value)) return '验证码仅允许数字'; + return null; +} + +/** 设备 ID:8~128 位 */ +export function validateDeviceId(value: string): ValidateResult { + if (!value) return '请输入设备标识'; + if (value.length < 8) return '设备标识至少 8 位'; + if (value.length > 128) return '设备标识最多 128 位'; + return null; +} + +/** 可选字段:非空时不超过 maxLen */ +export function optionalMaxLen(maxLen: number, label: string) { + return (value: string): ValidateResult => { + if (!value) return null; + if (value.length > maxLen) return `${label}最多 ${maxLen} 位`; + return null; + }; +} + +/** 邀请码:可选,最多 32 位字母数字 */ +export function validateReferralCode(value: string): ValidateResult { + if (!value) return null; + if (value.length > 32) return '邀请码最多 32 位'; + if (!/^[a-zA-Z0-9]+$/.test(value)) return '仅允许字母和数字'; + return null; +} + +/** + * 对一条字段配置执行所有规则校验 + * @returns 错误信息数组(空数组表示通过) + */ +export function validateField(value: string, rules: import('../types').FieldRule[]): string[] { + const errors: string[] = []; + for (const rule of rules) { + // required + if (rule.required && (!value || !value.trim())) { + errors.push(rule.message || '此字段为必填'); + continue; + } + if (!value) continue; // 非必填且为空 → 跳过后续校验 + + // minLen + if (rule.minLen && value.length < rule.minLen) { + errors.push(rule.message || `至少 ${rule.minLen} 位`); + } + // maxLen + if (rule.maxLen && value.length > rule.maxLen) { + errors.push(rule.message || `最多 ${rule.maxLen} 位`); + } + // pattern + if (rule.pattern && !rule.pattern.test(value)) { + errors.push(rule.message || '格式不正确'); + } + } + return errors; +} + +/** + * 校验整个表单 + * @returns 错误映射 { fieldName: errorMsg[] },空对象表示全部通过 + */ +export function validateForm>( + values: T, + fieldConfigs: import('../types').FieldConfig[], + crossValidators?: Record string | null>, +): Record { + const errors: Record = {}; + + for (const config of fieldConfigs) { + const value = values[config.name] || ''; + const fieldErrors = validateField(value, config.rules); + if (fieldErrors.length > 0) { + errors[config.name] = fieldErrors; + } + } + + // 跨字段校验(如确认密码) + if (crossValidators) { + for (const [name, fn] of Object.entries(crossValidators)) { + const value = values[name] || ''; + const err = fn(value, values); + if (err) { + errors[name] = [...(errors[name] || []), err]; + } + } + } + + return errors; +} diff --git a/src/pages/login/hooks/use-auth-state.ts b/src/pages/login/hooks/use-auth-state.ts new file mode 100644 index 0000000..da90e09 --- /dev/null +++ b/src/pages/login/hooks/use-auth-state.ts @@ -0,0 +1,131 @@ +// ============================================================ +// useAuthState — 记住密码 / 自动登录 状态管理 +// 持久化到 localStorage,下次打开页面自动回填 +// ============================================================ + +import { useState, useCallback } from 'react'; + +const STORAGE_KEY = 'ele-heixiu-auth'; + +interface StoredAuth { + /** 上次登录的用户名 */ + username: string; + /** 加密后的密码(Base64 编码,非安全加密,仅方便回填) */ + password: string; + /** 是否记住密码 */ + remember: boolean; + /** 是否自动登录 */ + autoLogin: boolean; +} + +/** 简单 Base64 编解码(非安全加密,仅避免明文存储) */ +function encode(str: string): string { + try { + return btoa(decodeURI(encodeURIComponent(str))); + } catch { + return ''; + } +} +function decode(str: string): string { + try { + return decodeURIComponent(decodeURI(atob(str))); + } catch { + return ''; + } +} + +/** 从 localStorage 读取已保存的认证信息 */ +function readAuth(): StoredAuth | null { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return null; + return JSON.parse(raw) as StoredAuth; + } catch { + return null; + } +} + +/** 写入 localStorage */ +function writeAuth(auth: StoredAuth): void { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(auth)); + } catch { + /* 静默 */ + } +} + +/** 清除 localStorage */ +function clearAuth(): void { + try { + localStorage.removeItem(STORAGE_KEY); + } catch { + /* 静默 */ + } +} + +// ---------- Hook ---------- + +export function useAuthState() { + // 初始化:从 localStorage 恢复 + const [username, setUsername] = useState(() => readAuth()?.username || ''); + const [password, setPassword] = useState(() => { + const auth = readAuth(); + return auth?.remember ? decode(auth.password) : ''; + }); + const [remember, setRemember] = useState(() => readAuth()?.remember || false); + const [autoLogin, setAutoLogin] = useState(() => readAuth()?.autoLogin || false); + + // 勾选"记住密码"变化时持久化 + const handleRememberChange = useCallback((checked: boolean) => { + setRemember(checked); + if (!checked) { + // 取消记住密码 → 同时取消自动登录 + setAutoLogin(false); + clearAuth(); + } + }, []); + + // 勾选"自动登录"变化时持久化 + const handleAutoLoginChange = useCallback((checked: boolean) => { + setAutoLogin(checked); + }, []); + + // 登录成功后保存 + const saveAuth = useCallback( + (user: string, pass: string) => { + setUsername(user); + if (remember) { + setPassword(pass); + writeAuth({ + username: user, + password: encode(pass), + remember, + autoLogin, + }); + } + }, + [remember, autoLogin], + ); + + // 清除保存的认证信息 + const clearSavedAuth = useCallback(() => { + setUsername(''); + setPassword(''); + setRemember(false); + setAutoLogin(false); + clearAuth(); + }, []); + + return { + username, + password, + remember, + autoLogin, + setUsername, + setPassword, + handleRememberChange, + handleAutoLoginChange, + saveAuth, + clearSavedAuth, + }; +} diff --git a/src/pages/login/index.tsx b/src/pages/login/index.tsx new file mode 100644 index 0000000..b594539 --- /dev/null +++ b/src/pages/login/index.tsx @@ -0,0 +1,149 @@ +// ============================================================ +// LoginPage — 登录/注册 Modal 弹层 +// +// 行为: +// - 未登录时弹出,不可操作主页(Modal 遮罩) +// - 可关闭(右上 X),关闭后主页可操作,但 API 401 时会再次弹出 +// - 登录成功 → 关闭 Modal,更新全局登录态 +// ============================================================ + +import { useState, useCallback } from 'react'; +import { Modal, Tabs, Typography, App } from 'antd'; + +import { useAppContext } from '@/contexts/app-context.ts'; +import { useTheme } from '@/hooks/use-theme.ts'; +import { LoginForm } from './components/LoginForm'; +import { RegisterForm } from './components/RegisterForm'; +import { useAuthState } from './hooks/use-auth-state'; +import type { LoginFormValues, RegisterFormValues } from './types'; + +const { Text } = Typography; + +interface LoginPageProps { + open: boolean; + onClose: () => void; +} + +export function LoginPage({ open, onClose }: LoginPageProps) { + const { edition, login } = useAppContext(); + const { isDark } = useTheme(); + const { message } = App.useApp(); + + const isEnterprise = edition === 'enterprise'; + const [activeTab, setActiveTab] = useState('login'); + const [submitting, setSubmitting] = useState(false); + + const authState = useAuthState(); + + // ========== 登录 ========== + + const handleLogin = useCallback( + async (values: LoginFormValues) => { + setSubmitting(true); + try { + // TODO: 接入登录 API + console.log('[Login]', values); + authState.saveAuth(values.username, values.password); + message.success('登录成功(Demo)'); + login(); + onClose(); + } catch (err) { + message.error((err as Error).message || '登录失败'); + } finally { + setSubmitting(false); + } + }, + [authState, message, login, onClose], + ); + + // ========== 注册 ========== + + const handleRegister = useCallback( + async (values: RegisterFormValues) => { + setSubmitting(true); + try { + console.log('[Register]', values); + message.success('注册成功(Demo),请登录'); + setActiveTab('login'); + } catch (err) { + message.error((err as Error).message || '注册失败'); + } finally { + setSubmitting(false); + } + }, + [message], + ); + + const handleSendSms = useCallback( + (phone: string) => { + console.log('[SMS]', phone); + message.info(`验证码已发送到 ${phone}(Demo)`); + }, + [message], + ); + + // ========== 渲染 ========== + + const loginTab = ( + + ); + + const registerTab = ( + + ); + + return ( + + {/* 标题 */} +
+ + 船长 · HeiXiu + + + {isEnterprise ? '企业版 — 员工账号登录' : '个人版'} + +
+ + {/* 个人版 Tab | 企业版仅登录 */} + {isEnterprise ? ( + loginTab + ) : ( + + )} +
+ ); +} diff --git a/src/pages/login/types.ts b/src/pages/login/types.ts new file mode 100644 index 0000000..f441e0a --- /dev/null +++ b/src/pages/login/types.ts @@ -0,0 +1,52 @@ +// ============================================================ +// 登录/注册 — 类型定义 +// ============================================================ + +// ---------- 登录 ---------- + +export interface LoginFormValues { + username: string; + password: string; + remember: boolean; + autoLogin: boolean; +} + +// ---------- 注册(个人版) ---------- + +export interface RegisterFormValues { + username: string; + password: string; + confirmPassword: string; + phone: string; + sms_code: string; + device_id: string; + device_label: string; + display_name: string; + referral_code: string; +} + +// ---------- 字段配置(数据驱动 UI 渲染) ---------- + +export interface FieldRule { + required?: boolean; + minLen?: number; + maxLen?: number; + pattern?: RegExp; + message?: string; +} + +export type InputType = 'text' | 'password' | 'tel'; + +export interface FieldConfig { + name: string; + label: string; + placeholder: string; + inputType: InputType; + rules: FieldRule[]; + /** 仅注册表单的选填字段 */ + optional?: boolean; + /** 附带操作按钮标识 */ + extraAction?: 'send-sms'; + /** 冷却秒数(发送验证码按钮用) */ + cooldown?: number; +} diff --git a/src/services/modules/announcement.ts b/src/services/modules/announcement.ts new file mode 100644 index 0000000..b203c53 --- /dev/null +++ b/src/services/modules/announcement.ts @@ -0,0 +1,38 @@ +// ============================================================ +// 公告模块 — 类型定义 + API 请求 +// GET /api/v1/announcements +// ============================================================ + +import { get } from '../request'; + +// ---------- 类型 ---------- + +/** 公告类型枚举 */ +export type AnnouncementType = 'system' | 'feature' | 'activity' | 'maintenance' | string; + +/** 单条公告 */ +export interface Announcement { + id: number; + title: string; + content: string; + type: AnnouncementType; + is_active: boolean; + pinned: boolean; + expires_at: string; + created_by: string; + created_at: string; + updated_at: string; +} + +/** 公告列表响应 */ +export type AnnouncementListResponse = Announcement[]; + +// ---------- API ---------- + +/** + * 获取公告列表 + * GET /api/v1/announcements + */ +export function fetchAnnouncements(): Promise { + return get('/api/v1/announcements'); +} diff --git a/src/services/modules/index.ts b/src/services/modules/index.ts new file mode 100644 index 0000000..74608b8 --- /dev/null +++ b/src/services/modules/index.ts @@ -0,0 +1,11 @@ +// ============================================================ +// API 模块统一导出 +// 后续新增模块(如 auth、user、billing 等)在此追加 +// ============================================================ + +export { + fetchAnnouncements, + type Announcement, + type AnnouncementType, + type AnnouncementListResponse, +} from './announcement'; diff --git a/src/services/request.ts b/src/services/request.ts new file mode 100644 index 0000000..6e9fe2b --- /dev/null +++ b/src/services/request.ts @@ -0,0 +1,285 @@ +// ============================================================ +// Axios 请求封装 +// +// 功能: +// - 统一 BaseURL(环境变量 VITE_API_BASE_URL) +// - 请求拦截器:自动附加 Token +// - 响应拦截器:统一错误处理、业务码校验 +// - 类型安全的 GET / POST / PUT / DELETE / UPLOAD +// - 请求超时、取消请求支持 +// ============================================================ + +import axios, { + type AxiosInstance, + type AxiosRequestConfig, + type AxiosResponse, + type InternalAxiosRequestConfig, +} from 'axios'; +import type { ApiResponse } from './types'; +import { RequestError, RequestErrorType } from './types'; +import { emit, EVENTS } from '../utils/event-bus'; + +// ---------- 配置 ---------- + +/** API 基础地址(可通过 Vite 环境变量覆盖) */ +const BASE_URL = import.meta.env.VITE_API_BASE_URL; +/** 请求超时时间(毫秒) */ +const TIMEOUT = 30000; + +/** localStorage 中 Token 的键名 */ +const TOKEN_KEY = 'ele-heixiu-token'; + +// ---------- Token 管理 ---------- + +/** 获取存储的 Token */ +export function getToken(): string | null { + try { + return localStorage.getItem(TOKEN_KEY); + } catch { + return null; + } +} + +/** 设置 Token */ +export function setToken(token: string): void { + try { + localStorage.setItem(TOKEN_KEY, token); + } catch { + /* 静默忽略 */ + } +} + +/** 清除 Token */ +export function clearToken(): void { + try { + localStorage.removeItem(TOKEN_KEY); + } catch { + /* 静默忽略 */ + } +} + +// ---------- Axios 实例 ---------- + +const instance: AxiosInstance = axios.create({ + baseURL: BASE_URL, + timeout: TIMEOUT, + headers: { + 'Content-Type': 'application/json', + }, +}); + +// ---------- 请求拦截器 ---------- + +instance.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + // 自动附加 Token + const token = getToken(); + if (token && config.headers) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + () => { + return Promise.reject(new RequestError(RequestErrorType.NETWORK, '请求配置失败')); + }, +); + +// ---------- 响应拦截器 ---------- + +instance.interceptors.response.use( + (response: AxiosResponse) => { + const { data } = response; + + // HTTP 200 但业务码非 0 → 业务错误 + if (data && data.code !== 0) { + const err = new RequestError(RequestErrorType.BUSINESS, data.message || '请求失败', { + code: data.code, + traceId: data.traceId, + }); + + // 特殊业务码处理 + if (data.code === 401) { + clearToken(); + emit(EVENTS.AUTH_REQUIRED); + } + + return Promise.reject(err); + } + + return response; + }, + (error) => { + // 请求已被取消 + if (axios.isCancel(error)) { + return Promise.reject(new RequestError(RequestErrorType.CANCELLED, '请求已取消')); + } + + // 超时 + if (error.code === 'ECONNABORTED') { + return Promise.reject(new RequestError(RequestErrorType.TIMEOUT, '请求超时,请检查网络')); + } + + // 无网络 + if (!error.response) { + return Promise.reject(new RequestError(RequestErrorType.NETWORK, '网络异常,请检查连接')); + } + + // HTTP 状态码错误 + const { status, data } = error.response; + let errMsg = '请求失败'; + + switch (status) { + case 400: + errMsg = '请求参数有误'; + break; + case 401: + errMsg = '登录已过期,请重新登录'; + clearToken(); + emit(EVENTS.AUTH_REQUIRED); + break; + case 403: + errMsg = '没有访问权限'; + break; + case 404: + errMsg = '请求的资源不存在'; + break; + case 500: + errMsg = '服务器内部错误'; + break; + case 502: + errMsg = '网关错误'; + break; + case 503: + errMsg = '服务暂时不可用'; + break; + } + + return Promise.reject( + new RequestError(RequestErrorType.HTTP, data?.message || errMsg, { + httpStatus: status, + code: data?.code, + }), + ); + }, +); + +// ---------- 请求方法 ---------- + +/** + * 发起 GET 请求 + * @param url - 请求路径 + * @param params - 查询参数 + * @param config - Axios 配置覆盖 + */ +export async function get( + url: string, + params?: Record, + config?: AxiosRequestConfig, +): Promise { + const res = await instance.get>(url, { ...config, params }); + return res.data.data; +} + +/** + * 发起 POST 请求(JSON) + * @param url - 请求路径 + * @param data - 请求体 + * @param config - Axios 配置覆盖 + */ +export async function post( + url: string, + data?: unknown, + config?: AxiosRequestConfig, +): Promise { + const res = await instance.post>(url, data, config); + return res.data.data; +} + +/** + * 发起 PUT 请求(JSON) + */ +export async function put(url: string, data?: unknown, config?: AxiosRequestConfig): Promise { + const res = await instance.put>(url, data, config); + return res.data.data; +} + +/** + * 发起 DELETE 请求 + */ +export async function del(url: string, config?: AxiosRequestConfig): Promise { + const res = await instance.delete>(url, config); + return res.data.data; +} + +/** + * 文件上传(multipart/form-data) + * @param url - 上传接口路径 + * @param formData - FormData 对象 + * @param onProgress - 上传进度回调 (0~100) + */ +export async function upload( + url: string, + formData: FormData, + onProgress?: (percent: number) => void, +): Promise { + const res = await instance.post>(url, formData, { + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 120000, // 上传超时 2 分钟 + onUploadProgress: (progressEvent) => { + if (onProgress && progressEvent.total) { + const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total); + onProgress(percent); + } + }, + }); + return res.data.data; +} + +/** + * 文件下载 + * @param url - 下载接口路径 + * @param filename - 保存的文件名 + */ +export async function download(url: string, filename?: string): Promise { + const res = await instance.get(url, { + responseType: 'blob', + }); + + const blob = new Blob([res.data]); + const downloadUrl = window.URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = downloadUrl; + anchor.download = filename || 'download'; + document.body.appendChild(anchor); + anchor.click(); + document.body.removeChild(anchor); + window.URL.revokeObjectURL(downloadUrl); +} + +/** + * 创建可取消的请求控制器 + * 用法: + * const { controller, request } = createCancellableRequest(); + * request(get('/some/url')); // 发起请求 + * controller.abort(); // 取消请求 + */ +export function createCancellableRequest() { + const controller = new AbortController(); + return { + controller, + signal: controller.signal, + /** 包裹一个请求 Promise,使其可通过 controller.abort() 取消 */ + request: (promise: Promise): Promise => { + return new Promise((resolve, reject) => { + promise.then(resolve).catch(reject); + controller.signal.addEventListener('abort', () => { + reject(new RequestError(RequestErrorType.CANCELLED, '请求已取消')); + }); + }); + }, + }; +} + +// ---------- 导出 axios 实例(供高级场景直接使用) ---------- +export { instance as axiosInstance }; +export { RequestError, RequestErrorType }; diff --git a/src/services/types.ts b/src/services/types.ts new file mode 100644 index 0000000..b147b49 --- /dev/null +++ b/src/services/types.ts @@ -0,0 +1,71 @@ +// ============================================================ +// API 响应通用类型 +// ============================================================ + +/** 后端统一响应结构 */ +export interface ApiResponse { + /** 业务状态码:0 表示成功 */ + code: number; + /** 响应数据 */ + data: T; + /** 提示信息 */ + message: string; + /** 请求追踪 ID(可选,用于排查问题) */ + traceId?: string; +} + +/** 分页请求参数 */ +export interface PaginationParams { + page: number; + pageSize: number; +} + +/** 分页响应数据 */ +export interface PaginatedData { + /** 数据列表 */ + list: T[]; + /** 总条数 */ + total: number; + /** 当前页码 */ + page: number; + /** 每页条数 */ + pageSize: number; +} + +/** 分页响应包装 */ +export type PaginatedResponse = ApiResponse>; + +/** 请求错误类型 */ +export enum RequestErrorType { + /** 网络错误(断网等) */ + NETWORK = 'NETWORK', + /** 请求超时 */ + TIMEOUT = 'TIMEOUT', + /** HTTP 状态码异常(4xx / 5xx) */ + HTTP = 'HTTP', + /** 业务错误(code ≠ 0) */ + BUSINESS = 'BUSINESS', + /** 请求被取消 */ + CANCELLED = 'CANCELLED', +} + +/** 请求错误 */ +export class RequestError extends Error { + type: RequestErrorType; + code?: number; + httpStatus?: number; + traceId?: string; + + constructor( + type: RequestErrorType, + message: string, + options?: { code?: number; httpStatus?: number; traceId?: string }, + ) { + super(message); + this.name = 'RequestError'; + this.type = type; + this.code = options?.code; + this.httpStatus = options?.httpStatus; + this.traceId = options?.traceId; + } +} diff --git a/src/theme/antd-theme.ts b/src/theme/antd-theme.ts new file mode 100644 index 0000000..c7bec2c --- /dev/null +++ b/src/theme/antd-theme.ts @@ -0,0 +1,312 @@ +// ============================================================ +// Ant Design 主题适配器 —— 蓝紫渐变主题(亮色 + 暗色) +// 通过 ConfigProvider 的 theme 属性覆盖 Ant Design 默认主题变量, +// 确保与 Tailwind 主题令牌(tokens.ts / globals.css)同步。 +// ============================================================ + +import type { ThemeConfig } from 'antd'; +import { theme } from 'antd'; + +import { + colorPrimary, + colorPrimaryLight, + colorSuccess, + colorWarning, + colorError, + colorInfo, + colorTextBase, + colorTextSecondary, + colorBgBase, + colorBgContainer, + colorBgElevated, + colorBgLayout, + colorBorder, + colorBorderSecondary, + borderRadiusBase, + borderRadiusLG, + borderRadiusSM, + borderRadiusXS, + fontFamily, + fontFamilyCode, + fontSizeBase, + fontSizeLG, + fontSizeSM, + fontSizeXL, + boxShadowBase, + boxShadowLG, + gradientPrimary, + // 暗色令牌 + darkColorTextBase, + darkColorTextSecondary, + darkColorTextTertiary, + darkColorBgBase, + darkColorBgContainer, + darkColorBgElevated, + darkColorBgLayout, + darkColorBorder, + darkColorBorderSecondary, +} from './tokens'; + +// ============================================================ +// 共享的组件级覆盖(亮色 & 暗色通用) +// ============================================================ + +const sharedComponents: ThemeConfig['components'] = { + Button: { + colorPrimary, + colorPrimaryHover: colorPrimaryLight, + colorPrimaryActive: '#4F46E5', + primaryShadow: '0 2px 0 rgba(99, 102, 241, 0.15)', + borderRadius: borderRadiusBase, + defaultBorderColor: colorBorder, + }, + Menu: { + itemSelectedBg: '#EEF2FF', + itemSelectedColor: colorPrimary, + itemHoverBg: '#F5F3FF', + itemActiveBg: '#E0E7FF', + }, + Tabs: { + itemSelectedColor: colorPrimary, + itemHoverColor: colorPrimaryLight, + inkBarColor: colorPrimary, + }, + Modal: { + borderRadiusLG, + }, + Card: { + borderRadiusLG, + }, + Tag: { + defaultBg: '#EEF2FF', + defaultColor: colorPrimary, + }, + Input: { + activeBorderColor: colorPrimary, + hoverBorderColor: colorPrimaryLight, + }, + Select: { + activeBorderColor: colorPrimary, + hoverBorderColor: colorPrimaryLight, + }, + DatePicker: { + activeBorderColor: colorPrimary, + hoverBorderColor: colorPrimaryLight, + }, + Switch: { + colorPrimary, + colorPrimaryHover: colorPrimaryLight, + }, + Slider: { + colorPrimary, + colorPrimaryBorder: colorPrimary, + colorPrimaryBorderHover: colorPrimaryLight, + }, + Progress: { + defaultColor: colorPrimary, + }, + Spin: { + colorPrimary, + }, + Breadcrumb: { + linkColor: colorPrimary, + linkHoverColor: colorPrimaryLight, + lastItemColor: colorTextBase, + }, + Pagination: { + itemActiveBg: colorPrimary, + colorPrimary, + colorPrimaryHover: colorPrimaryLight, + }, + Notification: { + borderRadiusLG, + }, + Tooltip: { + borderRadius: borderRadiusSM, + }, +}; + +// ============================================================ +// 共享的 token 基座(不变部分) +// ============================================================ + +const sharedTokens = { + // 品牌色 + colorPrimary, + colorPrimaryBg: '#EEF2FF', + colorPrimaryBgHover: '#E0E7FF', + colorPrimaryBorder: '#C7D2FE', + colorPrimaryBorderHover: '#A5B4FC', + colorPrimaryHover: colorPrimaryLight, + colorPrimaryActive: '#4F46E5', + colorPrimaryTextHover: colorPrimaryLight, + colorPrimaryText: colorPrimary, + colorPrimaryTextActive: '#4338CA', + + // 功能色 + colorSuccess, + colorWarning, + colorError, + colorInfo, + + // 圆角 + borderRadius: borderRadiusBase, + borderRadiusLG, + borderRadiusSM, + borderRadiusXS, + + // 字体 + fontFamily, + fontFamilyCode, + fontSize: fontSizeBase, + fontSizeLG, + fontSizeSM, + fontSizeXL, + fontSizeHeading1: 28, + fontSizeHeading2: 24, + fontSizeHeading3: 20, + fontSizeHeading4: 18, + fontSizeHeading5: 16, + + // 间距 + padding: 16, + paddingLG: 24, + paddingSM: 12, + paddingXS: 8, + paddingXXS: 4, + + // 链接 + colorLink: colorPrimary, + colorLinkHover: colorPrimaryLight, + colorLinkActive: '#4F46E5', +}; + +// ============================================================ +// 🌞 亮色主题配置 +// ============================================================ + +export const lightTheme: ThemeConfig = { + algorithm: theme.defaultAlgorithm, + token: { + ...sharedTokens, + + // 文字色 — 亮色 + colorText: colorTextBase, + colorTextSecondary, + colorTextTertiary: '#9CA3AF', + + // 背景色 — 亮色 + colorBgBase, + colorBgContainer, + colorBgElevated, + colorBgLayout, + + // 边框 — 亮色 + colorBorder, + colorBorderSecondary, + + // 阴影 + boxShadow: boxShadowBase, + boxShadowSecondary: boxShadowLG, + }, + components: { + ...sharedComponents, + Layout: { + siderBg: `linear-gradient(180deg, #1E1B4B 0%, #312E81 100%)`, + headerBg: colorBgBase, + bodyBg: colorBgLayout, + }, + Table: { + headerBg: '#EEF2FF', + headerColor: colorTextBase, + rowHoverBg: '#F5F3FF', + borderColor: colorBorderSecondary, + }, + }, +}; + +// ============================================================ +// 🌙 暗色主题配置 +// ============================================================ + +export const darkTheme: ThemeConfig = { + algorithm: theme.darkAlgorithm, + token: { + ...sharedTokens, + + // 暗色模式下品牌色适当提亮以保证对比度 + colorPrimary: colorPrimaryLight, + colorPrimaryHover: '#A5B4FC', + colorPrimaryActive: colorPrimary, + colorPrimaryBg: '#1E1B4B', + colorPrimaryBgHover: '#312E81', + colorPrimaryBorder: '#4338CA', + colorPrimaryBorderHover: colorPrimary, + colorPrimaryTextHover: '#A5B4FC', + colorPrimaryText: colorPrimaryLight, + colorPrimaryTextActive: colorPrimary, + + // 链接 + colorLink: colorPrimaryLight, + colorLinkHover: '#A5B4FC', + colorLinkActive: colorPrimary, + + // 文字色 — 暗色 + colorText: darkColorTextBase, + colorTextSecondary: darkColorTextSecondary, + colorTextTertiary: darkColorTextTertiary, + + // 背景色 — 暗色 + colorBgBase: darkColorBgBase, + colorBgContainer: darkColorBgContainer, + colorBgElevated: darkColorBgElevated, + colorBgLayout: darkColorBgLayout, + + // 边框 — 暗色 + colorBorder: darkColorBorder, + colorBorderSecondary: darkColorBorderSecondary, + + // 阴影 — 暗色模式下用更深的投影 + boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3)', + boxShadowSecondary: '0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.4)', + }, + components: { + ...sharedComponents, + Button: { + ...sharedComponents?.Button, + defaultBorderColor: darkColorBorder, + }, + Menu: { + itemSelectedBg: '#312E81', + itemSelectedColor: colorPrimaryLight, + itemHoverBg: '#242040', + itemActiveBg: '#1E1B4B', + }, + Layout: { + siderBg: `linear-gradient(180deg, #0B0A15 0%, #1A1730 100%)`, + headerBg: darkColorBgContainer, + bodyBg: darkColorBgLayout, + }, + Table: { + headerBg: '#1E1B4B', + headerColor: darkColorTextBase, + rowHoverBg: '#242040', + borderColor: darkColorBorderSecondary, + }, + Tag: { + defaultBg: '#1E1B4B', + defaultColor: colorPrimaryLight, + }, + }, +}; + +// ============================================================ +// 辅助导出 +// ============================================================ + +/** 根据 isDark 获取对应的主题配置 */ +export function getThemeConfig(isDark: boolean): ThemeConfig { + return isDark ? darkTheme : lightTheme; +} + +export { gradientPrimary }; diff --git a/src/theme/globals.css b/src/theme/globals.css new file mode 100644 index 0000000..f4be31d --- /dev/null +++ b/src/theme/globals.css @@ -0,0 +1,257 @@ +/* ============================================================ + * 全局样式 —— Tailwind CSS v4 指令 + 蓝紫渐变主题扩展 + 重置样式 + * Tailwind v4 使用 CSS @theme 指令替代 tailwind.config.ts, + * 设计令牌需与 tokens.ts / antd-theme.ts 保持同步。 + * ============================================================ */ + +@import 'tailwindcss'; + +/* ============================================================ + * Tailwind CSS v4 主题扩展(用 @theme 指令) + * 此处定义的自定义令牌会自动生成对应的 Tailwind 工具类。 + * 例如:colors.primary → bg-primary, text-primary, border-primary 等。 + * ============================================================ */ + +/* 品牌色 — 蓝紫渐变 */ +@theme { + /* 主色系 */ + --color-primary: #6366f1; /* Indigo-500 */ + --color-primary-light: #818cf8; /* Indigo-400 */ + --color-primary-dark: #4f46e5; /* Indigo-600 */ + --color-primary-50: #eef2ff; /* Indigo-50 */ + --color-primary-100: #e0e7ff; /* Indigo-100 */ + --color-primary-200: #c7d2fe; /* Indigo-200 */ + --color-primary-300: #a5b4fc; /* Indigo-300 */ + --color-primary-400: #818cf8; /* Indigo-400 */ + --color-primary-500: #6366f1; /* Indigo-500 */ + --color-primary-600: #4f46e5; /* Indigo-600 */ + --color-primary-700: #4338ca; /* Indigo-700 */ + --color-primary-800: #3730a3; /* Indigo-800 */ + --color-primary-900: #312e81; /* Indigo-900 */ + + /* 辅助色系 — Violet */ + --color-secondary: #8b5cf6; /* Violet-500 */ + --color-secondary-light: #a78bfa; /* Violet-400 */ + --color-secondary-dark: #7c3aed; /* Violet-600 */ + + /* 功能色 */ + --color-success: #10b981; + --color-success-light: #d1fae5; + --color-warning: #f59e0b; + --color-warning-light: #fef3c7; + --color-error: #ef4444; + --color-error-light: #fee2e2; + --color-info: #3b82f6; + --color-info-light: #dbeafe; + + /* 圆角 */ + --radius-xs: 4px; + --radius-sm: 6px; + --radius-base: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + --radius-2xl: 24px; + + /* 字体 */ + --font-family-base: + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', + 'PingFang SC', 'Microsoft YaHei', sans-serif; + --font-family-mono: + 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, 'Courier New', monospace; + + /* 动画 */ + --transition-duration: 0.2s; + --transition-timing: cubic-bezier(0.4, 0, 0.2, 1); +} + +/* ============================================================ + * 🌞 亮色模式 CSS 变量(默认) + * 这些变量与 tokens.ts 中的亮色令牌同步 + * ============================================================ */ + +:root, +[data-theme='light'] { + /* 中性色 — 亮色 */ + --color-text-base: #1e1b4b; + --color-text-secondary: #6b7280; + --color-text-tertiary: #9ca3af; + --color-bg-base: #ffffff; + --color-bg-container: #f9fafb; + --color-bg-layout: #f5f3ff; + --color-bg-elevated: #ffffff; + --color-border-base: #e5e7eb; + --color-border-secondary: #f3f4f6; + + /* 阴影 */ + --shadow-base: 0 1px 3px 0 rgba(99, 102, 241, 0.08), 0 1px 2px -1px rgba(99, 102, 241, 0.08); + --shadow-lg: 0 10px 15px -3px rgba(99, 102, 241, 0.1), 0 4px 6px -4px rgba(99, 102, 241, 0.1); +} + +/* ============================================================ + * 🌙 暗色模式 CSS 变量 + * 当 时自动切换 + * 这些变量与 tokens.ts 中的暗色令牌同步 + * ============================================================ */ + +[data-theme='dark'] { + /* 中性色 — 暗色 */ + --color-text-base: #e8e6f0; + --color-text-secondary: #a5a0c9; + --color-text-tertiary: #6e6998; + --color-bg-base: #0f0d1a; + --color-bg-container: #1a1730; + --color-bg-layout: #0b0a15; + --color-bg-elevated: #242040; + --color-border-base: #2e2a4a; + --color-border-secondary: #1f1c38; + + /* 暗色模式下品牌色提亮以保持对比度 */ + --color-primary: #818cf8; + --color-primary-light: #a5b4fc; + --color-primary-dark: #6366f1; + + /* 阴影 — 暗色下用深投影 */ + --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.4); +} + +/* ============================================================ + * 蓝紫渐变工具类 + * Tailwind v4 使用 @utility 定义自定义工具类 + * ============================================================ */ + +@utility gradient-primary { + background: linear-gradient(135deg, #4f46e5, #7c3aed); +} + +@utility gradient-primary-hover { + background: linear-gradient(135deg, #6366f1, #8b5cf6); +} + +@utility gradient-primary-text { + background: linear-gradient(135deg, #4f46e5, #7c3aed); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +@utility gradient-border { + border-image: linear-gradient(135deg, #4f46e5, #7c3aed) 1; +} + +/* ============================================================ + * 全局重置样式 + * 仅放必要的重置,不堆积组件样式 + * ============================================================ */ + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: var(--font-family-base); + font-size: 14px; + line-height: 1.5; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + /* 亮/暗切换过渡 */ + color-scheme: light dark; +} + +body { + margin: 0; + padding: 0; + color: var(--color-text-base); + background-color: var(--color-bg-base); + min-height: 100vh; + transition: + background-color 0.3s ease, + color 0.3s ease; +} + +#root { + min-height: 100vh; +} + +/* 滚动条美化 */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #c7d2fe; + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: #a5b4fc; +} + +/* 暗色模式滚动条 */ +[data-theme='dark'] ::-webkit-scrollbar-thumb { + background: #4338ca; +} + +[data-theme='dark'] ::-webkit-scrollbar-thumb:hover { + background: #4f46e5; +} + +/* 聚焦环 — 使用品牌色 */ +:focus-visible { + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +/* 选中文本 — 使用品牌色 */ +::selection { + background: rgba(99, 102, 241, 0.2); + color: var(--color-text-base); +} + +[data-theme='dark'] ::selection { + background: rgba(129, 140, 248, 0.3); + color: var(--color-text-base); +} + +/* 链接全局样式 */ +a { + color: var(--color-primary); + text-decoration: none; + transition: color var(--transition-duration) var(--transition-timing); +} + +a:hover { + color: var(--color-primary-light); +} + +/* ============================================================ + * 窗口拖拽区域(自定义导航栏) + * + * macOS hiddenInset 模式下,整个导航栏区域可拖拽移动窗口。 + * .navbar-drag-region → 可拖拽(背景区域) + * .navbar-no-drag → 不可拖拽(按钮、链接等交互元素) + * ============================================================ */ + +.navbar-drag-region { + -webkit-app-region: drag; + user-select: none; +} + +.navbar-no-drag { + -webkit-app-region: no-drag; +} + +/* macOS 红绿灯按钮区域不遮挡内容 */ +@supports (-webkit-app-region: drag) { + .navbar-drag-region { + -webkit-app-region: drag; + } +} diff --git a/src/theme/tokens.ts b/src/theme/tokens.ts new file mode 100644 index 0000000..839f764 --- /dev/null +++ b/src/theme/tokens.ts @@ -0,0 +1,117 @@ +// ============================================================ +// 设计令牌(Design Tokens)—— 蓝紫渐变主题 +// 此处定义的颜色、圆角、阴影等令牌,需同步到: +// 1. globals.css(Tailwind CSS 扩展,通过 @theme 指令) +// 2. antd-theme.ts(Ant Design ConfigProvider 主题配置) +// 修改时三处同步更新。 +// ============================================================ + +// ---------- 品牌色(蓝紫渐变) ---------- + +/** 品牌主色 — Indigo-500 */ +export const colorPrimary = '#6366F1'; + +/** 品牌主色浅色变体 */ +export const colorPrimaryLight = '#818CF8'; + +/** 品牌主色深色变体 */ +export const colorPrimaryDark = '#4F46E5'; + +/** 品牌辅助色 — Violet-500(渐变另一端) */ +export const colorSecondary = '#8B5CF6'; + +/** 品牌渐变色起始值 */ +export const gradientStart = '#4F46E5'; // Indigo-600 + +/** 品牌渐变色结束值 */ +export const gradientEnd = '#7C3AED'; // Violet-600 + +/** 品牌渐变色(CSS 值,可直接用于 background) */ +export const gradientPrimary = `linear-gradient(135deg, ${gradientStart}, ${gradientEnd})`; + +/** 品牌渐变悬停态 */ +export const gradientPrimaryHover = `linear-gradient(135deg, ${colorPrimary}, ${colorSecondary})`; + +// ---------- 功能色 ---------- + +export const colorSuccess = '#10B981'; +export const colorWarning = '#F59E0B'; +export const colorError = '#EF4444'; +export const colorInfo = '#3B82F6'; + +// ---------- 中性色(亮色模式) ---------- + +export const colorTextBase = '#1E1B4B'; // 深蓝紫黑 +export const colorTextSecondary = '#6B7280'; +export const colorTextTertiary = '#9CA3AF'; + +export const colorBgBase = '#FFFFFF'; +export const colorBgContainer = '#F9FAFB'; +export const colorBgElevated = '#FFFFFF'; +export const colorBgLayout = '#F5F3FF'; // Violet-50 +export const colorBgSpotlight = '#F3F4F6'; + +export const colorBorder = '#E5E7EB'; +export const colorBorderSecondary = '#F3F4F6'; + +// ---------- 中性色(暗色模式) ---------- + +/** 暗色模式 — 主文字 */ +export const darkColorTextBase = '#E8E6F0'; +/** 暗色模式 — 次要文字 */ +export const darkColorTextSecondary = '#A5A0C9'; +/** 暗色模式 — 辅助文字 */ +export const darkColorTextTertiary = '#6E6998'; + +/** 暗色模式 — 基础背景 */ +export const darkColorBgBase = '#0F0D1A'; // 深蓝紫黑 +/** 暗色模式 — 容器背景 */ +export const darkColorBgContainer = '#1A1730'; // 抬升一层 +/** 暗色模式 — 悬浮背景 */ +export const darkColorBgElevated = '#242040'; // 再抬升一层 +/** 暗色模式 — 布局背景 */ +export const darkColorBgLayout = '#0B0A15'; // 最深背景 + +/** 暗色模式 — 边框 */ +export const darkColorBorder = '#2E2A4A'; +/** 暗色模式 — 次要边框 */ +export const darkColorBorderSecondary = '#1F1C38'; + +// ---------- 圆角 ---------- + +export const borderRadiusBase = 8; +export const borderRadiusLG = 12; +export const borderRadiusSM = 6; +export const borderRadiusXS = 4; + +// ---------- 阴影 ---------- + +export const boxShadowBase = + '0 1px 3px 0 rgba(99, 102, 241, 0.08), 0 1px 2px -1px rgba(99, 102, 241, 0.08)'; +export const boxShadowLG = + '0 10px 15px -3px rgba(99, 102, 241, 0.1), 0 4px 6px -4px rgba(99, 102, 241, 0.1)'; + +// ---------- 字体 ---------- + +export const fontFamily = `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif`; +export const fontFamilyCode = `'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, 'Courier New', monospace`; + +export const fontSizeBase = 14; +export const fontSizeLG = 16; +export const fontSizeSM = 12; +export const fontSizeXL = 20; + +// ---------- 间距 ---------- + +export const spacingUnit = 4; +export const spacingXS = 4; +export const spacingSM = 8; +export const spacingMD = 16; +export const spacingLG = 24; +export const spacingXL = 32; +export const spacingXXL = 48; + +// ---------- 动画 ---------- + +export const transitionDuration = '0.2s'; +export const transitionTimingFunction = 'cubic-bezier(0.4, 0, 0.2, 1)'; diff --git a/src/utils/event-bus.ts b/src/utils/event-bus.ts new file mode 100644 index 0000000..e9ada35 --- /dev/null +++ b/src/utils/event-bus.ts @@ -0,0 +1,47 @@ +// ============================================================ +// 事件总线 — 跨组件/跨模块事件通信 +// 用于 axios 拦截器 → App 触发登录弹窗等解耦场景 +// ============================================================ + +type Listener = (...args: unknown[]) => void; + +const listeners = new Map>(); + +/** 监听事件 */ +export function on(event: string, fn: Listener): void { + if (!listeners.has(event)) { + listeners.set(event, new Set()); + } + listeners.get(event)!.add(fn); +} + +/** 取消监听 */ +export function off(event: string, fn: Listener): void { + listeners.get(event)?.delete(fn); +} + +/** 触发事件 */ +export function emit(event: string, ...args: unknown[]): void { + listeners.get(event)?.forEach((fn) => { + try { + fn(...args); + } catch (e) { + console.error(`[EventBus] ${event} 回调出错:`, e); + } + }); +} + +// ============================================================ +// 预定义事件名 +// ============================================================ + +export const EVENTS = { + /** 需要登录(axios 返回 401 时触发) */ + AUTH_REQUIRED: 'auth:required', + /** 显示登录弹窗(用户点击登录按钮触发) */ + SHOW_LOGIN: 'auth:show-login', + /** 登录成功 */ + LOGIN_SUCCESS: 'auth:login-success', + /** 退出登录 */ + LOGOUT: 'auth:logout', +} as const; diff --git a/src/utils/ipc.ts b/src/utils/ipc.ts new file mode 100644 index 0000000..413ebbd --- /dev/null +++ b/src/utils/ipc.ts @@ -0,0 +1,43 @@ +// ============================================================ +// IPC 安全访问守卫 +// window.ipcRenderer 仅在 Electron 环境中存在(由 preload 注入), +// 浏览器环境下为 undefined,所有调用必须先行判断。 +// ============================================================ + +/** 检查是否在 Electron 环境中(window.ipcRenderer 可用) */ +export function hasIpc(): boolean { + return typeof window !== 'undefined' && window.ipcRenderer != null; +} + +/** 安全地监听 IPC 消息 */ +export function safeIpcOn( + channel: string, + listener: (event: unknown, ...args: unknown[]) => void, +): void { + if (hasIpc()) { + window.ipcRenderer.on(channel, listener); + } +} + +/** 安全地取消监听 IPC 消息 */ +export function safeIpcOff(channel: string, listener: (...args: unknown[]) => void): void { + if (hasIpc()) { + window.ipcRenderer.off(channel, listener); + } +} + +/** 安全地发送 IPC 消息(不等待响应) */ +export function safeIpcSend(channel: string, ...args: unknown[]): void { + if (hasIpc()) { + window.ipcRenderer.send(channel, ...args); + } +} + +/** 安全地调用 IPC(等待响应) */ +export async function safeIpcInvoke(channel: string, ...args: unknown[]): Promise { + if (!hasIpc()) { + console.warn(`[IPC] 非 Electron 环境,invoke "${channel}" 被忽略`); + return undefined; + } + return window.ipcRenderer.invoke(channel, ...args); +} diff --git a/src/utils/logo.ts b/src/utils/logo.ts new file mode 100644 index 0000000..80f3aab --- /dev/null +++ b/src/utils/logo.ts @@ -0,0 +1,53 @@ +// ============================================================ +// 渲染进程 Logo 自适应工具 +// 提供按平台返回正确 Logo 资源路径的函数, +// 用于 等场景。 +// +// 资源存放在 src/assets/logo/ +// heixiu.ico — Windows 多尺寸图标 +// HX.png — 通用 PNG Logo +// HX2.png — 备用 PNG Logo(方形变体) +// ============================================================ + +import { isMacOS, isWindows } from './platform'; + +// Vite 中直接 import 图片资源得到编译后的 URL +import hxPng from '../assets/logo/HX.png'; +import hx2Png from '../assets/logo/HX2.png'; +// .ico 文件通常不太适合 标签,但在 Electron 窗口图标中使用 + +/** + * 获取主 Logo 图片 URL(用于界面展示、关于对话框等) + * 所有平台统一使用 PNG + */ +export function getMainLogoUrl(): string { + return hxPng; +} + +/** + * 获取备用/方形 Logo 图片 URL + */ +export function getAltLogoUrl(): string { + return hx2Png; +} + +/** + * 获取浏览器 favicon 路径 + * Windows 可用 .ico,其他平台用 .png + */ +export function getFaviconPath(): string { + if (isWindows()) { + return '/src/assets/logo/heixiu.ico'; + } + return hxPng; +} + +/** + * 获取平台推荐的应用图标格式说明 + * 用于调试或信息展示 + */ +export function getPlatformIconFormatInfo(): string { + if (isMacOS()) return '.icns(当前使用 .png 回退)'; + if (isWindows()) return '.ico'; + return '.png'; +} diff --git a/src/utils/platform.ts b/src/utils/platform.ts new file mode 100644 index 0000000..c00bee6 --- /dev/null +++ b/src/utils/platform.ts @@ -0,0 +1,89 @@ +// ============================================================ +// 渲染进程平台判定工具 +// 通过 preload 暴露的 process.platform 或 navigator.userAgent 判定 +// ============================================================ + +import type { Platform } from '@shared/types'; + +/** + * 获取当前平台标识 + * 优先使用 preload 暴露的 Electron process.platform, + * 降级使用 navigator.userAgent 推断 + */ +export function getPlatform(): Platform { + // 如果 preload 暴露了 platform 信息,优先使用 + if (typeof window !== 'undefined' && window.ipcRenderer) { + // 通过 IPC 或 User-Agent 判断 + const ua = navigator.userAgent.toLowerCase(); + if (ua.includes('mac os') || ua.includes('macintosh')) return 'darwin'; + if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) return 'win32'; + if (ua.includes('linux')) return 'linux'; + } + + // 降级方案:基于 userAgent 判断 + const ua = navigator.userAgent.toLowerCase(); + if (ua.includes('mac')) return 'darwin'; + if (ua.includes('win')) return 'win32'; + if (ua.includes('linux')) return 'linux'; + + // 默认为 Windows + return 'win32'; +} + +/** 是否为 macOS */ +export function isMacOS(): boolean { + return getPlatform() === 'darwin'; +} + +/** 是否为 Windows */ +export function isWindows(): boolean { + return getPlatform() === 'win32'; +} + +/** 是否为 Linux */ +export function isLinux(): boolean { + return getPlatform() === 'linux'; +} + +/** 获取平台名称(中文) */ +export function getPlatformName(): string { + if (isMacOS()) return 'macOS'; + if (isWindows()) return 'Windows'; + if (isLinux()) return 'Linux'; + return '未知平台'; +} + +/** + * 获取快捷键修饰符展示文本 + * macOS 用户习惯 ⌘ 符号,Windows/Linux 显示 Ctrl + */ +export function getShortcutDisplay(key: string): string { + if (isMacOS()) { + return `⌘+${key}`; + } + return `Ctrl+${key}`; +} + +/** + * 获取适合当前平台的菜单行为提示 + */ +export function getContextMenuHint(): string { + if (isMacOS()) { + return '右键点击 或 Ctrl+点击'; + } + return '右键点击'; +} + +/** + * 判断是否为开发环境 + */ +export function isDev(): boolean { + return import.meta.env.DEV; +} + +/** + * 判断是否为生产环境 + */ +export function isProd(): boolean { + return import.meta.env.PROD; +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..5a5882f --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,14 @@ +/// + +declare global { + interface Window { + ipcRenderer: { + on(channel: string, listener: (event: unknown, ...args: unknown[]) => void): unknown; + off(channel: string, listener: (...args: unknown[]) => void): unknown; + send(channel: string, ...args: unknown[]): void; + invoke(channel: string, ...args: unknown[]): Promise; + }; + } +} + +export {}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c322d69 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2024", + "useDefineForClassFields": true, + "lib": ["ES2024", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client", "node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Path aliases — TypeScript 6 中 paths 相对于 tsconfig 所在目录 */ + "paths": { + "@/*": ["./src/*"], + "@shared/*": ["./shared/*"] + }, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "shared"] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..5124d0a --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "composite": true, + "esModuleInterop": true, + "module": "esnext", + "target": "es2024", + "moduleResolution": "bundler", + "skipLibCheck": true, + "strict": true, + "types": ["node"] + }, + "include": ["vite.config.ts", "electron/**/*.ts", "shared"] +} diff --git a/tsconfig.node.tsbuildinfo b/tsconfig.node.tsbuildinfo new file mode 100644 index 0000000..b653f44 --- /dev/null +++ b/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.es2025.float16.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2024.full.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/round-robin-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/socks5-proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/iter.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/zlib/iter.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/rolldown/dist/shared/logging-bsnejils.d.mts","./node_modules/@oxc-project/types/types.d.ts","./node_modules/rolldown/dist/shared/binding-bacztfmx.d.mts","./node_modules/@rolldown/pluginutils/dist/filter/index.d.mts","./node_modules/@rolldown/pluginutils/dist/index.d.mts","./node_modules/rolldown/dist/shared/define-config-3bx_x2am.d.mts","./node_modules/rolldown/dist/index.d.mts","./node_modules/rolldown/dist/parse-ast-index.d.mts","./node_modules/vite/types/internal/rolluptypecompat.d.ts","./node_modules/rolldown/dist/shared/constructors-cbnat434.d.mts","./node_modules/rolldown/dist/plugins-index.d.mts","./node_modules/rolldown/dist/shared/transform-7xcuvrpl.d.mts","./node_modules/rolldown/dist/utils-index.d.mts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/types/internal/esbuildoptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/rolldown/dist/filter-index.d.mts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/quansync/dist/types.d.mts","./node_modules/exsolve/dist/index.d.mts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/pkg-types/dist/index.d.mts","./node_modules/local-pkg/dist/index.d.ts","./node_modules/vite-plugin-electron/dist/index-ba0fmstq.d.mts","./node_modules/vite-plugin-electron-renderer/dist/index.d.mts","./node_modules/vite-plugin-electron/dist/simple.d.mts","./node_modules/@vitejs/plugin-react/types/optionaltypes.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./node_modules/@tailwindcss/vite/dist/index.d.mts","./vite.config.ts","./node_modules/vite-plugin-electron/electron-env.d.ts","./node_modules/electron/electron.d.ts","./electron/electron-env.d.ts","./shared/types/index.ts","./electron/main/utils/platform.ts","./electron/main/utils/logo.ts","./package.json","./shared/constants/version.ts","./shared/constants/app.ts","./node_modules/builder-util-runtime/out/blockmapapi.d.ts","./node_modules/builder-util-runtime/out/cancellationtoken.d.ts","./node_modules/builder-util-runtime/out/error.d.ts","./node_modules/builder-util-runtime/out/progresscallbacktransform.d.ts","./node_modules/builder-util-runtime/out/httpexecutor.d.ts","./node_modules/builder-util-runtime/out/memolazy.d.ts","./node_modules/builder-util-runtime/out/publishoptions.d.ts","./node_modules/builder-util-runtime/out/retry.d.ts","./node_modules/builder-util-runtime/out/rfc2253parser.d.ts","./node_modules/builder-util-runtime/out/updateinfo.d.ts","./node_modules/builder-util-runtime/out/uuid.d.ts","./node_modules/builder-util-runtime/out/xml.d.ts","./node_modules/builder-util-runtime/out/index.d.ts","./node_modules/lazy-val/out/main.d.ts","./node_modules/electron-updater/out/appadapter.d.ts","./node_modules/electron-updater/out/electronhttpexecutor.d.ts","./node_modules/electron-updater/out/types.d.ts","./node_modules/electron-updater/out/downloadedupdatehelper.d.ts","./node_modules/electron-updater/out/providers/provider.d.ts","./node_modules/tiny-typed-emitter/lib/index.d.ts","./node_modules/electron-updater/out/appupdater.d.ts","./node_modules/electron-updater/out/baseupdater.d.ts","./node_modules/electron-updater/out/appimageupdater.d.ts","./node_modules/electron-updater/out/linuxupdater.d.ts","./node_modules/electron-updater/out/debupdater.d.ts","./node_modules/electron-updater/out/pacmanupdater.d.ts","./node_modules/electron-updater/out/rpmupdater.d.ts","./node_modules/electron-updater/out/macupdater.d.ts","./node_modules/electron-updater/out/nsisupdater.d.ts","./node_modules/electron-updater/out/main.d.ts","./electron/main/updater.ts","./electron/main/menu/index.ts","./electron/main.ts","./electron/preload.ts","./shared/constants/ipc-channels.ts","./shared/utils/index.ts"],"fileIdsList":[[80,144,152,156,159,161,162,163,175,264,265],[80,144,152,156,159,161,162,163,164,167,175,193,265,268,269,272,303,304],[80,144,152,156,159,161,162,163,175,265,268,271,272],[80,144,152,156,159,161,162,163,175,265,302],[80,144,152,156,159,161,162,163,167,175,268],[80,144,152,156,159,161,162,163,175,267],[80,144,152,156,159,161,162,163,175,265],[80,144,152,156,159,161,162,163,175],[80,144,152,156,159,161,162,163,175,209],[80,144,152,156,159,161,162,163,175,251],[80,141,142,144,152,156,159,161,162,163,175],[80,143,144,152,156,159,161,162,163,175],[144,152,156,159,161,162,163,175],[80,144,152,156,159,161,162,163,175,184],[80,144,145,150,152,155,156,159,161,162,163,165,175,180,193],[80,144,145,146,152,155,156,159,161,162,163,175],[80,144,147,152,156,159,161,162,163,175,194],[80,144,148,149,152,156,159,161,162,163,166,175],[80,144,149,152,156,159,161,162,163,175,180,190],[80,144,150,152,155,156,159,161,162,163,165,175],[80,143,144,151,152,156,159,161,162,163,175],[80,144,152,153,156,159,161,162,163,175],[80,144,152,154,155,156,159,161,162,163,175],[80,143,144,152,155,156,159,161,162,163,175],[80,144,152,155,156,157,159,161,162,163,175,180,193],[80,144,152,155,156,157,159,161,162,163,175,180,182,184],[80,131,144,152,155,156,158,159,161,162,163,165,175,180,193],[80,144,152,155,156,158,159,161,162,163,165,175,180,190,193],[80,144,152,156,158,159,160,161,162,163,175,180,190,193],[78,79,80,81,82,83,84,85,86,87,88,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201],[80,144,152,155,156,159,161,162,163,175],[80,144,152,156,159,161,163,175],[80,144,152,156,159,161,162,163,164,175,193],[80,144,152,155,156,159,161,162,163,165,175,180],[80,144,152,156,159,161,162,163,166,175],[80,144,152,156,159,161,162,163,167,175],[80,144,152,155,156,159,161,162,163,170,175],[80,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],[80,144,152,156,159,161,162,163,172,175],[80,144,152,156,159,161,162,163,173,175],[80,144,149,152,156,159,161,162,163,165,175,184],[80,144,152,155,156,159,161,162,163,175,176],[80,144,152,156,159,161,162,163,175,177,194,197],[80,144,152,155,156,159,161,162,163,175,180,183,184],[80,144,152,156,159,161,162,163,175,181,184],[80,144,152,156,159,161,162,163,175,182],[80,144,152,156,159,161,162,163,175,184,194],[80,144,152,156,159,161,162,163,175,185],[80,141,144,152,156,159,161,162,163,175,180,187,193],[80,144,152,156,159,161,162,163,175,180,186],[80,144,152,155,156,159,161,162,163,175,188,189],[80,144,152,156,159,161,162,163,175,188,189],[80,144,149,152,156,159,161,162,163,165,175,180,190],[80,144,152,156,159,161,162,163,175,191],[80,144,152,156,159,161,162,163,165,175,192],[80,144,152,156,158,159,161,162,163,173,175,193],[80,144,152,156,159,161,162,163,175,194,195],[80,144,149,152,156,159,161,162,163,175,195],[80,144,152,156,159,161,162,163,175,180,196],[80,144,152,156,159,161,162,163,164,175,197],[80,144,152,156,159,161,162,163,175,198],[80,144,147,152,156,159,161,162,163,175],[80,144,149,152,156,159,161,162,163,175],[80,144,152,156,159,161,162,163,175,194],[80,131,144,152,156,159,161,162,163,175],[80,144,152,156,159,161,162,163,175,193],[80,144,152,156,159,161,162,163,175,199],[80,144,152,156,159,161,162,163,170,175],[80,144,152,156,159,161,162,163,175,189],[80,131,144,152,155,156,157,159,161,162,163,170,175,180,184,193,196,197,199],[80,144,152,156,159,161,162,163,175,180,200],[80,144,152,156,159,161,162,163,175,182,201],[80,144,152,156,159,161,162,163,175,251,260],[80,144,149,152,156,158,159,161,162,163,175,180,193,274,276],[80,144,152,156,159,161,162,163,175,273,274,275,276,277,278,279,280,281,282,283,284],[80,144,152,156,159,161,162,163,175,180,274],[80,144,152,156,158,159,161,162,163,175],[80,144,152,156,159,161,162,163,175,274],[80,144,152,156,159,161,162,163,175,285,293,294],[80,144,152,156,158,159,161,162,163,175,265,285,286,287,288,289,290,291,292,302],[80,144,145,152,156,159,161,162,163,175,285,287,293],[80,144,152,156,159,161,162,163,175,285,287,289,293,294,296],[80,144,152,156,159,161,162,163,175,285,289],[80,144,152,156,158,159,161,162,163,175,265,285],[80,144,152,156,159,161,162,163,175,285,287,294],[80,144,152,156,159,161,162,163,175,285,287,293],[80,144,152,156,159,161,162,163,175,285,289,291,293,294,295,297,298,299,300,301],[80,144,152,156,159,161,162,163,175,285,287,293,294,302],[80,144,152,156,158,159,161,162,163,175,193,285,288,289],[80,144,152,155,156,159,161,162,163,175,193,285,288],[80,144,152,155,156,159,161,162,163,175,202],[80,144,152,156,159,161,162,163,175,244,245],[80,144,152,156,159,161,162,163,175,252,255],[80,144,152,156,159,161,162,163,175,253,254],[80,144,152,156,159,161,162,163,175,239],[80,144,152,156,159,161,162,163,175,237,239],[80,144,152,156,159,161,162,163,175,228,236,237,238,240,242],[80,144,152,156,159,161,162,163,175,226],[80,144,152,156,159,161,162,163,175,229,234,239,242],[80,144,152,156,159,161,162,163,175,225,242],[80,144,152,156,159,161,162,163,175,229,230,233,234,235,242],[80,144,152,156,159,161,162,163,175,229,230,231,233,234,242],[80,144,152,156,159,161,162,163,175,226,227,228,229,230,234,235,236,238,239,240,242],[80,144,152,156,159,161,162,163,175,242],[80,144,152,156,159,161,162,163,175,224,226,227,228,229,230,231,233,234,235,236,237,238,239,240,241],[80,144,152,156,159,161,162,163,175,224,242],[80,144,152,156,159,161,162,163,175,229,231,232,234,235,242],[80,144,152,156,159,161,162,163,175,233,242],[80,144,152,156,159,161,162,163,175,234,235,239,242],[80,144,152,156,159,161,162,163,175,227,237],[80,144,152,156,159,161,162,163,175,211],[80,144,152,156,159,161,162,163,175,206,208,211],[80,144,152,156,159,161,162,163,175,207,208],[80,144,152,156,159,161,162,163,175,208,211,215],[80,144,152,156,159,161,162,163,175,207],[80,144,152,156,159,161,162,163,175,208,211],[80,144,152,156,159,161,162,163,175,206,207,208,210],[80,144,152,156,159,161,162,163,175,206,208],[80,144,152,156,159,161,162,163,175,207,208,217],[80,95,98,101,102,144,152,156,159,161,162,163,175,193],[80,98,144,152,156,159,161,162,163,175,180,193],[80,98,102,144,152,156,159,161,162,163,175,193],[80,144,152,156,159,161,162,163,175,180],[80,92,144,152,156,159,161,162,163,175],[80,96,144,152,156,159,161,162,163,175],[80,94,95,98,144,152,156,159,161,162,163,175,193],[80,144,152,156,159,161,162,163,165,175,190],[80,144,152,156,159,161,162,163,175,202],[80,92,144,152,156,159,161,162,163,175,202],[80,94,98,144,152,156,159,161,162,163,165,175,193],[80,89,90,91,93,97,144,152,155,156,159,161,162,163,175,180,193],[80,98,107,115,144,152,156,159,161,162,163,175],[80,90,96,144,152,156,159,161,162,163,175],[80,98,125,126,144,152,156,159,161,162,163,175],[80,90,93,98,144,152,156,159,161,162,163,175,184,193,202],[80,98,144,152,156,159,161,162,163,175],[80,94,98,144,152,156,159,161,162,163,175,193],[80,89,144,152,156,159,161,162,163,175],[80,92,93,94,96,97,98,99,100,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,144,152,156,159,161,162,163,175],[80,98,118,121,144,152,156,159,161,162,163,175],[80,98,107,108,109,144,152,156,159,161,162,163,175],[80,96,98,108,110,144,152,156,159,161,162,163,175],[80,97,144,152,156,159,161,162,163,175],[80,90,92,98,144,152,156,159,161,162,163,175],[80,98,102,108,110,144,152,156,159,161,162,163,175],[80,102,144,152,156,159,161,162,163,175],[80,96,98,101,144,152,156,159,161,162,163,175,193],[80,90,94,98,107,144,152,156,159,161,162,163,175],[80,98,118,144,152,156,159,161,162,163,175],[80,110,144,152,156,159,161,162,163,175],[80,90,94,98,102,144,152,156,159,161,162,163,175],[80,92,98,125,144,152,156,159,161,162,163,175,184,199,202],[80,144,145,152,156,159,161,162,163,175,251,256],[80,144,152,156,159,161,162,163,175,251,257,258],[80,144,145,152,156,159,161,162,163,175],[80,144,152,156,159,161,162,163,175,203],[80,144,152,155,156,158,159,160,161,162,163,165,175,180,190,193,200,202,203,204,205,212,213,214,216,218,220,221,222,223,243,247,248,249,250,251],[80,144,152,156,159,161,162,163,175,203,204,205,219],[80,144,152,156,159,161,162,163,175,205],[80,144,152,156,159,161,162,163,175,246],[80,144,152,156,159,161,162,163,175,212,222,251],[80,144,152,156,159,161,162,163,175,212,251],[80,144,152,156,159,161,162,163,175,267,271],[80,144,152,156,159,161,162,163,175,270],[80,144,152,156,159,161,162,163,167,175,251,258,259,261,262]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"f13f4b465c99041e912db5c44129a94588e1aafee35a50eab51044833f50b4ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"b9f65879de79a7647ad2e5b8089277c215911fa99d4b858d78014df6ba2852f3","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"14e9acf826baba0ef4b5665704084896e7bcc06f65a9ab13af7e93d27d6b7069","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"21adf13435b9b748529c8cedf80f884e5130b9684188120a686cd2b26a2059c7","impliedFormat":1},{"version":"eec76bf6b9346f3f95fa402621b889489e96930e72295b0369022f332e9b4a6a","impliedFormat":1},{"version":"0ecd58f413f9bc3b7d4383eae31b0c8fc576985cd7404d6f99f8c643543ade74","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"d33ce35e3f9cfcc1d94eca415bdd3bde94d5b153ffdd33e6c4455c029986c630","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"4dc59f6e1dbf3d5f66660fceabe6c174d3261b37b696ae1854f0dbaf255fc753","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"114f493b30f364255290472111b5a4791d5902c308645670cd0401429cbc6930","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2ae155afe8a01cc0ae612d99117cf8ef16692ba7c4366590156fdec1bcf2d8c","impliedFormat":1},{"version":"3f5e5d9be35913db9fea42a63f3df0b7e3c8703b97670a2125587b4dbbd56d7c","impliedFormat":1},{"version":"c8b8968311ec4e5e97b7b5fb8a65efaba455db9bdcfd7fff7fb15f6e317bfba0","impliedFormat":1},{"version":"57c23df0b5f7a8e26363a3849b0bc7763f6b241207157c8e40089d1df4116f35","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b8bc0c17b54081b0878673989216229e575d67a10874e84566a21025a2461ee","impliedFormat":1},{"version":"5b0db5a58b73498792a29bfebc333438e61906fef75da898b410e24e52229e6f","impliedFormat":1},{"version":"dbe055b2b29a7bab2c1ca8f259436306adb43f469dca7e639a02cd3695d3f621","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"aecbf1d9e6a18dab7d92ef8a89a1444b47e1eb6134cb2bb776a26d55ff58c29a","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"9ec87fea42b92894b0f209931a880789d43c3397d09dd99c631ae40a2f7071d1","impliedFormat":1},{"version":"c68e88cdfadfb6c8ba5fc38e58a3a166b0beae77b1f05b7d921150a32a5ffb8d","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"1fede9296beac11ce8e6b425396a1791f64341f2be85deebb6286faf6e16306e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce697b6a251d9cad53998c7fd3098072df883b525ec45d83530e434dc6d80dc6","impliedFormat":1},{"version":"719412f054e6ecc35489462c9a21bab0323d173a7d04e55b0ace4b5d86fbeb07","impliedFormat":1},{"version":"0eb5d0cbf09de5d34542b977fd6a933bb2e0817bffe8e1a541b2f1ad1b9af1ff","impliedFormat":1},{"version":"fac3e88881b35d3a757ed891ac912b2674792c25e2a1a74e1f5fbc72d19a9792","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"c32c840c62d8bd7aeb3147aa6754cd2d922b990a6b6634530cb2ebdce5adc8e9","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"c1fa52b3d014001e8662fa2669d90ea15373958a288e3b83a3b621733d25292a","affectsGlobalScope":true,"impliedFormat":1},{"version":"cbed824fec91efefc7bbdcb8b43d1a531fdbebd0e2ef19481501ff365a93cb70","impliedFormat":1},{"version":"d0716593b3f2b0451bcf0c24cfa86dec2235c325c89f201934248b7c742715fc","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"2991bca2cc0f0628a278df2a2ccdb8d6cbcb700f3761abbed62bba137d5b1790","impliedFormat":1},{"version":"5e66972e83eb4dc7123939bf816e6cbd9ad81af5552db1cab84e6bd9c64d2ecc","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"8413d0641f293aed551c7464615b770d34a02dedede889b9591172287d68e773","impliedFormat":1},{"version":"0ea59f7d3e51440baa64f429253759b106cfcbaf51e474cae606e02265b37cf8","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"1b241e24f3227d078c06aeda6e050187ad59a4e591f4467abed44d92b084e08d","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"7fde0e1be5c8be204ffbf428abfcf01da2eb0f130e1bc3f539eb7275f4fd1f58","impliedFormat":1},{"version":"e284328553df5f425a5d33d36a0c3fa66b46af9d097cad6f4d2e8696dfdeb0f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"f36b3fbe2be150a9ca140da48593f21e6a8172004f92ddc549b43efec39f3e54","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"016b29bf4926b80255a108c53a1451717350059da04fcae64d1075f5e93bbb39","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"1c4f139ade4f6ebf45463505f8155173e5d7a5305e50e0aae0a5e712d6ff3b48","impliedFormat":1},{"version":"e16b319e5aca1031168de823c4946ff8e29629c4c8cc0ec0fcfe2a8ab2155043","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"9d3821bc75c59577e52643324cec92fc2145642e8d17cf7ee07a3181f21d985d","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"2c3c5c0f54055e87640f5d233716fd889f3034fc7911d603b642369b0dbeb2a7","impliedFormat":1},{"version":"0a20eaf2e4b1e3c1e1f87f7bccb0c936375b23b022baeea750519b7c9bc6ce83","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"a16b91b27bd6b706c687c88cbc8a7d4ee98e5ed6043026d6b84bda923c0aed67","impliedFormat":1},{"version":"1c9e5b1a17b1fc9b3711fb36e0690421261ab2880f15b145155b5b2ba2ab6c2d","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"6eeded8c7e352be6e0efb83f4935ec752513c4d22043b52522b90849a49a3a11","impliedFormat":1},{"version":"6c1ad90050ffbb151cacc68e2d06ea1a26a945659391e32651f5d42b86fd7f2c","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"6953d7597831d0860c7034cf4f0419687d263b6b98a4b32e37ce6d49615c36e2","impliedFormat":1},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"de4a612aa8f1704af486f701e21993c786ba7d8cfed55fffa6684026aea2346e","impliedFormat":99},{"version":"c73fdf42528325dd17940937ed787b15ae3445c6a2dae1a2b74bc4d87d337ca2","impliedFormat":99},{"version":"e8e17dfef3cfa9f0847ac93dd535a9896af7fb57c1a1b164484bb1b0ee4a25d8","impliedFormat":99},{"version":"905aa259ceb7f7b7d1d59f99de8868c65ef476f04888e779f85dd1d7e1235223","impliedFormat":99},{"version":"638a22f8e16b31c37297483fa38cfc760ed309b16d4c606a7b4532f4394c9c0c","impliedFormat":99},{"version":"9394183f4c37b8591156f32e41223c9e0dd211eefe7499155d4cdf15268eaea8","impliedFormat":99},{"version":"b1aaa10e07510ebf74e94f6a0ec8c0df41cdc87bf4ec9d3907031b2a1ee6f602","impliedFormat":99},{"version":"7f429346f311ed5c346764a92cd89474bfb7d4012ee557801d6177bd60a81fee","impliedFormat":99},{"version":"86da92c883312ac2f3b35d0fdbda6196bdd614c3d72c386917f9c636b2eacb6d","impliedFormat":99},{"version":"7d3e062a778b8f5ea4f0cac7e925e31f88e6739812ebc5f827474324a4048f14","impliedFormat":99},{"version":"4f9e435035dddeab56b449e09ce1782be49c853304f156a2affcabca0a815862","impliedFormat":99},{"version":"4a838129e2aa98dbdb49a5f1a3367b74e204d92fbb1a66ebffbcb4dd8a4112e2","impliedFormat":99},{"version":"ad86350594b91ab1008decf71af218a49c62d8b1cb955c30a3984046dcbc86d7","impliedFormat":99},{"version":"64cad96d8eea46fcf925ccf652d01b1f841a3df1900d84c31cd26f15a97c9fc4","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"8887e70871f697fa42ad7cdf32168db60ec2d6760c173c97973e35377fe5d83b","impliedFormat":99},{"version":"e0864480ea083087d705f9405bd6bf59b795e8474c3447f0d6413b2bce535a09","impliedFormat":99},{"version":"e67cbea16f1994af89efd700542dbf3828a46a52b29e4d67e801bd7869dc103c","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":99},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":99},{"version":"d2bb2bc576d9ddfc7c8aa6dbec440b6d8464abeaf46e3a0e4ed65b0c339f7ff6","impliedFormat":99},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":99},{"version":"a6fad0438acd1d5b8eff4c0fcbe5a3b7810e688f641149f2ea6714e1b8b5e74b","impliedFormat":99},{"version":"9853cfdb6c7399831b2d5bc50b2e486b5c8c71db9d5844892145ab153925d44c","impliedFormat":99},{"version":"f502e69e5cfac8ae448ec192b4b514b6b1082149ccde1566ed48909406a2ce3c","impliedFormat":99},{"version":"c967e03c8dbb4770f7e2f0b71b5d13593de679a41cc2b60266c4b69f1342a263","impliedFormat":1},{"version":"4e97037d3a6831c8c2d40f0bbf3a34e52b51180484caa0de82bb05252d7bff80","impliedFormat":99},{"version":"c123979cfd60fb69449afd3da96ded3c690d12441247cd20e6871fb3230dbf46","impliedFormat":99},{"version":"d423a8800cf391a0b163816426c53b4c66076f5d9009a638c79fc56319a7c7b8","impliedFormat":99},{"version":"f9f15330b5a05863cfb68dca931deeac10c6b0c1f204480a5569fdcb247349f3","impliedFormat":99},{"version":"d53269007ae5ba0adab0c8f2757190df94b28e64cf4573679289c2e0280b6078","impliedFormat":99},{"version":"2faebfa830ae4cfbfb58e48b0ec20a2a63882d776f0ca36ec7155d45cf1b7f2d","impliedFormat":99},{"version":"dc6e3ce502651ecc523590588213bfb986c04b60f5265d37f76662b824425903","impliedFormat":99},{"version":"7757c6ca7a8ad1992401c6aff33633d6a088515be5a39d7ee188b35bfc8e5f8e","impliedFormat":99},"2bce8f253584f19613a406a34c54f0d868429c4a32c7e94705a4dc556ad0b62e",{"version":"57a3a78c15dedd0d0fd4c688982d70f7e42ed837d23b7c06c4c151bdb4a2fa29","affectsGlobalScope":true,"impliedFormat":99},{"version":"80c5c937e55e650f8b70a9b481d6abebb7df1d774f507188fc5c28def5409c77","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc931a3b158b7a4a75bae6693812dff43603ee3be93019168838e027e923ac0c","affectsGlobalScope":true},"b87a821982723be04ae8d3b1f4e8864566c11c1b5e0c09ee8e6c75ce170dae69","ba3a8910f56702ed8a7e0487d4e11b3e8866d126e2821d90692c8a4dcaeefeb8","8272c29fac0d92ce3fc16c9d77c73e07987367632963e2579f2b5134a3a9b860","3962cb3952a340826522aa5ea7f56ff67278aa0125912d577b46dcc044b2740c","8bcf1ab68507655773af3e5ecf7acaefec0fc7a01a86e426c82a1f7a2aca389a","1301c30a46cb47b9e93fd69ad810c76b0872b8ca04d727658aa78b14b878c02f",{"version":"2bf791ed6e73a7b42a0fb22c517e7d959bec8c400ff926f14f8531a84c6117ab","impliedFormat":1},{"version":"602fb2b1b0803a1399f3112c222c81a3f25a65bda7fca36f874ee63940d91d59","impliedFormat":1},{"version":"dfe52fc8603a0d70d8383dce54daa540ee735ecbf37d4df65143ed2818160967","impliedFormat":1},{"version":"d3a8e527ce721b6204b96c37169711f8dd5ac0a746e6296edb7b35661fa5605f","impliedFormat":1},{"version":"3ef84e9d7195c6ef0bfd2bdacabc7c09b968cba85b887934c4918340281d788f","impliedFormat":1},{"version":"bda02ede52d7100982f34cced37adce477719c51bd0de235d4ef91b4a369dc2c","impliedFormat":1},{"version":"d07f040c70691fb90dfd86ee888e8855afa091c8a375704d27f94b0cc1465152","impliedFormat":1},{"version":"6631dbf39a8cf30a7dbaec63def815acbfb82d591dd73c29f460e2276b2ca174","impliedFormat":1},{"version":"1824bfefa21291ac93c15a4177149d78071f60b0910cd9a29317a351c020f9ac","impliedFormat":1},{"version":"8eb76ac5e1d0f9cefadee5be3b14824af40024f83791dc894d37dcc3fc79bb4e","impliedFormat":1},{"version":"2bc28dc567fa711cfda53d6174f73105b2fe1841f4cae85e87d80bbe84f934cd","impliedFormat":1},{"version":"e7da84660fb9074cfa4ae5a9d728736ac4cdbb0020fcccf5f7b68c0917ffa5e9","impliedFormat":1},{"version":"36914c589e25b44f011ebaf05a3a493509857532a054a7675221e7f14d725f76","impliedFormat":1},{"version":"e4bd94e97e08af3a3b8a6b2e85c6b93a690f572c1bffca113681ee7390f53411","impliedFormat":1},{"version":"7332d5eee14d5a68ede777b8ad0fb1bfe482d42393821a040f573e1a5ee416f7","impliedFormat":1},{"version":"ae499cb7bd072127e5cf521b2c185f261d3b6aaa7a1f8f59340da6c222fe6e92","impliedFormat":1},{"version":"3ba61e519a45b4ec9d53f2fbb10f4a8877ecd3e47b6d316a096786addff6fe4c","impliedFormat":1},{"version":"23d6acead4dd29a74539c3e32f8cf84e0fe45a2419929a409a8c8b0a2694ea7d","impliedFormat":1},{"version":"1faafd9383a1b372420ee75dc6bb9bd2ca48969f95de57cbafbd12679fb66841","impliedFormat":1},{"version":"3103df94f61695e93f42896943943f8005a32821ce2ccbc1233a78c27ac82474","impliedFormat":1},{"version":"00ce184857357d71210f0973b5beb322c2e32e516a0b6fbcf9b8d285a3a0173a","impliedFormat":1},{"version":"b05c9a8e815502a181a3cb8357cff7c7ce14d6add7b6891d859c3da466d742ba","impliedFormat":1},{"version":"af152008aaa81f2e60d6c95c463be9c5f488ede720210d4b1cb37c956269666e","impliedFormat":1},{"version":"52ec04024ca34d1566701f2c315e972b889b64901c006aa113e98e49dcd36c57","impliedFormat":1},{"version":"8f438d0dafa0ca57908376eb3431a3c06623273d89d776a9f3824f68de3affd1","impliedFormat":1},{"version":"c083ec567156bccbadb7f43d981ce48e2700e735137ca37aa178ea92bcb8d57b","impliedFormat":1},{"version":"881724b0d9e0cc92c6503822ce857f2930d8c15e78b6a94a69fe8d23e52beed7","impliedFormat":1},{"version":"c77ee14f1f05b7082eeeebf5354832afbfaa0fbad01569c9f9bc43bcbcd821be","impliedFormat":1},{"version":"4608b64eb56c0c9933c99ff9a14347f802eba6e39737e97abf892a85a7372239","impliedFormat":1},{"version":"76489df4d287f948e995b48ad4e8a979961d312f19b664b9514c1cc43dc29f05","impliedFormat":1},"eeb2a0be837a90a46e6e14f3b7ba0adfa5a4bae5dc3c52a71ca0216aa5d18996","631af276c839bbf2d7faa3c721bb351159acd5779c3a3cc696149f735d0b16a6","e5d74c3c9ff28fedb3cf2c8b381e0b02a3ba133a310339ac49c8b51fbc869799","8c43c4f793401b8a840c5504a023fb3f888cff2e43f896987867fb750f345dca","8cbfdf27b35c847505e9cbf155d8f1559644dcd0a09c71ffe1f1f3d938baa4a9","140c3fb535969df61f44cea21aed41c8b7c4e526f3a90a07dd4352289177cd8f"],"root":[263,[266,269],271,272,[303,308]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"esModuleInterop":true,"module":99,"skipLibCheck":true,"strict":true,"target":11},"referencedMap":[[266,1],[305,2],[304,3],[303,4],[269,5],[268,6],[306,7],[207,8],[209,8],[210,9],[262,10],[141,11],[142,11],[143,12],[80,13],[144,14],[145,15],[146,16],[78,8],[147,17],[148,18],[149,19],[150,20],[151,21],[152,22],[153,22],[154,23],[155,24],[156,25],[157,26],[81,8],[79,8],[158,27],[159,28],[160,29],[202,30],[161,31],[162,32],[163,31],[164,33],[165,34],[166,35],[167,36],[168,36],[169,36],[170,37],[171,38],[172,39],[173,40],[174,41],[175,42],[176,42],[177,43],[178,8],[179,8],[180,44],[181,45],[182,46],[183,44],[184,47],[185,48],[186,49],[187,50],[188,51],[189,52],[190,53],[191,54],[192,55],[193,56],[194,57],[195,58],[196,59],[197,60],[198,61],[82,31],[83,8],[84,62],[85,63],[86,8],[87,64],[88,8],[132,65],[133,66],[134,67],[135,67],[136,68],[137,8],[138,14],[139,69],[140,66],[199,70],[200,71],[201,72],[261,73],[260,8],[273,8],[274,31],[275,8],[277,74],[285,75],[278,8],[276,76],[279,77],[280,78],[281,8],[282,8],[283,8],[284,8],[287,8],[295,79],[293,80],[294,81],[297,82],[290,83],[288,84],[296,85],[300,86],[302,87],[301,88],[298,82],[291,89],[299,82],[289,90],[265,91],[253,8],[286,8],[244,8],[246,92],[245,8],[256,93],[255,94],[240,95],[238,96],[239,97],[227,98],[228,96],[235,99],[226,100],[231,101],[241,8],[232,102],[237,103],[243,104],[242,105],[225,106],[233,107],[234,108],[229,109],[236,95],[230,110],[252,8],[249,111],[212,112],[213,113],[216,114],[208,115],[215,116],[211,117],[206,8],[217,118],[218,119],[224,8],[292,8],[75,8],[76,8],[14,8],[12,8],[13,8],[18,8],[17,8],[2,8],[19,8],[20,8],[21,8],[22,8],[23,8],[24,8],[25,8],[26,8],[3,8],[27,8],[28,8],[4,8],[29,8],[33,8],[30,8],[31,8],[32,8],[34,8],[35,8],[36,8],[5,8],[37,8],[38,8],[39,8],[40,8],[6,8],[44,8],[41,8],[42,8],[43,8],[45,8],[7,8],[46,8],[51,8],[52,8],[47,8],[48,8],[49,8],[50,8],[8,8],[56,8],[53,8],[54,8],[55,8],[57,8],[9,8],[58,8],[59,8],[60,8],[62,8],[61,8],[63,8],[64,8],[10,8],[65,8],[66,8],[67,8],[11,8],[77,8],[68,8],[69,8],[70,8],[71,8],[72,8],[73,8],[1,8],[74,8],[16,8],[15,8],[254,8],[107,120],[120,121],[104,122],[121,123],[130,124],[95,125],[96,126],[94,127],[129,128],[124,129],[128,130],[98,131],[117,132],[97,133],[127,134],[92,135],[93,129],[99,136],[100,8],[106,137],[103,136],[90,138],[131,139],[122,140],[110,141],[109,136],[111,142],[114,143],[108,144],[112,145],[125,128],[101,146],[102,147],[115,148],[91,123],[119,149],[118,136],[105,147],[113,150],[116,151],[123,8],[89,8],[126,152],[258,10],[257,153],[259,154],[264,155],[204,156],[251,157],[220,158],[205,156],[203,8],[219,159],[250,8],[248,8],[221,8],[247,160],[214,161],[223,8],[222,162],[270,8],[272,163],[307,8],[271,164],[267,8],[308,8],[263,165]],"affectedFilesPendingEmit":[[305,17],[304,17],[303,17],[269,17],[268,17],[306,17],[272,17],[307,17],[271,17],[267,17],[308,17],[263,17]],"emitSignatures":[263,267,268,269,271,272,303,304,305,306,307,308],"version":"6.0.3"} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..650d516 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,47 @@ +import { defineConfig } from 'vite'; +import path from 'node:path'; +import electron from 'vite-plugin-electron/simple'; +import react from '@vitejs/plugin-react'; +import renderer from 'vite-plugin-electron-renderer'; +import tailwindcss from '@tailwindcss/vite'; +import { visualizer } from 'rollup-plugin-visualizer'; + +const __dirname = import.meta.dirname; + +export default defineConfig({ + plugins: [ + react(), + tailwindcss(), + electron({ + main: { + entry: 'electron/main.ts', + }, + preload: { + input: path.join(__dirname, 'electron/preload.ts'), + }, + }), + renderer(), + // 打包体积分析(仅 ANALYZE=true 时生成 stats.html) + process.env.ANALYZE && + visualizer({ + open: true, + gzipSize: true, + brotliSize: true, + filename: 'dist/stats.html', + }), + ].filter(Boolean), + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + '@shared': path.resolve(__dirname, 'shared'), + }, + }, + build: { + rollupOptions: { + output: {}, + }, + }, + preview: { + port: 5173, + }, +});