From 9f64a4d6f4b34a63e416f64bd0de6c923e8db347 Mon Sep 17 00:00:00 2001 From: Yatu Date: Wed, 1 Apr 2026 17:07:17 +0800 Subject: [PATCH] Initial commit: ERP Frontend baseline --- .env.development | 3 + .env.production | 1 + .gitignore | 24 + .vscode/extensions.json | 3 + LOGIN_TESTING.md | 102 + README.md | 5 + el.content | 0 eslint.config.js | 22 + index.html | 13 + npm | 0 package-lock.json | 3571 +++++++++++++++++ package.json | 37 + public/diagnose-vue.html | 314 ++ public/diagnose.html | 340 ++ public/emergency-print.html | 122 + public/login-fallback.html | 426 ++ public/plugins/cainiao-install.bat | 35 + public/plugins/cainiao-setup.exe | 14 + public/plugins/pdd-install.bat | 27 + public/plugins/print-plugin-client.js | 280 ++ public/simple-login.html | 449 +++ public/test-api.html | 38 + public/test-fix.html | 141 + public/test-login.html | 299 ++ public/test-mock.html | 120 + public/test-server.html | 126 + public/test-simple.html | 134 + public/test-vue-app.html | 140 + public/vite.svg | 1 + s.id | 0 src/App.vue | 3 + src/api/afterSale.ts | 58 + src/api/ai.ts | 129 + src/api/auth.ts | 141 + src/api/brand.ts | 65 + src/api/delivery.ts | 151 + src/api/goods.ts | 227 ++ src/api/log.ts | 65 + src/api/order.ts | 412 ++ src/api/platform-product.ts | 76 + src/api/platform.ts | 113 + src/api/platformGoods.ts | 166 + src/api/print-job.ts | 119 + src/api/print-plugin.ts | 78 + src/api/print.ts | 414 ++ src/api/purchase.ts | 172 + src/api/receiving.ts | 116 + src/api/role.ts | 64 + src/api/rule.ts | 0 src/api/shop.ts | 93 + src/api/stock.ts | 182 + src/api/supplier.ts | 67 + src/api/template.ts | 70 + src/api/thirdParty.ts | 64 + src/api/user.ts | 198 + src/api/utils/mock.ts | 0 src/api/utils/permission.ts | 0 src/api/utils/request.ts | 61 + src/api/warehouse.ts | 130 + src/api/wdt.ts | 0 src/assets/vue.svg | 1 + src/components/HelloWorld.vue | 41 + src/components/PrintDialog.vue | 53 + src/components/TheWelcome.vue | 95 + src/components/WelcomeItem.vue | 87 + src/components/__tests__/HelloWorld.spec.ts | 11 + src/components/base/ElPagination.vue | 0 src/components/base/ElTable.vue | 0 src/components/base/SearchBar.vue | 0 src/components/icons/IconCommunity.vue | 7 + src/components/icons/IconDocumentation.vue | 7 + src/components/icons/IconEcosystem.vue | 7 + src/components/icons/IconSupport.vue | 7 + src/components/icons/IconTooling.vue | 19 + src/components/order/OrderActionBtn.vue | 0 src/components/order/OrderStatusTag.vue | 40 + src/components/product/GoodsMatchPanel.vue | 0 src/composables/usePrint.ts | 317 ++ src/composables/usePrintPlugin.ts | 496 +++ src/layouts/MainLayout.vue | 658 +++ src/layouts/Sidebar.vue | 495 +++ src/main.ts | 13 + src/mock/adapter.ts | 1208 ++++++ src/mock/data.ts | 203 + src/router/manual.ts | 312 ++ src/stores/order.ts | 273 ++ src/stores/user.ts | 69 + src/style.css | 410 ++ src/types/template.ts | 38 + src/utils/request.ts | 61 + src/views/AfterSale/AfterSaleList.vue | 620 +++ src/views/Auth/Login.vue | 1151 ++++++ src/views/Dashboard/Welcome.vue | 364 ++ src/views/Goods/Edit.vue | 251 ++ src/views/Goods/List.vue | 239 ++ src/views/Goods/PlatformGoods.vue | 408 ++ src/views/Goods/PushLog.vue | 72 + .../Goods/components/GoodsPushDialog.vue | 97 + .../PlatformGoodsDownloadDialog.vue | 123 + src/views/Log/operation/OperationLog.vue | 355 ++ src/views/Order/OrderList.vue | 1061 +++++ src/views/Platform/Shops/Callback.vue | 86 + src/views/Platform/Shops/index.vue | 300 ++ src/views/Platform/WaybillAccount/index.vue | 150 + src/views/Platform/WaybillAccounts.vue | 198 + src/views/Print/FixedBarcodeTemplate.vue | 189 + src/views/Print/PluginDebug.vue | 538 +++ src/views/Print/PluginManagement.vue | 324 ++ src/views/Print/PrintBatch.vue | 411 ++ src/views/Print/PrintQueue.vue | 363 ++ src/views/Print/TemplateDesign.vue | 676 ++++ src/views/Print/TemplateDesign/index.vue | 163 + src/views/Print/TemplateList/index.vue | 84 + src/views/Print/batch-detail/[id].vue | 259 ++ src/views/Print/batch.vue | 845 ++++ src/views/Print/components/.gitkeep | 0 src/views/Print/log.vue | 529 +++ src/views/Setting/Brand.vue | 156 + src/views/Setting/PrintSetting.vue | 58 + src/views/Setting/Supplier.vue | 171 + src/views/Setting/ThirdPartyConfig.vue | 449 +++ src/views/System/OperationLog.vue | 124 + src/views/System/PersonalCenter.vue | 403 ++ src/views/System/RoleManagement.vue | 244 ++ src/views/System/UserManagement.vue | 570 +++ src/views/Warehouse/BindTemplate.vue | 212 + src/views/Warehouse/Edit.vue | 126 + src/views/Warehouse/Purchase.vue | 945 +++++ src/views/Warehouse/PurchaseDetail.vue | 456 +++ src/views/Warehouse/Receiving.vue | 439 ++ src/views/Warehouse/ReceivingDetail.vue | 136 + src/views/Warehouse/Stock.vue | 171 + src/views/Warehouse/StockDetail.vue | 154 + src/views/Warehouse/index.vue | 154 + test-mock.js | 20 + value | 0 vite.config.ts | 20 + write-login.cjs | 303 ++ 项目分析文档.md | 230 ++ 139 files changed, 30546 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 LOGIN_TESTING.md create mode 100644 README.md create mode 100644 el.content create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 npm create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/diagnose-vue.html create mode 100644 public/diagnose.html create mode 100644 public/emergency-print.html create mode 100644 public/login-fallback.html create mode 100644 public/plugins/cainiao-install.bat create mode 100644 public/plugins/cainiao-setup.exe create mode 100644 public/plugins/pdd-install.bat create mode 100644 public/plugins/print-plugin-client.js create mode 100644 public/simple-login.html create mode 100644 public/test-api.html create mode 100644 public/test-fix.html create mode 100644 public/test-login.html create mode 100644 public/test-mock.html create mode 100644 public/test-server.html create mode 100644 public/test-simple.html create mode 100644 public/test-vue-app.html create mode 100644 public/vite.svg create mode 100644 s.id create mode 100644 src/App.vue create mode 100644 src/api/afterSale.ts create mode 100644 src/api/ai.ts create mode 100644 src/api/auth.ts create mode 100644 src/api/brand.ts create mode 100644 src/api/delivery.ts create mode 100644 src/api/goods.ts create mode 100644 src/api/log.ts create mode 100644 src/api/order.ts create mode 100644 src/api/platform-product.ts create mode 100644 src/api/platform.ts create mode 100644 src/api/platformGoods.ts create mode 100644 src/api/print-job.ts create mode 100644 src/api/print-plugin.ts create mode 100644 src/api/print.ts create mode 100644 src/api/purchase.ts create mode 100644 src/api/receiving.ts create mode 100644 src/api/role.ts create mode 100644 src/api/rule.ts create mode 100644 src/api/shop.ts create mode 100644 src/api/stock.ts create mode 100644 src/api/supplier.ts create mode 100644 src/api/template.ts create mode 100644 src/api/thirdParty.ts create mode 100644 src/api/user.ts create mode 100644 src/api/utils/mock.ts create mode 100644 src/api/utils/permission.ts create mode 100644 src/api/utils/request.ts create mode 100644 src/api/warehouse.ts create mode 100644 src/api/wdt.ts create mode 100644 src/assets/vue.svg create mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/PrintDialog.vue create mode 100644 src/components/TheWelcome.vue create mode 100644 src/components/WelcomeItem.vue create mode 100644 src/components/__tests__/HelloWorld.spec.ts create mode 100644 src/components/base/ElPagination.vue create mode 100644 src/components/base/ElTable.vue create mode 100644 src/components/base/SearchBar.vue create mode 100644 src/components/icons/IconCommunity.vue create mode 100644 src/components/icons/IconDocumentation.vue create mode 100644 src/components/icons/IconEcosystem.vue create mode 100644 src/components/icons/IconSupport.vue create mode 100644 src/components/icons/IconTooling.vue create mode 100644 src/components/order/OrderActionBtn.vue create mode 100644 src/components/order/OrderStatusTag.vue create mode 100644 src/components/product/GoodsMatchPanel.vue create mode 100644 src/composables/usePrint.ts create mode 100644 src/composables/usePrintPlugin.ts create mode 100644 src/layouts/MainLayout.vue create mode 100644 src/layouts/Sidebar.vue create mode 100644 src/main.ts create mode 100644 src/mock/adapter.ts create mode 100644 src/mock/data.ts create mode 100644 src/router/manual.ts create mode 100644 src/stores/order.ts create mode 100644 src/stores/user.ts create mode 100644 src/style.css create mode 100644 src/types/template.ts create mode 100644 src/utils/request.ts create mode 100644 src/views/AfterSale/AfterSaleList.vue create mode 100644 src/views/Auth/Login.vue create mode 100644 src/views/Dashboard/Welcome.vue create mode 100644 src/views/Goods/Edit.vue create mode 100644 src/views/Goods/List.vue create mode 100644 src/views/Goods/PlatformGoods.vue create mode 100644 src/views/Goods/PushLog.vue create mode 100644 src/views/Goods/components/GoodsPushDialog.vue create mode 100644 src/views/Goods/components/PlatformGoodsDownloadDialog.vue create mode 100644 src/views/Log/operation/OperationLog.vue create mode 100644 src/views/Order/OrderList.vue create mode 100644 src/views/Platform/Shops/Callback.vue create mode 100644 src/views/Platform/Shops/index.vue create mode 100644 src/views/Platform/WaybillAccount/index.vue create mode 100644 src/views/Platform/WaybillAccounts.vue create mode 100644 src/views/Print/FixedBarcodeTemplate.vue create mode 100644 src/views/Print/PluginDebug.vue create mode 100644 src/views/Print/PluginManagement.vue create mode 100644 src/views/Print/PrintBatch.vue create mode 100644 src/views/Print/PrintQueue.vue create mode 100644 src/views/Print/TemplateDesign.vue create mode 100644 src/views/Print/TemplateDesign/index.vue create mode 100644 src/views/Print/TemplateList/index.vue create mode 100644 src/views/Print/batch-detail/[id].vue create mode 100644 src/views/Print/batch.vue create mode 100644 src/views/Print/components/.gitkeep create mode 100644 src/views/Print/log.vue create mode 100644 src/views/Setting/Brand.vue create mode 100644 src/views/Setting/PrintSetting.vue create mode 100644 src/views/Setting/Supplier.vue create mode 100644 src/views/Setting/ThirdPartyConfig.vue create mode 100644 src/views/System/OperationLog.vue create mode 100644 src/views/System/PersonalCenter.vue create mode 100644 src/views/System/RoleManagement.vue create mode 100644 src/views/System/UserManagement.vue create mode 100644 src/views/Warehouse/BindTemplate.vue create mode 100644 src/views/Warehouse/Edit.vue create mode 100644 src/views/Warehouse/Purchase.vue create mode 100644 src/views/Warehouse/PurchaseDetail.vue create mode 100644 src/views/Warehouse/Receiving.vue create mode 100644 src/views/Warehouse/ReceivingDetail.vue create mode 100644 src/views/Warehouse/Stock.vue create mode 100644 src/views/Warehouse/StockDetail.vue create mode 100644 src/views/Warehouse/index.vue create mode 100644 test-mock.js create mode 100644 value create mode 100644 vite.config.ts create mode 100644 write-login.cjs create mode 100644 项目分析文档.md diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..53eb5d2 --- /dev/null +++ b/.env.development @@ -0,0 +1,3 @@ +# .env.development +VITE_USE_MOCK=false +# VITE_API_BASE_URL=http://127.0.0.1:8001 \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..bd593aa --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://111.229.80.149/api diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# 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/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/LOGIN_TESTING.md b/LOGIN_TESTING.md new file mode 100644 index 0000000..20243fe --- /dev/null +++ b/LOGIN_TESTING.md @@ -0,0 +1,102 @@ +# 登录页面测试指南 + +## 🎯 测试账号(模拟模式) + +当前登录页面支持以下测试账号(当 `VITE_USE_MOCK=true` 时): + +| 账号 | 密码 | 角色 | 描述 | +|------|------|------|------| +| `admin@erp.com` | `password123` | `admin` | 系统管理员,拥有所有权限 | +| `user@erp.com` | `user123456` | `user` | 普通用户,基础权限 | +| `test@erp.com` | `test123456` | `test` | 测试用户,受限权限 | + +## 🚀 如何使用 + +### 1. 启动开发服务器 +```bash +npm run dev +# 或 +yarn dev +``` + +### 2. 访问登录页面 +打开浏览器访问:`http://localhost:5173/login` + +### 3. 识别模拟模式 +- **页面右上角**显示黄色"模拟模式"标签 +- **页脚**显示可用的模拟账号 +- **登录过程**为模拟延迟(800ms) + +### 4. 登录测试 +1. 选择"密码登录"方式 +2. 输入任一测试账号和密码 +3. 点击"登录"按钮 +4. 成功后将跳转到首页 (`/`) + +## ⚙️ 环境配置 + +### 启用/禁用模拟模式 +在 `.env.development` 文件中: +```env +# 启用模拟登录(默认) +VITE_USE_MOCK=true + +# 禁用模拟登录,使用真实API +VITE_USE_MOCK=false +``` + +### API配置 +```env +# 后端API地址 +VITE_API_BASE_URL=http://localhost:8080/api +``` + +## 🔧 模拟登录实现细节 + +### 前端模拟逻辑 +- **位置**: `src/views/Auth/LoginEnhanced.vue` 中的 `mockLogin()` 函数 +- **验证**: 检查账号密码是否匹配预设测试账号 +- **用户数据**: 生成模拟用户信息(ID、角色、权限等) +- **状态存储**: 使用 Pinia store + localStorage(模拟记住我) + +### 模拟用户权限 +| 角色 | 权限 | +|------|------| +| `admin` | `['dashboard', 'goods', 'order', 'system']` | +| `user` | `['dashboard', 'goods']` | +| `test` | `['dashboard']` | + +## 🎨 页面功能 + +### 登录方式 +1. **密码登录** - 使用邮箱和密码 +2. **短信登录** - 界面已完成,API待实现 + +### 特色功能 +- ✅ 明/暗色主题切换(自动记忆) +- ✅ 响应式设计(支持移动端) +- ✅ 表单实时验证 +- ✅ 社交登录(微信、企业微信、钉钉) +- ✅ 记住我功能 +- ✅ 协议声明 + +## 🐛 故障排除 + +### 常见问题 +1. **登录失败**:检查是否输入了正确的测试账号密码 +2. **页面样式异常**:确保安装了所有依赖 `npm install` +3. **路由问题**:检查 `src/router/complete-fixed.ts` 和 `complete.ts` 中的路由配置 + +### 开发建议 +- 模拟模式仅用于前端开发和测试 +- 对接真实API时,设置 `VITE_USE_MOCK=false` +- 正式环境应使用 `.env.production` 配置文件 + +## 📁 相关文件 +- `src/views/Auth/LoginEnhanced.vue` - 登录页面主文件 +- `src/stores/user.ts` - 用户状态管理 +- `src/api/auth.ts` - 登录相关API +- `.env.development` - 开发环境配置 + +--- +*最后更新: 2026-03-24* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/npm b/npm new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..36b7079 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3571 @@ +{ + "name": "new-erp", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "new-erp", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "element-plus": "^2.13.5", + "html2canvas": "^1.4.1", + "pinia": "^3.0.4", + "uuid": "^13.0.0", + "vue": "^3.5.25", + "vue-barcode": "^1.3.0", + "vue-router": "^5.0.3", + "vue3-barcode": "^1.0.1", + "vuedraggable": "^4.1.0" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-vue": "^6.0.2", + "axios-mock-adapter": "^2.1.0", + "eslint": "^10.1.0", + "eslint-plugin-vue": "^10.8.0", + "globals": "^17.4.0", + "typescript-eslint": "^8.57.2", + "vite": "^8.0.0-beta.13" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.6.tgz", + "integrity": "sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.6.tgz", + "integrity": "sha512-+tJhD21KvGNtUrpLXrZQlT+j5HZKiEwR2qtcZb3vNOUpvoT9QjEykr75ZW/Kr0W89gose/HVXU6351uVZD8Qvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.6.tgz", + "integrity": "sha512-DKNhjMk38FAWaHwUt1dFR3rA/qRAvn2NUvSG2UGvxvlMxSmN/qqww/j4ABAbXhNRXtGQNmrAINMXRuwHl16ZHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.6.tgz", + "integrity": "sha512-8TThsRkCPAnfyMBShxrGdtoOE6h36QepqRQI97iFaQSCRbHFWHcDHppcojZnzXoruuhPnjMEygzaykvPVJsMRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.6.tgz", + "integrity": "sha512-ZfmFoOwPUZCWtGOVC9/qbQzfc0249FrRUOzV2XabSMUV60Crp211OWLQN1zmQAsRIVWRcEwhJ46Z1mXGo/L/nQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.6.tgz", + "integrity": "sha512-ZsGzbNETxPodGlLTYHaCSGVhNN/rvkMDCJYHdT7PZr5jFJRmBfmDi2awhF64Dt2vxrJqY6VeeYSgOzEbHRsb7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.6.tgz", + "integrity": "sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.6.tgz", + "integrity": "sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.6.tgz", + "integrity": "sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.6.tgz", + "integrity": "sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.6.tgz", + "integrity": "sha512-mYa1+h2l6Zc0LvmwUh0oXKKYihnw/1WC73vTqw+IgtfEtv47A+rWzzcWwVDkW73+UDr0d/Ie/HRXoaOY22pQDw==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.6.tgz", + "integrity": "sha512-e2ABskbNH3MRUBMjgxaMjYIw11DSwjLJxBII3UgpF6WClGLIh8A20kamc+FKH5vIaFVnYQInmcLYSUVpqMPLow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.6.tgz", + "integrity": "sha512-dJVc3ifhaRXxIEh1xowLohzFrlQXkJ66LepHm+CmSprTWgVrPa8Fx3OL57xwIqDEH9hufcKkDX2v65rS3NZyRA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", + "integrity": "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/type-utils": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.2", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.57.2.tgz", + "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", + "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.2", + "@typescript-eslint/types": "^8.57.2", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", + "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", + "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz", + "integrity": "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.57.2.tgz", + "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", + "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.2", + "@typescript-eslint/tsconfig-utils": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.57.2.tgz", + "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", + "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.4.tgz", + "integrity": "sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.29.tgz", + "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.29", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", + "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", + "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.29", + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", + "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.29.tgz", + "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.29.tgz", + "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", + "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/runtime-core": "3.5.29", + "@vue/shared": "3.5.29", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.29.tgz", + "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "vue": "3.5.29" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.29.tgz", + "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.0.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-12.0.0.tgz", + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.0.0", + "@vueuse/shared": "12.0.0", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.0.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.0.0.tgz", + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.0.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.0.0.tgz", + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-mock-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/axios-mock-adapter/-/axios-mock-adapter-2.1.0.tgz", + "integrity": "sha512-AZUe4OjECGCNNssH8SOdtneiQELsqTsat3SQQCWLPjN436/H+L9AjWfV7bF+Zg/YL9cgbhrz5671hoh+Tbn98w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/element-plus": { + "version": "2.13.5", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.13.5.tgz", + "integrity": "sha512-dmY24fhSREfZN/PuUt0YZigMso7wWzl+B5o+YKNN15kQIn/0hzamsPU+ebj9SES0IbUqsLX1wkrzYmzU8VrVOQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "12.0.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "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.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "peer": true, + "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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-10.1.0.tgz", + "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.3", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.8.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz", + "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.0", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "peer": true, + "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.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "peer": true, + "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.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsbarcode": { + "version": "3.12.3", + "resolved": "https://registry.npmmirror.com/jsbarcode/-/jsbarcode-3.12.3.tgz", + "integrity": "sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.0.0-rc.6.tgz", + "integrity": "sha512-B8vFPV1ADyegoYfhg+E7RAucYKv0xdVlwYYsIJgfPNeiSxZGWNxts9RqhyGzC11ULK/VaeXyKezGCwpMiH8Ktw==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.6" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.6", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.6", + "@rolldown/binding-darwin-x64": "1.0.0-rc.6", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.6", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.6", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.6", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.6", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.6", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.6", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.6", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.6", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.6" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.6.tgz", + "integrity": "sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==", + "license": "MIT" + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.2", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.57.2.tgz", + "integrity": "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.2", + "@typescript-eslint/parser": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vite": { + "version": "8.0.0-beta.16", + "resolved": "https://registry.npmmirror.com/vite/-/vite-8.0.0-beta.16.tgz", + "integrity": "sha512-c0t7hYkxsjws89HH+BUFh/sL3BpPNhNsL9CJrTpMxBmwKQBRSa5OJ5w4o9O0bQVI/H/vx7UpUUIevvXa37NS/Q==", + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.31.1", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rolldown": "1.0.0-rc.6", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.29", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.29.tgz", + "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-sfc": "3.5.29", + "@vue/runtime-dom": "3.5.29", + "@vue/server-renderer": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-barcode": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/vue-barcode/-/vue-barcode-1.3.0.tgz", + "integrity": "sha512-DxQ0hxes/dP6GajsJumpW6jV14VwlnTwStZbtE6G0wkewuJVDoDOdxUr5seGuxsMT9fJ0aty4X47Z5TG0M/gxg==", + "license": "MIT", + "dependencies": { + "jsbarcode": "^3.5.8" + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", + "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/vue-router": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-5.0.3.tgz", + "integrity": "sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.6", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.0.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-8.0.7.tgz", + "integrity": "sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.0.7" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-kit": { + "version": "8.0.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.0.7.tgz", + "integrity": "sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.7", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-shared": { + "version": "8.0.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.0.7.tgz", + "integrity": "sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA==", + "license": "MIT" + }, + "node_modules/vue-router/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/vue3-barcode": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/vue3-barcode/-/vue3-barcode-1.0.1.tgz", + "integrity": "sha512-i9XU0iyLSLSQsWSbsmGoqiKr3kwflmyqbdmk1euITTna/f4aEbbibRRSv4rTLzriaSTGlXp3+iWxyEhimzNPBQ==", + "license": "MIT", + "dependencies": { + "@vitejs/plugin-vue": "^1.6.0", + "jsbarcode": "^3.11.5", + "vue": "^3.0.4" + } + }, + "node_modules/vue3-barcode/node_modules/@vitejs/plugin-vue": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz", + "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "vite": "^2.5.10" + } + }, + "node_modules/vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "license": "MIT", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5cac953 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "new-erp", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "element-plus": "^2.13.5", + "html2canvas": "^1.4.1", + "pinia": "^3.0.4", + "uuid": "^13.0.0", + "vue": "^3.5.25", + "vue-barcode": "^1.3.0", + "vue-router": "^5.0.3", + "vue3-barcode": "^1.0.1", + "vuedraggable": "^4.1.0" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-vue": "^6.0.2", + "axios-mock-adapter": "^2.1.0", + "eslint": "^10.1.0", + "eslint-plugin-vue": "^10.8.0", + "globals": "^17.4.0", + "typescript-eslint": "^8.57.2", + "vite": "^8.0.0-beta.13" + }, + "overrides": { + "vite": "^8.0.0-beta.13" + } +} diff --git a/public/diagnose-vue.html b/public/diagnose-vue.html new file mode 100644 index 0000000..2bf0c1d --- /dev/null +++ b/public/diagnose-vue.html @@ -0,0 +1,314 @@ + + + + + + Vue应用诊断 + + + +

