apifox-mock-generator 1.0.0 → 1.1.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,84 @@
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.0] - 2025-10-13
9
+
10
+ ### 🎯 核心功能
11
+
12
+ #### 🎭 直接使用 Apifox Mock 规则
13
+
14
+ - **使用 Apifox 配置** - 直接使用 Apifox 中为字段配置的 mock 规则
15
+ - **统一管理** - Mock 规则在 Apifox 平台统一管理,本地与云端保持完全一致
16
+ - **零配置** - 在 Apifox 中配置好 mock 规则,生成时自动应用
17
+
18
+ ### ✨ 新增功能
19
+
20
+ #### 🔄 Apifox Mock 规则支持
21
+
22
+ - **x-apifox-mock 字段** - 自动提取 Apifox 的 `x-apifox-mock` 扩展字段中的 mock 规则
23
+ - **智能语法转换** - 自动将 Apifox 模板语法(`{{$xxx}}`)转换为 Mock.js 语法(`@xxx`)
24
+ - **双语法支持** - 同时支持 Mock.js 语法和 Apifox 模板语法
25
+ - **自动应用** - 启用 `includeApifoxExtensionProperties` 后自动拉取和应用规则
26
+
27
+ 支持的 Apifox 模板转换:
28
+ - `{{$string.uuid}}` → `@guid`
29
+ - `{{$person.fullName(locale='zh_CN')}}` → `@cname`
30
+ - `{{$internet.email}}` → `@email`
31
+ - `{{$phone.number}}` → `/^1[3-9]\\d{9}$/`
32
+ - 更多模板映射...
33
+
34
+ #### 📊 回退策略
35
+
36
+ 当字段没有配置 Apifox mock 规则时,使用以下回退策略:
37
+
38
+ 1. **示例值优先** - 使用 schema 中定义的 `example`
39
+ 2. **枚举值** - 使用 `enum` 中的值(通过 `@pick` 随机选择)
40
+ 3. **基本规则** - 根据字段类型使用简单的默认规则
41
+ - 字符串:`@cword(3, 8)`
42
+ - 数字/整数:根据 `minimum/maximum` 生成范围
43
+ - 布尔值:`@boolean`
44
+
45
+ ### 📖 文档更新
46
+
47
+ - **README.md** - 新增"Apifox Mock 规则"章节
48
+ - 说明工作原理和使用方法
49
+ - 提供使用示例
50
+ - 更新项目结构说明
51
+ - **CHANGELOG.md** - 详细记录所有变更
52
+
53
+ ### 🎯 优势
54
+
55
+ - ✅ **统一管理** - 在 Apifox 中统一管理所有 mock 规则,团队协作更方便
56
+ - ✅ **完全一致** - 本地 Mock 数据与 Apifox 云端 Mock 保持一致
57
+ - ✅ **零学习成本** - 使用 Apifox 原生的 mock 规则,无需学习新语法
58
+ - ✅ **功能完整** - 支持 Apifox 的所有 mock 规则和高级功能
59
+
60
+ ### 🚀 使用示例
61
+
62
+ 在 Apifox 中配置字段的 mock 规则:
63
+
64
+ ```
65
+ 字段名: email
66
+ 类型: string
67
+ Mock 规则: @email
68
+ ```
69
+
70
+ 生成的 Mock 文件会自动应用该规则:
71
+
72
+ ```javascript
73
+ Mock.mock({
74
+ email: '@email' // 直接使用 Apifox 配置的规则
75
+ })
76
+ ```
77
+
78
+ ### ⚡ 兼容性
79
+
80
+ - 向下兼容 v1.0.0
81
+ - 无需修改配置文件
82
+ - 自动应用 Apifox mock 规则
83
+
84
+ ---
85
+
8
86
  ## [1.0.0] - 2025-10-10
9
87
 
10
88
  ### ✨ 初始版本发布
package/README.md CHANGED
@@ -18,7 +18,7 @@
18
18
  ### 核心功能
19
19
  - 🚀 **Apifox 集成** - 自动从 Apifox 项目拉取 API 接口定义(支持 OpenAPI 3.0)
20
20
  - 📝 **类型生成** - 生成 TypeScript 类型文件(.ts 格式),支持复杂类型、嵌套对象、枚举等
