apifox-mock-generator 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +129 -1
  2. package/README.md +195 -63
  3. package/dist/package.json +1 -1
  4. package/dist/src/core/apifox-client.d.ts.map +1 -1
  5. package/dist/src/core/apifox-client.js +16 -23
  6. package/dist/src/core/apifox-client.js.map +1 -1
  7. package/dist/src/core/endpoint-filter.d.ts.map +1 -1
  8. package/dist/src/core/endpoint-filter.js +35 -5
  9. package/dist/src/core/endpoint-filter.js.map +1 -1
  10. package/dist/src/core/openapi-converter.d.ts.map +1 -1
  11. package/dist/src/core/openapi-converter.js +3 -2
  12. package/dist/src/core/openapi-converter.js.map +1 -1
  13. package/dist/src/generators/mock-generator.d.ts +2 -2
  14. package/dist/src/generators/mock-generator.d.ts.map +1 -1
  15. package/dist/src/generators/mock-generator.js +37 -9
  16. package/dist/src/generators/mock-generator.js.map +1 -1
  17. package/dist/src/generators/templates/file-architecture.d.ts +10 -0
  18. package/dist/src/generators/templates/file-architecture.d.ts.map +1 -0
  19. package/dist/src/generators/templates/file-architecture.js +18 -0
  20. package/dist/src/generators/templates/file-architecture.js.map +1 -0
  21. package/dist/src/generators/templates/mock-template.d.ts +2 -2
  22. package/dist/src/generators/templates/mock-template.d.ts.map +1 -1
  23. package/dist/src/generators/templates/mock-template.js +196 -103
  24. package/dist/src/generators/templates/mock-template.js.map +1 -1
  25. package/dist/src/generators/templates/smart-mock-rules.d.ts +47 -0
  26. package/dist/src/generators/templates/smart-mock-rules.d.ts.map +1 -0
  27. package/dist/src/generators/templates/smart-mock-rules.js +643 -0
  28. package/dist/src/generators/templates/smart-mock-rules.js.map +1 -0
  29. package/dist/src/generators/templates/type-template.d.ts +2 -14
  30. package/dist/src/generators/templates/type-template.d.ts.map +1 -1
  31. package/dist/src/generators/templates/type-template.js +279 -147
  32. package/dist/src/generators/templates/type-template.js.map +1 -1
  33. package/dist/src/generators/type-generator.d.ts.map +1 -1
  34. package/dist/src/generators/type-generator.js +2 -2
  35. package/dist/src/generators/type-generator.js.map +1 -1
  36. package/dist/src/types/index.d.ts +6 -4
  37. package/dist/src/types/index.d.ts.map +1 -1
  38. package/dist/src/types/mock/list.d.ts +12 -0
  39. package/dist/src/types/mock/list.d.ts.map +1 -0
  40. package/dist/src/types/mock/list.js +4 -0
  41. package/dist/src/types/mock/list.js.map +1 -0
  42. package/dist/src/types/mock/test.d.ts +12 -0
  43. package/dist/src/types/mock/test.d.ts.map +1 -0
  44. package/dist/src/types/mock/test.js +4 -0
  45. package/dist/src/types/mock/test.js.map +1 -0
  46. package/dist/src/types/mock/v1/auth/captcha.d.ts +18 -0
  47. package/dist/src/types/mock/v1/auth/captcha.d.ts.map +1 -0
  48. package/dist/src/types/mock/v1/auth/captcha.js +4 -0
  49. package/dist/src/types/mock/v1/auth/captcha.js.map +1 -0
  50. package/dist/src/types/mock/v1/auth/login/tenant.d.ts +26 -0
  51. package/dist/src/types/mock/v1/auth/login/tenant.d.ts.map +1 -0
  52. package/dist/src/types/mock/v1/auth/login/tenant.js +4 -0
  53. package/dist/src/types/mock/v1/auth/login/tenant.js.map +1 -0
  54. package/dist/src/types/mock/v1/auth/login/username.d.ts +40 -0
  55. package/dist/src/types/mock/v1/auth/login/username.d.ts.map +1 -0
  56. package/dist/src/types/mock/v1/auth/login/username.js +4 -0
  57. package/dist/src/types/mock/v1/auth/login/username.js.map +1 -0
  58. package/dist/src/types/mock/v1/auth/logout.d.ts +12 -0
  59. package/dist/src/types/mock/v1/auth/logout.d.ts.map +1 -0
  60. package/dist/src/types/mock/v1/auth/logout.js +4 -0
  61. package/dist/src/types/mock/v1/auth/logout.js.map +1 -0
  62. package/dist/src/types/mock/v1/role/list.d.ts +36 -0
  63. package/dist/src/types/mock/v1/role/list.d.ts.map +1 -0
  64. package/dist/src/types/mock/v1/role/list.js +4 -0
  65. package/dist/src/types/mock/v1/role/list.js.map +1 -0
  66. package/dist/src/types/mock/v1/role/permissions.d.ts +24 -0
  67. package/dist/src/types/mock/v1/role/permissions.d.ts.map +1 -0
  68. package/dist/src/types/mock/v1/role/permissions.js +4 -0
  69. package/dist/src/types/mock/v1/role/permissions.js.map +1 -0
  70. package/dist/src/types/mock/v1/role.d.ts +91 -0
  71. package/dist/src/types/mock/v1/role.d.ts.map +1 -0
  72. package/dist/src/types/mock/v1/role.js +4 -0
  73. package/dist/src/types/mock/v1/role.js.map +1 -0
  74. package/dist/src/types/mock/v1/tenant/permissions.d.ts +33 -0
  75. package/dist/src/types/mock/v1/tenant/permissions.d.ts.map +1 -0
  76. package/dist/src/types/mock/v1/tenant/permissions.js +4 -0
  77. package/dist/src/types/mock/v1/tenant/permissions.js.map +1 -0
  78. package/dist/src/types/mock/v1/tenant/user/disabled.d.ts +24 -0
  79. package/dist/src/types/mock/v1/tenant/user/disabled.d.ts.map +1 -0
  80. package/dist/src/types/mock/v1/tenant/user/disabled.js +4 -0
  81. package/dist/src/types/mock/v1/tenant/user/disabled.js.map +1 -0
  82. package/dist/src/types/mock/v1/tenant/user/list.d.ts +46 -0
  83. package/dist/src/types/mock/v1/tenant/user/list.d.ts.map +1 -0
  84. package/dist/src/types/mock/v1/tenant/user/list.js +4 -0
  85. package/dist/src/types/mock/v1/tenant/user/list.js.map +1 -0
  86. package/dist/src/types/mock/v1/tenant/user/role.d.ts +24 -0
  87. package/dist/src/types/mock/v1/tenant/user/role.d.ts.map +1 -0
  88. package/dist/src/types/mock/v1/tenant/user/role.js +4 -0
  89. package/dist/src/types/mock/v1/tenant/user/role.js.map +1 -0
  90. package/dist/src/types/mock/v1/tenant/user/unlink.d.ts +12 -0
  91. package/dist/src/types/mock/v1/tenant/user/unlink.d.ts.map +1 -0
  92. package/dist/src/types/mock/v1/tenant/user/unlink.js +4 -0
  93. package/dist/src/types/mock/v1/tenant/user/unlink.js.map +1 -0
  94. package/dist/src/types/mock/v1/tenant/user.d.ts +36 -0
  95. package/dist/src/types/mock/v1/tenant/user.d.ts.map +1 -0
  96. package/dist/src/types/mock/v1/tenant/user.js +4 -0
  97. package/dist/src/types/mock/v1/tenant/user.js.map +1 -0
  98. package/dist/src/types/mock/v1/user/avatar.d.ts +22 -0
  99. package/dist/src/types/mock/v1/user/avatar.d.ts.map +1 -0
  100. package/dist/src/types/mock/v1/user/avatar.js +4 -0
  101. package/dist/src/types/mock/v1/user/avatar.js.map +1 -0
  102. package/dist/src/types/mock/v1/user/info.d.ts +36 -0
  103. package/dist/src/types/mock/v1/user/info.d.ts.map +1 -0
  104. package/dist/src/types/mock/v1/user/info.js +4 -0
  105. package/dist/src/types/mock/v1/user/info.js.map +1 -0
  106. package/dist/src/types/mock/v1/user/password.d.ts +24 -0
  107. package/dist/src/types/mock/v1/user/password.d.ts.map +1 -0
  108. package/dist/src/types/mock/v1/user/password.js +4 -0
  109. package/dist/src/types/mock/v1/user/password.js.map +1 -0
  110. package/dist/src/types/mock/v1/user/permissions.d.ts +33 -0
  111. package/dist/src/types/mock/v1/user/permissions.d.ts.map +1 -0
  112. package/dist/src/types/mock/v1/user/permissions.js +4 -0
  113. package/dist/src/types/mock/v1/user/permissions.js.map +1 -0
  114. package/dist/src/types/mock/v1/user/self.d.ts +22 -0
  115. package/dist/src/types/mock/v1/user/self.d.ts.map +1 -0
  116. package/dist/src/types/mock/v1/user/self.js +4 -0
  117. package/dist/src/types/mock/v1/user/self.js.map +1 -0
  118. package/dist/src/types/mock/v1/user.d.ts +34 -0
  119. package/dist/src/types/mock/v1/user.d.ts.map +1 -0
  120. package/dist/src/types/mock/v1/user.js +4 -0
  121. package/dist/src/types/mock/v1/user.js.map +1 -0
  122. package/dist/src/utils/code-formatter.js +1 -1
  123. package/dist/src/utils/code-formatter.js.map +1 -1
  124. package/dist/src/utils/type-mapping.d.ts.map +1 -1
  125. package/dist/src/utils/type-mapping.js +7 -1
  126. package/dist/src/utils/type-mapping.js.map +1 -1
  127. package/package.json +60 -60