Vue应用诊断

+ +
+

1. 检查Vue应用加载

+ +
+
+ +
+

2. 检查环境变量

+ +
+
+ +
+

3. 测试前端axios实例

+ +
+
+ +
+

4. 模拟Vue登录页面请求

+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/public/diagnose.html b/public/diagnose.html new file mode 100644 index 0000000..23b3428 --- /dev/null +++ b/public/diagnose.html @@ -0,0 +1,340 @@ + + + + + + ERP系统诊断页面 + + + +
+

🔧 ERP系统诊断工具

+
服务器状态检测与问题诊断
+ +
+
+
+ 🌐 + 服务器状态 +
+
检测中...
+
+ +
+
+ 🔌 + 端口信息 +
+
检测中...
+
+ +
+
+ 🔄 + API状态 +
+
待测试
+
+ +
+
+ + Vue应用状态 +
+
待测试
+
+
+ +
+

📋 诊断步骤

+
    +
  1. 点击下面的测试按钮检查各项功能
  2. +
  3. 查看右侧日志区域的结果
  4. +
  5. 如果测试失败,按F12查看浏览器控制台错误
  6. +
  7. 将错误信息截图发送给技术支持
  8. +
+
+ +
+ + + + + +
+ +
+
诊断工具已加载,点击按钮开始测试...
+
+
+ + + + \ No newline at end of file diff --git a/public/emergency-print.html b/public/emergency-print.html new file mode 100644 index 0000000..fc2674c --- /dev/null +++ b/public/emergency-print.html @@ -0,0 +1,122 @@ + checkboxes.forEach(cb => cb.checked = false) + updateSelectionStatus() + updateStatus('选择已清除', 'success') + } + + // 重置筛选 + function resetFilter() { + document.getElementById('statusFilter').value = '1' + loadOrders() + } + + // 打开打印对话框 + function openPrintDialog() { + if (selectedOrderIds.size === 0) { + alert('请选择订单') + return + } + + // 获取选中的订单 + const selectedOrders = orders.filter(order => selectedOrderIds.has(order.id)) + + // 更新对话框内容 + const ordersList = document.getElementById('selectedOrdersList') + ordersList.innerHTML = selectedOrders.slice(0, 10).map(order => ` +
+ ${order.shortId} + ${order.platformOrderSn} + ${order.receiverName} +
+ `).join('') + + if (selectedOrders.length > 10) { + ordersList.innerHTML += `
+ 还有 ${selectedOrders.length - 10} 个订单... +
` + } + + // 重置表单 + document.getElementById('expressSelect').value = '' + document.getElementById('templateSelect').value = '' + document.getElementById('remark').value = '' + + // 显示对话框 + document.getElementById('printDialog').style.display = 'flex' + } + + // 关闭打印对话框 + function closePrintDialog() { + document.getElementById('printDialog').style.display = 'none' + document.getElementById('printLoading').style.display = 'none' + document.getElementById('printError').style.display = 'none' + isPrinting = false + } + + // 开始打印 + function startPrint() { + if (isPrinting) return + + const expressId = document.getElementById('expressSelect').value + const templateId = document.getElementById('templateSelect').value + + if (!expressId || !templateId) { + alert('请选择快递公司和模板') + return + } + + isPrinting = true + document.getElementById('startPrintBtn').disabled = true + document.getElementById('printLoading').style.display = 'block' + document.getElementById('printError').style.display = 'none' + + // 模拟打印过程 + setTimeout(() => { + try { + // 模拟打印成功 + const selectedCount = selectedOrderIds.size + + // 清空选择 + selectedOrderIds.clear() + updateSelectionStatus() + + // 关闭对话框 + closePrintDialog() + + // 显示成功消息 + updateStatus(`成功打印 ${selectedCount} 个订单`, 'success') + alert(`打印完成!成功打印 ${selectedCount} 个订单`) + + } catch (error) { + document.getElementById('printError').textContent = '打印失败: ' + error.message + document.getElementById('printError').style.display = 'block' + updateStatus('打印失败', 'error') + } finally { + isPrinting = false + document.getElementById('startPrintBtn').disabled = false + document.getElementById('printLoading').style.display = 'none' + } + }, 2000) + } + + // 添加键盘快捷键 + document.addEventListener('keydown', function(event) { + // ESC键关闭对话框 + if (event.key === 'Escape') { + closePrintDialog() + } + + // Ctrl+Enter 开始打印 + if (event.ctrlKey && event.key === 'Enter') { + if (document.getElementById('printDialog').style.display === 'flex') { + startPrint() + } + } + }) + + // 初始化 + console.log('🆘 紧急可用版初始化完成') + console.log('如果此页面正常但Vue页面空白,说明是Vue编译问题') + console.log('请检查浏览器控制台是否有Vue编译错误') + + + \ No newline at end of file diff --git a/public/login-fallback.html b/public/login-fallback.html new file mode 100644 index 0000000..873a76f --- /dev/null +++ b/public/login-fallback.html @@ -0,0 +1,426 @@ + + + + + + ERP系统登录 + + + + + + + +
+ +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/plugins/cainiao-install.bat b/public/plugins/cainiao-install.bat new file mode 100644 index 0000000..fb68cdb --- /dev/null +++ b/public/plugins/cainiao-install.bat @@ -0,0 +1,35 @@ +@echo off +chcp 65001 > nul +echo ═══════════════════════════════════════════════ +echo 菜鸟打印插件 模拟安装程序 v2.5.8 +echo ═══════════════════════════════════════════════ +echo. +echo [1/4] 检查系统环境... +timeout /t 1 /nobreak > nul +echo ✓ Windows 版本检测通过 +echo. +echo [2/4] 检测打印机驱动... +timeout /t 1 /nobreak > nul +echo ✓ 打印机驱动就绪 +echo. +echo [3/4] 安装核心组件... +timeout /t 2 /nobreak > nul +echo ✓ C-Lodop 驱动安装成功 +echo. +echo [4/4] 注册系统服务... +timeout /t 1 /nobreak > nul +echo ✓ 服务注册完成 +echo. +echo ═══════════════════════════════════════════════ +echo ✅ 安装成功! +echo ═══════════════════════════════════════════════ +echo. +echo 插件信息: + 名称: 菜鸟打印插件 + 版本: v2.5.8 + 设备ID: DEMO-DEVICE-%random% + 安装时间: %date% %time% +echo. +echo 请访问 http://localhost:5174/print/plugin 进行插件注册 +echo. +pause diff --git a/public/plugins/cainiao-setup.exe b/public/plugins/cainiao-setup.exe new file mode 100644 index 0000000..50b4c96 --- /dev/null +++ b/public/plugins/cainiao-setup.exe @@ -0,0 +1,14 @@ +@echo off +echo ============================================= +echo 菜鸟打印插件 安装程序 v2.5.8 +echo ============================================= +echo. +echo 正在安装... +timeout /t 2 /nobreak > nul +echo. +echo [========================================] +echo 安装完成! +echo [========================================] +echo. +echo 按任意键退出... +pause > nul diff --git a/public/plugins/pdd-install.bat b/public/plugins/pdd-install.bat new file mode 100644 index 0000000..b08702b --- /dev/null +++ b/public/plugins/pdd-install.bat @@ -0,0 +1,27 @@ +@echo off +chcp 65001 > nul +echo ═══════════════════════════════════════════════ +echo 拼多多打印插件 模拟安装程序 v1.8.3 +echo ═══════════════════════════════════════════════ +echo. +echo [1/4] 检查系统环境... +timeout /t 1 /nobreak > nul +echo ✓ Windows 版本检测通过 +echo. +echo [2/4] 检测打印机驱动... +timeout /t 1 /nobreak > nul +echo ✓ 打印机驱动就绪 +echo. +echo [3/4] 安装核心组件... +timeout /t 2 /nobreak > nul +echo ✓ 拼多多打印服务安装成功 +echo. +echo [4/4] 注册系统服务... +timeout /t 1 /nobreak > nul +echo ✓ 服务注册完成 +echo. +echo ═══════════════════════════════════════════════ +echo ✅ 安装成功! +echo ═══════════════════════════════════════════════ +echo. +pause diff --git a/public/plugins/print-plugin-client.js b/public/plugins/print-plugin-client.js new file mode 100644 index 0000000..26b1459 --- /dev/null +++ b/public/plugins/print-plugin-client.js @@ -0,0 +1,280 @@ +/** + * 打印插件客户端 - 模拟版本 + * + * 功能: + * 1. 注册到ERP系统 + * 2. 发送心跳 + * 3. 获取打印任务 + * 4. 模拟打印 + * + * 使用方法: + * node print-plugin-client.js <命令> [参数] + * + * 示例: + * node print-plugin-client.js register cainiao + * node print-plugin-client.js heartbeat + * node print-plugin-client.js getjob + */ + +const http = require('http'); + +// 配置 +const CONFIG = { + API_BASE: 'http://localhost:10088/api', // 后端API地址 + DEVICE_ID: 'PLUGIN-' + Date.now().toString(36).toUpperCase(), + DEVICE_NAME: process.env.COMPUTERNAME || 'Unknown-PC', + OS_VERSION: process.release.name + ' ' + process.platform, + POLL_INTERVAL: 5000, // 5秒轮询一次 +}; + +// 模拟插件信息 +const PLUGIN_INFO = { + cainiao: { code: 'cainiao', name: '菜鸟打印插件', version: '2.5.8' }, + pdd: { code: 'pdd', name: '拼多多打印插件', version: '1.8.3' }, + douyin: { code: 'douyin', name: '抖音小店打印插件', version: '3.2.1' }, + kuaishou: { code: 'kuaishou', name: '快手小店打印插件', version: '2.1.5' }, +}; + +// API请求封装 +function apiRequest(method, path, data = null) { + return new Promise((resolve, reject) => { + const url = new URL(path, CONFIG.API_BASE); + const options = { + hostname: url.hostname, + port: url.port || 80, + path: url.pathname + url.search, + method: method, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + }; + + const req = http.request(options, (res) => { + let body = ''; + res.on('data', chunk => body += chunk); + res.on('end', () => { + try { + resolve(JSON.parse(body)); + } catch { + resolve(body); + } + }); + }); + + req.on('error', (err) => { + // API不可用时返回模拟数据 + resolve({ code: 200, data: getMockResponse(method, path, data) }); + }); + + if (data) { + req.write(JSON.stringify(data)); + } + req.end(); + }); +} + +// 模拟API响应 +function getMockResponse(method, path, data) { + if (path.includes('/heartbeat')) { + return { success: true }; + } + if (path.includes('/register')) { + return { + success: true, + installation_id: Date.now(), + has_update: false, + latest_version: '2.5.8' + }; + } + if (path.includes('/next-job')) { + // 模拟返回打印任务 + return { + id: Math.floor(Math.random() * 1000), + job_no: 'PJ' + Date.now().toString().slice(-10), + platform: 'pdd', + plugin_code: 'pdd', + print_data: { + receiverName: '张三', + receiverPhone: '138****8000', + receiverAddress: '北京市朝阳区某某街道某某小区', + expressNo: 'SF' + Math.random().toString().slice(2, 14), + goodsName: '商品测试', + quantity: 1, + }, + status: 'pending', + priority: 0, + }; + } + return {}; +} + +// 打印任务到控制台 +function printJob(job) { + console.log('\n╔══════════════════════════════════════════════╗'); + console.log('║ 🎯 收到打印任务 ║'); + console.log('╠══════════════════════════════════════════════╣'); + console.log(`║ 任务编号: ${job.job_no.padEnd(30)}║`); + console.log(`║ 平台: ${job.platform.padEnd(36)}║`); + console.log(`║ 收件人: ${(job.print_data?.receiverName || '-').padEnd(34)}║`); + console.log(`║ 电话: ${(job.print_data?.receiverPhone || '-').padEnd(35)}║`); + console.log(`║ 地址: ${(job.print_data?.receiverAddress || '-').substring(0, 30).padEnd(30)}║`); + console.log(`║ 快递单号: ${(job.print_data?.expressNo || '-').padEnd(31)}║`); + console.log('╠══════════════════════════════════════════════╣'); + console.log('║ 📄 正在模拟打印... ║'); + + return new Promise((resolve) => { + setTimeout(() => { + console.log('║ ✅ 打印完成! ║'); + console.log('╚══════════════════════════════════════════════╝\n'); + resolve(true); + }, 1500); + }); +} + +// 命令处理 +async function handleCommand(cmd, args) { + switch (cmd) { + case 'register': + await registerPlugin(args[0] || 'cainiao'); + break; + case 'heartbeat': + await sendHeartbeat(); + break; + case 'getjob': + await getNextJob(); + break; + case 'daemon': + await runDaemon(args[0] || 'cainiao'); + break; + case 'info': + showInfo(); + break; + default: + showHelp(); + } +} + +// 注册插件 +async function registerPlugin(pluginCode) { + const plugin = PLUGIN_INFO[pluginCode] || PLUGIN_INFO.cainiao; + + console.log(`\n📦 正在注册 ${plugin.name}...`); + console.log(` 设备ID: ${CONFIG.DEVICE_ID}`); + console.log(` 设备名称: ${CONFIG.DEVICE_NAME}`); + console.log(` 插件版本: ${plugin.version}`); + + const result = await apiRequest('POST', '/print-plugins/auth/register', { + plugin_code: plugin.code, + version: plugin.version, + device_id: CONFIG.DEVICE_ID, + device_name: CONFIG.DEVICE_NAME, + os_version: CONFIG.OS_VERSION, + }); + + if (result.success || result.code === 200) { + console.log('✅ 注册成功!'); + console.log(` 安装ID: ${result.installation_id}`); + if (result.has_update) { + console.log(` ⚠️ 有新版本: ${result.latest_version}`); + } + } else { + console.log('❌ 注册失败:', result.message || '未知错误'); + } +} + +// 发送心跳 +async function sendHeartbeat() { + const result = await apiRequest('POST', '/print-plugins/auth/heartbeat', { + device_id: CONFIG.DEVICE_ID, + }); + + if (result.success || result.code === 200) { + console.log('💓 心跳发送成功'); + } else { + console.log('❌ 心跳失败'); + } +} + +// 获取打印任务 +async function getNextJob() { + const result = await apiRequest('GET', `/print-device/next-job?device_id=${CONFIG.DEVICE_ID}`); + + if (result && result.id) { + await printJob(result); + + // 标记完成 + await apiRequest('POST', '/print-device/complete', { + job_id: result.id, + device_id: CONFIG.DEVICE_ID, + }); + } else { + console.log('📭 暂无打印任务'); + } +} + +// 运行守护进程 +async function runDaemon(pluginCode) { + const plugin = PLUGIN_INFO[pluginCode] || PLUGIN_INFO.cainiao; + + console.log('\n🚀 启动打印插件守护进程...'); + console.log(` 插件: ${plugin.name}`); + console.log(` 轮询间隔: ${CONFIG.POLL_INTERVAL / 1000}秒`); + console.log(' 按 Ctrl+C 停止\n'); + + // 先注册 + await registerPlugin(pluginCode); + + // 启动心跳 + setInterval(async () => { + await sendHeartbeat(); + }, 30000); + + // 轮询打印任务 + setInterval(async () => { + await getNextJob(); + }, CONFIG.POLL_INTERVAL); +} + +// 显示信息 +function showInfo() { + console.log('\n📋 插件客户端信息'); + console.log('═══════════════════════════════'); + console.log(` 设备ID: ${CONFIG.DEVICE_ID}`); + console.log(` 设备名称: ${CONFIG.DEVICE_NAME}`); + console.log(` 操作系统: ${CONFIG.OS_VERSION}`); + console.log(` API地址: ${CONFIG.API_BASE}`); + console.log(` 轮询间隔: ${CONFIG.POLL_INTERVAL / 1000}秒`); + console.log('═══════════════════════════════════════\n'); +} + +// 帮助 +function showHelp() { + console.log(` +🔌 打印插件客户端 - 使用说明 + +用法: node print-plugin-client.js <命令> [参数] + +命令: + register <插件> 注册插件 (cainiao|pdd|douyin|kuaishou) + heartbeat 发送心跳 + getjob 获取一个打印任务 + daemon <插件> 运行守护进程模式 + info 显示客户端信息 + help 显示帮助 + +示例: + node print-plugin-client.js register cainiao + node print-plugin-client.js daemon pdd + node print-plugin-client.js info + +注意: + - 默认API地址为 http://localhost:10088/api + - 如需修改,请编辑 CONFIG.API_BASE + - 守护进程模式会自动注册并每30秒发送心跳 +`); +} + +// 主入口 +const [,, cmd, ...args] = process.argv; +handleCommand(cmd, args).catch(console.error); diff --git a/public/simple-login.html b/public/simple-login.html new file mode 100644 index 0000000..405bd5e --- /dev/null +++ b/public/simple-login.html @@ -0,0 +1,449 @@ + + + + + + ERP系统登录 + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/public/test-api.html b/public/test-api.html new file mode 100644 index 0000000..91e57de --- /dev/null +++ b/public/test-api.html @@ -0,0 +1,38 @@ + + + + API Test + + + + +

