From 78d68767081d99ae47dec0d4847496eaf2f4bec1 Mon Sep 17 00:00:00 2001 From: Ferdi Koomen Date: Wed, 27 Oct 2021 20:34:47 +0200 Subject: [PATCH 1/2] - Fixed issue #869 --- src/openApi/v2/parser/getOperationParameter.ts | 14 ++++++++++---- src/openApi/v2/parser/getOperationResponse.ts | 14 ++++++++++---- src/openApi/v3/parser/getOperationParameter.ts | 16 +++++++++++----- src/openApi/v3/parser/getOperationResponse.ts | 9 +++++++-- yarn.lock | 7 ++++++- 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/openApi/v2/parser/getOperationParameter.ts b/src/openApi/v2/parser/getOperationParameter.ts index 2b8ab927..c31d0835 100644 --- a/src/openApi/v2/parser/getOperationParameter.ts +++ b/src/openApi/v2/parser/getOperationParameter.ts @@ -2,6 +2,7 @@ import type { OperationParameter } from '../../../client/interfaces/OperationPar import { getPattern } from '../../../utils/getPattern'; import type { OpenApi } from '../interfaces/OpenApi'; import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { extendEnum } from './extendEnum'; import { getComment } from './getComment'; import { getEnum } from './getEnum'; @@ -9,6 +10,7 @@ import { getEnumFromDescription } from './getEnumFromDescription'; import { getModel } from './getModel'; import { getOperationParameterDefault } from './getOperationParameterDefault'; import { getOperationParameterName } from './getOperationParameterName'; +import { getRef } from './getRef'; import { getType } from './getType'; export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParameter): OperationParameter { @@ -103,9 +105,13 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame return operationParameter; } - if (parameter.schema) { - if (parameter.schema.$ref) { - const model = getType(parameter.schema.$ref); + let schema = parameter.schema; + if (schema) { + if (schema.$ref?.startsWith('#/parameters/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { + const model = getType(schema.$ref); operationParameter.export = 'reference'; operationParameter.type = model.type; operationParameter.base = model.base; @@ -114,7 +120,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; } else { - const model = getModel(openApi, parameter.schema); + const model = getModel(openApi, schema); operationParameter.export = model.export; operationParameter.type = model.type; operationParameter.base = model.base; diff --git a/src/openApi/v2/parser/getOperationResponse.ts b/src/openApi/v2/parser/getOperationResponse.ts index 1e0e9ab4..946fedb4 100644 --- a/src/openApi/v2/parser/getOperationResponse.ts +++ b/src/openApi/v2/parser/getOperationResponse.ts @@ -2,8 +2,10 @@ import type { OperationResponse } from '../../../client/interfaces/OperationResp import { getPattern } from '../../../utils/getPattern'; import type { OpenApi } from '../interfaces/OpenApi'; import type { OpenApiResponse } from '../interfaces/OpenApiResponse'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { getComment } from './getComment'; import { getModel } from './getModel'; +import { getRef } from './getRef'; import { getType } from './getType'; export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse, responseCode: number): OperationResponse { @@ -31,9 +33,13 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse // if this is a reference then the parameter is just the 'name' of // this reference type. Otherwise it might be a complex schema and // then we need to parse the schema! - if (response.schema) { - if (response.schema.$ref) { - const model = getType(response.schema.$ref); + let schema = response.schema; + if (schema) { + if (schema.$ref?.startsWith('#/responses/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { + const model = getType(schema.$ref); operationResponse.export = 'reference'; operationResponse.type = model.type; operationResponse.base = model.base; @@ -41,7 +47,7 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse operationResponse.imports.push(...model.imports); return operationResponse; } else { - const model = getModel(openApi, response.schema); + const model = getModel(openApi, schema); operationResponse.export = model.export; operationResponse.type = model.type; operationResponse.base = model.base; diff --git a/src/openApi/v3/parser/getOperationParameter.ts b/src/openApi/v3/parser/getOperationParameter.ts index 27976edc..c8cacc2d 100644 --- a/src/openApi/v3/parser/getOperationParameter.ts +++ b/src/openApi/v3/parser/getOperationParameter.ts @@ -2,10 +2,12 @@ import type { OperationParameter } from '../../../client/interfaces/OperationPar import { getPattern } from '../../../utils/getPattern'; import type { OpenApi } from '../interfaces/OpenApi'; import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { getComment } from './getComment'; import { getModel } from './getModel'; import { getModelDefault } from './getModelDefault'; import { getOperationParameterName } from './getOperationParameterName'; +import { getRef } from './getRef'; import { getType } from './getType'; export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParameter): OperationParameter { @@ -40,18 +42,22 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame return operationParameter; } - if (parameter.schema) { - if (parameter.schema.$ref) { - const model = getType(parameter.schema.$ref); + let schema = parameter.schema; + if (schema) { + if (schema.$ref?.startsWith('#/components/parameters/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { + const model = getType(schema.$ref); operationParameter.export = 'reference'; operationParameter.type = model.type; operationParameter.base = model.base; operationParameter.template = model.template; operationParameter.imports.push(...model.imports); - operationParameter.default = getModelDefault(parameter.schema); + operationParameter.default = getModelDefault(schema); return operationParameter; } else { - const model = getModel(openApi, parameter.schema); + const model = getModel(openApi, schema); operationParameter.export = model.export; operationParameter.type = model.type; operationParameter.base = model.base; diff --git a/src/openApi/v3/parser/getOperationResponse.ts b/src/openApi/v3/parser/getOperationResponse.ts index 45abaa0a..84490516 100644 --- a/src/openApi/v3/parser/getOperationResponse.ts +++ b/src/openApi/v3/parser/getOperationResponse.ts @@ -2,9 +2,11 @@ import type { OperationResponse } from '../../../client/interfaces/OperationResp import { getPattern } from '../../../utils/getPattern'; import type { OpenApi } from '../interfaces/OpenApi'; import type { OpenApiResponse } from '../interfaces/OpenApiResponse'; +import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; import { getComment } from './getComment'; import { getContent } from './getContent'; import { getModel } from './getModel'; +import { getRef } from './getRef'; import { getType } from './getType'; export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse, responseCode: number): OperationResponse { @@ -29,9 +31,12 @@ export function getOperationResponse(openApi: OpenApi, response: OpenApiResponse }; if (response.content) { - const schema = getContent(openApi, response.content); + let schema = getContent(openApi, response.content); if (schema) { - if (schema?.$ref) { + if (schema.$ref?.startsWith('#/components/responses/')) { + schema = getRef(openApi, schema); + } + if (schema.$ref) { const model = getType(schema.$ref); operationResponse.export = 'reference'; operationResponse.type = model.type; diff --git a/yarn.lock b/yarn.lock index f3559f82..2555410c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1363,6 +1363,11 @@ jest-diff "^27.0.0" pretty-format "^27.0.0" +"@types/js-yaml@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.4.tgz#cc38781257612581a1a0eb25f1709d2b06812fce" + integrity sha512-AuHubXUmg0AzkXH0Mx6sIxeY/1C110mm/EkE/gB1sTRz3h2dao2W/63q42SlVST+lICxz5Oki2hzYA6+KnnieQ== + "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -3534,7 +3539,7 @@ js-yaml@3.14.1, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== From eac474ce5f02e1fac5d3695e16b06cdbf861412e Mon Sep 17 00:00:00 2001 From: Ferdi Koomen Date: Wed, 27 Oct 2021 20:35:06 +0200 Subject: [PATCH 2/2] - Updated version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4873662a..d083ef34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi-typescript-codegen", - "version": "0.11.1", + "version": "0.11.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Ferdi Koomen", "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen",