diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0987a66 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,25 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{js,jsx,ts,tsx,vue}] +indent_size = 2 + +[*.{md,markdown}] +trim_trailing_whitespace = false + +[*.go] +indent_style = tab +indent_size = 4 + +[*.{yml,yaml}] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..a0d66be --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] " +labels: "bug" +assignees: "" +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Environment (please complete the following information):** + +- OS: [e.g. macOS, Windows, Linux] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] +- Node.js version: [e.g. 18.x] +- Package manager: [e.g. pnpm, npm, yarn] + +**Additional context** +Add any other context about the problem here. + +**Logs** +Please include any relevant logs: + +``` +paste logs here +``` diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..fb51721 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,31 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE] " +labels: "enhancement" +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. + +**Implementation details (if applicable)** + +- Affected components: +- Potential breaking changes: +- Dependencies: + +**Would you like to work on this feature?** + +- [ ] Yes, I would like to implement this feature +- [ ] I need help with implementation +- [ ] I prefer someone else to implement this diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..c68fa62 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,58 @@ +--- +name: Pull Request +about: Submit a pull request to contribute to the project +title: "" +labels: "" +assignees: "" +--- + +## Description + +Please include a summary of the change and which issue is fixed. Include relevant motivation and context. + +Fixes # (issue) + +## Type of change + +Please select the relevant options: + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] This change requires a documentation update +- [ ] Performance improvement +- [ ] Code refactoring +- [ ] Test updates + +## Testing + +Please describe the tests that you ran to verify your changes: + +- [ ] Unit tests pass +- [ ] Integration tests pass +- [ ] Manual testing completed + +Test Configuration: + +- Node.js version: +- Browser(s): +- OS: + +## Checklist + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] Any dependent changes have been merged and published + +## Screenshots (if applicable) + +Please add screenshots to help reviewers understand the changes. + +## Additional Notes + +Add any other notes or context about the pull request here. diff --git a/.gitignore b/.gitignore index 5468b82..8854d7e 100644 --- a/.gitignore +++ b/.gitignore @@ -120,7 +120,6 @@ coverage .vscode-test # IDE files -.vscode/ .idea/ *.swp *.swo @@ -191,7 +190,6 @@ tramp .\#* # VS Code -.vscode/ *.code-workspace # JetBrains IDEs diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..58bba50 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,49 @@ +{ + "recommendations": [ + // Vue 开发必备 + "vue.volar", + "vue.vscode-typescript-vue-plugin", + + // 代码格式化和质量 + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + + // TypeScript 支持 + "ms-vscode.vscode-typescript-next", + + // Git 增强 + "eamodio.gitlens", + "mhutchie.git-graph", + + // 开发体验增强 + "christian-kohler.path-intellisense", + "visualstudioexptteam.vscodeintellicode", + "ms-vscode.vscode-json", + + // 文件图标 + "vscode-icons-team.vscode-icons", + + // 自动重命名标签 + "formulahendry.auto-rename-tag", + + // TODO 高亮 + "wayou.vscode-todo-highlight", + + // 注释增强 + "aaron-bond.better-comments", + + // 代码片段 + "hollowtree.vue-snippets", + + // 错误镜头 + "usernamehw.errorlens", + + // 导入成本 + "wix.vscode-import-cost" + ], + "unwantedRecommendations": [ + "ms-vscode.vscode-typescript", + "hookyqr.beautify", + "coenraads.bracket-pair-colorizer-2" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cab37ef --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,87 @@ +{ + // 编辑器设置 + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.formatOnType": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.tabSize": 2, + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "editor.trimAutoWhitespace": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + + // 文件关联 + "[vue]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.wordWrap": "on" + }, + + // ESLint 设置 + "eslint.workingDirectories": ["web"], + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue" + ], + + // TypeScript 设置 + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.suggest.autoImports": true, + "typescript.updateImportsOnFileMove.enabled": "always", + + // 搜索排除 + "search.exclude": { + "**/node_modules": true, + "**/dist": true, + "**/coverage": true, + "**/*.log": true, + "**/pnpm-lock.yaml": true, + "**/package-lock.json": true, + "**/yarn.lock": true + }, + + // 终端设置 + "terminal.integrated.defaultProfile.osx": "zsh", + + // Git 设置 + "git.autofetch": true, + "git.confirmSync": false, + "git.enableSmartCommit": true, + + // Emmet 设置 + "emmet.includeLanguages": { + "vue": "html" + } +} diff --git a/Makefile b/Makefile index 4194113..2389dbf 100644 --- a/Makefile +++ b/Makefile @@ -43,10 +43,9 @@ build-all: clean ## 为所有支持的平台构建二进制文件 .PHONY: run run: ## 构建前端并运行服务器 @echo "--- Building frontend... ---" - cd web && npm install && npm run build - @echo "--- Preparing backend... ---" @rm -rf cmd/gpt-load/dist - @cp -r web/dist cmd/gpt-load/dist + cd web && pnpm install && pnpm run build + @echo "--- Preparing backend... ---" @echo "--- Starting backend... ---" go run $(MAIN_PATH)/main.go diff --git a/fe/index.html b/fe/index.html deleted file mode 100644 index dde16aa..0000000 --- a/fe/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + Vue + TS - - -
- - - diff --git a/fe/package-lock.json b/fe/package-lock.json deleted file mode 100644 index 9300dec..0000000 --- a/fe/package-lock.json +++ /dev/null @@ -1,1804 +0,0 @@ -{ - "name": "tb-vite-demo", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tb-vite-demo", - "version": "0.0.0", - "dependencies": { - "axios": "^1.9.0", - "naive-ui": "^2.41.0", - "vue": "^3.5.13", - "vue-router": "^4.5.1" - }, - "devDependencies": { - "@types/node": "^22.15.24", - "@vitejs/plugin-vue": "^5.2.3", - "@vue/tsconfig": "^0.7.0", - "typescript": "~5.8.3", - "vite": "^6.3.5", - "vue-tsc": "^2.2.8" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz", - "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", - "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@css-render/plugin-bem": { - "version": "0.15.14", - "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz", - "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==", - "peerDependencies": { - "css-render": "~0.15.14" - } - }, - "node_modules/@css-render/vue3-ssr": { - "version": "0.15.14", - "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz", - "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==", - "peerDependencies": { - "vue": "^3.0.11" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", - "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", - "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", - "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", - "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", - "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", - "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", - "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", - "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", - "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", - "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", - "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", - "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", - "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", - "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", - "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", - "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", - "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", - "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", - "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", - "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true - }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" - }, - "node_modules/@types/lodash": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", - "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/node": { - "version": "22.15.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz", - "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==", - "dev": true, - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.14.tgz", - "integrity": "sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==", - "dev": true, - "dependencies": { - "@volar/source-map": "2.4.14" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.14.tgz", - "integrity": "sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==", - "dev": true - }, - "node_modules/@volar/typescript": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.14.tgz", - "integrity": "sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==", - "dev": true, - "dependencies": { - "@volar/language-core": "2.4.14", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", - "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", - "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.16", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", - "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", - "dependencies": { - "@vue/compiler-core": "3.5.16", - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", - "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", - "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.16", - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.3", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", - "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", - "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" - }, - "node_modules/@vue/language-core": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.10.tgz", - "integrity": "sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==", - "dev": true, - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^1.0.3", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", - "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", - "dependencies": { - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", - "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", - "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/shared": "3.5.16" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", - "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", - "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/runtime-core": "3.5.16", - "@vue/shared": "3.5.16", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", - "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", - "dependencies": { - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16" - }, - "peerDependencies": { - "vue": "3.5.16" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", - "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==" - }, - "node_modules/@vue/tsconfig": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.7.0.tgz", - "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", - "dev": true, - "peerDependencies": { - "typescript": "5.x", - "vue": "^3.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/alien-signals": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", - "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", - "dev": true - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "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 - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/css-render": { - "version": "0.15.14", - "resolved": "https://registry.npmjs.org/css-render/-/css-render-0.15.14.tgz", - "integrity": "sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==", - "dependencies": { - "@emotion/hash": "~0.8.0", - "csstype": "~3.0.5" - } - }, - "node_modules/css-render/node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/date-fns-tz": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", - "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", - "peerDependencies": { - "date-fns": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=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==", - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "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==", - "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/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/evtd": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/evtd/-/evtd-0.2.4.tgz", - "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==" - }, - "node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "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==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "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==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true - }, - "node_modules/naive-ui": { - "version": "2.41.0", - "resolved": "https://registry.npmjs.org/naive-ui/-/naive-ui-2.41.0.tgz", - "integrity": "sha512-KnmLg+xPLwXV8QVR7ZZ69eCjvel7R5vru8+eFe4VoAJHEgqAJgVph6Zno9K2IVQRpSF3GBGea3tjavslOR4FAA==", - "dependencies": { - "@css-render/plugin-bem": "^0.15.14", - "@css-render/vue3-ssr": "^0.15.14", - "@types/katex": "^0.16.2", - "@types/lodash": "^4.14.198", - "@types/lodash-es": "^4.17.9", - "async-validator": "^4.2.5", - "css-render": "^0.15.14", - "csstype": "^3.1.3", - "date-fns": "^3.6.0", - "date-fns-tz": "^3.1.3", - "evtd": "^0.2.4", - "highlight.js": "^11.8.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "seemly": "^0.3.8", - "treemate": "^0.3.11", - "vdirs": "^0.1.8", - "vooks": "^0.2.12", - "vueuc": "^0.4.63" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", - "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" - } - ], - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/rollup": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", - "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.1", - "@rollup/rollup-android-arm64": "4.41.1", - "@rollup/rollup-darwin-arm64": "4.41.1", - "@rollup/rollup-darwin-x64": "4.41.1", - "@rollup/rollup-freebsd-arm64": "4.41.1", - "@rollup/rollup-freebsd-x64": "4.41.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", - "@rollup/rollup-linux-arm-musleabihf": "4.41.1", - "@rollup/rollup-linux-arm64-gnu": "4.41.1", - "@rollup/rollup-linux-arm64-musl": "4.41.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-musl": "4.41.1", - "@rollup/rollup-linux-s390x-gnu": "4.41.1", - "@rollup/rollup-linux-x64-gnu": "4.41.1", - "@rollup/rollup-linux-x64-musl": "4.41.1", - "@rollup/rollup-win32-arm64-msvc": "4.41.1", - "@rollup/rollup-win32-ia32-msvc": "4.41.1", - "@rollup/rollup-win32-x64-msvc": "4.41.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/seemly": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.10.tgz", - "integrity": "sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==" - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/treemate": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/treemate/-/treemate-0.3.11.tgz", - "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true - }, - "node_modules/vdirs": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/vdirs/-/vdirs-0.1.8.tgz", - "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==", - "dependencies": { - "evtd": "^0.2.2" - }, - "peerDependencies": { - "vue": "^3.0.11" - } - }, - "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "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/vooks": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz", - "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==", - "dependencies": { - "evtd": "^0.2.2" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true - }, - "node_modules/vue": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", - "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", - "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-sfc": "3.5.16", - "@vue/runtime-dom": "3.5.16", - "@vue/server-renderer": "3.5.16", - "@vue/shared": "3.5.16" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-router": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", - "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.10.tgz", - "integrity": "sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==", - "dev": true, - "dependencies": { - "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.10" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/vueuc": { - "version": "0.4.64", - "resolved": "https://registry.npmjs.org/vueuc/-/vueuc-0.4.64.tgz", - "integrity": "sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==", - "dependencies": { - "@css-render/vue3-ssr": "^0.15.10", - "@juggle/resize-observer": "^3.3.1", - "css-render": "^0.15.10", - "evtd": "^0.2.4", - "seemly": "^0.3.6", - "vdirs": "^0.1.4", - "vooks": "^0.2.4" - }, - "peerDependencies": { - "vue": "^3.0.11" - } - } - } -} diff --git a/fe/package.json b/fe/package.json deleted file mode 100644 index af5aae4..0000000 --- a/fe/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "tb-vite-demo", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vue-tsc -b && vite build", - "preview": "vite preview" - }, - "dependencies": { - "axios": "^1.9.0", - "naive-ui": "^2.41.0", - "vue": "^3.5.13", - "vue-router": "^4.5.1" - }, - "devDependencies": { - "@types/node": "^22.15.24", - "@vitejs/plugin-vue": "^5.2.3", - "@vue/tsconfig": "^0.7.0", - "typescript": "~5.8.3", - "vite": "^6.3.5", - "vue-tsc": "^2.2.8" - } -} diff --git a/fe/pnpm-lock.yaml b/fe/pnpm-lock.yaml deleted file mode 100644 index 94ac2c6..0000000 --- a/fe/pnpm-lock.yaml +++ /dev/null @@ -1,1307 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - axios: - specifier: ^1.9.0 - version: 1.10.0 - naive-ui: - specifier: ^2.41.0 - version: 2.42.0(vue@3.5.17(typescript@5.8.3)) - vue: - specifier: ^3.5.13 - version: 3.5.17(typescript@5.8.3) - vue-router: - specifier: ^4.5.1 - version: 4.5.1(vue@3.5.17(typescript@5.8.3)) - devDependencies: - '@types/node': - specifier: ^22.15.24 - version: 22.15.34 - '@vitejs/plugin-vue': - specifier: ^5.2.3 - version: 5.2.4(vite@6.3.5(@types/node@22.15.34))(vue@3.5.17(typescript@5.8.3)) - '@vue/tsconfig': - specifier: ^0.7.0 - version: 0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) - typescript: - specifier: ~5.8.3 - version: 5.8.3 - vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.34) - vue-tsc: - specifier: ^2.2.8 - version: 2.2.10(typescript@5.8.3) - -packages: - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.27.7': - resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/types@7.27.7': - resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} - engines: {node: '>=6.9.0'} - - '@css-render/plugin-bem@0.15.14': - resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==} - peerDependencies: - css-render: ~0.15.14 - - '@css-render/vue3-ssr@0.15.14': - resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==} - peerDependencies: - vue: ^3.0.11 - - '@emotion/hash@0.8.0': - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@jridgewell/sourcemap-codec@1.5.2': - resolution: {integrity: sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==} - - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - - '@rollup/rollup-android-arm-eabi@4.44.1': - resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.44.1': - resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.44.1': - resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.44.1': - resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.44.1': - resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.44.1': - resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.44.1': - resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.44.1': - resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.44.1': - resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.44.1': - resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.44.1': - resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': - resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.44.1': - resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.44.1': - resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.44.1': - resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.44.1': - resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.44.1': - resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.44.1': - resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.44.1': - resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.44.1': - resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} - cpu: [x64] - os: [win32] - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/katex@0.16.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - - '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - - '@types/lodash@4.17.19': - resolution: {integrity: sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ==} - - '@types/node@22.15.34': - resolution: {integrity: sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==} - - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 - - '@volar/language-core@2.4.15': - resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} - - '@volar/source-map@2.4.15': - resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} - - '@volar/typescript@2.4.15': - resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} - - '@vue/compiler-core@3.5.17': - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} - - '@vue/compiler-dom@3.5.17': - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - - '@vue/compiler-sfc@3.5.17': - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} - - '@vue/compiler-ssr@3.5.17': - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} - - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - - '@vue/devtools-api@6.6.4': - resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - - '@vue/language-core@2.2.10': - resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@vue/reactivity@3.5.17': - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} - - '@vue/runtime-core@3.5.17': - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - - '@vue/runtime-dom@3.5.17': - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - - '@vue/server-renderer@3.5.17': - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} - peerDependencies: - vue: 3.5.17 - - '@vue/shared@3.5.17': - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} - - '@vue/tsconfig@0.7.0': - resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} - peerDependencies: - typescript: 5.x - vue: ^3.4.0 - peerDependenciesMeta: - typescript: - optional: true - vue: - optional: true - - alien-signals@1.0.13: - resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} - - async-validator@4.2.5: - resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.10.0: - resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - css-render@0.15.14: - resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==} - - csstype@3.0.11: - resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - date-fns-tz@3.2.0: - resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} - peerDependencies: - date-fns: ^3.0.0 || ^4.0.0 - - date-fns@3.6.0: - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - 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.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} - hasBin: true - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - evtd@0.2.4: - resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} - - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.3: - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} - engines: {node: '>= 6'} - - 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==} - - 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'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - 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.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - 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'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - - naive-ui@2.42.0: - resolution: {integrity: sha512-c7cXR2YgOjgtBadXHwiWL4Y0tpGLAI5W5QzzHksOi22iuHXoSGMAzdkVTGVPE/PM0MSGQ/JtUIzCx2Y0hU0vTQ==} - peerDependencies: - vue: ^3.0.0 - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - rollup@4.44.1: - resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - seemly@0.3.10: - resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - - treemate@0.3.11: - resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - vdirs@0.1.8: - resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} - peerDependencies: - vue: ^3.0.11 - - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vooks@0.2.12: - resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} - peerDependencies: - vue: ^3.0.0 - - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - - vue-router@4.5.1: - resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} - peerDependencies: - vue: ^3.2.0 - - vue-tsc@2.2.10: - resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} - hasBin: true - peerDependencies: - typescript: '>=5.0.0' - - vue@3.5.17: - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - vueuc@0.4.64: - resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==} - peerDependencies: - vue: ^3.0.11 - -snapshots: - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/parser@7.27.7': - dependencies: - '@babel/types': 7.27.7 - - '@babel/types@7.27.7': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@css-render/plugin-bem@0.15.14(css-render@0.15.14)': - dependencies: - css-render: 0.15.14 - - '@css-render/vue3-ssr@0.15.14(vue@3.5.17(typescript@5.8.3))': - dependencies: - vue: 3.5.17(typescript@5.8.3) - - '@emotion/hash@0.8.0': {} - - '@esbuild/aix-ppc64@0.25.5': - optional: true - - '@esbuild/android-arm64@0.25.5': - optional: true - - '@esbuild/android-arm@0.25.5': - optional: true - - '@esbuild/android-x64@0.25.5': - optional: true - - '@esbuild/darwin-arm64@0.25.5': - optional: true - - '@esbuild/darwin-x64@0.25.5': - optional: true - - '@esbuild/freebsd-arm64@0.25.5': - optional: true - - '@esbuild/freebsd-x64@0.25.5': - optional: true - - '@esbuild/linux-arm64@0.25.5': - optional: true - - '@esbuild/linux-arm@0.25.5': - optional: true - - '@esbuild/linux-ia32@0.25.5': - optional: true - - '@esbuild/linux-loong64@0.25.5': - optional: true - - '@esbuild/linux-mips64el@0.25.5': - optional: true - - '@esbuild/linux-ppc64@0.25.5': - optional: true - - '@esbuild/linux-riscv64@0.25.5': - optional: true - - '@esbuild/linux-s390x@0.25.5': - optional: true - - '@esbuild/linux-x64@0.25.5': - optional: true - - '@esbuild/netbsd-arm64@0.25.5': - optional: true - - '@esbuild/netbsd-x64@0.25.5': - optional: true - - '@esbuild/openbsd-arm64@0.25.5': - optional: true - - '@esbuild/openbsd-x64@0.25.5': - optional: true - - '@esbuild/sunos-x64@0.25.5': - optional: true - - '@esbuild/win32-arm64@0.25.5': - optional: true - - '@esbuild/win32-ia32@0.25.5': - optional: true - - '@esbuild/win32-x64@0.25.5': - optional: true - - '@jridgewell/sourcemap-codec@1.5.2': {} - - '@juggle/resize-observer@3.4.0': {} - - '@rollup/rollup-android-arm-eabi@4.44.1': - optional: true - - '@rollup/rollup-android-arm64@4.44.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.44.1': - optional: true - - '@rollup/rollup-darwin-x64@4.44.1': - optional: true - - '@rollup/rollup-freebsd-arm64@4.44.1': - optional: true - - '@rollup/rollup-freebsd-x64@4.44.1': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.44.1': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.44.1': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.44.1': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.44.1': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.44.1': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.44.1': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.44.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.44.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.44.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.44.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.44.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.44.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.44.1': - optional: true - - '@types/estree@1.0.8': {} - - '@types/katex@0.16.7': {} - - '@types/lodash-es@4.17.12': - dependencies: - '@types/lodash': 4.17.19 - - '@types/lodash@4.17.19': {} - - '@types/node@22.15.34': - dependencies: - undici-types: 6.21.0 - - '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.34))(vue@3.5.17(typescript@5.8.3))': - dependencies: - vite: 6.3.5(@types/node@22.15.34) - vue: 3.5.17(typescript@5.8.3) - - '@volar/language-core@2.4.15': - dependencies: - '@volar/source-map': 2.4.15 - - '@volar/source-map@2.4.15': {} - - '@volar/typescript@2.4.15': - dependencies: - '@volar/language-core': 2.4.15 - path-browserify: 1.0.1 - vscode-uri: 3.1.0 - - '@vue/compiler-core@3.5.17': - dependencies: - '@babel/parser': 7.27.7 - '@vue/shared': 3.5.17 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.17': - dependencies: - '@vue/compiler-core': 3.5.17 - '@vue/shared': 3.5.17 - - '@vue/compiler-sfc@3.5.17': - dependencies: - '@babel/parser': 7.27.7 - '@vue/compiler-core': 3.5.17 - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - estree-walker: 2.0.2 - magic-string: 0.30.17 - postcss: 8.5.6 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.17': - dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/shared': 3.5.17 - - '@vue/compiler-vue2@2.7.16': - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - '@vue/devtools-api@6.6.4': {} - - '@vue/language-core@2.2.10(typescript@5.8.3)': - dependencies: - '@volar/language-core': 2.4.15 - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.17 - alien-signals: 1.0.13 - minimatch: 9.0.5 - muggle-string: 0.4.1 - path-browserify: 1.0.1 - optionalDependencies: - typescript: 5.8.3 - - '@vue/reactivity@3.5.17': - dependencies: - '@vue/shared': 3.5.17 - - '@vue/runtime-core@3.5.17': - dependencies: - '@vue/reactivity': 3.5.17 - '@vue/shared': 3.5.17 - - '@vue/runtime-dom@3.5.17': - dependencies: - '@vue/reactivity': 3.5.17 - '@vue/runtime-core': 3.5.17 - '@vue/shared': 3.5.17 - csstype: 3.1.3 - - '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': - dependencies: - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - vue: 3.5.17(typescript@5.8.3) - - '@vue/shared@3.5.17': {} - - '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))': - optionalDependencies: - typescript: 5.8.3 - vue: 3.5.17(typescript@5.8.3) - - alien-signals@1.0.13: {} - - async-validator@4.2.5: {} - - asynckit@0.4.0: {} - - axios@1.10.0: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.3 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - balanced-match@1.0.2: {} - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - css-render@0.15.14: - dependencies: - '@emotion/hash': 0.8.0 - csstype: 3.0.11 - - csstype@3.0.11: {} - - csstype@3.1.3: {} - - date-fns-tz@3.2.0(date-fns@3.6.0): - dependencies: - date-fns: 3.6.0 - - date-fns@3.6.0: {} - - de-indent@1.0.2: {} - - delayed-stream@1.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - entities@4.5.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - 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.2 - - esbuild@0.25.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 - - estree-walker@2.0.2: {} - - evtd@0.2.4: {} - - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - follow-redirects@1.15.9: {} - - form-data@4.0.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - 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.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 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - gopd@1.2.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - highlight.js@11.11.1: {} - - lodash-es@4.17.21: {} - - lodash@4.17.21: {} - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.2 - - math-intrinsics@1.1.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - - muggle-string@0.4.1: {} - - naive-ui@2.42.0(vue@3.5.17(typescript@5.8.3)): - dependencies: - '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) - '@css-render/vue3-ssr': 0.15.14(vue@3.5.17(typescript@5.8.3)) - '@types/katex': 0.16.7 - '@types/lodash': 4.17.19 - '@types/lodash-es': 4.17.12 - async-validator: 4.2.5 - css-render: 0.15.14 - csstype: 3.1.3 - date-fns: 3.6.0 - date-fns-tz: 3.2.0(date-fns@3.6.0) - evtd: 0.2.4 - highlight.js: 11.11.1 - lodash: 4.17.21 - lodash-es: 4.17.21 - seemly: 0.3.10 - treemate: 0.3.11 - vdirs: 0.1.8(vue@3.5.17(typescript@5.8.3)) - vooks: 0.2.12(vue@3.5.17(typescript@5.8.3)) - vue: 3.5.17(typescript@5.8.3) - vueuc: 0.4.64(vue@3.5.17(typescript@5.8.3)) - - nanoid@3.3.11: {} - - path-browserify@1.0.1: {} - - picocolors@1.1.1: {} - - picomatch@4.0.2: {} - - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - proxy-from-env@1.1.0: {} - - rollup@4.44.1: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.1 - '@rollup/rollup-android-arm64': 4.44.1 - '@rollup/rollup-darwin-arm64': 4.44.1 - '@rollup/rollup-darwin-x64': 4.44.1 - '@rollup/rollup-freebsd-arm64': 4.44.1 - '@rollup/rollup-freebsd-x64': 4.44.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 - '@rollup/rollup-linux-arm-musleabihf': 4.44.1 - '@rollup/rollup-linux-arm64-gnu': 4.44.1 - '@rollup/rollup-linux-arm64-musl': 4.44.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 - '@rollup/rollup-linux-riscv64-gnu': 4.44.1 - '@rollup/rollup-linux-riscv64-musl': 4.44.1 - '@rollup/rollup-linux-s390x-gnu': 4.44.1 - '@rollup/rollup-linux-x64-gnu': 4.44.1 - '@rollup/rollup-linux-x64-musl': 4.44.1 - '@rollup/rollup-win32-arm64-msvc': 4.44.1 - '@rollup/rollup-win32-ia32-msvc': 4.44.1 - '@rollup/rollup-win32-x64-msvc': 4.44.1 - fsevents: 2.3.3 - - seemly@0.3.10: {} - - source-map-js@1.2.1: {} - - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - - treemate@0.3.11: {} - - typescript@5.8.3: {} - - undici-types@6.21.0: {} - - vdirs@0.1.8(vue@3.5.17(typescript@5.8.3)): - dependencies: - evtd: 0.2.4 - vue: 3.5.17(typescript@5.8.3) - - vite@6.3.5(@types/node@22.15.34): - dependencies: - esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.44.1 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.15.34 - fsevents: 2.3.3 - - vooks@0.2.12(vue@3.5.17(typescript@5.8.3)): - dependencies: - evtd: 0.2.4 - vue: 3.5.17(typescript@5.8.3) - - vscode-uri@3.1.0: {} - - vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)): - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.17(typescript@5.8.3) - - vue-tsc@2.2.10(typescript@5.8.3): - dependencies: - '@volar/typescript': 2.4.15 - '@vue/language-core': 2.2.10(typescript@5.8.3) - typescript: 5.8.3 - - vue@3.5.17(typescript@5.8.3): - dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-sfc': 3.5.17 - '@vue/runtime-dom': 3.5.17 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) - '@vue/shared': 3.5.17 - optionalDependencies: - typescript: 5.8.3 - - vueuc@0.4.64(vue@3.5.17(typescript@5.8.3)): - dependencies: - '@css-render/vue3-ssr': 0.15.14(vue@3.5.17(typescript@5.8.3)) - '@juggle/resize-observer': 3.4.0 - css-render: 0.15.14 - evtd: 0.2.4 - seemly: 0.3.10 - vdirs: 0.1.8(vue@3.5.17(typescript@5.8.3)) - vooks: 0.2.12(vue@3.5.17(typescript@5.8.3)) - vue: 3.5.17(typescript@5.8.3) diff --git a/fe/src/App.vue b/fe/src/App.vue deleted file mode 100644 index c8067b5..0000000 --- a/fe/src/App.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/fe/src/assets/vue.svg b/fe/src/assets/vue.svg deleted file mode 100644 index 770e9d3..0000000 --- a/fe/src/assets/vue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/fe/src/components/Logout.vue b/fe/src/components/Logout.vue deleted file mode 100644 index 7433244..0000000 --- a/fe/src/components/Logout.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/fe/src/main.ts b/fe/src/main.ts deleted file mode 100644 index 0ae79f1..0000000 --- a/fe/src/main.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createApp } from 'vue' -import './style.css' -import App from './App.vue' -import router from './utils/router' -import naive from 'naive-ui' - -createApp(App) - .use(router) - .use(naive) - .mount('#app') diff --git a/fe/src/style.css b/fe/src/style.css deleted file mode 100644 index c038d7e..0000000 --- a/fe/src/style.css +++ /dev/null @@ -1,82 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -#app { - max-width: 1280px; - width: 100%; - margin: 0 auto; - padding: 2rem; - min-height: 100vh; -} - -.flex { - display: flex; -} - -.flex-row { - flex-direction: row; -} - -.flex-col { - flex-direction: column; -} - -.justify-start { - justify-content: flex-start; -} - -.justify-center { - justify-content: center; -} - -.justify-end { - justify-content: flex-end; -} - -.justify-between { - justify-content: space-between; -} - -.items-start { - align-items: flex-start; -} - -.items-center { - align-items: center; -} - -.items-end { - align-items: flex-end; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.flex-nowrap { - flex-wrap: nowrap; -} - -.grow { - flex-grow: 1; -} - -.shrink { - flex-shrink: 1; -} diff --git a/fe/src/views/Dashboard.vue b/fe/src/views/Dashboard.vue deleted file mode 100644 index 3f1a307..0000000 --- a/fe/src/views/Dashboard.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/fe/src/views/Login.vue b/fe/src/views/Login.vue deleted file mode 100644 index 7537bb0..0000000 --- a/fe/src/views/Login.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/fe/src/views/Logs.vue b/fe/src/views/Logs.vue deleted file mode 100644 index d27c933..0000000 --- a/fe/src/views/Logs.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/fe/src/views/Settings.vue b/fe/src/views/Settings.vue deleted file mode 100644 index f395f53..0000000 --- a/fe/src/views/Settings.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/fe/src/vite-env.d.ts b/fe/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/fe/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/fe/tsconfig.app.json b/fe/tsconfig.app.json deleted file mode 100644 index 36f23ab..0000000 --- a/fe/tsconfig.app.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "@vue/tsconfig/tsconfig.dom.json", - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "baseUrl": ".", - "paths": { - "@/*": ["src/*"], - }, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] -} diff --git a/fe/tsconfig.json b/fe/tsconfig.json deleted file mode 100644 index 1ffef60..0000000 --- a/fe/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] -} diff --git a/fe/tsconfig.node.json b/fe/tsconfig.node.json deleted file mode 100644 index 9728af2..0000000 --- a/fe/tsconfig.node.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/fe/vite.config.ts b/fe/vite.config.ts deleted file mode 100644 index 4451734..0000000 --- a/fe/vite.config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -import path from 'path' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [vue()], - // 解析配置 - resolve: { - // 配置路径别名 - alias: { - '@': path.resolve(__dirname, './src') - } - }, - // 开发服务器配置 - server: { - // 代理配置示例 - proxy: { - '/api': { - target: 'http://api.example.com', - changeOrigin: true, - rewrite: (path) => path.replace(/^\/api/, '') - } - } - }, - // 构建配置 - build: { - outDir: 'dist', - assetsDir: 'assets' - } -}) diff --git a/web/.browserslistrc b/web/.browserslistrc new file mode 100644 index 0000000..8a6f52c --- /dev/null +++ b/web/.browserslistrc @@ -0,0 +1,10 @@ +# Browsers that we support +> 1% +last 2 versions +not dead +not ie 11 +not op_mini all +Chrome >= 87 +Firefox >= 78 +Safari >= 14 +Edge >= 88 diff --git a/web/.gitignore b/web/.gitignore index a547bf3..e69de29 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/web/.lintstagedrc b/web/.lintstagedrc new file mode 100644 index 0000000..8a4a416 --- /dev/null +++ b/web/.lintstagedrc @@ -0,0 +1,7 @@ +{ + "*.{js,jsx,ts,tsx,vue}": ["eslint --fix", "prettier --write"], + "*.{json,jsonc}": ["prettier --write"], + "*.{css,scss,less}": ["prettier --write"], + "*.{md,markdown}": ["prettier --write"], + "*.{yaml,yml}": ["prettier --write"] +} diff --git a/web/.npmrc b/web/.npmrc new file mode 100644 index 0000000..910cac9 --- /dev/null +++ b/web/.npmrc @@ -0,0 +1,30 @@ +# Use pnpm as package manager +package-manager=pnpm + +# Registry configuration +registry=https://registry.npmjs.org/ + +# Install configuration +prefer-offline=true +prefer-frozen-lockfile=true +strict-peer-dependencies=false + +# Hoisting configuration +shamefully-hoist=false +public-hoist-pattern[]=*eslint* +public-hoist-pattern[]=*prettier* + +# Workspace configuration +link-workspace-packages=true + +# Node.js configuration +node-version=18 + +# Store configuration +store-dir=~/.pnpm-store + +# Logging +loglevel=info + +# Security +audit-level=moderate diff --git a/web/.prettierignore b/web/.prettierignore new file mode 100644 index 0000000..dd24109 --- /dev/null +++ b/web/.prettierignore @@ -0,0 +1,43 @@ +# Build outputs +dist +dist-ssr +coverage + +# Dependencies +node_modules + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Environment files +.env +.env.* +!.env.example + +# IDE files +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.swp +*.swo + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Lock files +package-lock.json +yarn.lock +pnpm-lock.yaml diff --git a/web/.prettierrc b/web/.prettierrc new file mode 100644 index 0000000..e9ed359 --- /dev/null +++ b/web/.prettierrc @@ -0,0 +1,48 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false, + "printWidth": 100, + "endOfLine": "lf", + "trailingComma": "es5", + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "avoid", + "vueIndentScriptAndStyle": false, + "htmlWhitespaceSensitivity": "ignore", + "embeddedLanguageFormatting": "auto", + "overrides": [ + { + "files": ["*.vue"], + "options": { + "parser": "vue", + "vueIndentScriptAndStyle": false + } + }, + { + "files": ["*.json", "*.jsonc"], + "options": { + "parser": "json", + "trailingComma": "none" + } + }, + { + "files": ["*.md", "*.markdown"], + "options": { + "parser": "markdown", + "printWidth": 80, + "proseWrap": "preserve", + "tabWidth": 2 + } + }, + { + "files": ["*.yaml", "*.yml"], + "options": { + "parser": "yaml", + "tabWidth": 2 + } + } + ] +} diff --git a/web/README.md b/web/README.md deleted file mode 100644 index 33895ab..0000000 --- a/web/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Vue 3 + TypeScript + Vite - -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` - + diff --git a/web/src/api/auth.ts b/web/src/api/auth.ts deleted file mode 100644 index f9f2b94..0000000 --- a/web/src/api/auth.ts +++ /dev/null @@ -1,17 +0,0 @@ -import apiClient from './index'; - -export interface LoginRequest { - auth_key: string; -} - -export interface LoginResponse { - success: boolean; - message: string; -} - -export const login = async (authKey: string): Promise => { - const response = await apiClient.post('/auth/login', { - auth_key: authKey - }); - return response.data; -}; \ No newline at end of file diff --git a/web/src/api/dashboard.ts b/web/src/api/dashboard.ts deleted file mode 100644 index e2ebd74..0000000 --- a/web/src/api/dashboard.ts +++ /dev/null @@ -1,11 +0,0 @@ -import request from './index'; -import type { DashboardStats } from '@/types/models'; - -export const getDashboardData = (timeRange: string, groupId: number | null): Promise => { - const params = new URLSearchParams(); - params.append('time_range', timeRange); - if (groupId) { - params.append('group_id', groupId.toString()); - } - return request.get(`/dashboard/data?${params.toString()}`); -}; \ No newline at end of file diff --git a/web/src/api/groups.ts b/web/src/api/groups.ts deleted file mode 100644 index 963ab93..0000000 --- a/web/src/api/groups.ts +++ /dev/null @@ -1,92 +0,0 @@ -import apiClient from "./index"; -import type { Group } from "../types/models"; - -/** - * 获取所有分组列表 - */ -export const fetchGroups = (): Promise => { - return apiClient.get("/groups").then((res) => { - const groups = res.data.data; - // 将后端返回的 config 字符串解析为对象 - return groups.map((group: any) => ({ - ...group, - config: - typeof group.config === "string" - ? JSON.parse(group.config) - : group.config, - })); - }); -}; - -/** - * 获取单个分组的详细信息 - * @param id 分组ID - */ -export const fetchGroup = (id: string): Promise => { - return apiClient.get(`/groups/${id}`).then((res) => { - const group = res.data.data; - // 将后端返回的 config 字符串解析为对象 - return { - ...group, - config: - typeof group.config === "string" - ? JSON.parse(group.config) - : group.config, - }; - }); -}; - -/** - * 创建一个新的分组 - * @param groupData 新分组的数据 - */ -export const createGroup = ( - groupData: Omit -): Promise => { - // 将 config 对象转换为 JSON 字符串,匹配后端期望的格式 - const requestData = { - ...groupData, - config: - typeof groupData.config === "object" - ? JSON.stringify(groupData.config) - : groupData.config, - }; - - console.log("createGroup - Original data:", groupData); - console.log("createGroup - Request data:", requestData); - console.log("createGroup - Config type:", typeof requestData.config); - - return apiClient.post("/groups", requestData).then((res) => res.data.data); -}; - -/** - * 更新一个已存在的分组 - * @param id 分组ID - * @param groupData 要更新的数据 - */ -export const updateGroup = ( - id: string, - groupData: Partial< - Omit - > -): Promise => { - // 将 config 对象转换为 JSON 字符串,匹配后端期望的格式 - const requestData = { - ...groupData, - config: - groupData.config && typeof groupData.config === "object" - ? JSON.stringify(groupData.config) - : groupData.config, - }; - return apiClient - .put(`/groups/${id}`, requestData) - .then((res) => res.data.data); -}; - -/** - * 删除一个分组 - * @param id 分组ID - */ -export const deleteGroup = (id: string): Promise => { - return apiClient.delete(`/groups/${id}`).then((res) => res.data); -}; diff --git a/web/src/api/index.ts b/web/src/api/index.ts deleted file mode 100644 index 1a8e347..0000000 --- a/web/src/api/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import axios from "axios"; -import { useAuthStore } from "@/stores/authStore"; -import router from "@/router"; - -const apiClient = axios.create({ - baseURL: "/api", - headers: { - "Content-Type": "application/json", - }, -}); - -// 请求拦截器:自动添加认证头 -apiClient.interceptors.request.use( - (config) => { - const authStore = useAuthStore(); - const authKey = authStore.getAuthKey(); - - if (authKey) { - config.headers.Authorization = `Bearer ${authKey}`; - } - - return config; - }, - (error) => { - return Promise.reject(error); - } -); - -// 响应拦截器:处理401认证失败 -apiClient.interceptors.response.use( - (response) => { - return response; - }, - (error) => { - if (error.response?.status === 401) { - // 认证失败,清除登录状态并跳转到登录页 - const authStore = useAuthStore(); - authStore.logout(); - - // 跳转到登录页(如果不在登录页的话) - if (router.currentRoute.value.path !== '/login') { - router.push('/login'); - } - } - - return Promise.reject(error); - } -); - -export default apiClient; diff --git a/web/src/api/keys.ts b/web/src/api/keys.ts deleted file mode 100644 index da70eac..0000000 --- a/web/src/api/keys.ts +++ /dev/null @@ -1,71 +0,0 @@ -import apiClient from "./index"; -import type { Key } from "../types/models"; - -/** - * 获取指定分组下的所有密钥列表 - * @param groupId 分组ID - */ -export const fetchKeysInGroup = (groupId: string): Promise => { - return apiClient.get(`/groups/${groupId}/keys`).then((res) => res.data.data); -}; - -/** - * 在指定分组下创建一个新的密钥 - * @param groupId 分组ID - * @param keyData 新密钥的数据 - */ -export const createKey = ( - groupId: string, - keyData: Omit< - Key, - | "id" - | "group_id" - | "created_at" - | "updated_at" - | "request_count" - | "failure_count" - > -): Promise => { - return apiClient - .post(`/groups/${groupId}/keys`, keyData) - .then((res) => res.data.data); -}; - -/** - * 更新一个已存在的密钥 - * @param id 密钥ID - * @param keyData 要更新的数据 - */ -export const updateKey = (id: string, keyData: Partial): Promise => { - return apiClient.put(`/keys/${id}`, keyData).then((res) => res.data.data); -}; - -/** - * 删除一个密钥 - * @param id 密钥ID - */ -export const deleteKey = (id: string): Promise => { - return apiClient.delete(`/keys/${id}`).then((res) => res.data); -}; - -/** - * 批量更新密钥 - * @param ids 密钥ID列表 - * @param data 要更新的数据 - */ -export const batchUpdateKeys = ( - ids: string[], - data: Partial -): Promise => { - return apiClient - .post("/keys/batch-update", { ids, data }) - .then((res) => res.data); -}; - -/** - * 批量删除密钥 - * @param ids 密钥ID列表 - */ -export const batchDeleteKeys = (ids: string[]): Promise => { - return apiClient.post("/keys/batch-delete", { ids }).then((res) => res.data); -}; diff --git a/web/src/api/logs.ts b/web/src/api/logs.ts deleted file mode 100644 index 5d3dc3e..0000000 --- a/web/src/api/logs.ts +++ /dev/null @@ -1,24 +0,0 @@ -import request from './index'; -import type { RequestLog } from '@/types/models'; - -export type { RequestLog }; - -export interface LogQuery { - page?: number; - size?: number; - group_id?: number; - start_time?: string; - end_time?: string; - status_code?: number; -} - -export interface PaginatedLogs { - total: number; - page: number; - size: number; - data: RequestLog[]; -} - -export const getLogs = (query: LogQuery): Promise => { - return request.get('/logs', { params: query }); -}; \ No newline at end of file diff --git a/web/src/api/settings.ts b/web/src/api/settings.ts deleted file mode 100644 index 4dcab4d..0000000 --- a/web/src/api/settings.ts +++ /dev/null @@ -1,22 +0,0 @@ -import request from './index'; -import type { SettingCategory, SystemSettings } from '@/types/models'; - -// A generic function to get settings for a specific category -export function getSettings(category: SettingCategory) { - // The backend API would need to support this, e.g., /api/settings/system - return request.get(`/settings/${category}`); -} - -// A generic function to update settings for a specific category -export function updateSettings(category: SettingCategory, settings: T) { - return request.put(`/settings/${category}`, settings); -} - -// Specific functions for system settings as an example -export function getSystemSettings() { - return getSettings('system'); -} - -export function updateSystemSettings(settings: SystemSettings) { - return updateSettings('system', settings); -} \ No newline at end of file diff --git a/fe/src/components/BaseInfoCard.vue b/web/src/components/BaseInfoCard.vue similarity index 100% rename from fe/src/components/BaseInfoCard.vue rename to web/src/components/BaseInfoCard.vue diff --git a/web/src/components/GroupConfigForm.vue b/web/src/components/GroupConfigForm.vue deleted file mode 100644 index 1a8b85a..0000000 --- a/web/src/components/GroupConfigForm.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - diff --git a/web/src/components/GroupList.vue b/web/src/components/GroupList.vue deleted file mode 100644 index 1a7c75a..0000000 --- a/web/src/components/GroupList.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/fe/src/components/Layout.vue b/web/src/components/Layout.vue similarity index 100% rename from fe/src/components/Layout.vue rename to web/src/components/Layout.vue diff --git a/fe/src/components/LineChart.vue b/web/src/components/LineChart.vue similarity index 100% rename from fe/src/components/LineChart.vue rename to web/src/components/LineChart.vue diff --git a/web/src/components/LogFilter.vue b/web/src/components/LogFilter.vue deleted file mode 100644 index 78daa20..0000000 --- a/web/src/components/LogFilter.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/Logout.vue b/web/src/components/Logout.vue new file mode 100644 index 0000000..da4e421 --- /dev/null +++ b/web/src/components/Logout.vue @@ -0,0 +1,3 @@ + diff --git a/fe/src/components/NavBar.vue b/web/src/components/NavBar.vue similarity index 69% rename from fe/src/components/NavBar.vue rename to web/src/components/NavBar.vue index 65a1118..2a85373 100644 --- a/fe/src/components/NavBar.vue +++ b/web/src/components/NavBar.vue @@ -1,10 +1,5 @@ \ No newline at end of file diff --git a/web/src/components/business/dashboard/QuickActions.vue b/web/src/components/business/dashboard/QuickActions.vue deleted file mode 100644 index b945102..0000000 --- a/web/src/components/business/dashboard/QuickActions.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - \ No newline at end of file diff --git a/web/src/components/business/dashboard/RequestChart.vue b/web/src/components/business/dashboard/RequestChart.vue deleted file mode 100644 index 558ed59..0000000 --- a/web/src/components/business/dashboard/RequestChart.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - diff --git a/web/src/components/business/dashboard/StatsCards.vue b/web/src/components/business/dashboard/StatsCards.vue deleted file mode 100644 index dc534fa..0000000 --- a/web/src/components/business/dashboard/StatsCards.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/web/src/components/business/groups/GroupForm.vue b/web/src/components/business/groups/GroupForm.vue deleted file mode 100644 index 0172dbf..0000000 --- a/web/src/components/business/groups/GroupForm.vue +++ /dev/null @@ -1,486 +0,0 @@ - - - - - diff --git a/web/src/components/business/groups/GroupList.vue b/web/src/components/business/groups/GroupList.vue deleted file mode 100644 index 1262a13..0000000 --- a/web/src/components/business/groups/GroupList.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - - - diff --git a/web/src/components/business/groups/GroupStats.vue b/web/src/components/business/groups/GroupStats.vue deleted file mode 100644 index eb7611f..0000000 --- a/web/src/components/business/groups/GroupStats.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/business/keys/KeyBatchOps.vue b/web/src/components/business/keys/KeyBatchOps.vue deleted file mode 100644 index 9cea6ba..0000000 --- a/web/src/components/business/keys/KeyBatchOps.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - diff --git a/web/src/components/business/keys/KeyForm.vue b/web/src/components/business/keys/KeyForm.vue deleted file mode 100644 index 09cd3aa..0000000 --- a/web/src/components/business/keys/KeyForm.vue +++ /dev/null @@ -1,368 +0,0 @@ - - - - - diff --git a/web/src/components/business/keys/KeyTable.vue b/web/src/components/business/keys/KeyTable.vue deleted file mode 100644 index 47914da..0000000 --- a/web/src/components/business/keys/KeyTable.vue +++ /dev/null @@ -1,328 +0,0 @@ - - - - - diff --git a/web/src/components/business/keys/KeyTableNew.vue b/web/src/components/business/keys/KeyTableNew.vue deleted file mode 100644 index e69de29..0000000 diff --git a/web/src/components/business/settings/GroupSettings.vue b/web/src/components/business/settings/GroupSettings.vue deleted file mode 100644 index a2efb7b..0000000 --- a/web/src/components/business/settings/GroupSettings.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/web/src/components/business/settings/SettingItem.vue b/web/src/components/business/settings/SettingItem.vue deleted file mode 100644 index 95e1e05..0000000 --- a/web/src/components/business/settings/SettingItem.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/business/settings/SystemSettings.vue b/web/src/components/business/settings/SystemSettings.vue deleted file mode 100644 index c64b6aa..0000000 --- a/web/src/components/business/settings/SystemSettings.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - \ No newline at end of file diff --git a/web/src/components/common/ConfirmDialog.vue b/web/src/components/common/ConfirmDialog.vue deleted file mode 100644 index 846f57b..0000000 --- a/web/src/components/common/ConfirmDialog.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/common/DataTable.vue b/web/src/components/common/DataTable.vue deleted file mode 100644 index 0a64ee8..0000000 --- a/web/src/components/common/DataTable.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/common/DateRangePicker.vue b/web/src/components/common/DateRangePicker.vue deleted file mode 100644 index 8cb1d69..0000000 --- a/web/src/components/common/DateRangePicker.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/common/EmptyState.vue b/web/src/components/common/EmptyState.vue deleted file mode 100644 index ace54bf..0000000 --- a/web/src/components/common/EmptyState.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/common/LoadingSpinner.vue b/web/src/components/common/LoadingSpinner.vue deleted file mode 100644 index ad4b83b..0000000 --- a/web/src/components/common/LoadingSpinner.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/common/SearchInput.vue b/web/src/components/common/SearchInput.vue deleted file mode 100644 index 0b1234d..0000000 --- a/web/src/components/common/SearchInput.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/components/common/StatusBadge.vue b/web/src/components/common/StatusBadge.vue deleted file mode 100644 index 79e08d1..0000000 --- a/web/src/components/common/StatusBadge.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/web/src/layouts/Footer.vue b/web/src/layouts/Footer.vue deleted file mode 100644 index 215af7d..0000000 --- a/web/src/layouts/Footer.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/layouts/HeaderNav.vue b/web/src/layouts/HeaderNav.vue deleted file mode 100644 index 89e70fa..0000000 --- a/web/src/layouts/HeaderNav.vue +++ /dev/null @@ -1,260 +0,0 @@ - - - - - diff --git a/web/src/layouts/MainLayout.vue b/web/src/layouts/MainLayout.vue deleted file mode 100644 index 0b14fea..0000000 --- a/web/src/layouts/MainLayout.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/web/src/main.ts b/web/src/main.ts index cfbe296..820b425 100644 --- a/web/src/main.ts +++ b/web/src/main.ts @@ -1,20 +1,7 @@ +import naive from 'naive-ui' import { createApp } from 'vue' -import { createPinia } from 'pinia' import App from './App.vue' -import router from './router' import './style.css' -import ElementPlus from 'element-plus' -import 'element-plus/dist/index.css' -import { useAuthStore } from './stores/authStore' +import router from './utils/router' -const app = createApp(App) - -app.use(createPinia()) -app.use(router) -app.use(ElementPlus) - -// 确保认证状态在应用启动时初始化 -const authStore = useAuthStore() -authStore.initializeAuth() - -app.mount('#app') +createApp(App).use(router).use(naive).mount('#app') diff --git a/web/src/router/index.ts b/web/src/router/index.ts deleted file mode 100644 index 8d7ed07..0000000 --- a/web/src/router/index.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { createRouter, createWebHistory } from "vue-router"; -import { useAuthStore } from "../stores/authStore"; -import Dashboard from "../views/Dashboard.vue"; -import Login from "../views/Login.vue"; -import MainLayout from "../layouts/MainLayout.vue"; - -const routes = [ - { - path: "/login", - name: "Login", - component: Login, - meta: { requiresAuth: false }, - }, - { - path: "/", - component: MainLayout, - meta: { requiresAuth: true }, - children: [ - { - path: "", - redirect: "/dashboard", - }, - { - path: "/dashboard", - name: "Dashboard", - component: Dashboard, - meta: { requiresAuth: true }, - }, - { - path: "/groups", - name: "Groups", - component: () => import("../views/Groups.vue"), - meta: { requiresAuth: true }, - }, - { - path: "/logs", - name: "Logs", - component: () => import("../views/Logs.vue"), - meta: { requiresAuth: true }, - }, - { - path: "/settings", - name: "Settings", - component: () => import("../views/Settings.vue"), - meta: { requiresAuth: true }, - }, - ], - }, -]; - -const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), - routes, -}); - -// 路由守卫 -router.beforeEach((to, _from, next) => { - const authStore = useAuthStore(); - const isAuthenticated = authStore.isAuthenticated; - const requiresAuth = to.matched.some( - (record) => record.meta.requiresAuth !== false - ); - - if (requiresAuth && !isAuthenticated) { - // 临时测试:自动登录 - console.log("Auto-login for development testing"); - authStore.login("test-key"); - next(); - } else if (to.name === "Login" && isAuthenticated) { - // 已登录用户访问登录页,重定向到仪表盘 - next({ name: "Dashboard" }); - } else { - // 正常访问 - next(); - } -}); - -export default router; diff --git a/web/src/stores/authStore.ts b/web/src/stores/authStore.ts deleted file mode 100644 index 507aa97..0000000 --- a/web/src/stores/authStore.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { defineStore } from 'pinia'; -import { ref, computed } from 'vue'; -import type { User } from '@/types/models'; - -const AUTH_KEY_STORAGE = 'gpt-load-auth-key'; - -export const useAuthStore = defineStore('auth', () => { - // State - const authKey = ref(''); - const user = ref(null); - - // Computed - const isAuthenticated = computed(() => !!authKey.value); - - // Actions - function login(key: string) { - authKey.value = key; - // For now, we'll just mock a user object. - // In a real app, you'd fetch this from an API. - user.value = { id: '1', username: 'admin' }; - localStorage.setItem(AUTH_KEY_STORAGE, key); - } - - function logout() { - authKey.value = ''; - user.value = null; - localStorage.removeItem(AUTH_KEY_STORAGE); - } - - function getAuthKey(): string { - return authKey.value; - } - - function initializeAuth() { - const storedKey = localStorage.getItem(AUTH_KEY_STORAGE); - if (storedKey) { - authKey.value = storedKey; - // If auth key exists, we can assume the user is logged in. - // You might want to verify the key with the server here. - user.value = { id: '1', username: 'admin' }; - } - } - - // 在store初始化时自动恢复认证状态 - initializeAuth(); - - return { - // State - authKey, - user, - // Computed - isAuthenticated, - // Actions - login, - logout, - getAuthKey, - initializeAuth, - }; -}); \ No newline at end of file diff --git a/web/src/stores/dashboardStore.ts b/web/src/stores/dashboardStore.ts deleted file mode 100644 index 8144f5d..0000000 --- a/web/src/stores/dashboardStore.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { ref, computed } from "vue"; -import { defineStore } from "pinia"; -import { getDashboardData } from "@/api/dashboard"; -import type { DashboardStats } from "@/types/models"; - -export const useDashboardStore = defineStore("dashboard", () => { - const stats = ref({ - total_requests: 0, - success_requests: 0, - success_rate: 0, - group_stats: [], - // 前端扩展字段 - total_keys: 0, - active_keys: 0, - inactive_keys: 0, - error_keys: 0, - }); - const loading = ref(false); - const filters = ref({ - timeRange: "7d", - groupId: null as number | null, - }); - - let pollingInterval: number | undefined; - - const chartData = computed(() => { - // 基于group_stats生成图表数据 - return { - labels: stats.value.group_stats.map((g) => g.group_name), - data: stats.value.group_stats.map((g) => g.request_count), - }; - }); - - const fetchDashboardData = async () => { - loading.value = true; - try { - const response = await getDashboardData( - filters.value.timeRange, - filters.value.groupId - ); - stats.value = response; - } catch (error) { - console.error("Failed to fetch dashboard data:", error); - } finally { - loading.value = false; - } - }; - - const startPolling = () => { - fetchDashboardData(); - pollingInterval = window.setInterval(fetchDashboardData, 30000); // 30 seconds - }; - - const stopPolling = () => { - if (pollingInterval) { - clearInterval(pollingInterval); - pollingInterval = undefined; - } - }; - - return { - stats, - loading, - filters, - chartData, - fetchDashboardData, - startPolling, - stopPolling, - }; -}); diff --git a/web/src/stores/groupStore.ts b/web/src/stores/groupStore.ts deleted file mode 100644 index 1e12683..0000000 --- a/web/src/stores/groupStore.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { defineStore } from "pinia"; -import { ref, computed } from "vue"; -import * as groupApi from "@/api/groups"; -import type { Group } from "@/types/models"; -import { useKeyStore } from "./keyStore"; - -export const useGroupStore = defineStore("group", () => { - // State - const groups = ref([]); - const selectedGroupId = ref(null); - const isLoading = ref(false); - - // Getters - const selectedGroupDetails = computed(() => { - if (!selectedGroupId.value) { - return null; - } - return groups.value.find((g) => g.id === selectedGroupId.value) || null; - }); - - // Actions - async function fetchGroups() { - isLoading.value = true; - try { - groups.value = await groupApi.fetchGroups(); - // 如果没有选中的分组,或者选中的分组已不存在,则默认选中第一个 - const selectedExists = groups.value.some( - (g) => g.id === selectedGroupId.value - ); - if (groups.value.length > 0 && !selectedExists) { - selectGroup(groups.value[0].id); - } - } catch (error) { - console.error("Failed to fetch groups:", error); - } finally { - isLoading.value = false; - } - } - - function selectGroup(id: number | null) { - selectedGroupId.value = id; - const keyStore = useKeyStore(); - if (id) { - keyStore.fetchKeys(id.toString()); // 暂时转换为string以兼容现有API - } else { - keyStore.clearKeys(); - } - } - - async function fetchGroupKeys(groupId: number) { - // TODO: 实现获取特定分组的密钥 - console.log("fetchGroupKeys not implemented yet, groupId:", groupId); - /* - const group = groups.value.find(g => g.id === groupId); - if (group) { - try { - const keys = await groupApi.fetchGroupKeys(groupId); - group.api_keys = keys; - } catch (error) { - console.error('Failed to fetch group keys:', error); - throw error; - } - } - */ - } - - async function createGroup( - groupData: Omit - ) { - try { - const newGroup = await groupApi.createGroup(groupData); - await fetchGroups(); // Re-fetch to get the full list - selectGroup(newGroup.id); - } catch (error) { - console.error("Failed to create group:", error); - throw error; - } - } - - async function updateGroup(id: number, groupData: Partial) { - try { - await groupApi.updateGroup(id.toString(), groupData); // 暂时转换为string - await fetchGroups(); // Re-fetch to update the list - } catch (error) { - console.error("Failed to update group:", error); - throw error; - } - } - - async function deleteGroup(id: number) { - try { - await groupApi.deleteGroup(id.toString()); // 暂时转换为string - await fetchGroups(); // Re-fetch to update the list - if (selectedGroupId.value === id) { - selectedGroupId.value = null; - } - } catch (error) { - console.error("Failed to delete group:", error); - throw error; - } - } - - return { - // State - groups, - selectedGroupId, - isLoading, - // Getters - selectedGroupDetails, - // Actions - fetchGroups, - selectGroup, - fetchGroupKeys, - createGroup, - updateGroup, - deleteGroup, - }; -}); diff --git a/web/src/stores/keyStore.ts b/web/src/stores/keyStore.ts deleted file mode 100644 index 1370849..0000000 --- a/web/src/stores/keyStore.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { defineStore } from "pinia"; -import { ref } from "vue"; -import * as keyApi from "@/api/keys"; -import type { APIKey } from "@/types/models"; -import { useGroupStore } from "./groupStore"; - -export const useKeyStore = defineStore("key", () => { - // State - const keys = ref([]); - const selectedKeyIds = ref([]); - const isLoading = ref(false); - - // Actions - async function fetchKeys(groupId: string) { - if (!groupId) { - keys.value = []; - return; - } - isLoading.value = true; - try { - keys.value = await keyApi.fetchKeysInGroup(groupId); - } catch (error) { - console.error(`Failed to fetch keys for group ${groupId}:`, error); - keys.value = []; - } finally { - isLoading.value = false; - } - } - - function setSelectedKeys(ids: number[]) { - selectedKeyIds.value = ids; - } - - function clearKeys() { - keys.value = []; - selectedKeyIds.value = []; - } - - async function createKey( - groupId: string, - keyData: Omit< - APIKey, - | "id" - | "group_id" - | "created_at" - | "updated_at" - | "request_count" - | "failure_count" - > - ) { - try { - await keyApi.createKey(groupId, keyData); - await fetchKeys(groupId); - } catch (error) { - console.error("Failed to create key:", error); - throw error; - } - } - - async function updateKey(id: string, keyData: Partial) { - const groupStore = useGroupStore(); - try { - await keyApi.updateKey(id, keyData); - if (groupStore.selectedGroupId) { - await fetchKeys(groupStore.selectedGroupId.toString()); - } - } catch (error) { - console.error(`Failed to update key ${id}:`, error); - throw error; - } - } - - async function deleteKey(id: string) { - const groupStore = useGroupStore(); - try { - await keyApi.deleteKey(id); - if (groupStore.selectedGroupId) { - await fetchKeys(groupStore.selectedGroupId.toString()); - } - } catch (error) { - console.error(`Failed to delete key ${id}:`, error); - throw error; - } - } - - // 新增方法:更新密钥状态 - async function updateKeyStatus( - id: number, - status: "active" | "inactive" | "error" - ) { - try { - await keyApi.updateKey(id.toString(), { status }); - const groupStore = useGroupStore(); - if (groupStore.selectedGroupId) { - await fetchKeys(groupStore.selectedGroupId.toString()); - } - } catch (error) { - console.error(`Failed to update key status ${id}:`, error); - throw error; - } - } - - async function batchUpdateStatus( - ids: number[], - status: "active" | "inactive" | "error" - ) { - const groupStore = useGroupStore(); - try { - await keyApi.batchUpdateKeys( - ids.map((id) => id.toString()), - { status } - ); - if (groupStore.selectedGroupId) { - await fetchKeys(groupStore.selectedGroupId.toString()); - selectedKeyIds.value = []; // Clear selection after batch operation - } - } catch (error) { - console.error("Failed to batch update key status:", error); - throw error; - } - } - - // 新增方法:批量删除 - async function batchDelete(ids: number[]) { - const groupStore = useGroupStore(); - try { - await keyApi.batchDeleteKeys(ids.map((id) => id.toString())); - if (groupStore.selectedGroupId) { - await fetchKeys(groupStore.selectedGroupId.toString()); - selectedKeyIds.value = []; // Clear selection after batch operation - } - } catch (error) { - console.error("Failed to batch delete keys:", error); - throw error; - } - } - - async function batchDeleteKeys(ids: string[]) { - const groupStore = useGroupStore(); - try { - await keyApi.batchDeleteKeys(ids); - if (groupStore.selectedGroupId) { - await fetchKeys(groupStore.selectedGroupId.toString()); - selectedKeyIds.value = []; // Clear selection after batch operation - } - } catch (error) { - console.error("Failed to batch delete keys:", error); - throw error; - } - } - - return { - // State - keys, - selectedKeyIds, - isLoading, - // Actions - fetchKeys, - setSelectedKeys, - clearKeys, - createKey, - updateKey, - deleteKey, - updateKeyStatus, - batchUpdateStatus, - batchDelete, - batchDeleteKeys, - }; -}); diff --git a/web/src/stores/logStore.ts b/web/src/stores/logStore.ts deleted file mode 100644 index fb3a333..0000000 --- a/web/src/stores/logStore.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { defineStore } from 'pinia'; -import { ref, reactive } from 'vue'; -import { getLogs } from '@/api/logs'; -import type { RequestLog, LogQuery, PaginatedLogs } from '@/api/logs'; - -export const useLogStore = defineStore('logs', () => { - const logs = ref([]); - const loading = ref(false); - const pagination = reactive({ - page: 1, - size: 10, - total: 0, - }); - const filters = reactive({}); - - const fetchLogs = async () => { - loading.value = true; - try { - const query: LogQuery = { - ...filters, - page: pagination.page, - size: pagination.size, - }; - const response: PaginatedLogs = await getLogs(query); - logs.value = response.data; - pagination.total = response.total; - } catch (error) { - console.error('Failed to fetch logs:', error); - } finally { - loading.value = false; - } - }; - - const setFilters = (newFilters: LogQuery) => { - Object.assign(filters, newFilters); - pagination.page = 1; - fetchLogs(); - }; - - const setPage = (page: number) => { - pagination.page = page; - fetchLogs(); - }; - - const setSize = (size: number) => { - pagination.size = size; - pagination.page = 1; - fetchLogs(); - }; - - return { - logs, - loading, - pagination, - filters, - fetchLogs, - setFilters, - setPage, - setSize, - }; -}); \ No newline at end of file diff --git a/web/src/stores/settingStore.ts b/web/src/stores/settingStore.ts deleted file mode 100644 index b29eeb5..0000000 --- a/web/src/stores/settingStore.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { defineStore } from 'pinia'; -import { getSystemSettings, updateSystemSettings } from '@/api/settings'; -import type { SystemSettings } from '@/types/models'; -import { ElMessage } from 'element-plus'; - -interface SettingsState { - systemSettings: SystemSettings | null; - loading: boolean; - error: any; - errors: Record; // For field-specific validation errors -} - -export const useSettingStore = defineStore('setting', { - state: (): SettingsState => ({ - systemSettings: null, - loading: false, - error: null, - errors: {}, - }), - actions: { - async fetchSystemSettings() { - this.loading = true; - this.error = null; - try { - const response = await getSystemSettings(); - this.systemSettings = response.data; - } catch (error) { - this.error = error; - ElMessage.error('Failed to fetch system settings.'); - } finally { - this.loading = false; - } - }, - async saveSystemSettings() { - if (!this.systemSettings) return; - - this.loading = true; - this.error = null; - this.errors = {}; - - // Basic validation example - if (this.systemSettings.port < 1 || this.systemSettings.port > 65535) { - this.errors['port'] = 'Port must be between 1 and 65535.'; - } - if (Object.keys(this.errors).length > 0) { - this.loading = false; - ElMessage.error('Please correct the errors before saving.'); - return; - } - - try { - await updateSystemSettings(this.systemSettings); - await this.fetchSystemSettings(); // Refresh state - ElMessage.success('System settings updated successfully.'); - } catch (error) { - this.error = error; - ElMessage.error('Failed to update system settings.'); - } finally { - this.loading = false; - } - }, - // Action to reset settings to their original state (fetched from server) - async resetSystemSettings() { - await this.fetchSystemSettings(); - }, - }, -}); \ No newline at end of file diff --git a/web/src/style.css b/web/src/style.css index 9acc368..c038d7e 100644 --- a/web/src/style.css +++ b/web/src/style.css @@ -1,136 +1,82 @@ -/* 全局样式重置和基础设置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - :root { - font-family: "Inter", "SF Pro Display", system-ui, -apple-system, sans-serif; + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; font-weight: 400; - /* 使用亮色主题 */ - color-scheme: light; - color: #1f2937; - background-color: #ffffff; - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -html, -body { - height: 100%; - margin: 0; - padding: 0; - background-color: #f9fafb; -} - body { margin: 0; - width: 100%; - height: 100vh; - overflow-x: hidden; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; } #app { + max-width: 1280px; width: 100%; - height: 100vh; + margin: 0 auto; + padding: 2rem; + min-height: 100vh; +} + +.flex { display: flex; +} + +.flex-row { + flex-direction: row; +} + +.flex-col { flex-direction: column; } -/* 链接样式 */ -a { - font-weight: 500; - color: #3b82f6; - text-decoration: none; - transition: color 0.2s; +.justify-start { + justify-content: flex-start; } -a:hover { - color: #1d4ed8; +.justify-center { + justify-content: center; } -/* 标题样式 */ -h1, -h2, -h3, -h4, -h5, -h6 { - color: #1f2937; - font-weight: 600; - line-height: 1.2; - margin: 0; +.justify-end { + justify-content: flex-end; } -h1 { - font-size: 2.5rem; +.justify-between { + justify-content: space-between; } -h2 { - font-size: 2rem; +.items-start { + align-items: flex-start; } -h3 { - font-size: 1.5rem; +.items-center { + align-items: center; } -/* 按钮基础样式重置 */ -button { - border: none; - background: none; - padding: 0; - cursor: pointer; - font-family: inherit; +.items-end { + align-items: flex-end; } -/* 表单元素样式 */ -input, -textarea, -select { - font-family: inherit; +.flex-wrap { + flex-wrap: wrap; } -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; - height: 6px; +.flex-nowrap { + flex-wrap: nowrap; } -::-webkit-scrollbar-track { - background: #f1f5f9; - border-radius: 3px; +.grow { + flex-grow: 1; } -::-webkit-scrollbar-thumb { - background: #cbd5e1; - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: #94a3b8; -} - -/* 工具类 */ -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; +.shrink { + flex-shrink: 1; } diff --git a/web/src/types/models.ts b/web/src/types/models.ts deleted file mode 100644 index ed82dc8..0000000 --- a/web/src/types/models.ts +++ /dev/null @@ -1,175 +0,0 @@ -// Based on internal/models/types.go - -// Corresponds to the APIKey struct in Go - 修正版本 -export interface APIKey { - id: number; // uint -> number - group_id: number; // uint -> number - key_value: string; // 对应后端key_value字段 - status: "active" | "inactive" | "error"; // 对应后端status字段 - request_count: number; // int64 -> number - failure_count: number; // int64 -> number - last_used_at?: string; // *time.Time -> optional string - created_at: string; // time.Time -> string - updated_at: string; // time.Time -> string -} - -// 为了兼容,保留Key别名 -export type Key = APIKey; - -// Corresponds to the Group struct in Go - 修正版本 -export interface Group { - id: number; // uint -> number - name: string; - description: string; - channel_type: "openai" | "gemini"; // 明确的渠道类型 - is_default?: boolean; // 添加默认分组标识 - config: GroupConfig; // 解析后的配置对象 - api_keys?: APIKey[]; // 关联的API密钥,可选 - created_at: string; - updated_at: string; -} - -// 分组配置结构 -export interface GroupConfig { - upstream_url: string; - timeout?: number; - max_tokens?: number; - [key: string]: any; -} - -// 分组请求统计 -export interface GroupRequestStat { - group_name: string; - request_count: number; -} - -// 仪表盘统计数据 - 根据后端DashboardStats修正 -export interface DashboardStats { - total_requests: number; // 对应后端total_requests - success_requests: number; // 对应后端success_requests - success_rate: number; // 对应后端success_rate - group_stats: GroupRequestStat[]; // 对应后端group_stats - // 前端扩展字段 - total_keys?: number; - active_keys?: number; - inactive_keys?: number; - error_keys?: number; -} - -// 请求日志 -export interface RequestLog { - id: string; - timestamp: string; - group_id: number; // uint -> number - key_id: number; // uint -> number - source_ip: string; - status_code: number; - request_path: string; - request_body_snippet: string; -} - -// Corresponds to the SystemSetting struct in Go -export interface SystemSetting { - id: number; - setting_key: string; - setting_value: string; - description: string; - created_at: string; - updated_at: string; -} - -export interface AuthUser { - key: string; - isAuthenticated: boolean; -} - -export interface User { - id: string; - username: string; -} - -// Represents a simplified setting for frontend forms -export interface Setting { - key: string; - value: string; -} - -// Corresponds to the structured system settings -export interface CorsSettings { - allowed_origins: string; -} - -export interface TimeoutSettings { - read: number; - write: number; -} - -export interface SystemSettings { - port: number; - cors: CorsSettings; - timeout: TimeoutSettings; -} - -// A generic type for different setting categories -export type SettingCategory = - | "system" - | "auth" - | "performance" - | "logs" - | "group"; - -// 数据转换适配器 - 兼容旧数据格式 -export const adaptLegacyKey = (legacyKey: any): APIKey => ({ - id: Number(legacyKey.id), - group_id: Number(legacyKey.group_id), - key_value: legacyKey.api_key || legacyKey.key_value, - status: legacyKey.is_active ? "active" : "inactive", - request_count: legacyKey.usage || legacyKey.request_count || 0, - failure_count: legacyKey.failure_count || 0, - last_used_at: legacyKey.last_used_at, - created_at: legacyKey.created_at, - updated_at: legacyKey.updated_at, -}); - -export const adaptLegacyGroup = (legacyGroup: any): Group => ({ - id: Number(legacyGroup.id), - name: legacyGroup.name, - description: legacyGroup.description, - channel_type: legacyGroup.channel_type || "openai", - config: - typeof legacyGroup.config === "string" - ? JSON.parse(legacyGroup.config || "{}") - : legacyGroup.config || {}, - api_keys: legacyGroup.api_keys?.map(adaptLegacyKey), - created_at: legacyGroup.created_at, - updated_at: legacyGroup.updated_at, -}); - -// 工具函数 -export const maskKey = (key: string): string => { - if (!key || key.length < 8) return "****"; - return key.substring(0, 4) + "****" + key.substring(key.length - 4); -}; - -export const getStatusColor = (status: string): string => { - switch (status) { - case "active": - return "success"; - case "inactive": - return "warning"; - case "error": - return "danger"; - default: - return "info"; - } -}; - -export const formatNumber = (num: number): string => { - if (num >= 1000000) { - return (num / 1000000).toFixed(1) + "M"; - } - if (num >= 1000) { - return (num / 1000).toFixed(1) + "K"; - } - return num.toString(); -}; diff --git a/fe/src/utils/http.ts b/web/src/utils/http.ts similarity index 90% rename from fe/src/utils/http.ts rename to web/src/utils/http.ts index b98f853..2a2ccc3 100644 --- a/fe/src/utils/http.ts +++ b/web/src/utils/http.ts @@ -3,7 +3,7 @@ import axios from 'axios' const http = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 10000, - headers: { 'Content-Type': 'application/json' } + headers: { 'Content-Type': 'application/json' }, }) // 请求拦截器 diff --git a/fe/src/utils/router.ts b/web/src/utils/router.ts similarity index 52% rename from fe/src/utils/router.ts rename to web/src/utils/router.ts index a416085..4608242 100644 --- a/fe/src/utils/router.ts +++ b/web/src/utils/router.ts @@ -1,32 +1,31 @@ -import { createRouter, createWebHistory } from 'vue-router' -import type { RouteRecordRaw } from 'vue-router' +import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router' const routes: Array = [ { path: '/', name: 'dashboard', - component: () => import('@/views/Dashboard.vue') + component: () => import('@/views/Dashboard.vue'), }, { path: '/keys', name: 'keys', - component: () => import('@/views/Keys.vue') + component: () => import('@/views/Keys.vue'), }, { path: '/logs', name: 'logs', - component: () => import('@/views/Logs.vue') + component: () => import('@/views/Logs.vue'), }, { path: '/settings', name: 'settings', - component: () => import('@/views/Settings.vue') + component: () => import('@/views/Settings.vue'), }, ] const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), - routes + routes, }) export default router diff --git a/fe/src/utils/state.ts b/web/src/utils/state.ts similarity index 78% rename from fe/src/utils/state.ts rename to web/src/utils/state.ts index a20cb59..7bbba7f 100644 --- a/fe/src/utils/state.ts +++ b/web/src/utils/state.ts @@ -1,8 +1,8 @@ -import { reactive, toRef, isRef } from 'vue' -import type { Ref } from 'vue' +import { isRef, reactive, toRef, type Ref } from 'vue' -type IntializeFunc = (() => T | Ref) +type IntializeFunc = () => T | Ref type InitializeValue = T | Ref | IntializeFunc +// eslint-disable-next-line @typescript-eslint/no-explicit-any type GlobalState = Record const globalState = reactive({}) diff --git a/web/src/views/Dashboard.vue b/web/src/views/Dashboard.vue index b82207f..3f1a307 100644 --- a/web/src/views/Dashboard.vue +++ b/web/src/views/Dashboard.vue @@ -1,163 +1,15 @@ diff --git a/web/src/views/Groups.vue b/web/src/views/Groups.vue deleted file mode 100644 index c065fea..0000000 --- a/web/src/views/Groups.vue +++ /dev/null @@ -1,525 +0,0 @@ - - - - - diff --git a/fe/src/views/Keys.vue b/web/src/views/Keys.vue similarity index 100% rename from fe/src/views/Keys.vue rename to web/src/views/Keys.vue diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue index 1850645..7537bb0 100644 --- a/web/src/views/Login.vue +++ b/web/src/views/Login.vue @@ -1,192 +1,3 @@ - - - - \ No newline at end of file diff --git a/web/src/views/Logs.vue b/web/src/views/Logs.vue index e4505b6..d27c933 100644 --- a/web/src/views/Logs.vue +++ b/web/src/views/Logs.vue @@ -1,481 +1,3 @@ - - - - diff --git a/web/src/views/Logs_new.vue b/web/src/views/Logs_new.vue deleted file mode 100644 index e69de29..0000000 diff --git a/web/src/views/Logs_old.vue b/web/src/views/Logs_old.vue deleted file mode 100644 index 173d885..0000000 --- a/web/src/views/Logs_old.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/views/Settings.vue b/web/src/views/Settings.vue index 1e936f9..f395f53 100644 --- a/web/src/views/Settings.vue +++ b/web/src/views/Settings.vue @@ -1,113 +1,3 @@ - - - - \ No newline at end of file diff --git a/web/tsconfig.json b/web/tsconfig.json index 1ffef60..d32ff68 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json index f85a399..9728af2 100644 --- a/web/tsconfig.node.json +++ b/web/tsconfig.node.json @@ -1,7 +1,7 @@ { "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2023", + "target": "ES2022", "lib": ["ES2023"], "module": "ESNext", "skipLibCheck": true, diff --git a/web/vite.config.ts b/web/vite.config.ts index 6f046ba..5707b67 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,26 +1,31 @@ -import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' -import { fileURLToPath, URL } from 'url' +import path from 'path' +import { defineConfig } from 'vite' // https://vite.dev/config/ export default defineConfig({ plugins: [vue()], + // 解析配置 resolve: { + // 配置路径别名 alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } + '@': path.resolve(__dirname, './src'), + }, }, - build: { - outDir: 'dist' - }, - base: './', + // 开发服务器配置 server: { + // 代理配置示例 proxy: { '/api': { - target: 'http://localhost:3000', + target: 'http://api.example.com', changeOrigin: true, - secure: false - } - } - } + rewrite: path => path.replace(/^\/api/, ''), + }, + }, + }, + // 构建配置 + build: { + outDir: '../cmd/gpt-load/dist', + assetsDir: 'assets', + }, })