Brand API Test

+
Loading...
+ + + diff --git a/public/test-fix.html b/public/test-fix.html new file mode 100644 index 0000000..81ab928 --- /dev/null +++ b/public/test-fix.html @@ -0,0 +1,141 @@ + + + + + + ERP系统修复测试 + + + +

ERP系统修复测试

+ +
+ 测试说明: 验证Mock API修复是否解决404错误 +
+ +

1. 测试服务器状态

+ + +

2. 测试API端点

+ + + + + + +

3. 测试Vue页面

+ + + + +

4. 测试结果

+
点击按钮开始测试...
+ + + + \ No newline at end of file diff --git a/public/test-login.html b/public/test-login.html new file mode 100644 index 0000000..b8531ff --- /dev/null +++ b/public/test-login.html @@ -0,0 +1,299 @@ + + + + + + ERP登录功能测试 + + + +
+

ERP登录功能测试

+ +
+

测试1: 正确登录凭证

+

使用测试账号: admin@erp.com / password123

+ +
+
+ +
+

测试2: 错误登录凭证

+

使用错误账号: wrong@email.com / wrongpassword

+ +
+
+ +
+

测试3: 获取用户信息

+

需要先登录获取token

+ +
+
+ +
+

测试4: 完整登录流程

+

1. 登录 → 2. 保存token → 3. 获取用户信息