package/CHANGELOG.md CHANGED
@@ -5,6 +5,135 @@
5
5
  格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
6
6
  版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
7
 
8
+ ## [1.1.1] - 2025-01-27
9
+
10
+ ### 🎯 核心功能改进
11
+
12
+ #### 🏗️ Mock 文件架构优化
13
+
14
+ - **新增文件架构管理** - 引入 `file-architecture.ts` 模块,统一管理 Mock 文件的基础结构
15
+ - **两步生成模式** - Mock 文件生成改为两步模式:先确保文件架构,后生成接口内容
16
+ - **智能架构检测** - 自动检测现有文件是否包含必要的 import 语句,避免重复添加
17
+ - **增量架构更新** - 对于已存在的文件,智能添加缺失的基础架构而不覆盖现有内容
18
+
19
+ #### 🔧 代码质量提升
20
+
21
+ - **代码格式化优化** - 改进 `code-formatter.ts`,使用 Prettier 自动格式化生成的代码
22
+ - **统一代码风格** - 所有生成的 Mock 文件都遵循统一的代码风格和格式
23
+ - **更好的可读性** - 生成的代码更加整洁,便于维护和调试
24
+
25
+ #### 📊 类型系统增强
26
+
27
+ - **接口状态支持** - 在 `ApiEndpoint` 类型中新增 `status` 字段,支持接口状态管理
28
+ - **更精确的类型定义** - 优化类型注释,提供更清晰的 API 文档
29
+ - **废弃配置优化** - 改进 `excludedByTags` 的注释说明,明确其用于排除接口状态
30
+
31
+ ### 🚀 技术改进
32
+
33
+ #### 📁 文件管理优化
34
+
35
+ - **目录结构自动创建** - 生成 Mock 文件时自动创建必要的目录结构
36
+ - **文件存在性检查** - 增强文件存在性检查,避免文件操作错误
37
+ - **架构完整性保证** - 确保每个 Mock 文件都包含必要的 import 语句和基础设置
38
+
39
+ #### 🎨 代码生成改进
40
+
41
+ - **模块化架构** - 将文件架构管理独立为单独模块,提高代码复用性
42
+ - **更好的错误处理** - 改进文件操作过程中的错误处理和日志输出
43
+ - **增量更新支持** - 支持在现有文件中增量添加新的接口定义
44
+
45
+ ### 📖 文档更新
46
+
47
+ ### 📋 执行前提条件
48
+
49
+ 执行 `node dist/src/scripts/serve-mock.js` 需要满足以下条件:
50
+
51
+ 3. **配置文件存在** - 确保 `apifox.config.json` 在项目根目录
52
+ 4. **Mock 文件已生成** - 先运行 `npm run generate` 生成 Mock 文件
53
+ 5. **Mock 目录存在** - 确保 `mock/` 目录存在且包含有效的 Mock 文件
54
+ 6. **端口可用** - 确保配置的 `mockPort` 端口未被占用
55
+
56
+ ---
57
+
58
+ ## [1.1.0] - 2025-10-13
59
+
60
+ ### 🎯 核心功能
61
+
62
+ #### 🎭 直接使用 Apifox Mock 规则
63
+
64
+ - **使用 Apifox 配置** - 直接使用 Apifox 中为字段配置的 mock 规则
65
+ - **统一管理** - Mock 规则在 Apifox 平台统一管理,本地与云端保持完全一致
66
+ - **零配置** - 在 Apifox 中配置好 mock 规则,生成时自动应用
67
+
68
+ ### ✨ 新增功能
69
+
70
+ #### 🔄 Apifox Mock 规则支持
71
+
72
+ - **x-apifox-mock 字段** - 自动提取 Apifox 的 `x-apifox-mock` 扩展字段中的 mock 规则
73
+ - **智能语法转换** - 自动将 Apifox 模板语法(`{{$xxx}}`)转换为 Mock.js 语法(`@xxx`)
74
+ - **双语法支持** - 同时支持 Mock.js 语法和 Apifox 模板语法
75
+ - **自动应用** - 启用 `includeApifoxExtensionProperties` 后自动拉取和应用规则
76
+
77
+ 支持的 Apifox 模板转换:
78
+
79
+ - `{{$string.uuid}}` → `@guid`
80
+ - `{{$person.fullName(locale='zh_CN')}}` → `@cname`
81
+ - `{{$internet.email}}` → `@email`
82
+ - `{{$phone.number}}` → `/^1[3-9]\\d{9}$/`
83
+ - 更多模板映射...
84
+
85
+ #### 📊 回退策略
86
+
87
+ 当字段没有配置 Apifox mock 规则时,使用以下回退策略:
88
+
89
+ 1. **示例值优先** - 使用 schema 中定义的 `example`
90
+ 2. **枚举值** - 使用 `enum` 中的值(通过 `@pick` 随机选择)
91
+ 3. **基本规则** - 根据字段类型使用简单的默认规则
92
+ - 字符串:`@cword(3, 8)`
93
+ - 数字/整数:根据 `minimum/maximum` 生成范围
94
+ - 布尔值:`@boolean`
95
+
96
+ ### 📖 文档更新
97
+
98
+ - **README.md** - 新增"Apifox Mock 规则"章节
99
+ - 说明工作原理和使用方法
100
+ - 提供使用示例
101
+ - 更新项目结构说明
102
+ - **CHANGELOG.md** - 详细记录所有变更
103
+
104
+ ### 🎯 优势
105
+
106
+ - ✅ **统一管理** - 在 Apifox 中统一管理所有 mock 规则,团队协作更方便
107
+ - ✅ **完全一致** - 本地 Mock 数据与 Apifox 云端 Mock 保持一致
108
+ - ✅ **零学习成本** - 使用 Apifox 原生的 mock 规则,无需学习新语法
109
+ - ✅ **功能完整** - 支持 Apifox 的所有 mock 规则和高级功能
110
+
111
+ ### 🚀 使用示例
112
+
113
+ 在 Apifox 中配置字段的 mock 规则:
114
+
115
+ ```
116
+ 字段名: email
117
+ 类型: string
118
+ Mock 规则: @email
119
+ ```
120
+
121
+ 生成的 Mock 文件会自动应用该规则:
122
+
123
+ ```javascript
124
+ Mock.mock({
125
+ email: '@email' // 直接使用 Apifox 配置的规则
126
+ });
127
+ ```
128
+
129
+ ### ⚡ 兼容性
130
+
131
+ - 向下兼容 v1.0.0
132
+ - 无需修改配置文件
133
+ - 自动应用 Apifox mock 规则
134
+
135
+ ---
136
+
8
137
  ## [1.0.0] - 2025-10-10
