openapi-ts-request 1.6.7 → 1.7.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.
|
@@ -21,6 +21,33 @@ export default class ServiceGenerator {
|
|
|
21
21
|
private getFileTP;
|
|
22
22
|
private resolveFileTP;
|
|
23
23
|
private getResponseTP;
|
|
24
|
+
/**
|
|
25
|
+
* 生成多状态码响应类型定义
|
|
26
|
+
* 将 OpenAPI 的 responses 对象转换为 TypeScript 类型定义
|
|
27
|
+
* 例如:{ 200: ResponseType, 400: unknown, 404: unknown }
|
|
28
|
+
*
|
|
29
|
+
* @param responses OpenAPI 响应对象
|
|
30
|
+
* @param functionName 函数名称,用于生成主响应类型名称
|
|
31
|
+
* @returns 多状态码响应类型定义字符串,如果没有响应则返回 null
|
|
32
|
+
*/
|
|
33
|
+
private getResponsesType;
|
|
34
|
+
/**
|
|
35
|
+
* 解析响应条目,提取每个状态码对应的类型和描述信息
|
|
36
|
+
*
|
|
37
|
+
* @param responses OpenAPI 响应对象
|
|
38
|
+
* @param components OpenAPI 组件对象,用于解析引用类型
|
|
39
|
+
* @returns 响应条目数组,包含状态码、类型和描述
|
|
40
|
+
*/
|
|
41
|
+
private parseResponseEntries;
|
|
42
|
+
/**
|
|
43
|
+
* 从响应内容中提取 TypeScript 类型
|
|
44
|
+
* 处理不同的媒体类型和 schema 类型
|
|
45
|
+
*
|
|
46
|
+
* @param response 响应对象
|
|
47
|
+
* @param components OpenAPI 组件对象
|
|
48
|
+
* @returns TypeScript 类型字符串
|
|
49
|
+
*/
|
|
50
|
+
private getResponseTypeFromContent;
|
|
24
51
|
private getParamsTP;
|
|
25
52
|
private resolveObject;
|
|
26
53
|
private resolveArray;
|
|
@@ -424,6 +424,16 @@ class ServiceGenerator {
|
|
|
424
424
|
});
|
|
425
425
|
response.type = `${this.config.namespace}.${responseName}`;
|
|
426
426
|
}
|
|
427
|
+
const responsesType = this.getResponsesType(newApi.responses, functionName);
|
|
428
|
+
// 如果有多个响应类型,生成对应的类型定义
|
|
429
|
+
if (responsesType) {
|
|
430
|
+
this.interfaceTPConfigs.push({
|
|
431
|
+
typeName: (0, lodash_1.upperFirst)(`${functionName}Responses`),
|
|
432
|
+
type: responsesType,
|
|
433
|
+
isEnum: false,
|
|
434
|
+
props: [],
|
|
435
|
+
});
|
|
436
|
+
}
|
|
427
437
|
let formattedPath = newApi.path.replace(/:([^/]*)|{([^}]*)}/gi, (_, str, str2) => `$\{${str || str2}}`);
|
|
428
438
|
// 为 path 中的 params 添加 alias
|
|
429
439
|
const escapedPathParams = (0, lodash_1.map)(params.path, (item, index) => (Object.assign(Object.assign({}, item), { alias: `param${index}` })));
|
|
@@ -701,6 +711,108 @@ class ServiceGenerator {
|
|
|
701
711
|
responseSchema.type = this.getType(schema, this.config.namespace);
|
|
702
712
|
return responseSchema;
|
|
703
713
|
}
|
|
714
|
+
/**
|
|
715
|
+
* 生成多状态码响应类型定义
|
|
716
|
+
* 将 OpenAPI 的 responses 对象转换为 TypeScript 类型定义
|
|
717
|
+
* 例如:{ 200: ResponseType, 400: unknown, 404: unknown }
|
|
718
|
+
*
|
|
719
|
+
* @param responses OpenAPI 响应对象
|
|
720
|
+
* @param functionName 函数名称,用于生成主响应类型名称
|
|
721
|
+
* @returns 多状态码响应类型定义字符串,如果没有响应则返回 null
|
|
722
|
+
*/
|
|
723
|
+
getResponsesType(responses = {}, functionName) {
|
|
724
|
+
if ((0, lodash_1.isEmpty)(responses) ||
|
|
725
|
+
~(0, lodash_1.findIndex)(this.interfaceTPConfigs, (item) => item.typeName === (0, lodash_1.upperFirst)(`${functionName}Responses`))) {
|
|
726
|
+
return null;
|
|
727
|
+
}
|
|
728
|
+
const { components } = this.openAPIData;
|
|
729
|
+
// 生成主响应类型名称
|
|
730
|
+
const mainResponseTypeName = (0, lodash_1.upperFirst)(`${functionName}Response`);
|
|
731
|
+
const responseEntries = this.parseResponseEntries(responses, components);
|
|
732
|
+
const responseTypes = responseEntries.map(({ statusCode, type, description = '' }) => {
|
|
733
|
+
var _a;
|
|
734
|
+
// 检查是否已存在对应的主响应类型,如果存在则复用,避免重复定义
|
|
735
|
+
const existType = this.interfaceTPConfigs.find((item) => item.typeName === mainResponseTypeName);
|
|
736
|
+
const lastType = existType ? mainResponseTypeName : type;
|
|
737
|
+
// 格式化描述文本,让描述支持换行
|
|
738
|
+
const formattedDescription = config_2.lineBreakReg.test(description)
|
|
739
|
+
? (_a = description.split('\n')) === null || _a === void 0 ? void 0 : _a.join('\n * ')
|
|
740
|
+
: description;
|
|
741
|
+
// 生成带注释的类型定义
|
|
742
|
+
return formattedDescription
|
|
743
|
+
? ` /**\n * ${formattedDescription}\n */\n ${statusCode}: ${lastType};`
|
|
744
|
+
: ` ${statusCode}: ${lastType};`;
|
|
745
|
+
});
|
|
746
|
+
// 返回完整的对象类型定义
|
|
747
|
+
return `{\n${responseTypes.join('\n')}\n}`;
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* 解析响应条目,提取每个状态码对应的类型和描述信息
|
|
751
|
+
*
|
|
752
|
+
* @param responses OpenAPI 响应对象
|
|
753
|
+
* @param components OpenAPI 组件对象,用于解析引用类型
|
|
754
|
+
* @returns 响应条目数组,包含状态码、类型和描述
|
|
755
|
+
*/
|
|
756
|
+
parseResponseEntries(responses, components) {
|
|
757
|
+
return (0, lodash_1.keys)(responses).map((statusCode) => {
|
|
758
|
+
const response = this.resolveRefObject(responses[statusCode]);
|
|
759
|
+
if (!response) {
|
|
760
|
+
return { statusCode, type: 'unknown', description: '' };
|
|
761
|
+
}
|
|
762
|
+
const responseType = this.getResponseTypeFromContent(response, components);
|
|
763
|
+
const description = response.description || '';
|
|
764
|
+
return { statusCode, type: responseType, description };
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* 从响应内容中提取 TypeScript 类型
|
|
769
|
+
* 处理不同的媒体类型和 schema 类型
|
|
770
|
+
*
|
|
771
|
+
* @param response 响应对象
|
|
772
|
+
* @param components OpenAPI 组件对象
|
|
773
|
+
* @returns TypeScript 类型字符串
|
|
774
|
+
*/
|
|
775
|
+
getResponseTypeFromContent(response, components) {
|
|
776
|
+
var _a;
|
|
777
|
+
if (!response.content) {
|
|
778
|
+
return 'unknown';
|
|
779
|
+
}
|
|
780
|
+
const resContent = response.content;
|
|
781
|
+
const resContentMediaTypes = (0, lodash_1.keys)(resContent);
|
|
782
|
+
const mediaType = resContentMediaTypes.includes('application/json')
|
|
783
|
+
? 'application/json'
|
|
784
|
+
: resContentMediaTypes[0];
|
|
785
|
+
if (!(0, lodash_1.isObject)(resContent) || !mediaType) {
|
|
786
|
+
return 'unknown';
|
|
787
|
+
}
|
|
788
|
+
let schema = (resContent[mediaType].schema ||
|
|
789
|
+
config_2.DEFAULT_SCHEMA);
|
|
790
|
+
if ((0, util_2.isReferenceObject)(schema)) {
|
|
791
|
+
const refName = (0, util_2.getLastRefName)(schema.$ref);
|
|
792
|
+
const childrenSchema = components.schemas[refName];
|
|
793
|
+
// 如果配置了 dataFields,尝试从指定字段提取类型
|
|
794
|
+
if ((0, util_2.isNonArraySchemaObject)(childrenSchema) && this.config.dataFields) {
|
|
795
|
+
schema = (((_a = this.config.dataFields
|
|
796
|
+
.map((field) => childrenSchema.properties[field])
|
|
797
|
+
.filter(Boolean)) === null || _a === void 0 ? void 0 : _a[0]) ||
|
|
798
|
+
resContent[mediaType].schema ||
|
|
799
|
+
config_2.DEFAULT_SCHEMA);
|
|
800
|
+
}
|
|
801
|
+
return this.getType(schema);
|
|
802
|
+
}
|
|
803
|
+
else if ((0, util_2.isSchemaObject)(schema)) {
|
|
804
|
+
// 设置属性的 required 状态
|
|
805
|
+
(0, lodash_1.keys)(schema.properties).map((fieldName) => {
|
|
806
|
+
var _a, _b;
|
|
807
|
+
schema.properties[fieldName]['required'] =
|
|
808
|
+
(_b = (_a = schema.required) === null || _a === void 0 ? void 0 : _a.includes(fieldName)) !== null && _b !== void 0 ? _b : false;
|
|
809
|
+
});
|
|
810
|
+
return this.getType(schema);
|
|
811
|
+
}
|
|
812
|
+
else {
|
|
813
|
+
return this.getType(schema);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
704
816
|
getParamsTP(parameters = [], path = null) {
|
|
705
817
|
const templateParams = {};
|
|
706
818
|
if (parameters === null || parameters === void 0 ? void 0 : parameters.length) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openapi-ts-request",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Swagger2/OpenAPI3/Apifox to TypeScript/JavaScript, request client(support any client), request mock service, enum and enum translation, react-query/vue-query, type field label, JSON Schemas",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18.0.0",
|