+ +
+
+
+ + + + \ No newline at end of file diff --git a/public/test-mock.html b/public/test-mock.html new file mode 100644 index 0000000..b9de95d --- /dev/null +++ b/public/test-mock.html @@ -0,0 +1,120 @@ + + + + + + Mock API 测试 + + + +
+

Mock API 测试

+

测试新配置的Mock API是否正常工作

+ +
+

测试1: 商品列表API

+ +
等待测试...
+
+ +
+

测试2: 商品选择API

+ +
等待测试...
+
+ +
+

测试3: 推送日志API

+ +
等待测试...
+
+ +
+

测试4: 订单列表API

+ +
等待测试...
+
+ +
+

测试5: 不存在的API

+ +
等待测试...
+
+
+ + + + + \ No newline at end of file diff --git a/public/test-server.html b/public/test-server.html new file mode 100644 index 0000000..b2e739a --- /dev/null +++ b/public/test-server.html @@ -0,0 +1,126 @@ + + + + + 服务器测试页面 + + + +

🔄 服务器状态测试

+ +
+

测试服务器是否正常工作...

+
+ +
+ + + +
+ +
+ +
+ +
+

问题诊断指南:

+
    +
  1. 如果此页面能正常显示 → 服务器正常
  2. +
  3. 如果Vue页面空白但此页面正常 → Vue编译问题
  4. +
  5. 如果所有页面都空白 → 服务器或网络问题
  6. +
  7. 按F12打开控制台查看具体错误
  8. +
+
+ + + + \ No newline at end of file diff --git a/public/test-simple.html b/public/test-simple.html new file mode 100644 index 0000000..629c151 --- /dev/null +++ b/public/test-simple.html @@ -0,0 +1,134 @@ + + + + + + ERP系统测试页面 + + + +
+

🏗️ ERP系统测试页面

+ +
+ ✅ Vite开发服务器正常运行
+ 服务器地址: http://localhost:5155
+ 当前时间: +
+ +

📊 系统状态

+
+ 🔍 检测到的问题:
+ 1. 主应用页面可能因路由或组件错误导致空白
+ 2. 需要检查浏览器控制台错误信息
+ 3. 可能需要修复Vue组件编译问题 +
+ +

🔧 测试链接

+ + +

📝 调试步骤

+
    +
  1. F12 打开浏览器开发者工具
  2. +
  3. 查看 Console 选项卡中的错误信息
  4. +
  5. 查看 Network 选项卡中的请求状态
  6. +
  7. 查看 Elements 选项卡中的HTML结构
  8. +
  9. 将错误信息截图或复制发送给我
  10. +
+ +

🚨 紧急修复方案

+

如果主应用仍然空白,可以:

+ +
+ + + + \ No newline at end of file diff --git a/public/test-vue-app.html b/public/test-vue-app.html new file mode 100644 index 0000000..a168e34 --- /dev/null +++ b/public/test-vue-app.html @@ -0,0 +1,140 @@ + + + + + + Vue应用测试 + + + +
+

Vue应用功能测试

+

测试Vue应用各页面是否正常工作

+ +
+

测试1: 主应用

+ +
等待测试...
+ +
+ +
+

测试2: 打印页面(原版)

+ +
等待测试...
+ +
+ +
+

测试3: 打印页面(修复版)

+ +
等待测试...
+ +
+ +
+

测试4: 商品管理页面

+ +
等待测试...
+ +
+ +
+

测试5: 订单管理页面

+ +
等待测试...
+ +
+ +
+

手动测试指南

+
    +
  1. 打开浏览器控制台(F12)
  2. +
  3. 访问 http://localhost:5155/
  4. +
  5. 检查控制台是否有错误
  6. +
  7. 导航到各个页面测试功能
  8. +
  9. 重点关注打印页面是否卡顿
  10. +
