apifox-mock-generator 1.0.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 (109) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/LICENSE +22 -0
  3. package/README.md +788 -0
  4. package/dist/package.json +61 -0
  5. package/dist/src/core/apifox-client.d.ts +6 -0
  6. package/dist/src/core/apifox-client.d.ts.map +1 -0
  7. package/dist/src/core/apifox-client.js +114 -0
  8. package/dist/src/core/apifox-client.js.map +1 -0
  9. package/dist/src/core/config-loader.d.ts +6 -0
  10. package/dist/src/core/config-loader.d.ts.map +1 -0
  11. package/dist/src/core/config-loader.js +16 -0
  12. package/dist/src/core/config-loader.js.map +1 -0
  13. package/dist/src/core/endpoint-filter.d.ts +12 -0
  14. package/dist/src/core/endpoint-filter.d.ts.map +1 -0
  15. package/dist/src/core/endpoint-filter.js +77 -0
  16. package/dist/src/core/endpoint-filter.js.map +1 -0
  17. package/dist/src/core/openapi-converter.d.ts +6 -0
  18. package/dist/src/core/openapi-converter.d.ts.map +1 -0
  19. package/dist/src/core/openapi-converter.js +35 -0
  20. package/dist/src/core/openapi-converter.js.map +1 -0
  21. package/dist/src/generators/mock-generator.d.ts +6 -0
  22. package/dist/src/generators/mock-generator.d.ts.map +1 -0
  23. package/dist/src/generators/mock-generator.js +30 -0
  24. package/dist/src/generators/mock-generator.js.map +1 -0
  25. package/dist/src/generators/templates/mock-template.d.ts +6 -0
  26. package/dist/src/generators/templates/mock-template.d.ts.map +1 -0
  27. package/dist/src/generators/templates/mock-template.js +283 -0
  28. package/dist/src/generators/templates/mock-template.js.map +1 -0
  29. package/dist/src/generators/templates/type-template.d.ts +18 -0
  30. package/dist/src/generators/templates/type-template.d.ts.map +1 -0
  31. package/dist/src/generators/templates/type-template.js +201 -0
  32. package/dist/src/generators/templates/type-template.js.map +1 -0
  33. package/dist/src/generators/type-generator.d.ts +6 -0
  34. package/dist/src/generators/type-generator.d.ts.map +1 -0
  35. package/dist/src/generators/type-generator.js +31 -0
  36. package/dist/src/generators/type-generator.js.map +1 -0
  37. package/dist/src/index.d.ts +4 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/index.js +9 -0
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/scripts/cli.d.ts +3 -0
  42. package/dist/src/scripts/cli.d.ts.map +1 -0
  43. package/dist/src/scripts/cli.js +28 -0
  44. package/dist/src/scripts/cli.js.map +1 -0
  45. package/dist/src/scripts/generate-mock.d.ts +2 -0
  46. package/dist/src/scripts/generate-mock.d.ts.map +1 -0
  47. package/dist/src/scripts/generate-mock.js +49 -0
  48. package/dist/src/scripts/generate-mock.js.map +1 -0
  49. package/dist/src/scripts/serve-mock.d.ts +2 -0
  50. package/dist/src/scripts/serve-mock.d.ts.map +1 -0
  51. package/dist/src/scripts/serve-mock.js +49 -0
  52. package/dist/src/scripts/serve-mock.js.map +1 -0
  53. package/dist/src/server/express-server.d.ts +7 -0
  54. package/dist/src/server/express-server.d.ts.map +1 -0
  55. package/dist/src/server/express-server.js +85 -0
  56. package/dist/src/server/express-server.js.map +1 -0
  57. package/dist/src/server/hot-reload.d.ts +7 -0
  58. package/dist/src/server/hot-reload.d.ts.map +1 -0
  59. package/dist/src/server/hot-reload.js +57 -0
  60. package/dist/src/server/hot-reload.js.map +1 -0
  61. package/dist/src/server/route-loader.d.ts +13 -0
  62. package/dist/src/server/route-loader.d.ts.map +1 -0
  63. package/dist/src/server/route-loader.js +147 -0
  64. package/dist/src/server/route-loader.js.map +1 -0
  65. package/dist/src/server/route-manager.d.ts +13 -0
  66. package/dist/src/server/route-manager.d.ts.map +1 -0
  67. package/dist/src/server/route-manager.js +25 -0
  68. package/dist/src/server/route-manager.js.map +1 -0
  69. package/dist/src/server/route-matcher.d.ts +10 -0
  70. package/dist/src/server/route-matcher.d.ts.map +1 -0
  71. package/dist/src/server/route-matcher.js +35 -0
  72. package/dist/src/server/route-matcher.js.map +1 -0
  73. package/dist/src/server/validation.d.ts +6 -0
  74. package/dist/src/server/validation.d.ts.map +1 -0
  75. package/dist/src/server/validation.js +119 -0
  76. package/dist/src/server/validation.js.map +1 -0
  77. package/dist/src/types/index.d.ts +167 -0
  78. package/dist/src/types/index.d.ts.map +1 -0
  79. package/dist/src/types/index.js +2 -0
  80. package/dist/src/types/index.js.map +1 -0
  81. package/dist/src/utils/block-updater.d.ts +6 -0
  82. package/dist/src/utils/block-updater.d.ts.map +1 -0
  83. package/dist/src/utils/block-updater.js +73 -0
  84. package/dist/src/utils/block-updater.js.map +1 -0
  85. package/dist/src/utils/code-formatter.d.ts +5 -0
  86. package/dist/src/utils/code-formatter.d.ts.map +1 -0
  87. package/dist/src/utils/code-formatter.js +43 -0
  88. package/dist/src/utils/code-formatter.js.map +1 -0
  89. package/dist/src/utils/file-helper.d.ts +21 -0
  90. package/dist/src/utils/file-helper.d.ts.map +1 -0
  91. package/dist/src/utils/file-helper.js +25 -0
  92. package/dist/src/utils/file-helper.js.map +1 -0
  93. package/dist/src/utils/file-operations.d.ts +29 -0
  94. package/dist/src/utils/file-operations.d.ts.map +1 -0
  95. package/dist/src/utils/file-operations.js +62 -0
  96. package/dist/src/utils/file-operations.js.map +1 -0
  97. package/dist/src/utils/logger.d.ts +10 -0
  98. package/dist/src/utils/logger.d.ts.map +1 -0
  99. package/dist/src/utils/logger.js +27 -0
  100. package/dist/src/utils/logger.js.map +1 -0
  101. package/dist/src/utils/path-utils.d.ts +13 -0
  102. package/dist/src/utils/path-utils.d.ts.map +1 -0
  103. package/dist/src/utils/path-utils.js +64 -0
  104. package/dist/src/utils/path-utils.js.map +1 -0
  105. package/dist/src/utils/type-mapping.d.ts +17 -0
  106. package/dist/src/utils/type-mapping.d.ts.map +1 -0
  107. package/dist/src/utils/type-mapping.js +75 -0
  108. package/dist/src/utils/type-mapping.js.map +1 -0
  109. package/package.json +61 -0