21
- - 🎭 **Mock 生成** - 基于 Schema 自动生成 Mock 数据,使用 Faker.js 生成真实感数据
21
+ - 🎭 **Apifox Mock** - **✨ 直接使用 Apifox mock 规则**,无需本地配置,完全继承 Apifox 的数据生成能力
22
22
  - 🌐 **Mock 服务器** - 基于 Express 的本地 Mock 服务,快速响应,支持 CORS
23
23
 
24
24
  ### 高级特性
@@ -53,14 +53,13 @@ pnpm add apifox-mock-generator -D
53
53
  }
54
54
  ```
55
55
 
56
- > ⚠️ 重要:此文件包含敏感信息,请添加到 `.gitignore`
57
56
 
58
57
  ### 2. 配置 package.json 脚本
59
58
 
60
59
  ```json
61
60
  {
62
61
  "scripts": {
63
- "mock:generate": "apifox-mock generate",
62
+ "auto-mock": "apifox-mock generate",
64
63
  "mock:serve": "apifox-mock serve",
65
64
  "mock:dev": "apifox-mock dev"
66
65
  }
@@ -140,10 +139,6 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
140
139
  "type": "ALL",
141
140
  "excludedByTags": ["已废弃", "测试接口"]
142
141
  },
143
- "options": {
144
- "includeApifoxExtensionProperties": false,
145
- "addFoldersToTags": true
146
- },
147
142
  "includePaths": ["/api/auth/**", "/api/user/**"],
148
143
  "excludePaths": ["/api/admin/**"],
149
144
  "excludeDeprecated": true,