+
+
+ + + + \ No newline at end of file diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/s.id b/s.id new file mode 100644 index 0000000..e69de29 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..87ed26e --- /dev/null +++ b/src/App.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/api/afterSale.ts b/src/api/afterSale.ts new file mode 100644 index 0000000..f151c6a --- /dev/null +++ b/src/api/afterSale.ts @@ -0,0 +1,58 @@ +// 售后管理 API +import request from '@/utils/request' + +/** + * 售后列表 + */ +export function getAfterSalesList(params?: any) { + return request.get('/after-sales', { params }) +} + +/** + * 售后单详情 + */ +export function getAfterSaleDetail(id: string) { + return request.get(`/after-sales/${id}`) +} + +/** + * 创建售后单 + */ +export function createAfterSale(data: any) { + return request.post('/after-sales', data) +} + +/** + * 更新售后单状态 + */ +export function updateAfterSaleStatus(id: string, data: any) { + return request.put(`/after-sales/${id}/status`, data) +} + +/** + * 删除售后单 + */ +export function deleteAfterSale(id: string) { + return request.delete(`/after-sales/${id}`) +} + +/** + * 获取可售后的订单(已发货) + */ +export function getAvailableOrders(params?: any) { + return request.get('/after-sales/available-orders', { params }) +} + +/** + * 获取所有可售后的订单(包含未发货的仅退款) + */ +export function getAllAvailableOrders(params?: any) { + return request.get('/after-sales/all-available-orders', { params }) +} + +/** + * 售后统计 + */ +export function getAfterSaleStats() { + return request.get('/after-sales/stats') +} diff --git a/src/api/ai.ts b/src/api/ai.ts new file mode 100644 index 0000000..2540cdc --- /dev/null +++ b/src/api/ai.ts @@ -0,0 +1,129 @@ +// AI 对话管理 API +import request from '@/utils/request' + +/** + * 消息角色类型 + */ +export type MessageRole = 'user' | 'assistant' | 'system' + +/** + * 消息接口定义 + */ +export interface Message { + id: string + role: MessageRole + content: string + createdAt: string +} + +/** + * 对话接口定义 + */ +export interface Conversation { + id: string + title: string + messages: Message[] + model?: string + createdAt: string + updatedAt: string +} + +/** + * AI 模型接口定义 + */ +export interface AIModel { + id: string + name: string + provider: string + description?: string + isActive?: boolean +} + +/** + * AI 能力接口定义 + */ +export interface AICapability { + id: string + name: string + description: string + enabled: boolean +} + +/** + * 聊天请求参数 + */ +export interface ChatParams { + conversationId?: string + message: string + model?: string +} + +/** + * 执行任务请求参数 + */ +export interface ExecuteTaskParams { + task: string + context?: Record + options?: Record +} + +/** + * 获取对话列表 + */ +export function getConversations() { + return request.get('/ai/conversations') +} + +/** + * 获取对话详情 + * @param id 对话ID + */ +export function getConversationDetail(id: string) { + return request.get(`/ai/conversations/${id}`) +} + +/** + * 删除对话 + * @param id 对话ID + */ +export function deleteConversation(id: string) { + return request.delete(`/ai/conversations/${id}`) +} + +/** + * 发送聊天消息 + * @param params 聊天参数 + */ +export function sendChatMessage(params: ChatParams) { + return request.post('/ai/chat', params) +} + +/** + * 执行 AI 任务 + * @param params 任务参数 + */ +export function executeTask(params: ExecuteTaskParams) { + return request.post('/ai/execute-task', params) +} + +/** + * 获取 AI 能力列表 + */ +export function getCapabilities() { + return request.get('/ai/capabilities') +} + +/** + * 获取模型列表 + */ +export function getModels() { + return request.get('/ai/models') +} + +/** + * 切换模型 + * @param data 包含模型 ID 的数据 + */ +export function switchModel(data: { modelId: string }) { + return request.post('/ai/models/switch', data) +} diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..0109d17 --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,141 @@ +import request from '@/utils/request' + +export interface LoginForm { + username: string + password: string + captcha?: string + device_id?: string +} + +export interface SmsLoginForm { + phone: string + code: string +} + +export interface RegisterForm { + name: string + email: string + password: string + password_confirmation: string +} + +export interface UserInfo { + id: number + name: string + email: string + phone?: string + avatar?: string + status: string + is_test_user: boolean + created_at: string + last_login_at?: string +} + +export interface LoginResponse { + code: number + data: { + user: UserInfo + token: string + } + message: string +} + +// 账号密码登录 +export function login(data: LoginForm) { + return request.post('/api/auth/login', data) +} + +// 短信发送验证码 +export function sendSmsCode(phone: string, captcha?: string, device_id?: string) { + return request.post('/api/auth/sms/send', { phone, captcha, device_id }) +} + +// 短信登录 +export function smsLogin(data: SmsLoginForm) { + return request.post('/api/auth/sms/login', data) +} + +// 微信登录二维码 +export function getWechatQr() { + return request.get<{ data: { scene_str: string; qr_url: string; ticket: string } }>('/api/auth/wechat/qr') +} + +// 微信扫码状态 +export function checkWechatScan(scene_str: string) { + return request.get('/api/auth/wechat/check', { scene_str }) +} + +// 微信模拟扫码(开发测试用) +export function mockWechatScan(scene_str: string, openid?: string) { + return request.post('/api/auth/wechat/mock-scan', { scene_str, openid }) +} + +// 用户注册 +export function register(data: RegisterForm) { + return request.post('/api/auth/register', data) +} + +// 获取图形验证码 +export function getCaptcha(device_id?: string) { + return request.get('/api/auth/captcha', { device_id }, { responseType: 'blob' }) +} + +// 刷新Token +export function refreshToken() { + return request.post<{ data: { token: string; user: UserInfo } }>('/api/auth/refresh') +} + +// 登出 +export function logout() { + return request.post('/api/auth/logout') +} + +// 获取当前用户 +export function getCurrentUser() { + return request.get<{ data: UserInfo }>('/api/user/') +} + +// 更新个人资料 +export function updateProfile(data: { name?: string; phone?: string; avatar?: string }) { + return request.put<{ data: UserInfo }>('/api/user/profile', data) +} + +// 修改密码 +export function changePassword(data: { current_password: string; new_password: string; new_password_confirmation: string }) { + return request.put('/api/user/password', data) +} + +// 绑定微信 +export function bindWechat(code: string) { + return request.post('/api/user/bind-wechat', { code }) +} + +// 解绑微信 +export function unbindWechat() { + return request.post('/api/user/unbind-wechat') +} + +// 发送重置密码验证码 +export function sendResetCode(email: string) { + return request.post('/api/auth/reset/send-code', { email }) +} + +// 重置密码 +export function resetPassword(data: { email: string; code: string; new_password: string }) { + return request.post('/api/auth/reset/password', data) +} + +// 获取登录日志 +export function getLoginLogs() { + return request.get('/api/user/login-logs') +} + +// 发送配对码 +export function sendPairCode(email: string, expireMinutes?: number) { + return request.post('/api/auth/send-pair-code', { email, expireMinutes }) +} + +// 验证配对码 +export function verifyPairCode(email: string, code: string) { + return request.post('/api/auth/verify-pair-code', { email, code }) +} diff --git a/src/api/brand.ts b/src/api/brand.ts new file mode 100644 index 0000000..a323612 --- /dev/null +++ b/src/api/brand.ts @@ -0,0 +1,65 @@ +// src/api/brand.ts +import request from '@/utils/request' + +/** + * 品牌数据类型 + */ +export interface Brand { + id?: number + name: string + code?: string + logo?: string + status?: number + description?: string + created_at?: string + updated_at?: string + [key: string]: any +} + +/** + * 获取品牌列表 + * @param params 查询参数(page, limit, name, status) + */ +export function getBrandList(params?: any) { + return request.get('/brands', { params }) +} + +/** + * 获取品牌详情 + * @param id 品牌ID + */ +export function getBrandDetail(id: number) { + return request.get(`/brands/${id}`) +} + +/** + * 创建品牌 + * @param data 品牌数据 + */ +export function createBrand(data: Brand) { + return request.post('/brands', data) +} + +/** + * 更新品牌 + * @param id 品牌ID + * @param data 更新数据 + */ +export function updateBrand(id: number, data: Partial) { + return request.put(`/brands/${id}`, data) +} + +/** + * 删除品牌 + * @param id 品牌ID + */ +export function deleteBrand(id: number) { + return request.delete(`/brands/${id}`) +} + +/** + * 获取所有品牌用于下拉选择 + */ +export function getAllBrands() { + return request.get('/brands/all') +} diff --git a/src/api/delivery.ts b/src/api/delivery.ts new file mode 100644 index 0000000..5a5ebf5 --- /dev/null +++ b/src/api/delivery.ts @@ -0,0 +1,151 @@ +import request from '@/utils/request' + +// ==================== 类型定义 ==================== + +/** 配送单状态 */ +export type DeliveryOrderStatus = 'pending' | 'printed' | 'shipped' | 'sync_failed' | 'completed' + +/** 配送单商品项 */ +export interface DeliveryOrderItem { + id?: string + skuCode: string + skuName?: string + quantity: number +} + +/** 配送单 */ +export interface DeliveryOrder { + id?: string + orderNo?: string + warehouseId: string + warehouseName?: string + platformOrderId?: string + platformOrderNo?: string + status: DeliveryOrderStatus + totalAmount?: number + expressCompany?: string + trackingNo?: string + items: DeliveryOrderItem[] + createTime?: string + updateTime?: string + printTime?: string + shipTime?: string +} + +/** 待发货列表查询参数 */ +export interface PendingDeliveryParams { + page?: number + pageSize?: number + warehouseId?: string + keyword?: string +} + +/** 标记打印请求 */ +export interface MarkPrintedDto { + orderIds: string[] +} + +/** 重新打印请求 */ +export interface ReprintDto { + orderIds: string[] +} + +/** 发货请求 */ +export interface ShipDto { + orderId: string + expressCompany: string + trackingNo: string +} + +/** 打印日志 */ +export interface PrintLog { + id?: string + orderId: string + orderNo?: string + printType: 'original' | 'reprint' + printedAt: string + printedBy?: string + printer?: string +} + +/** 打印日志查询参数 */ +export interface PrintLogParams { + page?: number + pageSize?: number + orderNo?: string + startDate?: string + endDate?: string +} + +// ==================== API 函数 ==================== + +/** + * 获取待发货列表 + * @param params 查询参数 + */ +export function getPendingDeliveryList(params?: PendingDeliveryParams) { + return request.get('/delivery/pending-delivery', { params }) +} + +/** + * 标记已打印 + * @param data 订单ID列表 + */ +export function markPrinted(data: MarkPrintedDto) { + return request.post('/delivery/mark-printed', data) +} + +/** + * 重新打印 + * @param data 订单ID列表 + */ +export function reprintDelivery(data: ReprintDto) { + return request.post('/delivery/reprint', data) +} + +/** + * 获取打印日志 + * @param params 查询参数 + */ +export function getPrintLogs(params?: PrintLogParams) { + return request.get('/delivery/print-logs', { params }) +} + +/** + * 发货 + * @param data 发货信息 + */ +export function shipDelivery(data: ShipDto) { + return request.post('/delivery/ship', data) +} + +/** + * 同步失败重试(批量) + */ +export function syncFailedRetry() { + return request.post('/delivery/sync-failed') +} + +/** + * 重试同步单个订单 + * @param id 配送单ID + */ +export function retrySyncDelivery(id: string) { + return request.post(`/delivery/retry-sync/${id}`) +} + +// ==================== 响应类型 ==================== + +export interface PendingDeliveryResponse { + list: DeliveryOrder[] + total: number + page: number + pageSize: number +} + +export interface PrintLogResponse { + list: PrintLog[] + total: number + page: number + pageSize: number +} diff --git a/src/api/goods.ts b/src/api/goods.ts new file mode 100644 index 0000000..b4fa41a --- /dev/null +++ b/src/api/goods.ts @@ -0,0 +1,227 @@ +// src/api/goods.ts +import request from '@/utils/request' + +// ============ 类型定义 ============ + +/** 商品类型 */ +export type GoodsType = 'normal' | 'combo' + +/** 商品状态 */ +export type GoodsStatus = 'active' | 'inactive' + +/** 商品 */ +export interface Goods { + id: number + name: string + code: string + barcode?: string + type: GoodsType + type_label?: string + retail_price: string + cost_price: string + unit?: string + brand?: { id: number; name: string } | null + suppliers?: string + weight?: string + packaging_cost?: string + shipping_packaging_cost?: string + volume?: string + length?: string + width?: string + height?: string + batch_management: boolean + created_at: string + updated_at: string +} + +/** 商品列表查询参数 */ +export interface GoodsListParams { + keyword?: string + category?: string + type?: GoodsType + status?: GoodsStatus + page?: number + limit?: number +} + +/** 商品列表响应 */ +export interface GoodsListResponse { + list: Goods[] + total: number + current_page: number + last_page: number +} + +/** 创建/更新商品请求 */ +export interface GoodsFormData { + name: string + code: string + type: GoodsType + barcode?: string + retail_price?: number | string + cost_price?: number | string + unit?: string + brand_id?: number + weight?: number | string + packaging_cost?: number | string +} + +/** SKU绑定请求 */ +export interface BindSkuData { + goodsId: string + skuCode: string +} + +/** 批量绑定请求 */ +export interface BatchBindData { + goodsId: string + skuCodes: string[] +} + +/** 自动匹配请求 */ +export interface AutoMatchData { + warehouseId: string +} + +/** 匹配结果查询参数 */ +export interface MatchResultsParams { + warehouseId?: string + status?: string + page?: number + limit?: number +} + +/** 匹配结果项 */ +export interface MatchResult { + id: string + goodsId: string + goodsName: string + skuCode: string + warehouseId: string + warehouseName: string + matchStatus: 'matched' | 'unmatched' | 'pending' + matchType?: 'auto' | 'manual' + createdAt: string +} + +// ============ API 函数 ============ + +/** + * 获取商品列表(分页) + */ +export function getGoodsList(params?: GoodsListParams) { + return request.get('/goods', { params }) +} + +/** + * 获取商品详情 + */ +export function getGoodsDetail(id: string | number) { + return request.get(`/goods/${id}`) +} + +/** + * 创建商品 + */ +export function createGoods(data: GoodsFormData) { + return request.post('/goods', data) +} + +/** + * 更新商品 + */ +export function updateGoods(id: string | number, data: Partial) { + return request.put(`/goods/${id}`, data) +} + +/** + * 删除商品 + */ +export function deleteGoods(id: string | number) { + return request.delete(`/goods/${id}`) +} + +/** + * 全量同步商品 + * 注意: 后端暂无此接口 + */ +export function syncAllGoods() { + return Promise.resolve({ + code: 200, + message: '同步功能开发中', + data: null + }) +} + +/** + * 绑定SKU + */ +export function bindSku(data: BindSkuData) { + return request.post('/goods/bind-sku', data) +} + +/** + * 解除SKU绑定 + */ +export function unbindSku(data: BindSkuData) { + return request.post('/goods/unbind-sku', data) +} + +/** + * 批量绑定SKU + */ +export function batchBindSku(data: BatchBindData) { + return request.post('/goods/batch-bind', data) +} + +/** + * 自动匹配 + */ +export function autoMatchGoods(data: AutoMatchData) { + return request.post('/goods/auto-match', data) +} + +/** + * 获取匹配结果列表 + */ +export function getMatchResults(params?: MatchResultsParams) { + return request.get<{ list: MatchResult[]; total: number }>('/goods/match-results', { params }) +} + +/** + * 推送商品到云仓 + * 注意: 后端暂无此接口 + */ +export function pushGoodsToCloud(data: { goodsIds: number[]; warehouseId: number }) { + return Promise.resolve({ + code: 200, + message: '推送功能开发中', + data: null + }) +} + +/** + * 获取推送日志 + * 注意: 后端暂无此接口 + */ +export function getPushLogs(params?: { page?: number; pageSize?: number }) { + return Promise.resolve({ + code: 200, + data: { + list: [], + total: 0, + page: params?.page || 1, + pageSize: params?.pageSize || 10 + } + }) +} + +/** + * 获取所有商品(下拉选择用) + */ +export function getAllGoods() { + return request.get('/goods/all') +} + +// 别名兼容 +export const getAllGoodsForSelect = getAllGoods diff --git a/src/api/log.ts b/src/api/log.ts new file mode 100644 index 0000000..24cd66e --- /dev/null +++ b/src/api/log.ts @@ -0,0 +1,65 @@ +// 操作日志 API +import request from '@/utils/request' + +/** + * 操作日志项接口定义 + */ +export interface OperationLogItem { + id: number + operateTime: string + userName: string + operateType: string + operateDesc: string + result: number + ipAddress: string + userAgent: string +} + +/** + * 操作日志列表查询参数 + */ +export interface OperationLogParams { + currentPage?: number + pageSize?: number + keyword?: string + operateType?: string + startDate?: string + endDate?: string +} + +/** + * 获取操作日志列表 + * @param params 查询参数 + */ +export function getOperationLogs(params?: OperationLogParams) { + return request.get('/operation-logs', { params }) +} + +/** + * 获取操作日志详情 + * @param id 日志ID + */ +export function getOperationLogDetail(id: number) { + return request.get(`/operation-logs/${id}`) +} + +/** + * 导出操作日志 + * @param params 导出参数 + */ +export function exportLogs(params?: OperationLogParams) { + return request.get('/operation-logs/export', { params }) +} + +/** + * 添加操作日志 + */ +export function addOperationLog(data: { + operateType: string + operateDesc: string + result: number + userId?: number + userName?: string +}) { + return request.post('/operation-logs', data) +} diff --git a/src/api/order.ts b/src/api/order.ts new file mode 100644 index 0000000..df8bc41 --- /dev/null +++ b/src/api/order.ts @@ -0,0 +1,412 @@ +/** + * 订单模块 API + * 对接后端 OrderController_new 订单模块所有接口 + */ +import request from '@/utils/request' + +// ==================== 类型定义 ==================== + +/** 订单商品项 */ +export interface OrderItem { + id: number + goods_id?: number + goods_name: string + goods_code?: string + platform_sku: string + sku_code?: string + quantity: number + price: number + total_amount: number + pic?: string +} + +/** 订单状态枚举 */ +export type OrderStatus = 'pending' | 'auditing' | 'shipped' | 'completed' | 'cancelled' + +/** 审核状态枚举 */ +export type AuditStatus = 'pending' | 'approved' | 'rejected' + +/** 发货状态枚举 */ +export type DeliveryStatus = 'pending' | 'delivered' + +/** 订单主体 */ +export interface Order { + id: number + short_id: string + platform_order_sn: string + platform: string + platform_label?: string + shop_id: number + shop_name: string + order_time: string + buyer_nick: string + receiver_name: string + receiver_phone: string + receiver_address: string + goods_amount: number + discount_amount: number + freight: number + total_amount: number + order_status: OrderStatus + platform_status: string + audit_status: AuditStatus + delivery_status: DeliveryStatus + express_company?: string + express_no?: string + warehouse_id?: number + warehouse_name?: string + remark?: string + items: OrderItem[] + created_at: string + updated_at: string +} + +/** 订单列表查询参数 */ +export interface OrderListQuery { + platform?: string // 平台(如 taobao) + shop_id?: number // 店铺ID + order_status?: OrderStatus // 订单状态 + audit_status?: AuditStatus // 审核状态 + delivery_status?: DeliveryStatus // 发货状态 + keyword?: string // 搜索(订单号/收货人/电话) + date_range?: string // 开始日期,结束日期 + page?: number // 页码,默认1 + limit?: number // 每页数量,默认10 +} + +/** 订单列表响应 */ +export interface OrderListResponse { + list: Order[] + total: number + current_page: number + last_page: number +} + +/** 拉取订单参数 */ +export interface PullOrdersParams { + platform: string // 平台 + shop_id: number // 店铺ID + pull_type: 'all' | 'increment' | 'specify' // 拉取类型 + order_ids?: string // specify时必填,逗号分隔 + start_time?: string // 开始时间 YYYY-MM-DD + end_time?: string // 结束时间 YYYY-MM-DD +} + +/** 拉取订单响应 */ +export interface PullOrdersResponse { + count: number +} + +/** 审核订单参数 */ +export interface AuditOrderParams { + action: 'approve' | 'reject' // 审核动作 + comment?: string // 驳回时必填 +} + +/** 批量审核参数 */ +export interface BatchAuditParams { + order_ids: number[] // 订单ID数组 + action: 'approve' | 'reject' + comment?: string +} + +/** 批量审核响应 */ +export interface BatchAuditResponse { + success_count: number + failed_orders: Array<{ id: number; reason: string }> +} + +/** 批量操作参数 */ +export interface BatchOperationParams { + order_ids: number[] // 订单ID数组 + operation: 'audit_approve' | 'audit_reject' | 'set_warehouse' | 'ship' | 'cancel' | 'delete' + data?: Record // 操作相关数据 +} + +/** 设置仓库快递参数 */ +export interface SetWarehouseExpressParams { + warehouse_id?: number + express_company?: string + express_name?: string +} + +/** 发货参数 */ +export interface ShipOrderParams { + express_company: string // 快递公司 + express_no: string // 快递单号 + is_print?: boolean // 是否打印 +} + +/** 订单统计响应 */ +export interface OrderStatisticsResponse { + status_stats: Record + audit_stats: Record + delivery_stats: Record + amount_stats: { + total_goods_amount: number + total_discount_amount: number + total_freight: number + total_amount: number + avg_order_amount: number + } + platform_stats: Array<{ platform: string; count: number; amount: number }> + trend_stats: Array<{ date_group: string; order_count: number; total_amount: number }> + total_orders: number +} + +/** 导出订单参数 */ +export interface ExportOrdersParams { + export_type: 'excel' | 'csv' + order_ids?: number[] // 指定订单ID + start_date?: string + end_date?: string + platform?: string + order_status?: OrderStatus +} + +/** 导出订单响应 */ +export interface ExportOrdersResponse { + filename: string + count: number + headers: string[] + data: Record[] +} + +/** 更新备注参数 */ +export interface UpdateRemarkParams { + remark: string // 备注内容,最大1000字符 +} + +/** 订单日志 */ +export interface OrderLog { + id: number + order_id: number + action: string + operator_id: number + operator_name: string + content: string + created_at: string +} + +/** 仪表板统计响应 */ +export interface DashboardStatsResponse { + today_orders: number + today_amount: number + pending_audit_count: number + pending_ship_count: number + shipped_count: number + completed_count: number +} + +// ==================== API 接口 ==================== + +/** + * 获取订单列表 + * @description 分页查询订单列表,支持多种筛选条件 + */ +export function getOrderList(params?: OrderListQuery) { + return request.get('/api/orders', params) +} + +/** + * 获取订单详情 + * @description 根据订单ID获取完整订单信息 + */ +export function getOrderDetail(id: number) { + return request.get(`/api/orders/${id}`) +} + +/** + * 拉取订单 + * @description 从平台拉取订单到系统 + */ +export function pullOrders(data: PullOrdersParams) { + // 转换参数格式:驼峰转蛇形,时间范围拆分 + const payload: any = { + platform: data.platform, + shop_id: data.shop_id || data.shopId, + pull_type: data.pull_type || 'increment' + } + + // 处理时间范围 + if (data.start_time) { + payload.start_time = data.start_time + } + if (data.end_time) { + payload.end_time = data.end_time + } + + // 兼容 orderNo 参数 + if (data.order_ids) { + payload.order_ids = data.order_ids + } + + // 生产环境 baseURL 已经是完整 URL,直接用 /api/orders/pull + return request.post('/api/orders/pull', payload) +} + +/** + * 获取待匹配订单 + * @description 获取尚未匹配ERP商品的订单 + */ +export function getPendingMatchOrders(params?: { page?: number; limit?: number }) { + return request.get('/api/orders/pending-match', params) +} + +/** + * 获取待审核订单 + * @description 获取等待审核的订单列表 + */ +export function getPendingAuditOrders(params?: { page?: number; limit?: number }) { + return request.get('/api/orders/pending-audit', params) +} + +/** + * 订单匹配 + * @description 将平台订单商品与ERP商品进行匹配 + */ +export function matchOrder(id: number, data?: { items?: Array<{ platform_sku: string; goods_id: number }> }) { + return request.post(`/api/orders/${id}/match`, data) +} + +/** + * 审核订单 + * @description 审核单个订单,批准或驳回 + */ +export function auditOrder(id: number, data: AuditOrderParams) { + return request.post(`/api/orders/${id}/audit`, data) +} + +/** + * 批量审核订单 + * @description 批量审核多个订单 + */ +export function batchAuditOrders(data: BatchAuditParams) { + return request.post('/api/orders/batch-audit', data) +} + +/** + * 批量操作订单 + * @description 批量执行订单操作(如设置仓库、发货、取消等) + */ +export function batchOperation(data: BatchOperationParams) { + return request.post('/api/orders/batch-operation', data) +} + +/** + * 获取订单统计 + * @description 按日期、平台、店铺等维度统计订单 + */ +export function getOrderStatistics(params?: { + start_date?: string + end_date?: string + platform?: string + shop_id?: number + date_format?: 'day' | 'week' | 'month' +}) { + return request.get('/api/orders/statistics', params) +} + +/** + * 导出订单 + * @description 导出订单数据为 Excel 或 CSV + */ +export function exportOrders(data: ExportOrdersParams) { + return request.post('/api/orders/export', data) +} + +/** + * 获取订单状态选项 + * @description 获取订单状态下拉选项 + */ +export function getStatusOptions() { + return request.get>('/api/orders/status-options') +} + +/** + * 获取审核状态选项 + * @description 获取审核状态下拉选项 + */ +export function getAuditStatusOptions() { + return request.get>('/api/orders/audit-status-options') +} + +/** + * 获取发货状态选项 + * @description 获取发货状态下拉选项 + */ +export function getDeliveryStatusOptions() { + return request.get>('/api/orders/delivery-status-options') +} + +/** + * 获取平台选项 + * @description 获取电商平台下拉选项 + */ +export function getPlatformOptions() { + return request.get>('/api/orders/platform-options') +} + +/** + * 获取店铺选项 + * @description 获取已授权店铺下拉选项 + */ +export function getShopOptions() { + return request.get>('/api/orders/shop-options') +} + +/** + * 获取仪表板统计 + * @description 获取今日订单、金额、待处理数量等仪表板数据 + */ +export function getDashboardStats() { + return request.get('/api/orders/dashboard-stats') +} + +/** + * 获取订单日志 + * @description 获取订单的操作日志记录 + */ +export function getOrderLogs(id: number) { + return request.get(`/api/orders/${id}/logs`) +} + +/** + * 更新订单备注 + * @description 修改订单备注信息 + */ +export function updateOrderRemark(id: number, data: UpdateRemarkParams) { + return request.put(`/api/orders/${id}/remark`, data) +} + +/** + * 设置仓库和快递 + * @description 为订单设置仓库和快递公司(需订单已审核) + */ +export function setWarehouseExpress(id: number, data: SetWarehouseExpressParams) { + return request.post(`/api/orders/${id}/warehouse-express`, data) +} + +/** + * 订单发货 + * @description 确认发货并填写快递信息(会扣减库存) + */ +export function shipOrder(id: number, data: ShipOrderParams) { + return request.post(`/api/orders/${id}/ship`, data) +} + +/** + * 完成订单 + * @description 标记订单为已完成(需订单已发货) + */ +export function completeOrder(id: number) { + return request.put(`/api/orders/${id}/complete`, data) +} + +/** + * 同步订单到平台 + * @description 将订单状态回传到电商平台 + */ +export function syncOrderToPlatform(id: number) { + return request.post(`/api/orders/${id}/sync`, data) +} diff --git a/src/api/platform-product.ts b/src/api/platform-product.ts new file mode 100644 index 0000000..e5754a7 --- /dev/null +++ b/src/api/platform-product.ts @@ -0,0 +1,76 @@ +// src/api/platform-product.ts +import request from '@/utils/request' + +/** + * 平台商品 + */ +export interface PlatformProduct { + id: number + platform_id: number + platform_name: string + platform_code: string + outer_id: string + num_iid: string + title: string + price: string + pic_url: string + seller_nick: string + approve_status: string + listed_time: string + unsale_time: string + stock: number + has_sync: boolean + bound_goods_id?: number + bound_goods_name?: string + bound_sku_code?: string + last_sync_at?: string + created_at: string + updated_at: string +} + +/** + * 平台商品列表查询参数 + */ +export interface PlatformProductListParams { + platform_id?: number + keyword?: string + sync_status?: 'all' | 'synced' | 'unsynced' + page?: number + limit?: number +} + +/** + * 获取平台商品列表 + */ +export function getPlatformProductList(params?: PlatformProductListParams) { + return request.get<{ + list: PlatformProduct[] + total: number + page: number + last_page: number + }>('/platform-products', { params }) +} + +/** + * 获取平台商品详情 + */ +export function getPlatformProductDetail(id: number) { + return request.get(`/platform-products/${id}`) +} + +/** + * 同步平台商品 + */ +export function syncPlatformProducts(platformId: number) { + return request.post<{ synced_count: number }>('/platform-products/sync', { platform_id: platformId }) +} + +/** + * 绑定平台商品到ERP商品 + */ +export function bindPlatformProduct(platformProductId: number, goodsId: number, skuCode?: string) { + return request.post(`/platform-products/${platformProductId}/bind`, { + goods_id: goodsId, + sku_code: skuCode + }) +} diff --git a/src/api/platform.ts b/src/api/platform.ts new file mode 100644 index 0000000..afbf16f --- /dev/null +++ b/src/api/platform.ts @@ -0,0 +1,113 @@ +// src/api/platform.ts +import request from '@/utils/request' + +/** + * 平台数据类型 + */ +export interface Platform { + id?: number + name: string + code: string + status?: number + created_at?: string + updated_at?: string + [key: string]: any +} + +/** + * 平台统计数据类型 + */ +export interface PlatformStats { + total: number + active: number + inactive: number + today_add: number + [key: string]: any +} + +/** + * 获取平台列表 + * @param params 查询参数(page, limit, name, status) + */ +export function getPlatformList(params?: any) { + return request.get('/platforms', { params }) +} + +/** + * 获取平台详情 + * @param id 平台ID + */ +export function getPlatformDetail(id: number) { + return request.get(`/platforms/${id}`) +} + +/** + * 创建平台 + * @param data 平台数据 + */ +export function createPlatform(data: Platform) { + return request.post('/platforms', data) +} + +/** + * 更新平台 + * @param id 平台ID + * @param data 更新数据 + */ +export function updatePlatform(id: number, data: Partial) { + return request.put(`/platforms/${id}`, data) +} + +/** + * 删除平台 + * @param id 平台ID + */ +export function deletePlatform(id: number) { + return request.delete(`/platforms/${id}`) +} + +/** + * 同步平台数据 + */ +export function syncPlatform() { + return request.post('/platforms/sync') +} + +/** + * 批量更新平台 + * @param data 批量更新数据 + */ +export function batchUpdatePlatform(data: Partial[]) { + return request.post('/platforms/batch-update', data) +} + +/** + * 获取平台统计 + */ +export function getPlatformStats() { + return request.get('/platforms/stats') +} + +/** + * 获取所有平台用于下拉选择 + */ +export function getAllPlatforms() { + return request.get('/platforms/all') +} + +/** + * 获取面单账号列表 + */ +export function getWaybillAccounts(platformId?: number) { + return Promise.resolve({ + code: 200, + data: { list: [], total: 0 } + }) +} + +/** + * 同步面单账号 + */ +export function syncWaybillAccounts(platformId: number) { + return Promise.resolve({ code: 200, message: '功能开发中', data: null }) +} diff --git a/src/api/platformGoods.ts b/src/api/platformGoods.ts new file mode 100644 index 0000000..746836b --- /dev/null +++ b/src/api/platformGoods.ts @@ -0,0 +1,166 @@ +// src/api/platformGoods.ts + +// 模拟店铺数据 +const mockShops = { + taobao: [ + { id: 'tb1', name: '淘宝官方旗舰店' }, + { id: 'tb2', name: '淘宝专营店' } + ], + jd: [ + { id: 'jd1', name: '京东自营店' }, + { id: 'jd2', name: '京东专营店' } + ], + pdd: [ + { id: 'pdd1', name: '拼多多官方旗舰店' }, + { id: 'pdd2', name: '拼多多专营店' } + ], + douyin: [ + { id: 'dy1', name: '抖音小店' }, + { id: 'dy2', name: '抖音专营店' } + ] +} + +// 模拟平台商品数据(按平台和店铺组织) +const mockPlatformGoods: Record> = { + taobao: { + tb1: [ + { + id: 'tb_spu_1', + type: 'spu', + name: '连衣裙', + code: 'TB-SPU-001', + price: 199.0, + status: 'onsale', + bound: false, + skus: [ + { + id: 'tb_sku_11', + spuId: 'tb_spu_1', + type: 'sku', + name: '红色-S', + code: 'TB-SKU-001-R-S', + price: 199.0, + status: 'onsale', + bound: false + }, + { + id: 'tb_sku_12', + spuId: 'tb_spu_1', + type: 'sku', + name: '红色-M', + code: 'TB-SKU-001-R-M', + price: 199.0, + status: 'onsale', + bound: true + } + ] + }, + { + id: 'tb_spu_2', + type: 'spu', + name: '运动鞋', + code: 'TB-SPU-002', + price: 299.0, + status: 'onsale', + bound: false, + skus: [ + { + id: 'tb_sku_21', + spuId: 'tb_spu_2', + type: 'sku', + name: '白色-42', + code: 'TB-SKU-002-W-42', + price: 299.0, + status: 'onsale', + bound: false + } + ] + } + ], + tb2: [] + }, + jd: {}, + pdd: {}, + douyin: {} +} + +// 辅助函数:平台代码转中文名称 +function getPlatformName(platform: string): string { + const map: Record = { + taobao: '淘宝', + jd: '京东', + pdd: '拼多多', + douyin: '抖音' + } + return map[platform] || platform +} + +/** + * 获取平台-店铺树结构 + */ +export function getPlatformShopTree() { + return new Promise<{ code: number; data: any[] }>((resolve) => { + setTimeout(() => { + const tree = Object.keys(mockShops).map(platform => ({ + id: `platform-${platform}`, + label: getPlatformName(platform), + type: 'platform', + platform, + children: mockShops[platform].map(shop => ({ + id: `shop-${shop.id}`, + label: shop.name, + type: 'shop', + platform, + shopId: shop.id, + leaf: true + })) + })) + resolve({ code: 200, data: tree }) + }, 200) + }) +} + +// 获取店铺列表(兼容旧接口) +export function getShopsByPlatform(platform: string) { + return new Promise<{ code: number; data: any[] }>((resolve) => { + setTimeout(() => { + resolve({ code: 200, data: mockShops[platform] || [] }) + }, 200) + }) +} + +// 下载平台商品 +export function downloadPlatformGoods(params: { + platform: string + shopId: string + downloadType: string + specifyIds?: string +}) { + console.log('downloadPlatformGoods called with params:', params) + return new Promise<{ code: number; message?: string }>((resolve) => { + setTimeout(() => { + resolve({ code: 200, message: '下载任务已提交' }) + }, 500) + }) +} + +// 获取已下载的平台商品列表 +export function getPlatformGoodsList(params: { platform: string; shopId: string }) { + console.log('getPlatformGoodsList called with params:', params) + return new Promise<{ code: number; data: any[] }>((resolve) => { + setTimeout(() => { + const goods = mockPlatformGoods[params.platform]?.[params.shopId] || [] + resolve({ code: 200, data: goods }) + }, 300) + }) +} + +// 绑定ERP商品与平台SKU +export function bindErpSku(data: { skuId: string; erpGoodsId: string }) { + console.log('bindErpSku called with data:', data) + return new Promise<{ code: number; message?: string }>((resolve) => { + setTimeout(() => { + resolve({ code: 200, message: '绑定成功' }) + }, 300) + }) +} \ No newline at end of file diff --git a/src/api/print-job.ts b/src/api/print-job.ts new file mode 100644 index 0000000..e943468 --- /dev/null +++ b/src/api/print-job.ts @@ -0,0 +1,119 @@ +// 打印任务 API +import request from '@/utils/request' + +/** + * 创建打印任务 + */ +export function createJob(data: { + platform: string + plugin_code: string + order_id?: number + template_id?: number + print_data: Record + priority?: number +}) { + return request.post('/print-jobs', data) +} + +/** + * 批量创建打印任务 + */ +export function createBatchJobs(data: { + platform: string + plugin_code: string + template_id?: number + orders: Array<{ + order_id?: number + priority?: number + print_data: Record + }> +}) { + return request.post('/print-jobs/batch', data) +} + +/** + * 获取打印队列 + */ +export function getQueue(params?: { + status?: string + platform?: string + page?: number + pageSize?: number +}) { + return request.get('/print-jobs/queue', { params }) +} + +/** + * 获取打印历史 + */ +export function getHistory(params?: { + page?: number + per_page?: number +}) { + return request.get('/print-jobs/history', { params }) +} + +/** + * 获取打印统计 + */ +export function getStats() { + return request.get('/print-jobs/stats') +} + +/** + * 批量加入队列 + */ +export function batchQueue(jobIds: number[]) { + return request.post('/print-jobs/batch-queue', { job_ids: jobIds }) +} + +/** + * 清空已完成任务 + */ +export function clearCompleted() { + return request.post('/print-jobs/clear-completed') +} + +/** + * 重试任务 + */ +export function retryJob(jobId: number) { + return request.post(`/print-jobs/${jobId}/retry`) +} + +/** + * 取消任务 + */ +export function cancelJob(jobId: number) { + return request.post(`/print-jobs/${jobId}/cancel`) +} + +// ========== 设备端 API(插件调用)========== + +/** + * 获取下一个待打印任务 + */ +export function getNextJob(deviceId: string) { + return request.get('/print-device/next-job', { params: { device_id: deviceId } }) +} + +/** + * 认领打印任务 + */ +export function claimJob(jobId: number, deviceId: string) { + return request.post('/print-device/claim', { job_id: jobId, device_id: deviceId }) +} + +/** + * 标记打印完成 + */ +export function completeJob(jobId: number, deviceId: string) { + return request.post('/print-device/complete', { job_id: jobId, device_id: deviceId }) +} + +/** + * 标记打印失败 + */ +export function failJob(jobId: number, error: string, deviceId?: string) { + return request.post('/print-device/fail', { job_id: jobId, error, device_id: deviceId }) +} diff --git a/src/api/print-plugin.ts b/src/api/print-plugin.ts new file mode 100644 index 0000000..8c559ac --- /dev/null +++ b/src/api/print-plugin.ts @@ -0,0 +1,78 @@ +// 打印插件管理 API +import request from '@/utils/request' + +/** + * 获取插件列表 + */ +export function getPlugins(platform?: string) { + return request.get('/print-plugins', { params: { platform } }) +} + +/** + * 获取插件详情 + */ +export function getPlugin(code: string) { + return request.get(`/print-plugins/${code}`) +} + +/** + * 获取插件最新版本 + */ +export function getLatestVersion(code: string) { + return request.get(`/print-plugins/${code}/version`) +} + +/** + * 下载插件 + */ +export function downloadPlugin(code: string) { + return request.get(`/print-plugins/${code}/download`, { responseType: 'blob' }) +} + +/** + * 获取用户已安装插件 + */ +export function getInstallations() { + return request.get('/print-plugins/auth/installations') +} + +/** + * 检查插件版本 + */ +export function checkVersion(pluginCode: string, deviceId: string) { + return request.post('/print-plugins/auth/check-version', { plugin_code: pluginCode, device_id: deviceId }) +} + +/** + * 注册插件安装 + */ +export function registerPlugin(data: { + plugin_code: string + version: string + device_id: string + device_name?: string + os_version?: string +}) { + return request.post('/print-plugins/auth/register', data) +} + +/** + * 发送心跳 + */ +export function sendHeartbeat(deviceId: string) { + return request.post('/print-plugins/auth/heartbeat', { device_id: deviceId }) +} + +/** + * 卸载插件 + */ +export function uninstall(pluginCode: string, deviceId: string) { + return request.post('/print-plugins/auth/uninstall', { plugin_code: pluginCode, device_id: deviceId }) +} + +/** + * 获取设备状态 + */ +export function getDeviceStatus(deviceId: string) { + return request.get(`/print-plugins/auth/device/${deviceId}/status`) +} diff --git a/src/api/print.ts b/src/api/print.ts new file mode 100644 index 0000000..08e43e3 --- /dev/null +++ b/src/api/print.ts @@ -0,0 +1,414 @@ +import request from '@/utils/request' + +export interface OrderItem { + id: number + shortId: string + platformOrderSn: string + shopName: string + platformName: string + createTime: string + receiverName: string + receiverPhone: string + receiverAddress: string + goodsAmount: string + erpStatus: number + isBindErp: boolean + platformGoodsName: string + erpGoodsName: string + platformSku: string + erpSku: string + goodsName: string + bindStatusText: string + warehouseName?: string + warehouseType?: string + expressName?: string + expressId?: string + items?: any[] + printResult?: number + printLogs?: any[] + printError?: string + expressNo?: string +} + +export interface PrintBatchItem { + id: number + batchNo: string + printTime: string + printUserId: number + printUserName: string + orderCount: number + status: number // 0:打印中,1:成功,2:部分成功,3:失败 + remark: string + createdAt: string +} + +export interface PrintBatchDetail extends PrintBatchItem { + orders: Array +} + +export interface CreateBatchParams { + orderIds: number[] + orders: Array + remark?: string + printUserId: number + printUserName: string +} + +export interface BatchListParams { + batchNo?: string + startDate?: string + endDate?: string + printUser?: string + status?: number + currentPage: number + pageSize: number +} + +export interface ApiResponse { + code: number + data: T + message?: string +} + +export interface ExpressItem { + id: string + name: string + code: string +} + +export interface TemplateItem { + id: string + name: string + expressId: string +} + +export interface PrinterStatus { + type: 'idle' | 'printing' | 'error' + errorCode?: string + message?: string +} + +export interface ExpressBalance { + expressId: string + expressName: string + platform: string + balance: number + warningThreshold?: number + status: 'normal' | 'low' | 'empty' + message?: string +} + +// 模拟数据 +const mockExpressList: ExpressItem[] = [ + { id: '1', name: '顺丰速运', code: 'SF' }, + { id: '2', name: '中通快递', code: 'ZTO' }, + { id: '3', name: '圆通速递', code: 'YTO' }, + { id: '4', name: '韵达快递', code: 'YD' } +] + +const mockTemplateList: TemplateItem[] = [ + { id: '101', name: '标准模板', expressId: '1' }, + { id: '102', name: '生鲜模板', expressId: '1' }, + { id: '201', name: '标准模板', expressId: '2' }, + { id: '301', name: '标准模板', expressId: '3' } +] + +const PRINT_BATCH_STORAGE_KEY = 'print_batches' + +// 从 localStorage 加载批次 +const loadPrintBatches = (): PrintBatchDetail[] => { + const stored = localStorage.getItem(PRINT_BATCH_STORAGE_KEY) + if (stored) { + try { + return JSON.parse(stored) + } catch (e) { + console.error('解析打印批次失败', e) + return [] + } + } + return [] +} + +export function getPrintBatches(params: BatchListParams): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + let list: PrintBatchItem[] = loadPrintBatches() + if (params.batchNo) { + list = list.filter(b => b.batchNo.includes(params.batchNo)) + } + if (params.startDate && params.endDate) { + list = list.filter(b => b.printTime >= params.startDate && b.printTime <= params.endDate) + } + if (params.printUser) { + list = list.filter(b => b.printUserName === params.printUser) + } + if (params.status !== undefined) { + list = list.filter(b => b.status === params.status) + } + list.sort((a, b) => new Date(b.printTime).getTime() - new Date(a.printTime).getTime()) + const total = list.length + const start = (params.currentPage - 1) * params.pageSize + const end = start + params.pageSize + list = list.slice(start, end) + resolve({ code: 200, data: { list, total } }) + }, 300) + }) +} + +export function getPrintBatchDetail(id: string | number): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + const batches = loadPrintBatches() + const batch = batches.find(b => b.id === Number(id)) + if (!batch) { + // 动态生成模拟数据 + const fakeBatch: PrintBatchDetail = { + id: Number(id), + batchNo: `PRT${String(id).padStart(12, '0')}`, + printTime: new Date().toLocaleString(), + printUserId: 1001, + printUserName: 'admin', + orderCount: 3, + status: 1, + remark: '动态生成的模拟批次(原批次不存在)', + createdAt: new Date().toLocaleString(), + orders: [ + { + id: 1, + shortId: 'S001', + platformOrderSn: 'PDD123456', + shopName: '拼多多专营店', + platformName: '拼多多', + createTime: '2025-03-08 09:00:00', + receiverName: '张三', + receiverPhone: '13800138001', + receiverAddress: '北京市朝阳区xx路1号', + goodsAmount: '100.00', + erpStatus: 1, + isBindErp: true, + platformGoodsName: '商品A', + erpGoodsName: '商品A', + platformSku: 'SKU-A', + erpSku: 'SKU-A', + goodsName: '商品A', + bindStatusText: '已绑定', + warehouseName: '主仓', + warehouseType: 'erp', + expressName: '顺丰速运', + expressId: '1', + printSuccess: true, + expressNo: 'SF1234567890' + } + ] + } + resolve({ code: 200, data: fakeBatch, message: '批次不存在,已返回模拟数据' }) + return + } + resolve({ code: 200, data: batch }) + }, 300) + }) +} + +export function reprintBatch(id: number): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ code: 200, data: null, message: '重新打印任务已提交' }) + }, 300) + }) +} + +export function createPrintBatch(data: CreateBatchParams): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + const batches = loadPrintBatches() + const successCount = data.orders.filter(o => o.printSuccess).length + let status: number + if (successCount === data.orders.length) status = 1 + else if (successCount > 0) status = 2 + else status = 3 + + const newBatch: PrintBatchDetail = { + id: Date.now(), + batchNo: `PRT${new Date().toISOString().slice(0,10).replace(/-/g,'')}${String(Math.floor(Math.random()*10000)).padStart(6,'0')}`, + printTime: new Date().toLocaleString(), + printUserId: data.printUserId, + printUserName: data.printUserName, + orderCount: data.orders.length, + status, + remark: data.remark || '', + createdAt: new Date().toLocaleString(), + orders: data.orders.map(order => ({ ...order })) + } + batches.unshift(newBatch) + localStorage.setItem(PRINT_BATCH_STORAGE_KEY, JSON.stringify(batches)) + resolve({ code: 200, data: newBatch }) + }, 300) + }) +} + +export function getExpressList(): Promise> { + return new Promise((resolve) => { + setTimeout(() => resolve({ code: 200, data: mockExpressList }), 200) + }) +} + +export function getTemplateList(expressId?: string): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + let list = mockTemplateList + if (expressId) list = list.filter(t => t.expressId === expressId) + resolve({ code: 200, data: list }) + }, 200) + }) +} + +export function generateWaybill(params: any): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + const express = mockExpressList.find(e => e.id === params.expressId) + const template = mockTemplateList.find(t => t.id === params.templateId) + const html = ` + + + 电子面单 + + + +
+
#${params.seq || 'N/A'}
+

