From 2ad40da777c3cc01de554714cefb089d48d5c31c Mon Sep 17 00:00:00 2001 From: wurenzhi Date: Wed, 18 Mar 2026 10:19:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0DID=E6=8F=A1=E6=89=8B?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=92=8C=E5=88=9D=E5=A7=8B=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor: 重构DisputeResolverService和DIDHandshakeService fix: 修复SovereignWealthFundService中的表名错误 docs: 更新AI模块清单和任务总览文档 chore: 添加多个README文件说明项目结构 style: 优化logger日志输出格式 perf: 改进RecommendationService的性能和类型安全 test: 添加DomainBootstrap和test-domain-bootstrap测试文件 build: 配置dashboard的umi相关文件 ci: 添加GitHub工作流配置 --- .github/README.md | 34 + .prompts/README.md | 39 + .trae/README.md | 31 + README.md | 144 + dashboard/README.md | 122 + dashboard/src/.umi/appData.json | 2433 +++++++++++++++++ dashboard/src/.umi/core/EmptyRoute.tsx | 9 + dashboard/src/.umi/core/defineApp.ts | 16 + dashboard/src/.umi/core/helmet.ts | 10 + dashboard/src/.umi/core/helmetContext.ts | 4 + dashboard/src/.umi/core/history.ts | 72 + dashboard/src/.umi/core/historyIntelli.ts | 132 + dashboard/src/.umi/core/plugin.ts | 40 + dashboard/src/.umi/core/pluginConfig.ts | 324 +++ dashboard/src/.umi/core/pluginConfigJoi.d.ts | 7 + dashboard/src/.umi/core/polyfill.ts | 220 ++ dashboard/src/.umi/core/route.tsx | 72 + dashboard/src/.umi/core/routeProps.js | 5 + dashboard/src/.umi/core/routeProps.ts | 6 + dashboard/src/.umi/core/terminal.ts | 37 + dashboard/src/.umi/exports.ts | 19 + dashboard/src/.umi/testBrowser.tsx | 88 + dashboard/src/.umi/tsconfig.json | 44 + dashboard/src/.umi/typings.d.ts | 136 + dashboard/src/.umi/umi.ts | 81 + docs/00_Business/Task_Overview.md | 15 + docs/05_AI/AI_Module_List.md | 189 ++ docs1/README.md | 33 + docs11/README.md | 71 + extension/README.md | 102 + node-agent/README.md | 105 + scripts/README.md | 51 + server/README.md | 181 ++ server/src/api/routes/ai.ts | 178 -- server/src/core/ai/ImageRecognitionService.ts | 7 +- .../ai/NaturalLanguageProcessingService.ts | 6 +- server/src/core/ai/RecommendationService.ts | 17 +- .../src/core/network/DIDHandshakeService.ts | 19 + server/src/core/pipeline/CDCPipeline.ts | 9 +- server/src/core/runtime/DomainBootstrap.ts | 23 + server/src/core/runtime/DomainEventBus.ts | 24 + .../src/core/security/DIDHandshakeService.ts | 146 +- .../src/domains/Customer/CustomerService.ts | 1 + .../Finance/CommodityHedgingService.ts | 1 + .../domains/Finance/PoolSourcingService.ts | 2 +- .../Finance/SovereignWealthFundService.ts | 14 +- .../Logistics/CongestionFailoverService.ts | 2 +- .../domains/Logistics/LastMileAIService.ts | 2 +- .../Logistics/RouteOptimizerService.ts | 2 + server/src/domains/Marketing/KOLService.ts | 2 +- server/src/domains/Strategy/AdviceService.ts | 4 +- .../domains/Trade/SovereignCrisisService.ts | 4 +- server/src/index.ts | 56 +- server/src/services/AuthService.ts | 12 + server/src/services/AutoDelistService.ts | 439 +++ server/src/services/DisputeResolverService.ts | 95 +- server/src/services/DynamicPricingService.ts | 166 +- .../services/ImprovementSuggestionService.ts | 445 +++ .../src/services/ReturnRateDatabaseService.ts | 432 +++ .../src/services/ReturnRateMonitorService.ts | 265 ++ server/src/services/SupplierService.ts | 237 +- server/src/utils/logger.ts | 6 +- server/test-domain-bootstrap.ts | 6 + server/test-import.ts | 6 + 64 files changed, 6638 insertions(+), 862 deletions(-) create mode 100644 .github/README.md create mode 100644 .prompts/README.md create mode 100644 .trae/README.md create mode 100644 README.md create mode 100644 dashboard/README.md create mode 100644 dashboard/src/.umi/appData.json create mode 100644 dashboard/src/.umi/core/EmptyRoute.tsx create mode 100644 dashboard/src/.umi/core/defineApp.ts create mode 100644 dashboard/src/.umi/core/helmet.ts create mode 100644 dashboard/src/.umi/core/helmetContext.ts create mode 100644 dashboard/src/.umi/core/history.ts create mode 100644 dashboard/src/.umi/core/historyIntelli.ts create mode 100644 dashboard/src/.umi/core/plugin.ts create mode 100644 dashboard/src/.umi/core/pluginConfig.ts create mode 100644 dashboard/src/.umi/core/pluginConfigJoi.d.ts create mode 100644 dashboard/src/.umi/core/polyfill.ts create mode 100644 dashboard/src/.umi/core/route.tsx create mode 100644 dashboard/src/.umi/core/routeProps.js create mode 100644 dashboard/src/.umi/core/routeProps.ts create mode 100644 dashboard/src/.umi/core/terminal.ts create mode 100644 dashboard/src/.umi/exports.ts create mode 100644 dashboard/src/.umi/testBrowser.tsx create mode 100644 dashboard/src/.umi/tsconfig.json create mode 100644 dashboard/src/.umi/typings.d.ts create mode 100644 dashboard/src/.umi/umi.ts create mode 100644 docs/05_AI/AI_Module_List.md create mode 100644 docs1/README.md create mode 100644 docs11/README.md create mode 100644 extension/README.md create mode 100644 node-agent/README.md create mode 100644 scripts/README.md create mode 100644 server/README.md create mode 100644 server/src/core/network/DIDHandshakeService.ts create mode 100644 server/src/services/AutoDelistService.ts create mode 100644 server/src/services/ImprovementSuggestionService.ts create mode 100644 server/src/services/ReturnRateDatabaseService.ts create mode 100644 server/src/services/ReturnRateMonitorService.ts create mode 100644 server/test-domain-bootstrap.ts create mode 100644 server/test-import.ts diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..f7f52dc --- /dev/null +++ b/.github/README.md @@ -0,0 +1,34 @@ +# GitHub 配置 + +## 📋 项目简介 + +本目录包含 GitHub 相关的配置文件,主要用于 CI/CD 工作流。 + +## 🚀 核心功能 + +### 1. CI/CD 工作流 +- **文件**: `workflows/ci-cd.yml` +- **功能**: 自动化构建、测试和部署 +- **触发条件**: 代码提交到 main 分支 + +## 📁 项目结构 + +``` +.github/ +├── workflows/ # 工作流配置 +│ └── ci-cd.yml # CI/CD 配置 +└── README.md # 项目说明 +``` + +## 🔧 工作流配置 + +### CI/CD 流程 +1. **安装依赖**: 安装项目依赖 +2. **代码检查**: 运行 ESLint 和 TypeScript 类型检查 +3. **运行测试**: 执行单元测试和集成测试 +4. **构建项目**: 构建前端和后端项目 +5. **部署**: 部署到生产环境 + +## 🤝 贡献 + +欢迎贡献 GitHub 配置和提出建议!请先阅读项目文档,然后提交 Pull Request。 diff --git a/.prompts/README.md b/.prompts/README.md new file mode 100644 index 0000000..d8f1dc8 --- /dev/null +++ b/.prompts/README.md @@ -0,0 +1,39 @@ +# Prompts - 提示文件 + +## 📋 项目简介 + +本目录包含 AI 提示文件,用于指导 AI 模型生成代码和文档。 + +## 🚀 核心提示文件 + +### 1. 模型文件 +- **文件**: `V32-ThinkPad.Modelfile` +- **功能**: 定义 AI 模型的配置和行为 + +### 2. 审计提示 +- **文件**: `v32-audit.prompt` +- **功能**: 指导 AI 进行代码审计 + +### 3. 服务提示 +- **文件**: `v32-service.prompt` +- **功能**: 指导 AI 生成服务代码 + +## 📁 项目结构 + +``` +.prompts/ +├── V32-ThinkPad.Modelfile # 模型配置文件 +├── v32-audit.prompt # 审计提示文件 +├── v32-service.prompt # 服务提示文件 +└── README.md # 项目说明 +``` + +## 🔧 使用规范 + +- 提示文件应遵循清晰、具体的原则 +- 提示文件应包含足够的上下文信息 +- 提示文件应定期更新以适应项目需求 + +## 🤝 贡献 + +欢迎贡献提示文件和提出建议!请先阅读项目文档,然后提交 Pull Request。 diff --git a/.trae/README.md b/.trae/README.md new file mode 100644 index 0000000..0548a64 --- /dev/null +++ b/.trae/README.md @@ -0,0 +1,31 @@ +# Trae 配置 + +## 📋 项目简介 + +本目录包含 Trae IDE 相关的配置文件,主要用于项目特定规则的定义。 + +## 🚀 核心文件 + +### 1. 项目特定规则 +- **文件**: `rules/project-specific-rules.md` +- **功能**: 定义项目的硬性约束和配置 +- **内容**: 数据存储约束、业务规则、技术规范、安全权限等 + +## 📁 项目结构 + +``` +.trae/ +├── rules/ # 规则配置 +│ └── project-specific-rules.md # 项目特定规则 +└── README.md # 项目说明 +``` + +## 🔧 使用规范 + +- 所有代码必须遵守项目特定规则 +- 规则文件应定期更新以适应项目需求 +- 新加入项目的开发者应仔细阅读规则文件 + +## 🤝 贡献 + +欢迎贡献规则配置和提出建议!请先阅读项目文档,然后提交 Pull Request。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..2079bd9 --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +# Crawlful Hub + +## 📋 项目简介 + +Crawlful Hub 是一个全自动化的跨境电商运营平台,集成了商品管理、订单处理、物流策略、广告营销、B2B贸易等核心功能,通过AI技术实现智能决策和自动化运营。 + +## 🚀 核心功能 + +### 1. 商品管理 +- 商品刊登与管理 +- 库存同步与管理 +- 商品健康度监控 + +### 2. 订单管理 +- 多平台订单集中管理 +- 订单履约与异常处理 +- 批量订单处理 + +### 3. 物流策略 +- 智能物流渠道选择 +- 运费计算与优化 +- 物流轨迹跟踪 + +### 4. 广告营销 +- 广告计划创建与管理 +- 投放效果分析 +- ROI优化 + +### 5. B2B贸易 +- 企业报价管理 +- 批量订单处理 +- 合同管理 + +### 6. 售后逆向 +- 退货申请处理 +- 退款流程管理 +- 客户服务 + +### 7. 合规与证书管理 +- 证书管理与过期提醒 +- 合规检查 + +### 8. 用户资产 +- 资产概览 +- 积分管理 +- 会员等级 + +### 9. A/B测试与策略优化 +- 测试策略推荐 +- 自动优化算法 + +## 🏗 项目架构 + +### 技术栈 +- **前端**: React, TypeScript, UmiJS, Tailwind CSS +- **后端**: Node.js, Express, TypeScript +- **数据库**: MySQL +- **缓存**: Redis +- **消息队列**: BullMQ +- **AI**: 集成多种AI服务 + +### 模块结构 +- **dashboard**: 前端管理控制台 +- **server**: 后端服务 +- **extension**: 浏览器扩展 +- **node-agent**: 节点代理 +- **scripts**: 脚本工具 +- **docs**: 项目文档 + +## 📦 快速开始 + +### 环境要求 +- Node.js 16+ +- MySQL 8.0+ +- Redis 6.0+ + +### 安装依赖 + +```bash +# 后端依赖 +cd server +npm install + +# 前端依赖 +cd ../dashboard +npm install + +# 扩展依赖 +cd ../extension +npm install +``` + +### 数据库初始化 + +```bash +# 执行数据库初始化脚本 +mysql -u root -p < scripts/db-init.sql +``` + +### 启动服务 + +```bash +# 启动后端服务 +cd server +npm run dev + +# 启动前端服务 +cd ../dashboard +npm run dev + +# 构建扩展 +cd ../extension +npm run build +``` + +## 📚 文档 + +- **业务蓝图**: `docs/00_Business/` +- **架构设计**: `docs/01_Architecture/` +- **后端文档**: `docs/02_Backend/` +- **前端文档**: `docs/03_Frontend/` +- **插件文档**: `docs/04_Plugin/` +- **AI策略**: `docs/05_AI/` +- **测试文档**: `docs/07_Testing/` + +## 🔧 开发规范 + +### 代码规范 +- 遵循 TypeScript 最佳实践 +- 使用 ESLint 进行代码检查 +- 提交代码前运行 `npm run check` 进行类型检查 + +### 提交规范 +- 提交信息使用中文描述 +- 提交前确保代码通过测试 +- 大型功能提交前创建分支 + +## 🤝 贡献 + +欢迎贡献代码和提出建议!请先阅读项目文档,然后提交 Pull Request。 + +## 📄 许可证 + +MIT License diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 0000000..fc962d9 --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,122 @@ +# Dashboard - 前端管理控制台 + +## 📋 项目简介 + +Dashboard 是 Crawlful Hub 的前端管理控制台,提供了直观的用户界面,用于管理商品、订单、物流、广告等核心业务功能。 + +## 🚀 核心功能 + +### 1. 商品管理 +- 商品详情查看与编辑 +- 商品发布表单 +- 素材上传管理 + +### 2. 订单管理 +- 订单列表与详情 +- 订单聚合分析 +- 异常订单处理 + +### 3. 物流管理 +- 物流渠道选择 +- 物流轨迹跟踪 +- 运费计算 + +### 4. 广告管理 +- 广告计划创建与管理 +- 广告投放监控 +- ROI分析 + +### 5. B2B贸易管理 +- 企业报价管理 +- 批量订单处理 +- 合同管理 + +### 6. 售后管理 +- 退货申请处理 +- 退款流程管理 +- 客户服务 + +### 7. 合规管理 +- 证书管理 +- 合规检查 +- 证书过期提醒 + +### 8. 用户资产管理 +- 资产概览 +- 积分管理 +- 会员等级 + +### 9. A/B测试管理 +- 测试配置 +- 测试结果分析 + +## 🏗 技术栈 + +- **框架**: React + UmiJS +- **语言**: TypeScript +- **样式**: Tailwind CSS +- **状态管理**: 内置状态管理 +- **路由**: UmiJS 路由 + +## 📦 快速开始 + +### 环境要求 +- Node.js 16+ + +### 安装依赖 + +```bash +cd dashboard +npm install +``` + +### 启动开发服务器 + +```bash +npm run dev +``` + +### 构建生产版本 + +```bash +npm run build +``` + +## 📁 项目结构 + +``` +dashboard/ +├── src/ +│ ├── pages/ # 页面组件 +│ │ ├── ABTest/ # A/B测试相关页面 +│ │ ├── Ad/ # 广告管理相关页面 +│ │ ├── AfterSales/ # 售后管理相关页面 +│ │ ├── Auth/ # 认证相关页面 +│ │ ├── B2B/ # B2B贸易相关页面 +│ │ ├── B2BTrade/ # B2B贸易相关页面 +│ │ ├── Compliance/ # 合规管理相关页面 +│ │ ├── Logistics/ # 物流管理相关页面 +│ │ ├── Orders/ # 订单管理相关页面 +│ │ ├── Product/ # 商品管理相关页面 +│ │ └── UserAsset/ # 用户资产管理相关页面 +├── package.json # 项目配置 +├── tsconfig.json # TypeScript 配置 +└── README.md # 项目说明 +``` + +## 🔧 开发规范 + +### 代码规范 +- 遵循 TypeScript 最佳实践 +- 使用 ESLint 进行代码检查 +- 组件命名使用 PascalCase +- 文件命名使用 PascalCase + +### 提交规范 +- 提交信息使用中文描述 +- 提交前确保代码通过测试 +- 大型功能提交前创建分支 + +## 🤝 贡献 + +欢迎贡献代码和提出建议!请先阅读项目文档,然后提交 Pull Request。 diff --git a/dashboard/src/.umi/appData.json b/dashboard/src/.umi/appData.json new file mode 100644 index 0000000..b7e8fd2 --- /dev/null +++ b/dashboard/src/.umi/appData.json @@ -0,0 +1,2433 @@ +{ + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "pkg": { + "name": "dashboard", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "umi dev", + "build": "umi build", + "postinstall": "umi setup", + "setup": "umi setup", + "start": "npm run dev" + }, + "dependencies": { + "@ant-design/icons": "^5.2.6", + "@antv/g6": "^5.0.51", + "@antv/l7": "^2.25.2", + "@antv/l7-react": "^2.4.3", + "antd": "^5.12.2", + "axios": "^1.6.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "umi": "^4.0.0" + }, + "devDependencies": { + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "typescript": "^5.0.0" + } + }, + "pkgPath": "D:\\trae_projects\\makemd\\makemd\\dashboard\\package.json", + "plugins": { + "./node_modules/@umijs/core/dist/service/servicePlugin": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "preset", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/core/dist/service/servicePlugin.js", + "id": "./node_modules/@umijs/core/dist/service/servicePlugin", + "key": "servicePlugin", + "config": {}, + "time": { + "hooks": {}, + "register": 3 + }, + "enableBy": "register" + }, + "@umijs/preset-umi": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "preset", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/index.js", + "id": "@umijs/preset-umi", + "key": "umi", + "config": {}, + "time": { + "hooks": {}, + "register": 19 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/registerMethods": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/registerMethods.js", + "id": "./node_modules/@umijs/preset-umi/dist/registerMethods", + "key": "registerMethods", + "config": {}, + "time": { + "hooks": { + "onStart": [ + 0 + ] + }, + "register": 8 + }, + "enableBy": "register" + }, + "@umijs/did-you-know": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/did-you-know/dist/plugin.js", + "id": "@umijs/did-you-know", + "key": "umijsDidYouKnow", + "config": {}, + "time": { + "hooks": { + "onStart": [ + 6 + ] + }, + "register": 7 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/404/404": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/404/404.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/404/404", + "key": "404", + "config": {}, + "time": { + "hooks": { + "modifyRoutes": [ + 0 + ] + }, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/aiDev/aiDev": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/aiDev/aiDev.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/aiDev/aiDev", + "key": "aiDev", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/appData/appData": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/appData/appData.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/appData/appData", + "key": "appData", + "config": {}, + "time": { + "hooks": { + "modifyAppData": [ + 265 + ] + }, + "register": 42 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/appData/umiInfo": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/appData/umiInfo.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/appData/umiInfo", + "key": "umiInfo", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/check/check": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/check/check.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/check/check", + "key": "check", + "config": {}, + "time": { + "hooks": { + "onCheckConfig": [ + 0 + ], + "onCheck": [ + 1 + ] + }, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/check/babel722": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/check/babel722.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/check/babel722", + "key": "babel722", + "config": {}, + "time": { + "hooks": { + "onCheck": [ + 0 + ] + }, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/codeSplitting/codeSplitting": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/codeSplitting/codeSplitting.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/codeSplitting/codeSplitting", + "key": "codeSplitting", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/configPlugins/configPlugins": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/configPlugins/configPlugins.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/configPlugins/configPlugins", + "key": "configPlugins", + "config": {}, + "time": { + "hooks": { + "modifyConfig": [ + 0 + ] + }, + "register": 18 + }, + "enableBy": "register" + }, + "virtual: config-title": { + "id": "virtual: config-title", + "key": "title", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-styles": { + "id": "virtual: config-styles", + "key": "styles", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-scripts": { + "id": "virtual: config-scripts", + "key": "scripts", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-routes": { + "id": "virtual: config-routes", + "key": "routes", + "config": { + "onChange": "regenerateTmpFiles" + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-routeLoader": { + "id": "virtual: config-routeLoader", + "key": "routeLoader", + "config": { + "default": { + "moduleType": "esm" + } + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-reactRouter5Compat": { + "id": "virtual: config-reactRouter5Compat", + "key": "reactRouter5Compat", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-presets": { + "id": "virtual: config-presets", + "key": "presets", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-plugins": { + "id": "virtual: config-plugins", + "key": "plugins", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-npmClient": { + "id": "virtual: config-npmClient", + "key": "npmClient", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-mountElementId": { + "id": "virtual: config-mountElementId", + "key": "mountElementId", + "config": { + "default": "root" + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-metas": { + "id": "virtual: config-metas", + "key": "metas", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-links": { + "id": "virtual: config-links", + "key": "links", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-historyWithQuery": { + "id": "virtual: config-historyWithQuery", + "key": "historyWithQuery", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-history": { + "id": "virtual: config-history", + "key": "history", + "config": { + "default": { + "type": "browser" + } + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-headScripts": { + "id": "virtual: config-headScripts", + "key": "headScripts", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-esbuildMinifyIIFE": { + "id": "virtual: config-esbuildMinifyIIFE", + "key": "esbuildMinifyIIFE", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-conventionRoutes": { + "id": "virtual: config-conventionRoutes", + "key": "conventionRoutes", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-conventionLayout": { + "id": "virtual: config-conventionLayout", + "key": "conventionLayout", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-base": { + "id": "virtual: config-base", + "key": "base", + "config": { + "default": "/" + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-analyze": { + "id": "virtual: config-analyze", + "key": "analyze", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-writeToDisk": { + "id": "virtual: config-writeToDisk", + "key": "writeToDisk", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-transformRuntime": { + "id": "virtual: config-transformRuntime", + "key": "transformRuntime", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-theme": { + "id": "virtual: config-theme", + "key": "theme", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-targets": { + "id": "virtual: config-targets", + "key": "targets", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-svgr": { + "id": "virtual: config-svgr", + "key": "svgr", + "config": { + "default": {} + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-svgo": { + "id": "virtual: config-svgo", + "key": "svgo", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-stylusLoader": { + "id": "virtual: config-stylusLoader", + "key": "stylusLoader", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-styleLoader": { + "id": "virtual: config-styleLoader", + "key": "styleLoader", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-srcTranspilerOptions": { + "id": "virtual: config-srcTranspilerOptions", + "key": "srcTranspilerOptions", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-srcTranspiler": { + "id": "virtual: config-srcTranspiler", + "key": "srcTranspiler", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-sassLoader": { + "id": "virtual: config-sassLoader", + "key": "sassLoader", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-runtimePublicPath": { + "id": "virtual: config-runtimePublicPath", + "key": "runtimePublicPath", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-purgeCSS": { + "id": "virtual: config-purgeCSS", + "key": "purgeCSS", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-publicPath": { + "id": "virtual: config-publicPath", + "key": "publicPath", + "config": { + "default": "/" + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-proxy": { + "id": "virtual: config-proxy", + "key": "proxy", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-postcssLoader": { + "id": "virtual: config-postcssLoader", + "key": "postcssLoader", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-outputPath": { + "id": "virtual: config-outputPath", + "key": "outputPath", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-normalCSSLoaderModules": { + "id": "virtual: config-normalCSSLoaderModules", + "key": "normalCSSLoaderModules", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-mfsu": { + "id": "virtual: config-mfsu", + "key": "mfsu", + "config": { + "default": { + "strategy": "eager" + } + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-mdx": { + "id": "virtual: config-mdx", + "key": "mdx", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-manifest": { + "id": "virtual: config-manifest", + "key": "manifest", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-lessLoader": { + "id": "virtual: config-lessLoader", + "key": "lessLoader", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-jsMinifierOptions": { + "id": "virtual: config-jsMinifierOptions", + "key": "jsMinifierOptions", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-jsMinifier": { + "id": "virtual: config-jsMinifier", + "key": "jsMinifier", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-inlineLimit": { + "id": "virtual: config-inlineLimit", + "key": "inlineLimit", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-ignoreMomentLocale": { + "id": "virtual: config-ignoreMomentLocale", + "key": "ignoreMomentLocale", + "config": { + "default": true + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-https": { + "id": "virtual: config-https", + "key": "https", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-hash": { + "id": "virtual: config-hash", + "key": "hash", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-forkTSChecker": { + "id": "virtual: config-forkTSChecker", + "key": "forkTSChecker", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-fastRefresh": { + "id": "virtual: config-fastRefresh", + "key": "fastRefresh", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-extraPostCSSPlugins": { + "id": "virtual: config-extraPostCSSPlugins", + "key": "extraPostCSSPlugins", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-extraBabelPresets": { + "id": "virtual: config-extraBabelPresets", + "key": "extraBabelPresets", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-extraBabelPlugins": { + "id": "virtual: config-extraBabelPlugins", + "key": "extraBabelPlugins", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-extraBabelIncludes": { + "id": "virtual: config-extraBabelIncludes", + "key": "extraBabelIncludes", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-externals": { + "id": "virtual: config-externals", + "key": "externals", + "config": { + "default": {} + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-esm": { + "id": "virtual: config-esm", + "key": "esm", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-devtool": { + "id": "virtual: config-devtool", + "key": "devtool", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-depTranspiler": { + "id": "virtual: config-depTranspiler", + "key": "depTranspiler", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-define": { + "id": "virtual: config-define", + "key": "define", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-deadCode": { + "id": "virtual: config-deadCode", + "key": "deadCode", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-cssPublicPath": { + "id": "virtual: config-cssPublicPath", + "key": "cssPublicPath", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-cssMinifierOptions": { + "id": "virtual: config-cssMinifierOptions", + "key": "cssMinifierOptions", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-cssMinifier": { + "id": "virtual: config-cssMinifier", + "key": "cssMinifier", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-cssLoaderModules": { + "id": "virtual: config-cssLoaderModules", + "key": "cssLoaderModules", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-cssLoader": { + "id": "virtual: config-cssLoader", + "key": "cssLoader", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-copy": { + "id": "virtual: config-copy", + "key": "copy", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-checkDepCssModules": { + "id": "virtual: config-checkDepCssModules", + "key": "checkDepCssModules", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-chainWebpack": { + "id": "virtual: config-chainWebpack", + "key": "chainWebpack", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-cacheDirectoryPath": { + "id": "virtual: config-cacheDirectoryPath", + "key": "cacheDirectoryPath", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-babelLoaderCustomize": { + "id": "virtual: config-babelLoaderCustomize", + "key": "babelLoaderCustomize", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-autoprefixer": { + "id": "virtual: config-autoprefixer", + "key": "autoprefixer", + "config": {}, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-autoCSSModules": { + "id": "virtual: config-autoCSSModules", + "key": "autoCSSModules", + "config": { + "default": true + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "virtual: config-alias": { + "id": "virtual: config-alias", + "key": "alias", + "config": { + "default": { + "umi": "@@/exports", + "react": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react", + "react-dom": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react-dom", + "react-router": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react-router", + "react-router-dom": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react-router-dom" + } + }, + "type": "plugin", + "enableBy": "register", + "time": { + "hooks": {}, + "register": 0 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/crossorigin/crossorigin": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/crossorigin/crossorigin.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/crossorigin/crossorigin", + "key": "crossorigin", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/depsOnDemand/depsOnDemand": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/depsOnDemand/depsOnDemand.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/depsOnDemand/depsOnDemand", + "key": "depsOnDemand", + "config": {}, + "time": { + "hooks": { + "onStart": [ + 1 + ] + }, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/devTool/devTool": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/devTool/devTool.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/devTool/devTool", + "key": "devTool", + "config": {}, + "time": { + "hooks": {}, + "register": 6 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/esbuildHelperChecker/esbuildHelperChecker": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/esbuildHelperChecker/esbuildHelperChecker.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/esbuildHelperChecker/esbuildHelperChecker", + "key": "esbuildHelperChecker", + "config": {}, + "time": { + "hooks": {}, + "register": 289 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/esmi/esmi": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/esmi/esmi.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/esmi/esmi", + "key": "esmi", + "config": {}, + "time": { + "hooks": {}, + "register": 109 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/exportStatic/exportStatic": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/exportStatic/exportStatic.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/exportStatic/exportStatic", + "key": "exportStatic", + "config": {}, + "time": { + "hooks": {}, + "register": 48 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/favicons/favicons": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/favicons/favicons.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/favicons/favicons", + "key": "favicons", + "config": {}, + "time": { + "hooks": { + "modifyAppData": [ + 0 + ] + }, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/helmet/helmet": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/helmet/helmet.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/helmet/helmet", + "key": "helmet", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/icons/icons": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/icons/icons.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/icons/icons", + "key": "icons", + "config": {}, + "time": { + "hooks": {}, + "register": 6 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/mock/mock": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/mock/mock.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/mock/mock", + "key": "mock", + "config": {}, + "time": { + "hooks": { + "onStart": [ + 2 + ] + }, + "register": 49 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/mpa/mpa": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/mpa/mpa.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/mpa/mpa", + "key": "mpa", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/okam/okam": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/okam/okam.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/okam/okam", + "key": "okam", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/overrides/overrides": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/overrides/overrides.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/overrides/overrides", + "key": "overrides", + "config": {}, + "time": { + "hooks": {}, + "register": 0 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/phantomDependency/phantomDependency": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/phantomDependency/phantomDependency.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/phantomDependency/phantomDependency", + "key": "phantomDependency", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/polyfill/polyfill": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/polyfill/polyfill.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/polyfill/polyfill", + "key": "polyfill", + "config": {}, + "time": { + "hooks": { + "modifyConfig": [ + 1 + ] + }, + "register": 4 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/polyfill/publicPathPolyfill": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/polyfill/publicPathPolyfill.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/polyfill/publicPathPolyfill", + "key": "publicPathPolyfill", + "config": {}, + "time": { + "hooks": {}, + "register": 0 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/prepare/prepare": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/prepare/prepare.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/prepare/prepare", + "key": "prepare", + "config": {}, + "time": { + "hooks": {}, + "register": 3 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/routePrefetch/routePrefetch": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/routePrefetch/routePrefetch.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/routePrefetch/routePrefetch", + "key": "routePrefetch", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/stagewise/stagewise": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/stagewise/stagewise.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/stagewise/stagewise", + "key": "stagewise", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/terminal/terminal": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/terminal/terminal.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/terminal/terminal", + "key": "terminal", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/tmpFiles/tmpFiles": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/tmpFiles/tmpFiles.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/tmpFiles/tmpFiles", + "key": "tmpFiles", + "config": {}, + "time": { + "hooks": {}, + "register": 16 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/clientLoader/clientLoader": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/clientLoader/clientLoader.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/clientLoader/clientLoader", + "key": "clientLoader", + "config": {}, + "time": { + "hooks": {}, + "register": 5 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/routeProps/routeProps": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/routeProps/routeProps.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/routeProps/routeProps", + "key": "routeProps", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/ssr/ssr": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/ssr/ssr.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/ssr/ssr", + "key": "ssr", + "config": {}, + "time": { + "hooks": {}, + "register": 5 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/tmpFiles/configTypes": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/tmpFiles/configTypes.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/tmpFiles/configTypes", + "key": "configTypes", + "config": {}, + "time": { + "hooks": {}, + "register": 6 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/transform/transform": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/transform/transform.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/transform/transform", + "key": "transform", + "config": {}, + "time": { + "hooks": {}, + "register": 6 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/lowImport/lowImport": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/lowImport/lowImport.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/lowImport/lowImport", + "key": "lowImport", + "config": {}, + "time": { + "hooks": {}, + "register": 5 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/vite/vite": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/vite/vite.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/vite/vite", + "key": "vite", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/apiRoute/apiRoute": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/apiRoute/apiRoute.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/apiRoute/apiRoute", + "key": "apiRoute", + "config": {}, + "time": { + "hooks": {}, + "register": 13 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/monorepo/redirect": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/monorepo/redirect.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/monorepo/redirect", + "key": "monorepoRedirect", + "config": {}, + "time": { + "hooks": {}, + "register": 33 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/test/test": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/test/test.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/test/test", + "key": "test", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent", + "key": "clickToComponent", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/legacy/legacy": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/legacy/legacy.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/legacy/legacy", + "key": "legacy", + "config": {}, + "time": { + "hooks": {}, + "register": 3 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/classPropertiesLoose/classPropertiesLoose": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/classPropertiesLoose/classPropertiesLoose.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/classPropertiesLoose/classPropertiesLoose", + "key": "classPropertiesLoose", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/webpack/webpack": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/webpack/webpack.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/webpack/webpack", + "key": "preset-umi:webpack", + "config": {}, + "time": { + "hooks": {}, + "register": 3 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/swc/swc": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/swc/swc.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/swc/swc", + "key": "swc", + "config": {}, + "time": { + "hooks": { + "addOnDemandDeps": [ + 0 + ] + }, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/features/ui/ui": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/ui/ui.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/ui/ui", + "key": "ui", + "config": {}, + "time": { + "hooks": {}, + "register": 5 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/mako/mako": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/mako/mako.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/mako/mako", + "key": "mako", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/utoopack/utoopack": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/utoopack/utoopack.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/utoopack/utoopack", + "key": "utoopack", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/hmrGuardian/hmrGuardian": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/hmrGuardian/hmrGuardian.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/hmrGuardian/hmrGuardian", + "key": "hmrGuardian", + "config": {}, + "time": { + "hooks": {}, + "register": 6 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/routePreloadOnLoad/routePreloadOnLoad": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/routePreloadOnLoad/routePreloadOnLoad.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/routePreloadOnLoad/routePreloadOnLoad", + "key": "routePreloadOnLoad", + "config": {}, + "time": { + "hooks": {}, + "register": 55 + } + }, + "./node_modules/@umijs/preset-umi/dist/features/forget/forget": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/forget/forget.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/forget/forget", + "key": "forget", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "config" + }, + "./node_modules/@umijs/preset-umi/dist/features/bundler/bundler": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/features/bundler/bundler.js", + "id": "./node_modules/@umijs/preset-umi/dist/features/bundler/bundler", + "key": "preset-umi:bundler", + "config": {}, + "time": { + "hooks": {}, + "register": 9 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/build": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/build.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/build", + "key": "build", + "config": {}, + "time": { + "hooks": {}, + "register": 12 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/config/config": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/config/config.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/config/config", + "key": "config", + "config": {}, + "time": { + "hooks": {}, + "register": 61 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/dev/dev": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/dev/dev.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/dev/dev", + "key": "dev", + "config": {}, + "time": { + "hooks": { + "modifyAppData": [ + 21 + ] + }, + "register": 67 + } + }, + "./node_modules/@umijs/preset-umi/dist/commands/help": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/help.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/help", + "key": "help", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/lint": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/lint.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/lint", + "key": "lint", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/setup": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/setup.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/setup", + "key": "setup", + "config": {}, + "time": { + "hooks": {}, + "register": 0 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/deadcode": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/deadcode.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/deadcode", + "key": "deadcode", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/version": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/version.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/version", + "key": "version", + "config": {}, + "time": { + "hooks": {}, + "register": 0 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/page": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/page.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/page", + "key": "generator:page", + "config": {}, + "time": { + "hooks": {}, + "register": 5 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/prettier": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/prettier.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/prettier", + "key": "generator:prettier", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/tsconfig": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/tsconfig.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/tsconfig", + "key": "generator:tsconfig", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/jest": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/jest.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/jest", + "key": "generator:jest", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/tailwindcss": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/tailwindcss.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/tailwindcss", + "key": "generator:tailwindcss", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/dva": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/dva.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/dva", + "key": "generator:dva", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/component": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/component.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/component", + "key": "generator:component", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/mock": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/mock.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/mock", + "key": "generator:mock", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/cypress": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/cypress.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/cypress", + "key": "generator:cypress", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/api": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/api.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/api", + "key": "generator:api", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/generators/precommit": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/generators/precommit.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/generators/precommit", + "key": "generator:precommit", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/plugin": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/plugin.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/plugin", + "key": "command:plugin", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/verify-commit": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/verify-commit.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/verify-commit", + "key": "verifyCommit", + "config": {}, + "time": { + "hooks": {}, + "register": 1 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/preview": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/preview.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/preview", + "key": "preview", + "config": {}, + "time": { + "hooks": {}, + "register": 31 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/preset-umi/dist/commands/mfsu/mfsu": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/preset-umi/dist/commands/mfsu/mfsu.js", + "id": "./node_modules/@umijs/preset-umi/dist/commands/mfsu/mfsu", + "key": "mfsu-cli", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + }, + "@umijs/plugin-run": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/plugin-run/dist/index.js", + "id": "@umijs/plugin-run", + "key": "run", + "config": {}, + "time": { + "hooks": {}, + "register": 5 + }, + "enableBy": "register" + }, + "./node_modules/@umijs/core/dist/service/generatePlugin": { + "cwd": "D:\\trae_projects\\makemd\\makemd\\dashboard", + "type": "plugin", + "path": "D:/trae_projects/makemd/makemd/dashboard/node_modules/@umijs/core/dist/service/generatePlugin.js", + "id": "./node_modules/@umijs/core/dist/service/generatePlugin", + "key": "generatePlugin", + "config": {}, + "time": { + "hooks": {}, + "register": 2 + }, + "enableBy": "register" + } + }, + "presets": [], + "name": "dev", + "args": { + "_": [] + }, + "userConfig": {}, + "mainConfigFile": null, + "config": { + "routeLoader": { + "moduleType": "esm" + }, + "mountElementId": "root", + "history": { + "type": "browser" + }, + "base": "/", + "svgr": {}, + "publicPath": "/", + "mfsu": { + "strategy": "eager" + }, + "ignoreMomentLocale": true, + "externals": {}, + "autoCSSModules": true, + "alias": { + "umi": "@@/exports", + "react": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react", + "react-dom": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react-dom", + "react-router": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react-router", + "react-router-dom": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\react-router-dom", + "@": "D:/trae_projects/makemd/makemd/dashboard/src", + "@@": "D:/trae_projects/makemd/makemd/dashboard/src/.umi", + "regenerator-runtime": "D:\\trae_projects\\makemd\\makemd\\dashboard\\node_modules\\regenerator-runtime" + }, + "targets": { + "chrome": 80 + } + }, + "routes": { + "Compliance/CertificateExpiryReminder": { + "path": "Compliance/CertificateExpiryReminder", + "id": "Compliance/CertificateExpiryReminder", + "file": "Compliance/CertificateExpiryReminder.tsx", + "absPath": "/Compliance/CertificateExpiryReminder", + "__content": "import React, { useState, useEffect } from 'react';\nimport {\n Card,\n Table,\n Button,\n Space,\n Modal,\n Tag,\n Row,\n Col,\n Statistic,\n Alert,\n List,\n Badge,\n Tooltip,\n Switch,\n message,\n Divider,\n Timeline,\n} from 'antd';\nimport {\n BellOutlined,\n ClockCircleOutlined,\n WarningOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined,\n SettingOutlined,\n MailOutlined,\n SyncOutlined,\n FileTextOutlined,\n} from '@ant-design/icons';\nimport dayjs from 'dayjs';\n\ninterface ExpiryReminder {\n id: string;\n certNo: string;\n certName: string;\n certType: string;\n productName: string;\n expiryDate: string;\n daysRemaining: number;\n status: 'CRITICAL' | 'WARNING' | 'NOTICE' | 'SAFE';\n reminderSent: boolean;\n lastReminderDate?: string;\n nextReminderDate?: string;\n actions: string[];\n}\n\nconst MOCK_REMINDERS: ExpiryReminder[] = [\n {\n id: '1',\n certNo: 'FCC-2025-045',\n certName: 'FCC Declaration',\n certType: 'FCC',\n productName: 'Control Module B',\n expiryDate: '2025-06-19',\n daysRemaining: 93,\n status: 'WARNING',\n reminderSent: true,\n lastReminderDate: '2025-03-15',\n nextReminderDate: '2025-04-15',\n actions: ['Initiate renewal process', 'Contact testing lab'],\n },\n {\n id: '2',\n certNo: 'RoHS-2024-112',\n certName: 'RoHS Compliance Certificate',\n certType: 'RoHS',\n productName: 'Power Supply Unit C',\n expiryDate: '2025-02-28',\n daysRemaining: -18,\n status: 'CRITICAL',\n reminderSent: true,\n lastReminderDate: '2025-03-01',\n actions: ['Immediate re-certification required', 'Suspend product listing'],\n },\n {\n id: '3',\n certNo: 'CE-2026-001',\n certName: 'CE Declaration of Conformity',\n certType: 'CE',\n productName: 'Industrial Sensor A',\n expiryDate: '2027-01-14',\n daysRemaining: 663,\n status: 'SAFE',\n reminderSent: false,\n actions: [],\n },\n {\n id: '4',\n certNo: 'UL-2026-008',\n certName: 'UL Safety Certification',\n certType: 'UL',\n productName: 'Communication Gateway D',\n expiryDate: '2027-01-31',\n daysRemaining: 680,\n status: 'SAFE',\n reminderSent: false,\n actions: [],\n },\n {\n id: '5',\n certNo: 'ISO-2025-022',\n certName: 'ISO 9001:2015',\n certType: 'ISO',\n productName: 'Company-wide',\n expiryDate: '2025-09-30',\n daysRemaining: 196,\n status: 'NOTICE',\n reminderSent: true,\n lastReminderDate: '2025-03-01',\n nextReminderDate: '2025-06-01',\n actions: ['Schedule surveillance audit', 'Update quality manual'],\n },\n];\n\nconst STATUS_CONFIG: Record = {\n CRITICAL: { color: 'error', text: 'Critical', icon: , bgColor: '#fff2f0' },\n WARNING: { color: 'warning', text: 'Warning', icon: , bgColor: '#fffbe6' },\n NOTICE: { color: 'processing', text: 'Notice', icon: , bgColor: '#e6f7ff' },\n SAFE: { color: 'success', text: 'Safe', icon: , bgColor: '#f6ffed' },\n};\n\nexport const CertificateExpiryReminder: React.FC = () => {\n const [loading, setLoading] = useState(false);\n const [reminders, setReminders] = useState(MOCK_REMINDERS);\n const [settingsModalVisible, setSettingsModalVisible] = useState(false);\n const [emailEnabled, setEmailEnabled] = useState(true);\n const [autoRenewal, setAutoRenewal] = useState(false);\n\n useEffect(() => {\n checkReminders();\n }, []);\n\n const checkReminders = () => {\n setLoading(true);\n setTimeout(() => {\n setLoading(false);\n message.success('Reminders checked');\n }, 1000);\n };\n\n const handleSendReminder = (reminder: ExpiryReminder) => {\n Modal.confirm({\n title: 'Send Reminder',\n content: `Send expiry reminder for ${reminder.certNo}?`,\n onOk: () => {\n setReminders(reminders.map(r => \n r.id === reminder.id ? { ...r, reminderSent: true, lastReminderDate: new Date().toISOString().split('T')[0] } : r\n ));\n message.success('Reminder sent successfully');\n },\n });\n };\n\n const handleInitiateRenewal = (reminder: ExpiryReminder) => {\n Modal.confirm({\n title: 'Initiate Renewal',\n content: `Start renewal process for ${reminder.certNo}?`,\n onOk: () => {\n message.success('Renewal process initiated');\n },\n });\n };\n\n const getStatusTag = (status: string, days: number) => {\n const config = STATUS_CONFIG[status];\n if (days < 0) {\n return }>EXPIRED;\n }\n return {config.text};\n };\n\n const criticalCount = reminders.filter(r => r.status === 'CRITICAL' || r.daysRemaining < 0).length;\n const warningCount = reminders.filter(r => r.status === 'WARNING').length;\n const noticeCount = reminders.filter(r => r.status === 'NOTICE').length;\n\n return (\n
\n \n \n \n } \n />\n \n \n \n \n } \n />\n \n \n \n \n } \n />\n \n \n \n \n } \n />\n \n \n \n\n {criticalCount > 0 && (\n }\n style={{ marginBottom: 24 }}\n action={\n \n }\n />\n )}\n\n \n \n \n \n }\n >\n a.daysRemaining - b.daysRemaining)}\n renderItem={(item) => (\n \n ,\n ,\n ]}\n >\n
\n
\n
Email Notifications
\n \n
\n Receive email notifications for certificate expiry reminders\n
\n
\n\n
\n
Auto-initiate Renewal
\n \n
\n Automatically initiate renewal process when certificate enters warning status\n
\n
\n\n Reminder Schedule\n\n (\n \n \n \n )}\n />\n
\n \n
\n );\n};\n\nexport default CertificateExpiryReminder;\n", + "__isJSFile": true, + "__absFile": "D:/trae_projects/makemd/makemd/dashboard/src/pages/Compliance/CertificateExpiryReminder.tsx" + }, + "Compliance/CertificateManage": { + "path": "Compliance/CertificateManage", + "id": "Compliance/CertificateManage", + "file": "Compliance/CertificateManage.tsx", + "absPath": "/Compliance/CertificateManage", + "__content": "import React, { useState, useEffect } from 'react';\nimport {\n Card,\n Table,\n Button,\n Space,\n Modal,\n Form,\n Input,\n Select,\n DatePicker,\n Upload,\n Descriptions,\n Divider,\n message,\n Tag,\n Tabs,\n Row,\n Col,\n Statistic,\n Alert,\n Tooltip,\n Badge,\n} from 'antd';\nimport {\n FileTextOutlined,\n PlusOutlined,\n EyeOutlined,\n EditOutlined,\n DeleteOutlined,\n UploadOutlined,\n DownloadOutlined,\n CheckCircleOutlined,\n ClockCircleOutlined,\n CloseCircleOutlined,\n WarningOutlined,\n BellOutlined,\n} from '@ant-design/icons';\nimport type { ColumnsType } from 'antd/es/table';\nimport dayjs from 'dayjs';\n\nconst { Option } = Select;\nconst { TabPane } = Tabs;\nconst { RangePicker } = DatePicker;\n\ninterface Certificate {\n id: string;\n certNo: string;\n certName: string;\n certType: 'CE' | 'FCC' | 'RoHS' | 'UL' | 'ISO' | 'FDA' | 'CCC' | 'OTHER';\n productId: string;\n productName: string;\n issuer: string;\n issueDate: string;\n expiryDate: string;\n status: 'VALID' | 'EXPIRED' | 'PENDING_RENEWAL' | 'REVOKED';\n attachments: string[];\n scope: string;\n remark?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nconst CERT_TYPES = [\n { value: 'CE', label: 'CE Certification', color: 'blue' },\n { value: 'FCC', label: 'FCC Certification', color: 'green' },\n { value: 'RoHS', label: 'RoHS Compliance', color: 'purple' },\n { value: 'UL', label: 'UL Certification', color: 'orange' },\n { value: 'ISO', label: 'ISO Certification', color: 'cyan' },\n { value: 'FDA', label: 'FDA Approval', color: 'red' },\n { value: 'CCC', label: 'CCC Certification', color: 'gold' },\n { value: 'OTHER', label: 'Other', color: 'default' },\n];\n\nconst STATUS_CONFIG: Record = {\n VALID: { color: 'success', text: 'Valid', icon: },\n EXPIRED: { color: 'error', text: 'Expired', icon: },\n PENDING_RENEWAL: { color: 'warning', text: 'Pending Renewal', icon: },\n REVOKED: { color: 'red', text: 'Revoked', icon: },\n};\n\nconst MOCK_PRODUCTS = [\n { id: 'P001', name: 'Industrial Sensor A' },\n { id: 'P002', name: 'Control Module B' },\n { id: 'P003', name: 'Power Supply Unit C' },\n { id: 'P004', name: 'Communication Gateway D' },\n];\n\nexport const CertificateManage: React.FC = () => {\n const [form] = Form.useForm();\n const [loading, setLoading] = useState(false);\n const [certificates, setCertificates] = useState([]);\n const [createModalVisible, setCreateModalVisible] = useState(false);\n const [detailModalVisible, setDetailModalVisible] = useState(false);\n const [selectedCert, setSelectedCert] = useState(null);\n const [activeTab, setActiveTab] = useState('all');\n\n useEffect(() => {\n fetchCertificates();\n }, []);\n\n const fetchCertificates = async () => {\n setLoading(true);\n try {\n const mockCerts: Certificate[] = [\n {\n id: '1',\n certNo: 'CE-2026-001',\n certName: 'CE Declaration of Conformity',\n certType: 'CE',\n productId: 'P001',\n productName: 'Industrial Sensor A',\n issuer: 'TÜV SÜD',\n issueDate: '2025-01-15',\n expiryDate: '2027-01-14',\n status: 'VALID',\n attachments: ['ce_cert_2026_001.pdf', 'test_report.pdf'],\n scope: 'Low Voltage Directive (LVD), EMC Directive',\n createdAt: '2025-01-15 10:00:00',\n updatedAt: '2025-01-15 10:00:00',\n },\n {\n id: '2',\n certNo: 'FCC-2025-045',\n certName: 'FCC Declaration',\n certType: 'FCC',\n productId: 'P002',\n productName: 'Control Module B',\n issuer: 'FCC',\n issueDate: '2024-06-20',\n expiryDate: '2025-06-19',\n status: 'PENDING_RENEWAL',\n attachments: ['fcc_cert.pdf'],\n scope: 'Part 15B Class B Digital Device',\n remark: 'Renewal application submitted',\n createdAt: '2024-06-20 14:30:00',\n updatedAt: '2025-03-10 09:00:00',\n },\n {\n id: '3',\n certNo: 'RoHS-2024-112',\n certName: 'RoHS Compliance Certificate',\n certType: 'RoHS',\n productId: 'P003',\n productName: 'Power Supply Unit C',\n issuer: 'SGS',\n issueDate: '2024-03-01',\n expiryDate: '2025-02-28',\n status: 'EXPIRED',\n attachments: ['rohs_cert.pdf'],\n scope: 'RoHS 2.0 (2011/65/EU)',\n remark: 'Needs re-certification',\n createdAt: '2024-03-01 09:00:00',\n updatedAt: '2025-03-01 00:00:00',\n },\n {\n id: '4',\n certNo: 'UL-2026-008',\n certName: 'UL Safety Certification',\n certType: 'UL',\n productId: 'P004',\n productName: 'Communication Gateway D',\n issuer: 'Underwriters Laboratories',\n issueDate: '2026-02-01',\n expiryDate: '2027-01-31',\n status: 'VALID',\n attachments: ['ul_cert.pdf', 'safety_test.pdf'],\n scope: 'UL 60950-1, Information Technology Equipment',\n createdAt: '2026-02-01 11:00:00',\n updatedAt: '2026-02-01 11:00:00',\n },\n ];\n setCertificates(mockCerts);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCreateCert = async (values: any) => {\n setLoading(true);\n try {\n const product = MOCK_PRODUCTS.find(p => p.id === values.productId);\n const newCert: Certificate = {\n id: `${Date.now()}`,\n certNo: `${values.certType}-${new Date().getFullYear()}-${String(certificates.length + 1).padStart(3, '0')}`,\n certName: values.certName,\n certType: values.certType,\n productId: values.productId,\n productName: product?.name || '',\n issuer: values.issuer,\n issueDate: values.issueDate.format('YYYY-MM-DD'),\n expiryDate: values.expiryDate.format('YYYY-MM-DD'),\n status: 'VALID',\n attachments: [],\n scope: values.scope,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n setCertificates([newCert, ...certificates]);\n message.success('Certificate created successfully');\n setCreateModalVisible(false);\n form.resetFields();\n } finally {\n setLoading(false);\n }\n };\n\n const handleViewDetail = (cert: Certificate) => {\n setSelectedCert(cert);\n setDetailModalVisible(true);\n };\n\n const handleRenew = (cert: Certificate) => {\n Modal.confirm({\n title: 'Renew Certificate',\n content: `Are you sure you want to initiate renewal for ${cert.certNo}?`,\n onOk: () => {\n setCertificates(certificates.map(c => \n c.id === cert.id ? { ...c, status: 'PENDING_RENEWAL' as const, updatedAt: new Date().toISOString() } : c\n ));\n message.success('Renewal initiated');\n },\n });\n };\n\n const handleDelete = (certId: string) => {\n Modal.confirm({\n title: 'Delete Certificate',\n content: 'Are you sure you want to delete this certificate?',\n okType: 'danger',\n onOk: () => {\n setCertificates(certificates.filter(c => c.id !== certId));\n message.success('Certificate deleted');\n },\n });\n };\n\n const getFilteredCerts = () => {\n if (activeTab === 'all') return certificates;\n if (activeTab === 'expiring') {\n return certificates.filter(c => {\n const daysUntilExpiry = dayjs(c.expiryDate).diff(dayjs(), 'day');\n return daysUntilExpiry > 0 && daysUntilExpiry <= 90;\n });\n }\n return certificates.filter(c => c.status === activeTab.toUpperCase());\n };\n\n const columns: ColumnsType = [\n {\n title: 'Cert No',\n dataIndex: 'certNo',\n key: 'certNo',\n width: 130,\n render: (no: string, record: Certificate) => (\n handleViewDetail(record)}>{no}\n ),\n },\n {\n title: 'Certificate Name',\n dataIndex: 'certName',\n key: 'certName',\n width: 200,\n ellipsis: true,\n },\n {\n title: 'Type',\n dataIndex: 'certType',\n key: 'certType',\n width: 100,\n render: (type: string) => {\n const config = CERT_TYPES.find(t => t.value === type);\n return {type};\n },\n },\n {\n title: 'Product',\n dataIndex: 'productName',\n key: 'productName',\n width: 160,\n },\n {\n title: 'Issuer',\n dataIndex: 'issuer',\n key: 'issuer',\n width: 120,\n },\n {\n title: 'Issue Date',\n dataIndex: 'issueDate',\n key: 'issueDate',\n width: 100,\n },\n {\n title: 'Expiry Date',\n dataIndex: 'expiryDate',\n key: 'expiryDate',\n width: 100,\n render: (date: string, record: Certificate) => {\n const daysUntilExpiry = dayjs(date).diff(dayjs(), 'day');\n const isExpiringSoon = daysUntilExpiry > 0 && daysUntilExpiry <= 90;\n return (\n \n \n {date}\n \n \n );\n },\n },\n {\n title: 'Status',\n dataIndex: 'status',\n key: 'status',\n width: 120,\n render: (status: string) => {\n const config = STATUS_CONFIG[status];\n return {config.text};\n },\n },\n {\n title: 'Actions',\n key: 'actions',\n width: 150,\n render: (_, record: Certificate) => (\n \n \n \n }>\n \n \n Expiring Soon} key=\"expiring\" />\n \n \n \n \n\n \n \n\n setCreateModalVisible(false)}\n footer={null}\n width={700}\n >\n
\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n\n
\n \n \n
\n
\n \n\n setDetailModalVisible(false)}\n footer={[\n ,\n selectedCert?.status === 'VALID' && (\n \n ),\n ]}\n width={700}\n >\n {selectedCert && (\n <>\n \n {selectedCert.certNo}\n \n \n {STATUS_CONFIG[selectedCert.status].text}\n \n \n {selectedCert.certName}\n \n t.value === selectedCert.certType)?.color}>\n {CERT_TYPES.find(t => t.value === selectedCert.certType)?.label}\n \n \n {selectedCert.productName}\n {selectedCert.issuer}\n {selectedCert.issueDate}\n {selectedCert.expiryDate}\n {selectedCert.scope}\n {selectedCert.remark && (\n {selectedCert.remark}\n )}\n \n\n {selectedCert.attachments.length > 0 && (\n <>\n Attachments\n \n {selectedCert.attachments.map((file, index) => (\n \n ))}\n \n \n )}\n \n )}\n \n \n );\n};\n\nexport default CertificateManage;\n", + "__isJSFile": true, + "__absFile": "D:/trae_projects/makemd/makemd/dashboard/src/pages/Compliance/CertificateManage.tsx" + }, + "AfterSales/CustomerService": { + "path": "AfterSales/CustomerService", + "id": "AfterSales/CustomerService", + "file": "AfterSales/CustomerService.tsx", + "absPath": "/AfterSales/CustomerService", + "__content": "import React, { useState, useEffect, useRef } from 'react';\nimport {\n Card,\n Table,\n Tag,\n Button,\n Space,\n Modal,\n Form,\n Input,\n Select,\n Descriptions,\n Divider,\n message,\n Tabs,\n Badge,\n Tooltip,\n Row,\n Col,\n Statistic,\n List,\n Avatar,\n Typography,\n Dropdown,\n Menu,\n Popconfirm,\n} from 'antd';\nimport {\n MessageOutlined,\n UserOutlined,\n SendOutlined,\n ClockCircleOutlined,\n CheckCircleOutlined,\n CloseCircleOutlined,\n MoreOutlined,\n PhoneOutlined,\n MailOutlined,\n FileTextOutlined,\n ReloadOutlined,\n} from '@ant-design/icons';\nimport type { ColumnsType } from 'antd/es/table';\n\nconst { TextArea } = Input;\nconst { Option } = Select;\nconst { TabPane } = Tabs;\nconst { Text, Paragraph } = Typography;\n\ninterface CustomerServiceTicket {\n id: string;\n ticketId: string;\n orderId: string;\n customerId: string;\n customerName: string;\n customerEmail: string;\n subject: string;\n category: string;\n priority: 'LOW' | 'MEDIUM' | 'HIGH' | 'URGENT';\n status: 'OPEN' | 'IN_PROGRESS' | 'WAITING_CUSTOMER' | 'RESOLVED' | 'CLOSED';\n assignedTo?: string;\n createdAt: string;\n updatedAt: string;\n platform: string;\n lastMessage?: string;\n messageCount: number;\n}\n\ninterface ChatMessage {\n id: string;\n ticketId: string;\n sender: 'CUSTOMER' | 'AGENT' | 'SYSTEM';\n senderName: string;\n content: string;\n attachments?: string[];\n createdAt: string;\n isRead: boolean;\n}\n\nconst TICKET_STATUS_MAP: Record = {\n OPEN: { color: 'error', text: 'Open' },\n IN_PROGRESS: { color: 'processing', text: 'In Progress' },\n WAITING_CUSTOMER: { color: 'warning', text: 'Waiting Customer' },\n RESOLVED: { color: 'success', text: 'Resolved' },\n CLOSED: { color: 'default', text: 'Closed' },\n};\n\nconst PRIORITY_MAP: Record = {\n LOW: { color: 'default', text: 'Low' },\n MEDIUM: { color: 'blue', text: 'Medium' },\n HIGH: { color: 'orange', text: 'High' },\n URGENT: { color: 'red', text: 'Urgent' },\n};\n\nconst CATEGORIES = [\n { value: 'ORDER_ISSUE', label: 'Order Issue' },\n { value: 'REFUND_REQUEST', label: 'Refund Request' },\n { value: 'RETURN_REQUEST', label: 'Return Request' },\n { value: 'SHIPPING_ISSUE', label: 'Shipping Issue' },\n { value: 'PRODUCT_INQUIRY', label: 'Product Inquiry' },\n { value: 'PAYMENT_ISSUE', label: 'Payment Issue' },\n { value: 'OTHER', label: 'Other' },\n];\n\nconst QUICK_REPLIES = [\n 'Thank you for contacting us. How can I help you today?',\n 'I understand your concern. Let me check that for you.',\n 'I apologize for the inconvenience. We will resolve this as soon as possible.',\n 'Your request has been processed. Is there anything else I can help with?',\n 'Thank you for your patience. We are looking into this issue.',\n];\n\nexport const CustomerService: React.FC = () => {\n const [form] = Form.useForm();\n const [loading, setLoading] = useState(false);\n const [tickets, setTickets] = useState([]);\n const [selectedTicket, setSelectedTicket] = useState(null);\n const [messages, setMessages] = useState([]);\n const [detailModalVisible, setDetailModalVisible] = useState(false);\n const [chatModalVisible, setChatModalVisible] = useState(false);\n const [newTicketModalVisible, setNewTicketModalVisible] = useState(false);\n const [activeTab, setActiveTab] = useState('all');\n const [messageInput, setMessageInput] = useState('');\n const [stats, setStats] = useState({\n total: 0,\n open: 0,\n inProgress: 0,\n resolved: 0,\n avgResponseTime: 0,\n });\n const chatEndRef = useRef(null);\n\n useEffect(() => {\n fetchTickets();\n }, []);\n\n useEffect(() => {\n if (chatModalVisible && chatEndRef.current) {\n chatEndRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n }, [messages, chatModalVisible]);\n\n const fetchTickets = async () => {\n setLoading(true);\n try {\n const mockTickets: CustomerServiceTicket[] = [\n {\n id: '1',\n ticketId: 'TKT-2026-001',\n orderId: 'ORD-2026-001',\n customerId: 'CUST_001',\n customerName: 'John Smith',\n customerEmail: 'john.smith@email.com',\n subject: 'Order not received',\n category: 'SHIPPING_ISSUE',\n priority: 'HIGH',\n status: 'OPEN',\n createdAt: '2026-03-18 10:30:00',\n updatedAt: '2026-03-18 11:00:00',\n platform: 'Amazon',\n lastMessage: 'When will my order arrive?',\n messageCount: 3,\n },\n {\n id: '2',\n ticketId: 'TKT-2026-002',\n orderId: 'ORD-2026-002',\n customerId: 'CUST_002',\n customerName: 'Emma Wilson',\n customerEmail: 'emma.wilson@email.com',\n subject: 'Request for refund',\n category: 'REFUND_REQUEST',\n priority: 'MEDIUM',\n status: 'IN_PROGRESS',\n assignedTo: 'Agent_001',\n createdAt: '2026-03-17 14:20:00',\n updatedAt: '2026-03-18 09:00:00',\n platform: 'eBay',\n lastMessage: 'I would like to request a refund for my order.',\n messageCount: 5,\n },\n {\n id: '3',\n ticketId: 'TKT-2026-003',\n orderId: 'ORD-2026-003',\n customerId: 'CUST_003',\n customerName: 'Michael Brown',\n customerEmail: 'michael.brown@email.com',\n subject: 'Product quality issue',\n category: 'RETURN_REQUEST',\n priority: 'LOW',\n status: 'RESOLVED',\n assignedTo: 'Agent_002',\n createdAt: '2026-03-16 09:15:00',\n updatedAt: '2026-03-17 16:30:00',\n platform: 'Shopify',\n lastMessage: 'Thank you for resolving my issue.',\n messageCount: 8,\n },\n {\n id: '4',\n ticketId: 'TKT-2026-004',\n orderId: 'ORD-2026-004',\n customerId: 'CUST_004',\n customerName: 'Sarah Davis',\n customerEmail: 'sarah.davis@email.com',\n subject: 'Payment failed',\n category: 'PAYMENT_ISSUE',\n priority: 'URGENT',\n status: 'WAITING_CUSTOMER',\n assignedTo: 'Agent_001',\n createdAt: '2026-03-18 08:00:00',\n updatedAt: '2026-03-18 10:00:00',\n platform: 'Amazon',\n lastMessage: 'Please provide your payment screenshot.',\n messageCount: 4,\n },\n ];\n\n setTickets(mockTickets);\n calculateStats(mockTickets);\n } catch (error) {\n message.error('Failed to load tickets');\n } finally {\n setLoading(false);\n }\n };\n\n const calculateStats = (ticketList: CustomerServiceTicket[]) => {\n setStats({\n total: ticketList.length,\n open: ticketList.filter((t) => t.status === 'OPEN').length,\n inProgress: ticketList.filter((t) => t.status === 'IN_PROGRESS').length,\n resolved: ticketList.filter((t) => t.status === 'RESOLVED').length,\n avgResponseTime: 2.5,\n });\n };\n\n const fetchMessages = async (ticketId: string) => {\n const mockMessages: ChatMessage[] = [\n {\n id: '1',\n ticketId,\n sender: 'CUSTOMER',\n senderName: selectedTicket?.customerName || 'Customer',\n content: 'Hello, I have an issue with my order.',\n createdAt: '2026-03-18 10:30:00',\n isRead: true,\n },\n {\n id: '2',\n ticketId,\n sender: 'AGENT',\n senderName: 'Support Agent',\n content: 'Hello! Thank you for contacting us. How can I help you today?',\n createdAt: '2026-03-18 10:32:00',\n isRead: true,\n },\n {\n id: '3',\n ticketId,\n sender: 'CUSTOMER',\n senderName: selectedTicket?.customerName || 'Customer',\n content: 'My order was supposed to arrive yesterday but it hasnt been delivered yet.',\n createdAt: '2026-03-18 10:35:00',\n isRead: true,\n },\n {\n id: '4',\n ticketId,\n sender: 'AGENT',\n senderName: 'Support Agent',\n content: 'I apologize for the delay. Let me check the status of your order for you.',\n createdAt: '2026-03-18 10:38:00',\n isRead: true,\n },\n ];\n setMessages(mockMessages);\n };\n\n const handleViewDetail = (ticket: CustomerServiceTicket) => {\n setSelectedTicket(ticket);\n setDetailModalVisible(true);\n };\n\n const handleOpenChat = (ticket: CustomerServiceTicket) => {\n setSelectedTicket(ticket);\n setChatModalVisible(true);\n fetchMessages(ticket.ticketId);\n };\n\n const handleSendMessage = async () => {\n if (!messageInput.trim()) return;\n\n const newMessage: ChatMessage = {\n id: Date.now().toString(),\n ticketId: selectedTicket?.ticketId || '',\n sender: 'AGENT',\n senderName: 'Support Agent',\n content: messageInput,\n createdAt: new Date().toISOString(),\n isRead: true,\n };\n\n setMessages([...messages, newMessage]);\n setMessageInput('');\n message.success('Message sent');\n };\n\n const handleQuickReply = (reply: string) => {\n setMessageInput(reply);\n };\n\n const handleStatusChange = async (ticketId: string, newStatus: string) => {\n setLoading(true);\n try {\n console.log('Updating ticket status:', { ticketId, newStatus });\n await new Promise((resolve) => setTimeout(resolve, 500));\n message.success('Status updated successfully');\n fetchTickets();\n } catch (error) {\n message.error('Failed to update status');\n } finally {\n setLoading(false);\n }\n };\n\n const handleCreateTicket = async () => {\n try {\n const values = await form.validateFields();\n setLoading(true);\n\n console.log('Creating new ticket:', values);\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n message.success('Ticket created successfully');\n setNewTicketModalVisible(false);\n form.resetFields();\n fetchTickets();\n } catch (error) {\n message.error('Failed to create ticket');\n } finally {\n setLoading(false);\n }\n };\n\n const getFilteredTickets = () => {\n if (activeTab === 'all') return tickets;\n return tickets.filter((t) => t.status === activeTab.toUpperCase());\n };\n\n const columns: ColumnsType = [\n {\n title: 'Ticket ID',\n dataIndex: 'ticketId',\n key: 'ticketId',\n width: 130,\n render: (text: string, record) => (\n handleViewDetail(record)}>{text}\n ),\n },\n {\n title: 'Subject',\n dataIndex: 'subject',\n key: 'subject',\n width: 200,\n ellipsis: true,\n },\n {\n title: 'Customer',\n dataIndex: 'customerName',\n key: 'customerName',\n width: 120,\n },\n {\n title: 'Platform',\n dataIndex: 'platform',\n key: 'platform',\n width: 90,\n render: (platform: string) => {platform},\n },\n {\n title: 'Category',\n dataIndex: 'category',\n key: 'category',\n width: 130,\n render: (category: string) => (\n {CATEGORIES.find((c) => c.value === category)?.label || category}\n ),\n },\n {\n title: 'Priority',\n dataIndex: 'priority',\n key: 'priority',\n width: 90,\n render: (priority: string) => {\n const config = PRIORITY_MAP[priority];\n return {config.text};\n },\n },\n {\n title: 'Status',\n dataIndex: 'status',\n key: 'status',\n width: 130,\n render: (status: string) => {\n const config = TICKET_STATUS_MAP[status];\n return {config.text};\n },\n },\n {\n title: 'Messages',\n dataIndex: 'messageCount',\n key: 'messageCount',\n width: 80,\n render: (count: number) => (\n \n ),\n },\n {\n title: 'Updated',\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n width: 150,\n },\n {\n title: 'Actions',\n key: 'action',\n width: 150,\n fixed: 'right',\n render: (_, record) => (\n \n \n }\n onClick={() => handleViewDetail(record)}\n />\n \n \n }\n onClick={() => handleOpenChat(record)}\n />\n \n \n handleStatusChange(record.ticketId, 'RESOLVED')}\n >\n Mark as Resolved\n \n handleStatusChange(record.ticketId, 'CLOSED')}\n >\n Close Ticket\n \n \n }\n >\n \n \n \n }\n >\n \n \n \n All\n \n \n }\n key=\"all\"\n />\n \n \n Open\n \n \n }\n key=\"open\"\n />\n \n \n \n \n \n\n `Total ${total} tickets`,\n }}\n />\n \n\n setDetailModalVisible(false)}\n footer={[\n ,\n }\n onClick={() => {\n setDetailModalVisible(false);\n handleOpenChat(selectedTicket!);\n }}\n >\n Open Chat\n ,\n ]}\n width={700}\n >\n {selectedTicket && (\n \n \n {selectedTicket.ticketId}\n \n {selectedTicket.orderId}\n {selectedTicket.platform}\n \n {selectedTicket.subject}\n \n \n {CATEGORIES.find((c) => c.value === selectedTicket.category)?.label}\n \n \n \n {PRIORITY_MAP[selectedTicket.priority].text}\n \n \n \n \n {TICKET_STATUS_MAP[selectedTicket.status].text}\n \n \n \n {selectedTicket.assignedTo || 'Unassigned'}\n \n \n {selectedTicket.customerName}\n \n \n {selectedTicket.customerEmail}\n \n \n {selectedTicket.createdAt}\n \n \n {selectedTicket.updatedAt}\n \n \n {selectedTicket.lastMessage}\n \n \n )}\n \n\n \n \n Chat - {selectedTicket?.ticketId}\n
\n }\n open={chatModalVisible}\n onCancel={() => setChatModalVisible(false)}\n footer={null}\n width={700}\n >\n {selectedTicket && (\n <>\n \n \n \n {selectedTicket.customerName}\n \n {selectedTicket.orderId}\n \n {selectedTicket.platform}\n \n \n \n\n \n (\n \n \n }\n />\n \n \n \n {msg.senderName} - {msg.createdAt}\n \n {msg.content}\n \n \n \n \n )}\n />\n
\n
\n\n
\n \n Quick Replies:\n \n
\n {QUICK_REPLIES.map((reply, index) => (\n handleQuickReply(reply)}\n >\n {reply.substring(0, 30)}...\n \n ))}\n
\n
\n\n \n setMessageInput(e.target.value)}\n placeholder=\"Type your message...\"\n autoSize={{ minRows: 1, maxRows: 3 }}\n onPressEnter={(e) => {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSendMessage();\n }\n }}\n style={{ borderRadius: '4px 0 0 4px' }}\n />\n }\n onClick={handleSendMessage}\n style={{ height: 'auto' }}\n >\n Send\n \n \n \n )}\n \n\n setNewTicketModalVisible(false)}\n onOk={handleCreateTicket}\n confirmLoading={loading}\n width={600}\n >\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n