@@ -164,12 +159,7 @@ const login = async (data: LoginRequest): Promise<LoginResponse> => {
164
159
  | `folderPath` | `string` | 文件夹路径(type 为 FOLDER 时) |
165
160
  | `apiIdList` | `string[]` | API ID 列表(type 为 API_LIST 时) |
166
161
 
167
- **`options` 配置** - 导出选项:
168
-
169
- | 参数 | 类型 | 说明 |
170
- |------|------|------|
171
- | `includeApifoxExtensionProperties` | `boolean` | 是否包含 Apifox 扩展属性 |
172
- | `addFoldersToTags` | `boolean` | 是否将文件夹路径添加到标签 |
162
+ > 📝 **注意**: 系统默认启用 Apifox 扩展属性和文件夹标签功能,无需额外配置。
173
163
 
174
164
  #### 客户端过滤(生成时)
175
165
 
@@ -269,6 +259,63 @@ npm run mock:dev
269
259
 
270
260
  ## 🎯 高级用法
271
261
 
262
+ ### 🎭 Apifox Mock 规则
263
+
264
+ 本工具**直接使用 Apifox 中配置的 mock 规则**,无需在本地重复配置。只需在 Apifox 中设置好字段的 mock 规则,生成时会自动应用。
265
+
266
+ #### 工作原理
267
+
268
+ 1. **在 Apifox 中配置** - 为每个字段设置 mock 规则(支持 Mock.js 语法和 Apifox 模板语法)
269
+ 2. **自动拉取规则** - 启用 `includeApifoxExtensionProperties` 后,导出的 OpenAPI 数据中会包含 `x-apifox-mock` 扩展字段
270
+ 3. **智能转换** - 自动将 Apifox 模板语法(如 `{{$string.uuid}}`)转换为 Mock.js 语法(如 `@guid`)
271
+ 4. **生成 Mock 文件** - 工具自动提取并转换 Apifox 的 mock 规则,生成本地 Mock 文件
272
+
273
+ #### 示例
274
+
275
+ 在 Apifox 中配置字段的 mock 规则:
276
+
277
+ ```
278
+ 字段名: id
279
+ 类型: string
280
+ Mock 规则: {{$string.uuid}} ← Apifox 模板语法
281
+
282
+ 字段名: name
283
+ 类型: string
284
+ Mock 规则: {{$person.fullName(locale='zh_CN')}}
285
+
286
+ 字段名: code
287
+ 类型: number
288
+ Mock 规则: @integer(0, 999) ← Mock.js 语法
289
+ ```
290
+
291
+ 生成的 Mock 文件会自动转换:
292
+
293
+ ```javascript
294
+ Mock.mock({
295
+ code: '@integer(0, 999)', // 直接使用 Mock.js 规则
296
+ data: {
297
+ id: '@guid', // {{$string.uuid}} → @guid
298
+ name: '@cname', // {{$person.fullName(locale='zh_CN')}} → @cname
299
+ email: '@email' // 直接使用 Mock.js 规则
300
+ }
301
+ })
302
+ ```
303
+
304
+ #### 优势
305
+
306
+ - ✅ **统一管理** - 在 Apifox 中统一管理所有 mock 规则,团队协作更方便
307
+ - ✅ **完全一致** - 本地 Mock 数据与 Apifox 云端 Mock 保持一致
308
+ - ✅ **智能转换** - 自动转换 Apifox 模板语法为 Mock.js 语法,无缝兼容
309
+ - ✅ **双语法支持** - 同时支持 Mock.js 语法(`@xxx`)和 Apifox 模板语法(`{{$xxx}}`)
310
+
311
+ #### 回退策略
312
+
313
+ 如果字段没有配置 Apifox mock 规则,会使用以下回退策略:
314
+
315
+ 1. **示例值** - 使用 schema 中定义的 `example`
316
+ 2. **枚举值** - 使用 `enum` 中的值(通过 `@pick` 随机选择)
317
+ 3. **基本规则** - 根据字段类型使用简单的默认规则(如字符串用 `@cword(3,8)`)
318
+
272
319
  ### 自定义 Mock 数据
273
320
 
274
321
  修改生成的 Mock 文件(如 `mock/api/auth/login.js`):
@@ -455,7 +502,7 @@ apifox-mock-generator/
455
502
  │ │ └── openapi-converter.ts # OpenAPI 转换器
456
503
  │ ├── generators/ # 生成器模块
457
504
  │ │ ├── templates/ # 模板生成
458
- │ │ │ ├── mock-template.ts # Mock 文件模板
505
+ │ │ │ ├── mock-template.ts # Mock 文件模板(使用 Apifox mock 规则)
459
506
  │ │ │ └── type-template.ts # TypeScript 类型模板
460
507
  │ │ ├── mock-generator.ts # Mock 文件生成器
461
508
  │ │ └── type-generator.ts # 类型文件生成器
@@ -653,6 +700,22 @@ mock/
653
700
 
654
701
  ## 📝 更新日志
655
702
 
703
+ ### v1.1.0 (2025-10-13)
704
+
705
+ #### 🎯 核心功能
706
+ - 🎭 **直接使用 Apifox Mock 规则** - 使用 Apifox 中配置的 mock 规则,本地与云端保持完全一致
707
+ - 🔄 **统一管理** - Mock 规则在 Apifox 平台统一管理,团队协作更方便
708
+
709
+ #### ✨ 新功能
710
+ - ✅ 支持 Apifox 的 `x-apifox-mock` 扩展字段,提取 mock 规则
711
+ - ✅ 智能转换 Apifox 模板语法(`{{$xxx}}`)为 Mock.js 语法(`@xxx`)
712
+ - ✅ 同时支持 Mock.js 和 Apifox 两种语法
713
+ - ✅ 完善的回退策略(示例值 → 枚举值 → 基本规则)
714
+
715
+ #### 📖 文档更新
716
+ - 新增"Apifox Mock 规则"章节,说明使用方法
717
+ - 更新项目结构说明
718
+
656
719
  ### v1.0.0 (2025-10-10)
657
720
 
658
721
  #### 核心功能
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.1.0",
4
4
  "description": "从Apifox拉取API接口并生成本地mock和TypeScript类型文件",
5
5
  "main": "dist/src/index.js",
6
6
  "type": "module",
@@ -60,18 +60,11 @@ function buildRequestBody(config) {
60
60
  requestBody.scope = scope;
61
61
  }
62
62
  }
63
- if (config.apiFilter.options) {
64
- const options = {};
65
- if (config.apiFilter.options.includeApifoxExtensionProperties !== undefined) {
66
- options.includeApifoxExtensionProperties = config.apiFilter.options.includeApifoxExtensionProperties;
67
- }
68
- if (config.apiFilter.options.addFoldersToTags !== undefined) {
69
- options.addFoldersToTags = config.apiFilter.options.addFoldersToTags;
70
- }
71
- if (Object.keys(options).length > 0) {
72
- requestBody.options = options;
73
- }
74
- }
63
+ // 始终启用 Apifox 扩展属性和文件夹标签(写死为 true)
64
+ requestBody.options = {
65
+ includeApifoxExtensionProperties: true,
66
+ addFoldersToTags: true
67
+ };
75
68
  }
76
69
  return requestBody;
77
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apifox-client.js","sourceRoot":"","sources":["../../../src/core/apifox-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apifox-client.js","sourceRoot":"","sources":["../../../src/core/apifox-client.ts"],"names":[],"mappings":"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"}