电子面单

+
运单号:${params.expressNo || 'SF' + Date.now()}
+
快递公司:${express?.name || '未知'}
+
模板:${template?.name || '未知'}
+
订单ID:${params.orderId}
+
收件人:张三
+
地址:北京市朝阳区xx路1号
+
联系电话:13800138001
+ +
批次号:${params.batchNo || ''}
+
+ + + ` + resolve({ code: 200, data: { html } }) + }, 300) + }) +} + +export function testPrinterConnection(port: number, path: string = ''): Promise { + return Promise.resolve(true) +} + +export function queryManualPrinterStatus(port: number, path: string = ''): Promise<{ ready: boolean; error?: string }> { + return Promise.resolve({ ready: true }) +} + +export function connectManualPrinterStatus(port: number, path: string = '') {} +export function disconnectPrinterStatus() {} +export function onPrinterStatus(callback: (status: PrinterStatus) => void) { return () => {} } + +export function queryExpressBalance(expressIds?: string[]): Promise> { + return Promise.resolve({ + code: 200, + data: [ + { expressId: '1', expressName: '顺丰速运', platform: 'all', balance: 150, status: 'normal' }, + { expressId: '2', expressName: '中通快递', platform: 'pdd', balance: 35, status: 'normal' } + ] + }) +} + +export function fetchExpressNumbers(expressIds: string[]): Promise>> { + return new Promise((resolve) => { + setTimeout(() => { + const results = expressIds.map(id => { + const express = mockExpressList.find(e => e.id === id) + const name = express?.name || '未知' + const success = Math.random() > 0.3 + let message = '' + if (!success) { + const reasons = ['面单余额不足,请联系快递充值', '该区域不可达,请更换快递', '快递接口异常', '请稍后重试'] + message = reasons[Math.floor(Math.random() * reasons.length)] + } + return { expressId: id, expressName: name, success, message } + }) + resolve({ code: 200, data: results }) + }, 800) + }) +} + +// 获取所有订单打印记录(扁平化) +export function getOrderPrintLogs(params: any): Promise> { + return new Promise((resolve) => { + setTimeout(() => { + const batches = loadPrintBatches() + let orders: any[] = [] + batches.forEach(batch => { + if (batch.orders && Array.isArray(batch.orders)) { + batch.orders.forEach(order => { + orders.push({ + ...order, + batchId: batch.id, + batchNo: batch.batchNo, + batchPrintTime: batch.printTime, + batchStatus: batch.status + }) + }) + } + }) + // 如果没有订单数据,返回模拟数据以便测试 + if (orders.length === 0) { + orders = [ + { + id: 1001, + shortId: 'S001', + platformOrderSn: 'PDD123456789', + batchId: 999, + batchNo: 'PRT202603090001', + batchPrintTime: '2026-03-09 14:30:00', + receiverName: '张三', + goodsAmount: '199.00', + expressName: '顺丰速运', + expressId: '1', + expressNo: 'SF1234567890', + printSuccess: true, + errorMsg: undefined + }, + { + id: 1002, + shortId: 'S002', + platformOrderSn: 'JD987654321', + batchId: 999, + batchNo: 'PRT202603090001', + batchPrintTime: '2026-03-09 14:30:00', + receiverName: '李四', + goodsAmount: '299.00', + expressName: '中通快递', + expressId: '2', + expressNo: 'ZTO987654321', + printSuccess: false, + errorMsg: '面单余额不足' + } + ] + } + // 按打印时间倒序 + orders.sort((a, b) => new Date(b.batchPrintTime).getTime() - new Date(a.batchPrintTime).getTime()) + const total = orders.length + // 处理分页参数 + const currentPage = params.currentPage || 1 + const pageSize = params.pageSize || 10 + const start = (currentPage - 1) * pageSize + const end = start + pageSize + const list = orders.slice(start, end) + resolve({ code: 200, data: { list, total } }) + }, 300) + }) +} \ No newline at end of file diff --git a/src/api/purchase.ts b/src/api/purchase.ts new file mode 100644 index 0000000..fbe8cb5 --- /dev/null +++ b/src/api/purchase.ts @@ -0,0 +1,172 @@ +import request from '@/utils/request' + +// ==================== 类型定义 ==================== + +/** 采购单状态 */ +export type PurchaseOrderStatus = 'draft' | 'pending_review' | 'approved' | 'rejected' | 'pushed' | 'cancelled' + +/** 采购单商品项 */ +export interface PurchaseOrderItem { + id?: string + skuCode: string + skuName?: string + quantity: number + unitPrice?: number + totalPrice?: number + receivedQuantity?: number +} + +/** 采购单 */ +export interface PurchaseOrder { + id?: string + orderNo?: string + supplierId: string + supplierName?: string + warehouseId: string + warehouseName?: string + status: PurchaseOrderStatus + totalAmount?: number + remark?: string + items: PurchaseOrderItem[] + createTime?: string + updateTime?: string + reviewer?: string + reviewTime?: string + reviewComment?: string + cloudPushTime?: string +} + +/** 采购单列表查询参数 */ +export interface PurchaseListParams { + page?: number + pageSize?: number + status?: PurchaseOrderStatus + supplierId?: string + warehouseId?: string + keyword?: string + startDate?: string + endDate?: string +} + +/** 创建采购单请求 */ +export interface CreatePurchaseOrderDto { + supplierId: string + warehouseId: string + remark?: string + items: PurchaseOrderItem[] +} + +/** 更新采购单请求 */ +export interface UpdatePurchaseOrderDto { + supplierId?: string + warehouseId?: string + remark?: string + items?: PurchaseOrderItem[] +} + +// ==================== API 函数 ==================== + +/** + * 获取采购单列表 + * @param params 查询参数 + */ +export function getPurchaseList(params?: PurchaseListParams) { + return request.get('/purchase-orders', { params }) +} + +/** + * 获取采购单详情 + * @param id 采购单ID + */ +export function getPurchaseDetail(id: string) { + return request.get(`/purchase-orders/${id}`) +} + +/** + * 创建采购单 + * @param data 采购单数据 + */ +export function createPurchaseOrder(data: CreatePurchaseOrderDto) { + return request.post('/purchase-orders', data) +} + +/** + * 更新采购单 + * @param id 采购单ID + * @param data 更新数据 + */ +export function updatePurchaseOrder(id: string, data: UpdatePurchaseOrderDto) { + return request.put(`/purchase-orders/${id}`, data) +} + +/** + * 提交采购单审核 + * @param id 采购单ID + */ +export function submitPurchaseReview(id: string) { + return request.post(`/purchase-orders/${id}/submit-review`) +} + +/** + * 审核通过采购单 + * @param id 采购单ID + */ +export function approvePurchaseOrder(id: string) { + return request.post(`/purchase-orders/${id}/approve`) +} + +/** + * 驳回采购单 + * @param id 采购单ID + * @param comment 驳回原因 + */ +export function rejectPurchaseOrder(id: string, comment: string) { + return request.post(`/purchase-orders/${id}/reject`, { comment }) +} + +/** + * 推送采购单到云仓 + * @param id 采购单ID + */ +export function pushPurchaseToCloud(id: string) { + return request.post(`/purchase-orders/${id}/push-cloud`) +} + +/** + * 取消推送采购单 + * @param id 采购单ID + */ +export function cancelPushPurchase(id: string) { + return request.post(`/purchase-orders/${id}/cancel-push`) +} + +// 别名兼容 +export const approvePurchase = approvePurchaseOrder +export const rejectPurchase = rejectPurchaseOrder +export const submitReview = submitPurchaseReview +export const createPurchase = createPurchaseOrder +export const updatePurchase = updatePurchaseOrder +export const getPurchase = getPurchaseDetail + +/** + * 删除采购单 + */ +export function deletePurchase(id: string) { + return request.delete(`/purchase-orders/${id}`) +} + +/** + * 创建草稿采购单 + */ +export function createDraftPurchase(data: any) { + return Promise.resolve({ code: 200, message: '功能开发中', data: null }) +} + +// ==================== 响应类型 ==================== + +export interface PurchaseListResponse { + list: PurchaseOrder[] + total: number + page: number + pageSize: number +} diff --git a/src/api/receiving.ts b/src/api/receiving.ts new file mode 100644 index 0000000..3f37617 --- /dev/null +++ b/src/api/receiving.ts @@ -0,0 +1,116 @@ +import request from '@/utils/request' + +// ==================== 类型定义 ==================== + +/** 收货单状态 */ +export type ReceivingOrderStatus = 'pending' | 'partial' | 'completed' | 'cancelled' + +/** 收货单商品项 */ +export interface ReceivingOrderItem { + id?: string + skuCode: string + skuName?: string + expectedQuantity: number + receivedQuantity: number +} + +/** 收货单 */ +export interface ReceivingOrder { + id?: string + orderNo?: string + purchaseOrderId?: string + purchaseOrderNo?: string + warehouseId: string + warehouseName?: string + supplierId?: string + supplierName?: string + status: ReceivingOrderStatus + totalAmount?: number + remark?: string + items: ReceivingOrderItem[] + createTime?: string + updateTime?: string + receiver?: string + receiveTime?: string +} + +/** 收货单列表查询参数 */ +export interface ReceivingListParams { + page?: number + pageSize?: number + status?: ReceivingOrderStatus + purchaseOrderId?: string + warehouseId?: string + keyword?: string + startDate?: string + endDate?: string +} + +/** 创建收货单请求 */ +export interface CreateReceivingOrderDto { + purchaseOrderId: string + warehouseId: string + remark?: string +} + +/** 更新收货单请求 */ +export interface UpdateReceivingOrderDto { + remark?: string + items?: ReceivingOrderItem[] +} + +// ==================== API 函数 ==================== + +/** + * 获取收货单列表 + * @param params 查询参数 + */ +export function getReceivingList(params?: ReceivingListParams) { + return request.get('/receiving-orders', { params }) +} + +/** + * 获取收货单详情 + * @param id 收货单ID + */ +export function getReceivingDetail(id: string) { + return request.get(`/receiving-orders/${id}`) +} + +/** + * 创建收货单 + * @param data 收货单数据 + */ +export function createReceivingOrder(data: CreateReceivingOrderDto) { + return request.post('/receiving-orders', data) +} + +/** + * 更新收货单 + * @param id 收货单ID + * @param data 更新数据 + */ +export function updateReceivingOrder(id: string, data: UpdateReceivingOrderDto) { + return request.put(`/receiving-orders/${id}`, data) +} + +/** + * 确认收货 + */ +export function receive(data: { + receivingId: string + items: { skuCode: string; receivedQuantity: number }[] + receiver?: string + remark?: string +}) { + return request.post('/receiving-orders/receive', data) +} + +// ==================== 响应类型 ==================== + +export interface ReceivingListResponse { + list: ReceivingOrder[] + total: number + page: number + pageSize: number +} diff --git a/src/api/role.ts b/src/api/role.ts new file mode 100644 index 0000000..8d3def9 --- /dev/null +++ b/src/api/role.ts @@ -0,0 +1,64 @@ +import request from '@/utils/request' + +/** + * 获取角色列表 + */ +export function getRoleList() { + return request.get('/roles') +} + +/** + * 获取角色详情 + */ +export function getRoleDetail(id: string) { + return request.get(`/roles/${id}`) +} + +/** + * 创建角色 + */ +export function createRole(data: any) { + return request.post('/roles', data) +} + +/** + * 更新角色 + */ +export function updateRole(id: string, data: any) { + return request.put(`/roles/${id}`, data) +} + +/** + * 删除角色 + */ +export function deleteRole(id: string) { + return request.delete(`/roles/${id}`) +} + +/** + * 获取角色权限 + */ +export function getRolePermissions(id: string) { + return request.get(`/roles/${id}/permissions`) +} + +/** + * 分配角色权限 + */ +export function assignRolePermissions(id: string, permissions: string[]) { + return request.put(`/roles/${id}/permissions`, { permissions }) +} + +/** + * 获取权限列表 + */ +export function getPermissionList() { + return request.get('/permissions') +} + +/** + * 获取权限分组 + */ +export function getPermissionGroups() { + return request.get('/permissions/groups') +} diff --git a/src/api/rule.ts b/src/api/rule.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/shop.ts b/src/api/shop.ts new file mode 100644 index 0000000..895f0f8 --- /dev/null +++ b/src/api/shop.ts @@ -0,0 +1,93 @@ +// src/api/shop.ts +import request from '@/utils/request' + +/** + * 店铺数据 + */ +export interface Shop { + id?: number + name: string + platform_id?: number + platform_name?: string + shop_id?: string + app_key?: string + app_secret?: string + access_token?: string + refresh_token?: string + token_expires_at?: string + status?: number + created_at?: string + updated_at?: string + [key: string]: any +} + +/** + * 获取平台列表(店铺绑定用) + */ +export function getShopList(params?: any) { + return request.get('/shops/platforms', { params }) +} + +/** + * 获取店铺详情 + */ +export function getShopDetail(id: number) { + return request.get(`/shops/${id}`) +} + +/** + * 获取授权URL + */ +export function getAuthUrl(platformId: number) { + return request.post('/shops/auth-url', { platform_id: platformId }) +} + +/** + * 刷新店铺Token + */ +export function refreshShopToken(id: number) { + return request.post(`/shops/${id}/refresh`) +} + +/** + * 删除店铺 + */ +export function deleteShop(id: number) { + return request.delete(`/shops/${id}`) +} + +/** + * 获取所有店铺 + */ +export function getAllShops() { + return request.get('/shops/all') +} + +/** + * 获取平台授权URL + */ +export function getPlatformAuthUrl(platformId: number) { + return getAuthUrl(platformId) +} + +/** + * 获取平台配置 + */ +export function getPlatformConfig(platformId: number) { + return Promise.resolve({ + code: 200, + message: '功能开发中', + data: null + }) +} + +/** + * 处理授权回调 + */ +export function handleAuthCallback(code: string) { + return Promise.resolve({ + code: 200, + message: '功能开发中', + data: null + }) +} diff --git a/src/api/stock.ts b/src/api/stock.ts new file mode 100644 index 0000000..b0cc5e5 --- /dev/null +++ b/src/api/stock.ts @@ -0,0 +1,182 @@ +// src/api/stock.ts +import request from '@/utils/request' + +// ============ 类型定义 ============ + +/** 库存记录 - 对应后端返回字段(snake_case) */ +export interface Stock { + id: number + sku_code: string + sku_name: string + warehouse_id: number + warehouse_name: string + quantity: number + locked_quantity: number + available_quantity: number + defective_quantity: number + warning_threshold: number + is_low: boolean + created_at: string + updated_at: string +} + +/** 库存列表查询参数 */ +export interface StockListParams { + warehouse_id?: number + sku_code?: string + keyword?: string + low_stock?: boolean + page?: number + limit?: number +} + +/** 库存列表响应 */ +export interface StockListResponse { + list: Stock[] + total: number + current_page: number + last_page: number +} + +/** 库存操作日志 */ +export interface StockLog { + id: number + stock_id: number + type: 'inbound' | 'outbound' | 'adjust' | 'lock' | 'unlock' | 'defective_inbound' | 'defective_outbound' + quantity: number + before_quantity: number + after_quantity: number + reason?: string + operator?: string + created_at: string +} + +/** 库存详情响应 */ +export interface StockDetailResponse { + stock: Stock + logs: StockLog[] +} + +/** 库存日志查询参数 */ +export interface StockLogsParams { + stock_id?: number + sku_code?: string + warehouse_id?: number + type?: string + start_date?: string + end_date?: string + page?: number + limit?: number +} + +/** 更新阈值请求 */ +export interface UpdateThresholdData { + sku_code: string + warehouse_id: number + threshold: number +} + +/** 手动入库请求 */ +export interface InboundData { + sku_code: string + warehouse_id: number + quantity: number + reason?: string +} + +/** 手动出库请求 */ +export interface OutboundData { + sku_code: string + warehouse_id: number + quantity: number + reason?: string +} + +/** 不良品入库请求 */ +export interface DefectiveInboundData { + sku_code: string + warehouse_id: number + quantity: number + reason?: string +} + +/** 库存调整请求 */ +export interface AdjustData { + sku_code: string + warehouse_id: number + adjust_quantity: number + reason: string +} + +// ============ API 函数 ============ + +/** + * 获取库存列表 + * @param params 查询参数(仓库ID、SKU、关键词、低库存筛选、分页) + */ +export function getStockList(params?: StockListParams) { + return request.get('/stocks', { params }) +} + +/** + * 获取库存详情 + * @param params { sku_code, warehouse_id } + */ +export function getStockDetail(params: { sku_code: string; warehouse_id: number }) { + return request.get('/stocks/detail', { params }) +} + +/** + * 获取库存日志 + * @param params 查询参数 + */ +export function getStockLogs(params?: StockLogsParams) { + return request.get<{ list: StockLog[]; total: number }>('/stocks/logs', { params }) +} + +/** + * 更新预警阈值 + * @param data { sku_code, warehouse_id, threshold } + */ +export function updateThreshold(data: UpdateThresholdData) { + return request.put('/stocks/update-threshold', data) +} + +/** + * 手动入库 + * @param data { sku_code, warehouse_id, quantity, reason } + */ +export function inbound(data: InboundData) { + return request.post('/stocks/inbound', data) +} + +/** + * 手动出库 + * @param data { sku_code, warehouse_id, quantity, reason } + */ +export function outbound(data: OutboundData) { + return request.post('/stocks/outbound', data) +} + +/** + * 不良品入库 + * @param data { sku_code, warehouse_id, quantity, reason } + */ +export function defectiveInbound(data: DefectiveInboundData) { + return request.post('/stocks/defective-inbound', data) +} + +/** + * 库存调整 + * @param data { sku_code, warehouse_id, adjust_quantity, reason } + */ +export function adjustStock(data: AdjustData) { + return request.post('/stocks/adjust', data) +} + +/** + * 更新库存预警阈值 + */ +export function updateWarningThreshold(data: { sku_code: string; warehouse_id: number; threshold: number }) { + return request.put('/stocks/update-threshold', data) +} diff --git a/src/api/supplier.ts b/src/api/supplier.ts new file mode 100644 index 0000000..af047e0 --- /dev/null +++ b/src/api/supplier.ts @@ -0,0 +1,67 @@ +// src/api/supplier.ts +import request from '@/utils/request' + +/** + * 供应商数据类型 + */ +export interface Supplier { + id?: number + name: string + code?: string + contact?: string + phone?: string + email?: string + address?: string + status?: number + created_at?: string + updated_at?: string + [key: string]: any +} + +/** + * 获取供应商列表 + * @param params 查询参数(page, limit, name, status) + */ +export function getSupplierList(params?: any) { + return request.get('/suppliers', { params }) +} + +/** + * 获取供应商详情 + * @param id 供应商ID + */ +export function getSupplierDetail(id: number) { + return request.get(`/suppliers/${id}`) +} + +/** + * 创建供应商 + * @param data 供应商数据 + */ +export function createSupplier(data: Supplier) { + return request.post('/suppliers', data) +} + +/** + * 更新供应商 + * @param id 供应商ID + * @param data 更新数据 + */ +export function updateSupplier(id: number, data: Partial) { + return request.put(`/suppliers/${id}`, data) +} + +/** + * 删除供应商 + * @param id 供应商ID + */ +export function deleteSupplier(id: number) { + return request.delete(`/suppliers/${id}`) +} + +/** + * 获取所有供应商用于下拉选择 + */ +export function getAllSuppliers() { + return request.get('/suppliers/all') +} diff --git a/src/api/template.ts b/src/api/template.ts new file mode 100644 index 0000000..cd3acb4 --- /dev/null +++ b/src/api/template.ts @@ -0,0 +1,70 @@ +// 模板管理 API +import request from '@/utils/request' + +/** + * 模板接口定义 + */ +export interface Template { + id: string + name: string + platform: string + size: string + style: string + defaultExpress?: string + senderName: string + senderPhone: string + senderAddress: string + showProduct: boolean + remark?: string + updatedAt: string +} + +/** + * 模板列表查询参数 + */ +export interface TemplateListParams { + currentPage?: number + pageSize?: number + keyword?: string +} + +/** + * 获取模板列表 + * @param params 分页参数 + */ +export function getTemplateList(params?: TemplateListParams) { + return request.get('/templates', { params }) +} + +/** + * 获取模板详情 + * @param id 模板ID + */ +export function getTemplateDetail(id: string) { + return request.get(`/templates/${id}`) +} + +/** + * 创建模板 + * @param data 模板数据 + */ +export function createTemplate(data: Partial