9
138
 
10
139
  ### ✨ 初始版本发布
@@ -128,4 +257,3 @@
128
257
  ## 许可证
129
258
 
130
259
  MIT License - 详见 [LICENSE](./LICENSE) 文件
131
-
package/README.md CHANGED
@@ -16,12 +16,14 @@
16
16
  ## ✨ 功能特性
17
17
 
18
18
  ### 核心功能
19
+
19
20
  - 🚀 **Apifox 集成** - 自动从 Apifox 项目拉取 API 接口定义(支持 OpenAPI 3.0)
20
21
  - 📝 **类型生成** - 生成 TypeScript 类型文件(.ts 格式),支持复杂类型、嵌套对象、枚举等
21
- - 🎭 **Mock 生成** - 基于 Schema 自动生成 Mock 数据,使用 Faker.js 生成真实感数据
22
+ - 🎭 **Apifox Mock** - **✨ 直接使用 Apifox mock 规则**,无需本地配置,完全继承 Apifox 的数据生成能力
22
23
  - 🌐 **Mock 服务器** - 基于 Express 的本地 Mock 服务,快速响应,支持 CORS
23
24
 
24
25
  ### 高级特性
26
+
25
27
  - 🔥 **热重载** - 修改 Mock 文件自动生效,无需重启服务器
