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.6.7",
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",