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.
- package/CHANGELOG.md +131 -0
- package/LICENSE +22 -0
- package/README.md +788 -0
- package/dist/package.json +61 -0
- package/dist/src/core/apifox-client.d.ts +6 -0
- package/dist/src/core/apifox-client.d.ts.map +1 -0
- package/dist/src/core/apifox-client.js +114 -0
- package/dist/src/core/apifox-client.js.map +1 -0
- package/dist/src/core/config-loader.d.ts +6 -0
- package/dist/src/core/config-loader.d.ts.map +1 -0
- package/dist/src/core/config-loader.js +16 -0
- package/dist/src/core/config-loader.js.map +1 -0
- package/dist/src/core/endpoint-filter.d.ts +12 -0
- package/dist/src/core/endpoint-filter.d.ts.map +1 -0
- package/dist/src/core/endpoint-filter.js +77 -0
- package/dist/src/core/endpoint-filter.js.map +1 -0
- package/dist/src/core/openapi-converter.d.ts +6 -0
- package/dist/src/core/openapi-converter.d.ts.map +1 -0
- package/dist/src/core/openapi-converter.js +35 -0
- package/dist/src/core/openapi-converter.js.map +1 -0
- package/dist/src/generators/mock-generator.d.ts +6 -0
- package/dist/src/generators/mock-generator.d.ts.map +1 -0
- package/dist/src/generators/mock-generator.js +30 -0
- package/dist/src/generators/mock-generator.js.map +1 -0
- package/dist/src/generators/templates/mock-template.d.ts +6 -0
- package/dist/src/generators/templates/mock-template.d.ts.map +1 -0
- package/dist/src/generators/templates/mock-template.js +283 -0
- package/dist/src/generators/templates/mock-template.js.map +1 -0
- package/dist/src/generators/templates/type-template.d.ts +18 -0
- package/dist/src/generators/templates/type-template.d.ts.map +1 -0
- package/dist/src/generators/templates/type-template.js +201 -0
- package/dist/src/generators/templates/type-template.js.map +1 -0
- package/dist/src/generators/type-generator.d.ts +6 -0
- package/dist/src/generators/type-generator.d.ts.map +1 -0
- package/dist/src/generators/type-generator.js +31 -0
- package/dist/src/generators/type-generator.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/scripts/cli.d.ts +3 -0
- package/dist/src/scripts/cli.d.ts.map +1 -0
- package/dist/src/scripts/cli.js +28 -0
- package/dist/src/scripts/cli.js.map +1 -0
- package/dist/src/scripts/generate-mock.d.ts +2 -0
- package/dist/src/scripts/generate-mock.d.ts.map +1 -0
- package/dist/src/scripts/generate-mock.js +49 -0
- package/dist/src/scripts/generate-mock.js.map +1 -0
- package/dist/src/scripts/serve-mock.d.ts +2 -0
- package/dist/src/scripts/serve-mock.d.ts.map +1 -0
- package/dist/src/scripts/serve-mock.js +49 -0
- package/dist/src/scripts/serve-mock.js.map +1 -0
- package/dist/src/server/express-server.d.ts +7 -0
- package/dist/src/server/express-server.d.ts.map +1 -0
- package/dist/src/server/express-server.js +85 -0
- package/dist/src/server/express-server.js.map +1 -0
- package/dist/src/server/hot-reload.d.ts +7 -0
- package/dist/src/server/hot-reload.d.ts.map +1 -0
- package/dist/src/server/hot-reload.js +57 -0
- package/dist/src/server/hot-reload.js.map +1 -0
- package/dist/src/server/route-loader.d.ts +13 -0
- package/dist/src/server/route-loader.d.ts.map +1 -0
- package/dist/src/server/route-loader.js +147 -0
- package/dist/src/server/route-loader.js.map +1 -0
- package/dist/src/server/route-manager.d.ts +13 -0
- package/dist/src/server/route-manager.d.ts.map +1 -0
- package/dist/src/server/route-manager.js +25 -0
- package/dist/src/server/route-manager.js.map +1 -0
- package/dist/src/server/route-matcher.d.ts +10 -0
- package/dist/src/server/route-matcher.d.ts.map +1 -0
- package/dist/src/server/route-matcher.js +35 -0
- package/dist/src/server/route-matcher.js.map +1 -0
- package/dist/src/server/validation.d.ts +6 -0
- package/dist/src/server/validation.d.ts.map +1 -0
- package/dist/src/server/validation.js +119 -0
- package/dist/src/server/validation.js.map +1 -0
- package/dist/src/types/index.d.ts +167 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +2 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/block-updater.d.ts +6 -0
- package/dist/src/utils/block-updater.d.ts.map +1 -0
- package/dist/src/utils/block-updater.js +73 -0
- package/dist/src/utils/block-updater.js.map +1 -0
- package/dist/src/utils/code-formatter.d.ts +5 -0
- package/dist/src/utils/code-formatter.d.ts.map +1 -0
- package/dist/src/utils/code-formatter.js +43 -0
- package/dist/src/utils/code-formatter.js.map +1 -0
- package/dist/src/utils/file-helper.d.ts +21 -0
- package/dist/src/utils/file-helper.d.ts.map +1 -0
- package/dist/src/utils/file-helper.js +25 -0
- package/dist/src/utils/file-helper.js.map +1 -0
- package/dist/src/utils/file-operations.d.ts +29 -0
- package/dist/src/utils/file-operations.d.ts.map +1 -0
- package/dist/src/utils/file-operations.js +62 -0
- package/dist/src/utils/file-operations.js.map +1 -0
- package/dist/src/utils/logger.d.ts +10 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +27 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/path-utils.d.ts +13 -0
- package/dist/src/utils/path-utils.d.ts.map +1 -0
- package/dist/src/utils/path-utils.js +64 -0
- package/dist/src/utils/path-utils.js.map +1 -0
- package/dist/src/utils/type-mapping.d.ts +17 -0
- package/dist/src/utils/type-mapping.d.ts.map +1 -0
- package/dist/src/utils/type-mapping.js +75 -0
- package/dist/src/utils/type-mapping.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/scripts/cli.ts"],"names":[],"mappings":""}
|