@@ -0,0 +1,283 @@
1
+ import { mapTypeToLodashCheck } from '../../utils/type-mapping.js';
2
+ /**
3
+ * 生成 Mock 文件内容(新格式,ES Module 版本,支持增量更新)
4
+ */
5
+ export function generateMockFileContent(endpoint, definitions) {
6
+ const method = endpoint.method.toUpperCase();
7
+ // 生成方法前缀和命名空间(用于注释标记)
8
+ const methodPrefix = endpoint.method.charAt(0).toUpperCase() + endpoint.method.slice(1).toLowerCase();
9
+ const pathSegments = endpoint.path.split('/').filter(s => s && !s.startsWith('{'));
10
+ const resourceName = pathSegments[pathSegments.length - 1]
11
+ ?.split(/[-_]/)
12
+ .map(part => part.charAt(0).toUpperCase() + part.slice(1))
13
+ .join('') || 'Api';
14
+ const namespaceName = `${methodPrefix}${resourceName}`;
15
+ // 生成参数校验数组
16
+ const mockParams = generateMockParams(endpoint);
17
+ // 生成 Mock.js 模板(用于响应数据)
18
+ const mockTemplate = generateMockTemplateForResponse(endpoint.responseBody, definitions);
19
+ // 生成注释标记
20
+ const commentTag = `${endpoint.path}[${method}]`;
21
+ const content = `//[start]${commentTag}
22
+ /**
23
+ * @apiName ${endpoint.name}
24
+ * @apiURI ${endpoint.path}
25
+ * @apiRequestType ${method}
26
+ */
27
+ import Mock from "mockjs";
28
+ import lodash from "lodash";
29
+
30
+ export const check_${namespaceName} = function () {
31
+ \t//ture 本地数据, false 远程服务器数据
32
+ \treturn false;
33
+ };
34
+
35
+ export function ${namespaceName}(query, body, ctx) {
36
+ const options = { req: { query, method: ctx.req.method }, data: JSON.stringify(body) }
37
+
38
+ let apiMethod = lodash.get(options, 'req.method');
39
+ let originQuery = options.req.query;
40
+ let apiParams = apiMethod === 'GET' ? originQuery : JSON.parse(options.data || '{}');
41
+
42
+ // ${endpoint.name}
43
+
44
+ if (apiMethod === '${method}') {
45
+ ${mockParams ? `
46
+ let mockParams = ${mockParams};
47
+ for(let i = 0, len = mockParams.length; i < len; i++) {
48
+ let param = mockParams[i];
49
+ if (param.paramIsRequired && !apiParams.hasOwnProperty(param.paramKey)) {
50
+ return {
51
+ code: 1,
52
+ msg: '缺少必要参数: ' + param.paramKey
53
+ }
54
+ }
55
+ if (apiParams.hasOwnProperty(param.paramKey) && lodash[param.paramType] && !lodash[param.paramType](apiParams[param.paramKey])) {
56
+ return {
57
+ code: 1,
58
+ msg: '参数类型错误: ' + param.paramKey
59
+ }
60
+ }
61
+ }
62
+ ` : ''}
63
+ return new Promise(res => {
64
+ setTimeout(() => {
65
+ res(Mock.mock(${mockTemplate}))
66
+ }, Math.random() * 3000)
67
+
68
+ })
69
+ ;
70
+ }
71
+
72
+
73
+ return {
74
+ code: 1,
75
+ msg: '请检查请求的method或者URI的query是否正确'
76
+ };
77
+ }
78
+ //[end]${commentTag}
79
+ `;
80
+ return content;
81
+ }
82
+ /**
83
+ * 生成参数校验数组
84
+ */
85
+ function generateMockParams(endpoint) {
86
+ const params = [];
87
+ // 收集请求体参数
88
+ if (endpoint.requestBody) {
89
+ const bodyParams = extractParamsFromSchema(endpoint.requestBody);
90
+ params.push(...bodyParams);
91
+ }
92
+ // 收集查询参数和路径参数
93
+ if (endpoint.parameters && endpoint.parameters.length > 0) {
94
+ endpoint.parameters.forEach(param => {
95
+ params.push({
96
+ paramKey: param.name,
97
+ paramType: mapTypeToLodashCheck(param.type),
98
+ paramIsRequired: param.required
99
+ });
100
+ });
101
+ }
102
+ if (params.length === 0) {
103
+ return null;
104
+ }
105
+ // 格式化为多行数组
106
+ const formattedParams = params.map(p => `\n {\n paramKey: '${p.paramKey}',\n paramType: '${p.paramType}',\n paramIsRequired: ${p.paramIsRequired}\n }`).join(',');
107
+ return `[${formattedParams}\n ]`;
108
+ }
109
+ /**
110
+ * 从 schema 提取参数配置
111
+ */
112
+ function extractParamsFromSchema(schema, required = []) {
113
+ if (!schema)
114
+ return [];
115
+ const params = [];
116
+ const requiredFields = schema.required || required;
117
+ if (schema.type === 'object' && schema.properties) {
118
+ for (const [key, prop] of Object.entries(schema.properties)) {
119
+ const propSchema = prop;
120
+ params.push({
121
+ paramKey: key,
122
+ paramType: mapTypeToLodashCheck(propSchema.type),
123
+ paramIsRequired: requiredFields.includes(key)
124
+ });
125
+ }
126
+ }
127
+ return params;
128
+ }
129
+ /**
130
+ * 生成 Mock.js 响应模板(格式化为对象字面量)
131
+ */
132
+ function generateMockTemplateForResponse(schema, definitions, indent = '\t\t\t\t\t') {
133
+ if (!schema)
134
+ return '{}';
135
+ // 处理引用
136
+ if (schema.$ref) {
137
+ const refName = schema.$ref.split('/').pop();
138
+ if (definitions?.[refName]) {
139
+ return generateMockTemplateForResponse(definitions[refName], definitions, indent);
140
+ }
141
+ }
142
+ // 根据类型生成模板
143
+ switch (schema.type) {
144
+ case 'object':
145
+ if (!schema.properties || Object.keys(schema.properties).length === 0) {
146
+ return '{}';
147
+ }
148
+ let objContent = '{';
149
+ const props = Object.entries(schema.properties);
150
+ props.forEach(([key, prop], index) => {
151
+ const propSchema = prop;
152
+ const mockValue = generateMockValueForField(key, propSchema, definitions);
153
+ const comma = index < props.length - 1 ? ',' : '';
154
+ objContent += `\n${indent}'${key}': ${mockValue}${comma}`;
155
+ });
156
+ objContent += `\n${indent.slice(0, -1)}}`; // 减少一级缩进
157
+ return objContent;
158
+ case 'array':
159
+ const itemTemplate = generateMockTemplateForResponse(schema.items, definitions, indent + '\t');
160
+ return `[${itemTemplate}]`;
161
+ default:
162
+ return generateMockValueForField('', schema, definitions);
163
+ }
164
+ }
165
+ /**
166
+ * 为单个字段生成 Mock 值
167
+ */
168
+ function generateMockValueForField(fieldName, schema, definitions) {
169
+ if (!schema)
170
+ return 'null';
171
+ // 处理引用
172
+ if (schema.$ref) {
173
+ const refName = schema.$ref.split('/').pop();
174
+ if (definitions?.[refName]) {
175
+ return generateMockValueForField(fieldName, definitions[refName], definitions);
176
+ }
177
+ }
178
+ switch (schema.type) {
179
+ case 'string':
180
+ return inferStringMockValue(schema, fieldName);
181
+ case 'number':
182
+ case 'integer':
183
+ return inferNumberMockValue(schema, fieldName);
184
+ case 'boolean':
185
+ // 使用 Math.random() < 0.5 生成随机布尔值
186
+ return 'Boolean(Math.random() < 0.5)';
187
+ case 'array':
188
+ return `[${generateMockValueForField('', schema.items, definitions)}]`;
189
+ case 'object':
190
+ return generateMockTemplateForResponse(schema, definitions);
191
+ default:
192
+ return 'null';
193
+ }
194
+ }
195
+ /**
196
+ * 推断字符串类型的 Mock 值
197
+ */
198
+ function inferStringMockValue(schema, fieldName) {
199
+ // 1. 枚举值
200
+ if (schema.enum)
201
+ return `"${schema.enum[0]}"`;
202
+ // 2. 格式
203
+ if (schema.format === 'date-time')
204
+ return '"@datetime"';
205
+ if (schema.format === 'date')
206
+ return '"@date"';
207
+ if (schema.format === 'email')
208
+ return '"@email"';
209
+ if (schema.format === 'url')
210
+ return '"@url"';
211
+ // 3. 根据字段名推断
212
+ const name = (fieldName || '').toLowerCase();
213
+ if (name.includes('code'))
214
+ return 'String(Math.random() < 1)'; // 状态码通常是字符串 "0" 或 "1"
215
+ if (name.includes('msg') || name.includes('message')) {
216
+ // 计算合适的字数范围
217
+ const minWords = 0;
218
+ const maxWords = 11;
219
+ return `'@cword(${minWords}, ${maxWords})'`;
220
+ }
221
+ if (name.includes('token'))
222
+ return '"@guid"';
223
+ if (name.includes('id') || name.includes('_id'))
224
+ return '"@guid"';
225
+ if (name.includes('email'))
226
+ return '"@email"';
227
+ if (name.includes('phone') || name.includes('mobile') || name.includes('tel'))
228
+ return '"/^1[3-9]\\\\d{9}$/"';
229
+ if (name.includes('name') && !name.includes('file'))
230
+ return '"@cname"';
231
+ if (name.includes('username'))
232
+ return '"@name"';
233
+ if (name.includes('address'))
234
+ return '"@county(true)"';
235
+ if (name.includes('city'))
236
+ return '"@city"';
237
+ if (name.includes('province'))
238
+ return '"@province"';
239
+ if (name.includes('url') || name.includes('link') || name.includes('href'))
240
+ return '"@url"';
241
+ if (name.includes('avatar') || name.includes('image') || name.includes('img') || name.includes('pic'))
242
+ return '"@image(\\"200x200\\")"';
243
+ if (name.includes('title'))
244
+ return '"@ctitle(5, 15)"';
245
+ if (name.includes('content') || name.includes('desc') || name.includes('description'))
246
+ return '"@cparagraph(1, 3)"';
247
+ // 4. 示例值
248
+ if (schema.example)
249
+ return `"${schema.example}"`;
250
+ // 5. 默认规则
251
+ return '"@string(5, 10)"';
252
+ }
253
+ /**
254
+ * 推断数字类型的 Mock 值
255
+ */
256
+ function inferNumberMockValue(schema, fieldName) {
257
+ // 1. 如果有范围,使用范围
258
+ if (schema.minimum !== undefined && schema.maximum !== undefined) {
259
+ return `Number(Math.random() * ${schema.maximum - schema.minimum} + ${schema.minimum})`;
260
+ }
261
+ // 2. 根据字段名推断
262
+ const name = (fieldName || '').toLowerCase();
263
+ if (name.includes('code') || name.includes('status')) {
264
+ // code 字段通常 0 表示成功
265
+ return 'Number(Math.random() < 0)'; // 永远返回 0
266
+ }
267
+ if (name.includes('age'))
268
+ return 'Number(Math.random() * 42 + 18)';
269
+ if (name.includes('price') || name.includes('amount') || name.includes('money'))
270
+ return 'Number((Math.random() * 10000).toFixed(2))';
271
+ if (name.includes('count') || name.includes('num') || name.includes('total'))
272
+ return 'Math.floor(Math.random() * 1000)';
273
+ if (name.includes('page'))
274
+ return 'Math.floor(Math.random() * 100) + 1';
275
+ if (name.includes('size') || name.includes('limit'))
276
+ return 'Math.floor(Math.random() * 90) + 10';
277
+ // 3. 示例值
278
+ if (schema.example !== undefined)
279
+ return schema.example.toString();
280
+ // 4. 默认规则
281
+ return 'Math.floor(Math.random() * 100)';
282
+ }
283
+ //# sourceMappingURL=mock-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-template.js","sourceRoot":"","sources":["../../../../src/generators/templates/mock-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ApiEndpoint } from '../../types/index.js';
2
+ /**
3
+ * 为单个接口生成类型文件
4
+ */
5
+ export declare function generateEndpointTypeFile(endpoint: ApiEndpoint, schemas: any): string;
6
+ /**
7
+ * 生成接口体内容(属性名带引号)
8
+ */
9
+ export declare function generateInterfaceBodyWithQuotes(schema: any, definitions: any, indent: string): string;
10
+ /**
11
+ * 生成嵌套类型和接口(用于复杂请求参数)
12
+ */
13
+ export declare function generateNestedTypesAndInterfaces(endpoint: ApiEndpoint, schemas: any, namespaceName: string): string;
14
+ /**
15
+ * 生成请求体属性(带引号)
16
+ */
17
+ export declare function generateRequestBodyPropertiesWithQuotes(schema: any, definitions: any, namespaceName: string, indent: string): string;
18
+ //# sourceMappingURL=type-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-template.d.ts","sourceRoot":"","sources":["../../../../src/generators/templates/type-template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAGvD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,CAwDpF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmCrG;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAoFnH;AAED;;GAEG;AACH,wBAAgB,uCAAuC,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA4CpI"}
@@ -0,0 +1,201 @@
1
+ import { getTypeScriptType, getTypeScriptTypeWithEnumCheck, mapSchemaTypeToTS } from '../../utils/type-mapping.js';
2
+ /**
3
+ * 为单个接口生成类型文件
4
+ */
5
+ export function generateEndpointTypeFile(endpoint, schemas) {
6
+ // 生成方法前缀(如 Post, Get, Put 等)
7
+ const methodPrefix = endpoint.method.charAt(0).toUpperCase() + endpoint.method.slice(1).toLowerCase();
8
+ // 生成命名空间名称(基于路径的最后一段,转为驼峰命名)
9
+ const pathSegments = endpoint.path.split('/').filter(s => s && !s.startsWith('{'));
10
+ const resourceName = pathSegments[pathSegments.length - 1]
11
+ ?.split(/[-_]/)
12
+ .map(part => part.charAt(0).toUpperCase() + part.slice(1))
13
+ .join('') || 'Api';
14
+ const namespaceName = `${methodPrefix}${resourceName}`;
15
+ // 生成注释标记
16
+ const commentTag = `${endpoint.path}[${endpoint.method}]`;
17
+ let content = `//[start]${commentTag}
18
+ export namespace ${namespaceName} {`;
19
+ // 生成响应类型
20
+ content += `\n export interface Res ${generateInterfaceBodyWithQuotes(endpoint.responseBody, schemas, ' ')}`;
21
+ // 生成嵌套类型和接口(用于请求参数)
22
+ const nestedTypes = generateNestedTypesAndInterfaces(endpoint, schemas, namespaceName);
23
+ if (nestedTypes) {
24
+ content += `\n\n${nestedTypes}`;
25
+ }
26
+ // 生成请求参数类型(合并 query, path params 和 body)
27
+ const hasParams = endpoint.parameters && endpoint.parameters.length > 0;
28
+ const hasBody = endpoint.requestBody;
29
+ if (hasParams || hasBody) {
30
+ content += `\n\n export interface Request {`;
31
+ // 添加路径参数和查询参数
32
+ if (hasParams) {
33
+ endpoint.parameters?.forEach(param => {
34
+ const optional = param.required ? '' : '?';
35
+ const description = param.description ? `\n /** ${param.description} */` : '';
36
+ content += `${description}\n '${param.name}'${optional}: ${mapSchemaTypeToTS(param.type)};`;
37
+ });
38
+ }
39
+ // 添加请求体参数
40
+ if (hasBody) {
41
+ const bodyProps = generateRequestBodyPropertiesWithQuotes(endpoint.requestBody, schemas, namespaceName, ' ');
42
+ content += bodyProps;
43
+ }
44
+ content += `\n }`;
45
+ }
46
+ content += `\n}\n//[end]${commentTag}\n`;
47
+ return content;
48
+ }
49
+ /**
50
+ * 生成接口体内容(属性名带引号)
51
+ */
52
+ export function generateInterfaceBodyWithQuotes(schema, definitions, indent) {
53
+ if (!schema)
54
+ return '{}';
55
+ // 处理引用
56
+ if (schema.$ref) {
57
+ const refName = schema.$ref.split('/').pop();
58
+ if (definitions?.[refName]) {
59
+ return generateInterfaceBodyWithQuotes(definitions[refName], definitions, indent);
60
+ }
61
+ }
62
+ if (schema.type === 'object' && schema.properties) {
63
+ const props = Object.entries(schema.properties);
64
+ if (props.length === 0) {
65
+ return '{}';
66
+ }
67
+ let result = '{';
68
+ const required = schema.required || [];
69
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
70
+ const prop = propSchema;
71
+ const isRequired = required.includes(propName);
72
+ const optional = isRequired ? '' : '?';
73
+ const description = prop.description ? `\n${indent} /** ${prop.description} */` : '';
74
+ const tsType = getTypeScriptType(prop);
75
+ result += `${description}\n${indent} '${propName}'${optional}: ${tsType};`;
76
+ }
77
+ result += `\n${indent}}`;
78
+ return result;
79
+ }
80
+ return '{}';
81
+ }
82
+ /**
83
+ * 生成嵌套类型和接口(用于复杂请求参数)
84
+ */
85
+ export function generateNestedTypesAndInterfaces(endpoint, schemas, namespaceName) {
86
+ if (!endpoint.requestBody)
87
+ return '';
88
+ const schema = endpoint.requestBody;
89
+ let result = '';
90
+ const generatedInterfaces = new Set();
91
+ // 递归处理 schema 中的嵌套对象
92
+ const processSchema = (s, parentName) => {
93
+ if (!s || !s.properties)
94
+ return;
95
+ for (const [propName, propSchema] of Object.entries(s.properties)) {
96
+ const prop = propSchema;
97
+ // 处理枚举类型
98
+ if (prop.type === 'string' && prop.enum && prop.enum.length > 0) {
99
+ const typeName = `${parentName}${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}`;
100
+ if (!generatedInterfaces.has(typeName)) {
101
+ const enumValues = prop.enum.map((v) => typeof v === 'string' ? `'${v}'` : v).join(' | ');
102
+ result += ` export type ${typeName} = ${enumValues};\n\n`;
103
+ generatedInterfaces.add(typeName);
104
+ }
105
+ }
106
+ // 处理数字枚举类型
107
+ if ((prop.type === 'number' || prop.type === 'integer') && prop.enum && prop.enum.length > 0) {
108
+ const typeName = `${parentName}${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}`;
109
+ if (!generatedInterfaces.has(typeName)) {
110
+ const enumValues = prop.enum.join(' | ');
111
+ result += ` export type ${typeName} = ${enumValues};\n\n`;
112
+ generatedInterfaces.add(typeName);
113
+ }
114
+ }
115
+ // 处理嵌套对象
116
+ if (prop.type === 'object' && prop.properties) {
117
+ const interfaceName = `${parentName}${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}`;
118
+ if (!generatedInterfaces.has(interfaceName)) {
119
+ result += ` export interface ${interfaceName} {\n`;
120
+ const required = prop.required || [];
121
+ for (const [nestedPropName, nestedPropSchema] of Object.entries(prop.properties)) {
122
+ const nestedProp = nestedPropSchema;
123
+ const isRequired = required.includes(nestedPropName);
124
+ const optional = isRequired ? '' : '?';
125
+ const tsType = getTypeScriptTypeWithEnumCheck(nestedProp, `${interfaceName}${nestedPropName.charAt(0).toUpperCase() + nestedPropName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}`);
126
+ result += ` '${nestedPropName}'${optional}: ${tsType};\n`;
127
+ }
128
+ result += ` }\n\n`;
129
+ generatedInterfaces.add(interfaceName);
130
+ // 递归处理嵌套对象的属性
131
+ processSchema(prop, interfaceName);
132
+ }
133
+ }
134
+ // 处理数组中的对象
135
+ if (prop.type === 'array' && prop.items?.type === 'object' && prop.items.properties) {
136
+ const interfaceName = `${parentName}${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}Item`;
137
+ if (!generatedInterfaces.has(interfaceName)) {
138
+ result += ` export interface ${interfaceName} {\n`;
139
+ const required = prop.items.required || [];
140
+ for (const [itemPropName, itemPropSchema] of Object.entries(prop.items.properties)) {
141
+ const itemProp = itemPropSchema;
142
+ const isRequired = required.includes(itemPropName);
143
+ const optional = isRequired ? '' : '?';
144
+ const tsType = getTypeScriptType(itemProp);
145
+ result += ` '${itemPropName}'${optional}: ${tsType};\n`;
146
+ }
147
+ result += ` }\n\n`;
148
+ generatedInterfaces.add(interfaceName);
149
+ }
150
+ }
151
+ }
152
+ };
153
+ processSchema(schema, `${namespaceName}Request`);
154
+ return result.trimEnd();
155
+ }
156
+ /**
157
+ * 生成请求体属性(带引号)
158
+ */
159
+ export function generateRequestBodyPropertiesWithQuotes(schema, definitions, namespaceName, indent) {
160
+ if (!schema)
161
+ return '';
162
+ // 处理引用
163
+ if (schema.$ref) {
164
+ const refName = schema.$ref.split('/').pop();
165
+ if (definitions?.[refName]) {
166
+ return generateRequestBodyPropertiesWithQuotes(definitions[refName], definitions, namespaceName, indent);
167
+ }
168
+ }
169
+ if (schema.type === 'object' && schema.properties) {
170
+ let result = '';
171
+ const required = schema.required || [];
172
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
173
+ const prop = propSchema;
174
+ const isRequired = required.includes(propName);
175
+ const optional = isRequired ? '' : '?';
176
+ const description = prop.description ? `\n${indent}/** ${prop.description} */` : '';
177
+ // 生成类型,对于嵌套对象使用接口名
178
+ let tsType;
179
+ if (prop.type === 'object' && prop.properties) {
180
+ const interfaceName = `${namespaceName}Request${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}`;
181
+ tsType = interfaceName;
182
+ }
183
+ else if (prop.type === 'array' && prop.items?.type === 'object' && prop.items.properties) {
184
+ const interfaceName = `${namespaceName}Request${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}Item`;
185
+ tsType = `${interfaceName}[]`;
186
+ }
187
+ else if (prop.enum && prop.enum.length > 0) {
188
+ // 使用枚举类型名
189
+ const enumTypeName = `${namespaceName}Request${propName.charAt(0).toUpperCase() + propName.slice(1).replace(/_([a-z])/g, (_, c) => c.toUpperCase())}`;
190
+ tsType = enumTypeName;
191
+ }
192
+ else {
193
+ tsType = getTypeScriptType(prop);
194
+ }
195
+ result += `${description}\n${indent}'${propName}'${optional}: ${tsType};`;
196
+ }
197
+ return result;
198
+ }
199
+ return '';
200
+ }
201
+ //# sourceMappingURL=type-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-template.js","sourceRoot":"","sources":["../../../../src/generators/templates/type-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ApifoxConfig, ApiEndpoint } from '../types/index.js';
2
+ /**
3
+ * 生成 TypeScript 类型文件
4
+ */
5
+ export declare function generateTypeFiles(config: ApifoxConfig, openapi: any, endpoints: ApiEndpoint[]): Promise<void>;
6
+ //# sourceMappingURL=type-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../../src/generators/type-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAElE;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BnH"}
@@ -0,0 +1,31 @@
1
+ import path from 'path';
2
+ import { fileHelper } from '../utils/file-helper.js';
3
+ import { logger } from '../utils/logger.js';
4
+ import { groupEndpointsByPath } from '../utils/path-utils.js';
5
+ import { generateEndpointTypeFile } from './templates/type-template.js';
6
+ /**
7
+ * 生成 TypeScript 类型文件
8
+ */
9
+ export async function generateTypeFiles(config, openapi, endpoints) {
10
+ logger.title('生成 TypeScript 类型文件...');
11
+ await fileHelper.ensureDir(config.typesDir);
12
+ const schemas = openapi.components?.schemas || {};
13
+ let generatedCount = 0;
14
+ // 按资源路径分组接口,使用增量更新
15
+ const groupedEndpoints = groupEndpointsByPath(endpoints);
16
+ for (const [groupPath, groupEndpoints] of Object.entries(groupedEndpoints)) {
17
+ const typeFilePath = path.join(config.typesDir, `${groupPath}.ts`);
18
+ // 为每个接口生成类型定义块
19
+ for (const endpoint of groupEndpoints) {
20
+ const typeContent = generateEndpointTypeFile(endpoint, schemas);
21
+ const blockIdentifier = `${endpoint.path}[${endpoint.method}]`;
22
+ // 使用增量更新,支持多个接口在同一文件
23
+ await fileHelper.updateFileWithBlock(typeFilePath, typeContent, blockIdentifier);
24
+ generatedCount++;
25
+ }
26
+ logger.info(` ✓ ${typeFilePath} (${groupEndpoints.length} 个接口)`);
27
+ }
28
+ logger.success(`\n类型文件生成完成!`);
29
+ logger.info(`共生成 ${generatedCount} 个接口类型`);
30
+ }
31
+ //# sourceMappingURL=type-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../../src/generators/type-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAGvE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAoB,EAAE,OAAY,EAAE,SAAwB;IAClG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAErC,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,mBAAmB;IACnB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA;IAExD,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,SAAS,KAAK,CAAC,CAAA;QAElE,eAAe;QACf,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC/D,MAAM,eAAe,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAA;YAE9D,qBAAqB;YACrB,MAAM,UAAU,CAAC,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;YAChF,cAAc,EAAE,CAAA;QAClB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,KAAK,cAAc,CAAC,MAAM,OAAO,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types/index.js';
2
+ export * from './utils/logger.js';
3
+ export declare const version: any;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAMjC,eAAO,MAAM,OAAO,KAAc,CAAA"}
@@ -0,0 +1,9 @@
1
+ // 主入口文件 - 导出公共 API
2
+ export * from './types/index.js';
3
+ export * from './utils/logger.js';
4
+ // 版本信息 - 从 package.json 读取
5
+ import { createRequire } from 'module';
6
+ const require = createRequire(import.meta.url);
7
+ const pkg = require('../package.json');
8
+ export const version = pkg.version;
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAEjC,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/scripts/cli.ts"],"names":[],"mappings":""}