26
28
  - 🎯 **API 筛选** - 支持路径、方法、标签、操作 ID 等多维度筛选
27
29
  - ⚡ **增量更新** - 智能识别文件变化,仅更新必要内容
@@ -39,6 +41,15 @@ pnpm add apifox-mock-generator -D
39
41
 
40
42
  ## 🚀 快速开始
41
43
 
44
+ ### 前置条件
45
+
46
+ 在开始使用之前,请确保满足以下条件:
47
+
48
+ - ✅ **Node.js 16+** - 确保已安装 Node.js 16 或更高版本
49
+ - ✅ **项目编译** - 运行 `npm run build` 编译 TypeScript 代码
50
+ - ✅ **Apifox 配置** - 创建 `apifox.config.json` 配置文件
51
+ - ✅ **Mock 文件生成** - 运行 `npm run generate` 生成 Mock 文件
52
+
42
53
  ### 1. 创建配置文件
43
54
 
44
55
  在你的项目根目录创建 `apifox.config.json`:
@@ -53,14 +64,12 @@ pnpm add apifox-mock-generator -D
53
64
  }
54
65
  ```
55
66
 
56
- > ⚠️ 重要:此文件包含敏感信息,请添加到 `.gitignore`
57
-
58
67
  ### 2. 配置 package.json 脚本
59
68
 
60
69
  ```json
61
70
  {
62
71
  "scripts": {
63
- "mock:generate": "apifox-mock generate",
72
+ "auto-mock": "apifox-mock generate",
64
73
  "mock:serve": "apifox-mock serve",
65
74
  "mock:dev": "apifox-mock dev"
66
75
  }
@@ -79,6 +88,12 @@ npm run mock:generate
79
88
  npm run mock:serve
80
89
  ```
81
90
 
91
+ > ⚠️ **执行前提条件**:
92
+ >
93
+ > - 必须先运行 `npm run generate` 生成 Mock 文件
94
+ > - 确保 `apifox.config.json` 配置文件存在且配置正确
95
+ > - 确保 `mock/` 对应项目根目录存在且包含有效的 Mock 文件
96
+
82
97
  ### 5. 配置代理(Vite 项目)
83
98
 
84
99
  在 `vite.config.ts` 中:
@@ -93,21 +108,21 @@ export default defineConfig({
93
108
  }
94
109
  }
95
110
  }
96
- })
111
+ });
97
112
  ```
98
113
 
99
114
  ### 6. 使用生成的类型
100
115
 
101
116
  ```typescript
102
- import type { LoginRequest, LoginResponse } from './src/types/api/auth/login'
117
+ import type { LoginRequest, LoginResponse } from './src/types/api/auth/login';
103
118
 
104
119
  const login = async (data: LoginRequest): Promise<LoginResponse> => {
105
120
  const response = await fetch('/api/auth/login', {
106
121
  method: 'POST',
107
122
  body: JSON.stringify(data)
108
- })
109
- return response.json()
110
- }
123
+ });
124
+ return response.json();
125
+ };
111
126
  ```
112
127
 
113
128
  ## 🔧 配置说明
@@ -138,11 +153,7 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
138
153
  "apiFilter": {
139
154
  "scope": {
140
155
  "type": "ALL",
141
- "excludedByTags": ["已废弃", "测试接口"]
142
- },
143
- "options": {
144
- "includeApifoxExtensionProperties": false,
145
- "addFoldersToTags": true
156
+ "excludedByTags": ["设计中", "已废弃"]
146
157
  },
147
158
  "includePaths": ["/api/auth/**", "/api/user/**"],
148
159
  "excludePaths": ["/api/admin/**"],
@@ -156,38 +167,48 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
156
167
 
157
168
  **`scope` 配置** - 控制从 Apifox 导出哪些接口:
158
169
 
159
- | 参数 | 类型 | 说明 |
160
- |------|------|------|
161
- | `type` | `'ALL' \| 'FOLDER' \| 'TAG' \| 'API_LIST'` | 导出类型:全部/按文件夹/按标签/按 API ID |
162
- | `includedByTags` | `string[]` | 包含的标签 |
163
- | `excludedByTags` | `string[]` | 排除的标签 |
164
- | `folderPath` | `string` | 文件夹路径(type 为 FOLDER 时) |
165
- | `apiIdList` | `string[]` | API ID 列表(type 为 API_LIST 时) |
170
+ | 参数 | 类型 | 说明 |
171
+ | ---------------- | ------------------------------------------ | --------------------------------------------------------- |
172
+ | `type` | `'ALL' \| 'FOLDER' \| 'TAG' \| 'API_LIST'` | 导出类型:全部/按文件夹/按标签/按 API ID |
173
+ | `includedByTags` | `string[]` | 包含的标签 |
174
+ | `excludedByTags` | `string[]` | 排除的接口状态(支持中文:`设计中`、`已废弃`、`待定` 等) |
175
+ | `folderPath` | `string` | 文件夹路径(type 为 FOLDER 时) |
176
+ | `apiIdList` | `string[]` | API ID 列表(type 为 API_LIST 时) |
177
+
178
+ > 📝 **注意**: 系统默认启用 Apifox 扩展属性和文件夹标签功能,无需额外配置。
166
179
 
167
- **`options` 配置** - 导出选项:
180
+ #### 接口状态映射
168
181
 
169
- | 参数 | 类型 | 说明 |
170
- |------|------|------|
171
- | `includeApifoxExtensionProperties` | `boolean` | 是否包含 Apifox 扩展属性 |
172
- | `addFoldersToTags` | `boolean` | 是否将文件夹路径添加到标签 |
182
+ `excludedByTags` 支持中文状态配置,系统会自动映射到 Apifox 的英文状态:
183
+
184
+ | 中文状态 | 英文状态 | 说明 |
185
+ | -------- | ------------ | -------------- |
186
+ | `设计中` | `designing` | 接口正在设计中 |
187
+ | `开发中` | `developing` | 接口正在开发中 |
188
+ | `已完成` | `completed` | 接口开发完成 |
189
+ | `已废弃` | `deprecated` | 接口已废弃 |
190
+ | `待定` | `pending` | 接口状态待定 |
191
+ | `测试中` | `testing` | 接口正在测试 |
192
+ | `已发布` | `published` | 接口已发布 |
173
193
 
174
194
  #### 客户端过滤(生成时)
175
195
 
176
196
  在生成 Mock 和类型文件时进行二次过滤:
177
197
 
178
- | 参数 | 类型 | 说明 |
179
- |------|------|------|
180
- | `includePaths` | `string[]` | 只包含这些路径(支持 `*` 和 `**` 通配符) |
181
- | `excludePaths` | `string[]` | 排除这些路径 |
182
- | `includeOperationIds` | `string[]` | 只包含这些 operationId |
183
- | `excludeOperationIds` | `string[]` | 排除这些 operationId |
184
- | `excludeDeprecated` | `boolean` | 排除废弃的接口 |
185
- | `includeMethods` | `string[]` | 只包含这些 HTTP 方法 |
186
- | `excludeMethods` | `string[]` | 排除这些 HTTP 方法 |
198
+ | 参数 | 类型 | 说明 |
199
+ | --------------------- | ---------- | ----------------------------------------- |
200
+ | `includePaths` | `string[]` | 只包含这些路径(支持 `*` 和 `**` 通配符) |
201
+ | `excludePaths` | `string[]` | 排除这些路径 |
202
+ | `includeOperationIds` | `string[]` | 只包含这些 operationId |
203
+ | `excludeOperationIds` | `string[]` | 排除这些 operationId |
204
+ | `excludeDeprecated` | `boolean` | 排除废弃的接口 |
205
+ | `includeMethods` | `string[]` | 只包含这些 HTTP 方法 |
206
+ | `excludeMethods` | `string[]` | 排除这些 HTTP 方法 |
187
207
 
188
208
  #### 常用场景
189
209
 
190
210
  **场景 1:导出所有接口,排除已废弃**
211
+
191
212
  ```json
192
213
  {
193
214
  "apiFilter": {
@@ -200,6 +221,7 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
200
221
  ```
201
222
 
202
223
  **场景 2:只导出指定文件夹**
224
+
203
225
  ```json
204
226
  {
205
227
  "apiFilter": {
@@ -212,6 +234,7 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
212
234
  ```
213
235
 
214
236
  **场景 3:按标签导出**
237
+
215
238
  ```json
216
239
  {
217
240
  "apiFilter": {
@@ -224,6 +247,7 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
224
247
  ```
225
248
 
226
249
  **场景 4:服务端 + 客户端双重过滤**
250
+
227
251
  ```json
228
252
  {
229
253
  "apiFilter": {
@@ -269,6 +293,63 @@ npm run mock:dev
269
293
 
270
294
  ## 🎯 高级用法
271
295
 
296
+ ### 🎭 Apifox Mock 规则
297
+
298
+ 本工具**直接使用 Apifox 中配置的 mock 规则**,无需在本地重复配置。只需在 Apifox 中设置好字段的 mock 规则,生成时会自动应用。
299
+
300
+ #### 工作原理
301
+
302
+ 1. **在 Apifox 中配置** - 为每个字段设置 mock 规则(支持 Mock.js 语法和 Apifox 模板语法)
303
+ 2. **自动拉取规则** - 启用 `includeApifoxExtensionProperties` 后,导出的 OpenAPI 数据中会包含 `x-apifox-mock` 扩展字段
304
+ 3. **智能转换** - 自动将 Apifox 模板语法(如 `{{$string.uuid}}`)转换为 Mock.js 语法(如 `@guid`)
305
+ 4. **生成 Mock 文件** - 工具自动提取并转换 Apifox 的 mock 规则,生成本地 Mock 文件
306
+
307
+ #### 示例
308
+
309
+ 在 Apifox 中配置字段的 mock 规则:
310
+
311
+ ```
312
+ 字段名: id
313
+ 类型: string
314
+ Mock 规则: {{$string.uuid}} ← Apifox 模板语法
315
+
316
+ 字段名: name
317
+ 类型: string
318
+ Mock 规则: {{$person.fullName(locale='zh_CN')}}
319
+
320
+ 字段名: code
321
+ 类型: number
322
+ Mock 规则: @integer(0, 999) ← Mock.js 语法
323
+ ```
324
+
325
+ 生成的 Mock 文件会自动转换:
326
+
327
+ ```javascript
328
+ Mock.mock({
329
+ code: '@integer(0, 999)', // 直接使用 Mock.js 规则
330
+ data: {
331
+ id: '@guid', // {{$string.uuid}} → @guid
332
+ name: '@cname', // {{$person.fullName(locale='zh_CN')}} → @cname
333
+ email: '@email' // 直接使用 Mock.js 规则
334
+ }
335
+ });
336
+ ```
337
+
338
+ #### 优势
339
+
340
+ - ✅ **统一管理** - 在 Apifox 中统一管理所有 mock 规则,团队协作更方便
341
+ - ✅ **完全一致** - 本地 Mock 数据与 Apifox 云端 Mock 保持一致
342
+ - ✅ **智能转换** - 自动转换 Apifox 模板语法为 Mock.js 语法,无缝兼容
343
+ - ✅ **双语法支持** - 同时支持 Mock.js 语法(`@xxx`)和 Apifox 模板语法(`{{$xxx}}`)
344
+
345
+ #### 回退策略
346
+
347
+ 如果字段没有配置 Apifox mock 规则,会使用以下回退策略:
348
+
349
+ 1. **示例值** - 使用 schema 中定义的 `example`
350
+ 2. **枚举值** - 使用 `enum` 中的值(通过 `@pick` 随机选择)
351
+ 3. **基本规则** - 根据字段类型使用简单的默认规则(如字符串用 `@cword(3,8)`)
352
+
272
353
  ### 自定义 Mock 数据
273
354
 
274
355
  修改生成的 Mock 文件(如 `mock/api/auth/login.js`):
@@ -281,11 +362,11 @@ export default {
281
362
  code: 0,
282
363
  message: 'success',
283
364
  data: {
284
- token: 'custom-token-12345', // 自定义数据
365
+ token: 'custom-token-12345', // 自定义数据
285
366
  userId: 10086
286
367
  }
287
368
  }
288
- }
369
+ };
289
370
  ```
290
371
 
291
372
  > ⚠️ 注意:重新运行 `apifox-mock generate` 会覆盖自定义的修改
@@ -366,6 +447,7 @@ npm run mock:generate
366
447
  ```
367
448
 
368
449
  执行过程:
450
+
369
451
  - 从 Apifox 拉取 API 定义
370
452
  - 应用筛选规则
371
453
  - 生成 TypeScript 类型 → `src/types/api/`
@@ -392,20 +474,20 @@ export default defineConfig({
392
474
  }
393
475
  }
394
476
  }
395
- })
477
+ });
396
478
  ```
397
479
 
398
480
  #### 5️⃣ 在代码中使用
399
481
 
400
482
  ```typescript
401
483
  // 导入类型
402
- import type { LoginRequest, LoginResponse } from '@/types/api/auth/login'
484
+ import type { LoginRequest, LoginResponse } from '@/types/api/auth/login';
403
485
 
404
486
  // 发起请求(自动代理到 Mock 服务器)
405
487
  const response = await fetch('/api/auth/login', {
406
488
  method: 'POST',
407
489
  body: JSON.stringify(data)
408
- })
490
+ });
409
491
  ```
410
492
 
411
493
  ### 项目结构
@@ -455,7 +537,7 @@ apifox-mock-generator/
455
537
  │ │ └── openapi-converter.ts # OpenAPI 转换器
456
538
  │ ├── generators/ # 生成器模块
457
539
  │ │ ├── templates/ # 模板生成
458
- │ │ │ ├── mock-template.ts # Mock 文件模板
540
+ │ │ │ ├── mock-template.ts # Mock 文件模板(使用 Apifox mock 规则)
459
541
  │ │ │ └── type-template.ts # TypeScript 类型模板
460
542
  │ │ ├── mock-generator.ts # Mock 文件生成器
461
543
  │ │ └── type-generator.ts # 类型文件生成器
@@ -493,23 +575,23 @@ apifox-mock-generator/
493
575
 
494
576
  项目采用**模块化分层架构**,职责清晰分离:
495
577
 
496
- | 层级 | 目录 | 职责 |
497
- |------|------|------|
498
- | **核心层** | `core/` | Apifox API 交互、配置加载、OpenAPI 转换和过滤 |
499
- | **生成层** | `generators/` | Mock 和 TypeScript 类型生成、代码模板 |
500
- | **服务层** | `server/` | Express 服务器、动态路由、热重载、参数校验 |
501
- | **工具层** | `utils/` | 文件操作、增量更新、代码格式化、日志输出 |
502
- | **脚本层** | `scripts/` | CLI 命令入口(generate、serve) |
503
- | **类型层** | `types/` | 公共 TypeScript 类型定义 |
578
+ | 层级 | 目录 | 职责 |
579
+ | ---------- | ------------- | --------------------------------------------- |
580
+ | **核心层** | `core/` | Apifox API 交互、配置加载、OpenAPI 转换和过滤 |
581
+ | **生成层** | `generators/` | Mock 和 TypeScript 类型生成、代码模板 |
582
+ | **服务层** | `server/` | Express 服务器、动态路由、热重载、参数校验 |
583
+ | **工具层** | `utils/` | 文件操作、增量更新、代码格式化、日志输出 |
584
+ | **脚本层** | `scripts/` | CLI 命令入口(generate、serve) |
585
+ | **类型层** | `types/` | 公共 TypeScript 类型定义 |
504
586
 
505
587
  ## 🛠️ 脚本说明
506
588
 
507
- | 命令 | 说明 |
508
- |------|------|
509
- | `npm run build` | 编译 TypeScript 代码 |
589
+ | 命令 | 说明 |
590
+ | ------------------ | ------------------------------------------- |
591
+ | `npm run build` | 编译 TypeScript 代码 |
510
592
  | `npm run generate` | 一键生成(拉取 API + 生成 Mock + 生成类型) |
511
- | `npm run serve` | 启动 Mock 服务器 |
512
- | `npm run dev` | 开发模式(generate + serve) |
593
+ | `npm run serve` | 启动 Mock 服务器 |
594
+ | `npm run dev` | 开发模式(generate + serve) |
513
595
 
514
596
  ## 📚 技术栈
515
597
 
@@ -537,6 +619,7 @@ apifox-mock-generator/
537
619
  ### 1. 拉取 API 失败?
538
620
 
539
621
  检查:
622
+
540
623
  - `projectId` 和 `token` 是否正确
541
624
  - Token 是否有「项目维护者」或「管理员」权限
542
625
  - 网络连接是否正常
@@ -548,6 +631,7 @@ apifox-mock-generator/
548
631
  ### 3. 没有生成任何文件?
549
632
 
550
633
  检查:
634
+
551
635
  - `apiFilter` 筛选规则是否过于严格
552
636
  - Apifox 项目中是否有匹配的接口
553
637
  - 查看终端输出的错误信息
@@ -556,6 +640,7 @@ apifox-mock-generator/
556
640
  ### 4. 类型生成不准确?
557
641
 
558
642
  建议:
643
+
559
644
  - 在 Apifox 中完善接口的数据模型定义
560
645
  - 使用 JSON Schema 定义清晰的数据结构
561
646
  - 为每个字段添加描述和示例
@@ -563,10 +648,36 @@ apifox-mock-generator/
563
648
  ### 5. 热重载不生效?
564
649
 
565
650
  确认:
651
+
566
652
  - Mock 文件保存成功
567
653
  - 查看终端是否有文件变化的提示
568
654
  - 检查文件路径是否在 `mockDir` 配置的目录下
569
655
 
656
+ ### 6. 启动 Mock 服务器失败?
657
+
658
+ 检查以下条件:
659
+
660
+ - ✅ **配置文件存在** - 确保 `apifox.config.json` 在项目根目录
661
+ - ✅ **Mock 目录存在** - 确保 `mock/` 目录存在且不为空
662
+ - ✅ **项目已编译** - 运行 `npm run build` 编译代码
663
+ - ✅ **Mock 文件已生成** - 先运行 `npm run generate` 生成 Mock 文件
664
+ - ✅ **端口未被占用** - 检查 `mockPort` 配置的端口是否可用
665
+
666
+ 常见错误及解决方案:
667
+
668
+ ```bash
669
+ # 错误:未找到 apifox.config.json 配置文件
670
+ # 解决:创建配置文件
671
+ cp apifox.config.json.example apifox.config.json
672
+
673
+ # 错误:未找到 Mock 目录
674
+ # 解决:先生成 Mock 文件
675
+ npm run generate
676
+
677
+ # 错误:未找到任何 Mock 文件
678
+ # 解决:检查 API 筛选配置,确保有匹配的接口
679
+ ```
680
+
570
681
  ## 🤝 不同框架的配置示例
571
682
 
572
683
  ### Vue CLI 项目
@@ -582,7 +693,7 @@ module.exports = {
582
693
  }
583
694
  }
584
695
  }
585
- }
696
+ };
586
697
  ```
587
698
 
588
699
  ### React (Create React App)
@@ -600,7 +711,7 @@ module.exports = {
600
711
  // src/setupProxy.js
601
712
  const { createProxyMiddleware } = require('http-proxy-middleware');
602
713
 
603
- module.exports = function(app) {
714
+ module.exports = function (app) {
604
715
  app.use(
605
716
  '/api',
606
717
  createProxyMiddleware({
@@ -644,18 +755,38 @@ mock/
644
755
 
645
756
  ### 💡 最佳实践
646
757
 
647
- | 场景 | 建议 |
648
- |------|------|
649
- | **配置文件** | `apifox.config.json` 不要提交,提供 `.example` 示例 |
650
- | **类型文件** | 建议提交到 Git,团队共享类型定义 |
651
- | **Mock 数据** | 可以不提交,每个开发者自行生成 |
652
- | **切换环境** | 后端完成后只需修改代理配置,代码无需改动 |
758
+ | 场景 | 建议 |
759
+ | ------------- | --------------------------------------------------- |
760
+ | **配置文件** | `apifox.config.json` 不要提交,提供 `.example` 示例 |
761
+ | **类型文件** | 建议提交到 Git,团队共享类型定义 |
762
+ | **Mock 数据** | 可以不提交,每个开发者自行生成 |
763
+ | **切换环境** | 后端完成后只需修改代理配置,代码无需改动 |
653
764
 
654
765
  ## 📝 更新日志
655
766
 
767
+ ### v1.1.0 (2025-10-13)
768
+
769
+ #### 🎯 核心功能
770
+
771
+ - 🎭 **直接使用 Apifox Mock 规则** - 使用 Apifox 中配置的 mock 规则,本地与云端保持完全一致
772
+ - 🔄 **统一管理** - Mock 规则在 Apifox 平台统一管理,团队协作更方便
773
+
774
+ #### ✨ 新功能
775
+
776
+ - ✅ 支持 Apifox 的 `x-apifox-mock` 扩展字段,提取 mock 规则
777
+ - ✅ 智能转换 Apifox 模板语法(`{{$xxx}}`)为 Mock.js 语法(`@xxx`)
778
+ - ✅ 同时支持 Mock.js 和 Apifox 两种语法
779
+ - ✅ 完善的回退策略(示例值 → 枚举值 → 基本规则)
780
+
781
+ #### 📖 文档更新
782
+
783
+ - 新增"Apifox Mock 规则"章节,说明使用方法
784
+ - 更新项目结构说明
785
+
656
786
  ### v1.0.0 (2025-10-10)
657
787
 
658
788
  #### 核心功能
789
+
659
790
  - 🚀 **Apifox API 客户端** - 从 Apifox 项目拉取 API 接口定义
660
791
  - 📝 **类型生成器** - 自动生成 TypeScript 类型文件(.ts 格式)
661
792
  - 🎭 **Mock 生成器** - 基于 Schema 自动生成 Mock 数据文件
@@ -663,6 +794,7 @@ mock/
663
794
  - 🔥 **热重载** - 修改 Mock 文件自动生效,无需重启服务器
664
795
 
665
796
  #### 高级特性
797
+
666
798
  - 🎯 **API 筛选** - 支持路径、方法、标签、操作 ID 等多维度筛选
667
799
  - ⚡ **增量更新** - 智能识别文件变化,仅更新必要的内容
668
800
  - 🎨 **代码格式化** - 使用 Prettier 格式化生成的代码
@@ -671,6 +803,7 @@ mock/
671
803
  - ✅ **参数校验** - 基于 Schema 的请求参数验证
672
804
 
673
805
  #### 支持的特性
806
+
674
807
  - ✅ OpenAPI 3.0 规范
675
808
  - ✅ HTTP 方法:GET、POST、PUT、DELETE、PATCH
676
809
  - ✅ 路径参数、查询参数、请求体、响应体
@@ -785,4 +918,3 @@ copies or substantial portions of the Software.
785
918
  如有问题或建议,欢迎提 [Issue](https://github.com/yourname/apifox-mock-generator/issues)!
786
919
 
787
920
  ⭐ 如果这个项目对你有帮助,请给一个 Star!
788
-
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apifox-mock-generator",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "从Apifox拉取API接口并生成本地mock和TypeScript类型文件",
5
5
  "main": "dist/src/index.js",
6
6
  "type": "module",
@@ -1 +1 @@
1
- {"version":3,"file":"apifox-client.d.ts","sourceRoot":"","sources":["../../../src/core/apifox-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CA6B/E"}
1
+ {"version":3,"file":"apifox-client.d.ts","sourceRoot":"","sources":["../../../src/core/apifox-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,GAAG,CAAC,CA8Bd"}