diff --git a/src/internal/OpenApiTools/Walker/Operation.ts b/src/internal/OpenApiTools/Walker/Operation.ts index 0c7ea4d2..74eb864b 100644 --- a/src/internal/OpenApiTools/Walker/Operation.ts +++ b/src/internal/OpenApiTools/Walker/Operation.ts @@ -8,6 +8,15 @@ export interface State { [operationId: string]: CodeGenerator.OpenApiOperation; } +type UniqueParameterMap = Record; + +const uniqParameters = (rawParameters: OpenApi.Parameter[]): OpenApi.Parameter[] => { + const parameterMap = rawParameters.reduce((all, parameter) => { + return { ...all, [`${parameter.in}:${parameter.name}`]: parameter }; + }, {}); + return Object.values(parameterMap); +}; + export const create = (rootSchema: OpenApi.Document): State => { const paths = rootSchema.paths || {}; const state: State = {}; @@ -20,13 +29,15 @@ export const create = (rootSchema: OpenApi.Document): State => { if (!operation.operationId) { return; } + const parameters = [...(pathItem.parameters || []), ...(operation.parameters || [])] as OpenApi.Parameter[]; + state[operation.operationId] = { httpMethod, requestUri, comment: [operation.summary, operation.description].filter(Boolean).join(EOL), deprecated: !!operation.deprecated, requestBody: operation.requestBody as OpenApi.RequestBody, - parameters: operation.parameters as OpenApi.Parameter[], + parameters: uniqParameters(parameters), responses: operation.responses as CodeGenerator.OpenApiResponses, }; }); diff --git a/src/internal/OpenApiTools/Walker/Store.ts b/src/internal/OpenApiTools/Walker/Store.ts index 9412223a..4c141706 100644 --- a/src/internal/OpenApiTools/Walker/Store.ts +++ b/src/internal/OpenApiTools/Walker/Store.ts @@ -16,7 +16,7 @@ class Store { private state: State.Type; private operator: Structure.OperatorType; private getChildByPaths: Structure.GetChildByPaths; - constructor(private factory: Factory.Type, private rootDocument: OpenApi.Document) { + constructor(private factory: Factory.Type, rootDocument: OpenApi.Document) { this.state = State.createDefaultState(rootDocument); const { operator, getChildByPaths } = Structure.create(); this.operator = operator; diff --git a/src/internal/OpenApiTools/components/Operation.ts b/src/internal/OpenApiTools/components/Operation.ts index 4b9f9dce..73e81002 100644 --- a/src/internal/OpenApiTools/components/Operation.ts +++ b/src/internal/OpenApiTools/components/Operation.ts @@ -31,7 +31,6 @@ const generateComment = (operation: OpenApi.Operation): string => { return comments.join(EOL); }; -// 使わない可能性あり export const generateNamespace = ( entryPoint: string, currentPoint: string, @@ -40,6 +39,7 @@ export const generateNamespace = ( parentPath: string, name: string, operation: OpenApi.Operation, + pathItemParameters: OpenApi.PathItem["parameters"], context: ToTypeNode.Context, converterContext: ConverterContext.Types, ): void => { @@ -55,7 +55,9 @@ export const generateNamespace = ( deprecated: operation.deprecated, }); - if (operation.parameters) { + const parameters = [...pathItemParameters || [], ...operation.parameters || []]; + + if (parameters.length > 0) { const parameterName = "Parameter"; store.addStatement(`${basePath}/Parameter`, { kind: "interface", @@ -66,7 +68,7 @@ export const generateNamespace = ( store, factory, parameterName, - operation.parameters, + parameters, context, converterContext, ), @@ -136,6 +138,7 @@ export const generateStatements = ( requestUri: string, httpMethod: string, // PUT POST PATCH operation: OpenApi.Operation, + pathItemParameters: OpenApi.PathItem["parameters"], context: ToTypeNode.Context, converterContext: ConverterContext.Types, ): ts.Statement[] => { @@ -145,7 +148,8 @@ export const generateStatements = ( throw new Error("not setting operationId\n" + JSON.stringify(operation)); } store.updateOperationState(httpMethod, requestUri, operationId, {}); - if (operation.parameters) { + const parameters = [...pathItemParameters || [], ...operation.parameters || []]; + if (parameters.length > 0) { const parameterName = converterContext.generateParameterName(operationId); statements.push( Parameter.generateAliasInterface( @@ -154,7 +158,7 @@ export const generateStatements = ( store, factory, parameterName, - operation.parameters, + parameters, context, converterContext, ), diff --git a/src/internal/OpenApiTools/components/Parameter.ts b/src/internal/OpenApiTools/components/Parameter.ts index b3d19bb6..246e8d90 100644 --- a/src/internal/OpenApiTools/components/Parameter.ts +++ b/src/internal/OpenApiTools/components/Parameter.ts @@ -36,7 +36,7 @@ export const generateTypeAlias = ( }); }; -export const generatePropertySignature = ( +export const generatePropertySignatureObject = ( entryPoint: string, currentPoint: string, store: Walker.Store, @@ -44,24 +44,30 @@ export const generatePropertySignature = ( parameter: OpenApi.Parameter | OpenApi.Reference, context: ToTypeNode.Context, converterContext: ConverterContext.Types, -): ts.PropertySignature => { +): { name: string; typeElement: ts.PropertySignature } => { if (Guard.isReference(parameter)) { const reference = Reference.generate(entryPoint, currentPoint, parameter); if (reference.type === "local") { context.setReferenceHandler(currentPoint, reference); const localRef = store.getParameter(reference.path); - return factory.PropertySignature.create({ - name: converterContext.escapePropertySignatureName(localRef.name), + const name = converterContext.escapePropertySignatureName(localRef.name); + const typeElement = factory.PropertySignature.create({ + name: name, optional: false, comment: localRef.description, type: factory.TypeReferenceNode.create({ name: context.resolveReferencePath(currentPoint, reference.path).name, }), }); + return { + name, + typeElement: typeElement, + }; } const isPathProperty = reference.data.in === "path"; - return factory.PropertySignature.create({ - name: converterContext.escapePropertySignatureName(reference.data.name), + const name = converterContext.escapePropertySignatureName(reference.data.name); + const typeElement = factory.PropertySignature.create({ + name: name, optional: isPathProperty ? false : !reference.data.required, comment: reference.data.description, type: ToTypeNode.convert( @@ -73,14 +79,23 @@ export const generatePropertySignature = ( converterContext, ), }); + return { + name, + typeElement: typeElement, + }; } const isPathProperty = parameter.in === "path"; - return factory.PropertySignature.create({ - name: converterContext.escapePropertySignatureName(parameter.name), + const name = converterContext.escapePropertySignatureName(parameter.name); + const typeElement = factory.PropertySignature.create({ + name: name, optional: isPathProperty ? false : !parameter.required, type: ToTypeNode.convert(entryPoint, currentPoint, factory, parameter.schema || { type: "null" }, context, converterContext), comment: parameter.description, }); + return { + name, + typeElement: typeElement, + }; }; export const generatePropertySignatures = ( @@ -92,9 +107,11 @@ export const generatePropertySignatures = ( context: ToTypeNode.Context, converterContext: ConverterContext.Types, ): ts.PropertySignature[] => { - return parameters.map(parameter => { - return generatePropertySignature(entryPoint, currentPoint, store, factory, parameter, context, converterContext); - }); + const typeElementMap = parameters.reduce>((all, parameter) => { + const { name, typeElement } = generatePropertySignatureObject(entryPoint, currentPoint, store, factory, parameter, context, converterContext); + return { ...all, [name]: typeElement }; + }, {}); + return Object.values(typeElementMap); }; export const generateInterface = ( @@ -103,7 +120,7 @@ export const generateInterface = ( store: Walker.Store, factory: Factory.Type, name: string, - parameters: [OpenApi.Parameter | OpenApi.Reference], + parameters: (OpenApi.Parameter | OpenApi.Reference)[], context: ToTypeNode.Context, converterContext: ConverterContext.Types, ): ts.InterfaceDeclaration => { diff --git a/src/internal/OpenApiTools/components/PathItem.ts b/src/internal/OpenApiTools/components/PathItem.ts index 7c7db96c..3f18d711 100644 --- a/src/internal/OpenApiTools/components/PathItem.ts +++ b/src/internal/OpenApiTools/components/PathItem.ts @@ -29,28 +29,28 @@ export const generateNamespace = ( comment: Servers.addComment([topComment, pathItem.description], pathItem.servers), }); if (pathItem.get) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "GET", pathItem.get, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "GET", pathItem.get, pathItem.parameters, context, converterContext); } if (pathItem.put) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "PUT", pathItem.put, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "PUT", pathItem.put, pathItem.parameters,context, converterContext); } if (pathItem.post) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "POST", pathItem.post, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "POST", pathItem.post, pathItem.parameters, context, converterContext); } if (pathItem.delete) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "DELETE", pathItem.delete, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "DELETE", pathItem.delete, pathItem.parameters, context, converterContext); } if (pathItem.options) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "OPTIONS", pathItem.options, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "OPTIONS", pathItem.options, pathItem.parameters, context, converterContext); } if (pathItem.head) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "HEAD", pathItem.head, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "HEAD", pathItem.head, pathItem.parameters, context, converterContext); } if (pathItem.patch) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "PATCH", pathItem.patch, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "PATCH", pathItem.patch, pathItem.parameters, context, converterContext); } if (pathItem.trace) { - Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "TRACE", pathItem.trace, context, converterContext); + Operation.generateNamespace(entryPoint, currentPoint, store, factory, basePath, "TRACE", pathItem.trace, pathItem.parameters, context, converterContext); } if (pathItem.parameters) { Parameters.generateNamespaceWithList(entryPoint, currentPoint, store, factory, pathItem.parameters, context, converterContext); @@ -70,22 +70,22 @@ export const generateStatements = ( const statements: ts.Statement[][] = []; if (pathItem.get) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "GET", pathItem.get, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "GET", pathItem.get, pathItem.parameters, context, converterContext), ); } if (pathItem.put) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "PUT", pathItem.put, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "PUT", pathItem.put, pathItem.parameters, context, converterContext), ); } if (pathItem.post) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "POST", pathItem.post, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "POST", pathItem.post, pathItem.parameters, context, converterContext), ); } if (pathItem.delete) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "DELETE", pathItem.delete, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "DELETE", pathItem.delete, pathItem.parameters, context, converterContext), ); } if (pathItem.options) { @@ -98,6 +98,7 @@ export const generateStatements = ( requestUri, "OPTIONS", pathItem.options, + pathItem.parameters, context, converterContext, ), @@ -105,17 +106,17 @@ export const generateStatements = ( } if (pathItem.head) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "HEAD", pathItem.head, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "HEAD", pathItem.head, pathItem.parameters, context, converterContext), ); } if (pathItem.patch) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "PATCH", pathItem.patch, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "PATCH", pathItem.patch, pathItem.parameters, context, converterContext), ); } if (pathItem.trace) { statements.push( - Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "TRACE", pathItem.trace, context, converterContext), + Operation.generateStatements(entryPoint, currentPoint, store, factory, requestUri, "TRACE", pathItem.trace, pathItem.parameters, context, converterContext), ); } // if (pathItem.parameters) { diff --git a/src/typedef/OpenApi.ts b/src/typedef/OpenApi.ts index 531a6eff..46a2fa6b 100644 --- a/src/typedef/OpenApi.ts +++ b/src/typedef/OpenApi.ts @@ -246,7 +246,7 @@ export interface Operation { description?: string; externalDocs?: ExternalDocumentation; operationId?: string; - parameters?: [Parameter | Reference]; + parameters?: (Parameter | Reference)[]; requestBody?: RequestBody | Reference; responses?: Responses; callbacks?: Record; diff --git a/test/__tests__/__snapshots__/parameter-test.ts.snap b/test/__tests__/__snapshots__/parameter-test.ts.snap index 77eeda6c..9cad94d1 100644 --- a/test/__tests__/__snapshots__/parameter-test.ts.snap +++ b/test/__tests__/__snapshots__/parameter-test.ts.snap @@ -263,6 +263,7 @@ exports[`Parameter api.test.domain 1`] = ` \\"requestUri\\": \\"/get/reference/items\\", \\"comment\\": \\"\\", \\"deprecated\\": false, + \\"parameters\\": [], \\"responses\\": { \\"200\\": { \\"description\\": \\"Get Books\\", @@ -313,6 +314,180 @@ exports[`Parameter api.test.domain 1`] = ` } } } + }, + { + \\"operationId\\": \\"getBookById\\", + \\"convertedParams\\": { + \\"escapedOperationId\\": \\"getBookById\\", + \\"argumentParamsTypeDeclaration\\": \\"Params$getBookById\\", + \\"functionName\\": \\"getBookById\\", + \\"requestContentTypeName\\": \\"RequestContentType$getBookById\\", + \\"responseContentTypeName\\": \\"ResponseContentType$getBookById\\", + \\"parameterName\\": \\"Parameter$getBookById\\", + \\"requestBodyName\\": \\"RequestBody$getBookById\\", + \\"hasRequestBody\\": false, + \\"hasParameter\\": true, + \\"pickedParameters\\": [ + { + \\"name\\": \\"id\\", + \\"in\\": \\"path\\", + \\"required\\": true + } + ], + \\"requestContentTypes\\": [], + \\"responseSuccessNames\\": [ + \\"Response$getBookById$Status$200\\" + ], + \\"responseFirstSuccessName\\": \\"Response$getBookById$Status$200\\", + \\"has2OrMoreSuccessNames\\": false, + \\"responseErrorNames\\": [], + \\"has2OrMoreRequestContentTypes\\": false, + \\"successResponseContentTypes\\": [ + \\"application/json\\" + ], + \\"successResponseFirstContentType\\": \\"application/json\\", + \\"has2OrMoreSuccessResponseContentTypes\\": false, + \\"hasAdditionalHeaders\\": false, + \\"hasQueryParameters\\": false + }, + \\"operationParams\\": { + \\"httpMethod\\": \\"get\\", + \\"requestUri\\": \\"/get/books/{id}\\", + \\"comment\\": \\"\\", + \\"deprecated\\": false, + \\"parameters\\": [ + { + \\"name\\": \\"id\\", + \\"in\\": \\"path\\", + \\"required\\": true, + \\"description\\": \\"Book ID\\", + \\"schema\\": { + \\"type\\": \\"string\\", + \\"format\\": \\"uuid\\" + } + } + ], + \\"responses\\": { + \\"200\\": { + \\"description\\": \\"get books\\", + \\"content\\": { + \\"application/json\\": { + \\"schema\\": { + \\"type\\": \\"object\\", + \\"properties\\": { + \\"stringType\\": { + \\"type\\": \\"string\\" + }, + \\"numberType\\": { + \\"type\\": \\"number\\" + }, + \\"booleanType\\": { + \\"type\\": \\"boolean\\" + }, + \\"arrayType\\": { + \\"type\\": \\"string\\" + }, + \\"objectType\\": { + \\"type\\": \\"object\\", + \\"required\\": [ + \\"requiredStringType\\" + ], + \\"properties\\": { + \\"requiredStringType\\": { + \\"type\\": \\"string\\" + } + } + } + }, + \\"example\\": { + \\"stringType\\": \\"string-type\\", + \\"numberType\\": 1, + \\"booleanType\\": false, + \\"arrayType\\": [], + \\"objectType\\": { + \\"requiredStringType\\": \\"required-string-type\\" + } + } + } + } + } + } + } + } + }, + { + \\"operationId\\": \\"deleteBook\\", + \\"convertedParams\\": { + \\"escapedOperationId\\": \\"deleteBook\\", + \\"argumentParamsTypeDeclaration\\": \\"Params$deleteBook\\", + \\"functionName\\": \\"deleteBook\\", + \\"requestContentTypeName\\": \\"RequestContentType$deleteBook\\", + \\"responseContentTypeName\\": \\"ResponseContentType$deleteBook\\", + \\"parameterName\\": \\"Parameter$deleteBook\\", + \\"requestBodyName\\": \\"RequestBody$deleteBook\\", + \\"hasRequestBody\\": false, + \\"hasParameter\\": true, + \\"pickedParameters\\": [ + { + \\"name\\": \\"id\\", + \\"in\\": \\"path\\", + \\"required\\": true + } + ], + \\"requestContentTypes\\": [], + \\"responseSuccessNames\\": [ + \\"Response$deleteBook$Status$200\\" + ], + \\"responseFirstSuccessName\\": \\"Response$deleteBook$Status$200\\", + \\"has2OrMoreSuccessNames\\": false, + \\"responseErrorNames\\": [], + \\"has2OrMoreRequestContentTypes\\": false, + \\"successResponseContentTypes\\": [ + \\"application/json\\" + ], + \\"successResponseFirstContentType\\": \\"application/json\\", + \\"has2OrMoreSuccessResponseContentTypes\\": false, + \\"hasAdditionalHeaders\\": false, + \\"hasQueryParameters\\": false + }, + \\"operationParams\\": { + \\"httpMethod\\": \\"delete\\", + \\"requestUri\\": \\"/get/books/{id}\\", + \\"comment\\": \\"\\", + \\"deprecated\\": false, + \\"parameters\\": [ + { + \\"name\\": \\"id\\", + \\"in\\": \\"path\\", + \\"required\\": true, + \\"description\\": \\"Number Book ID\\", + \\"schema\\": { + \\"type\\": \\"number\\", + \\"format\\": \\"uuid\\" + } + } + ], + \\"responses\\": { + \\"200\\": { + \\"description\\": \\"get books\\", + \\"content\\": { + \\"application/json\\": { + \\"schema\\": { + \\"type\\": \\"object\\", + \\"properties\\": { + \\"status\\": { + \\"type\\": \\"string\\", + \\"enum\\": [ + \\"ok\\" + ] + } + } + } + } + } + } + } + } } ]" `; diff --git a/test/__tests__/__snapshots__/spit-code-test.ts.snap b/test/__tests__/__snapshots__/spit-code-test.ts.snap index f43c2a2f..d2893fbe 100644 --- a/test/__tests__/__snapshots__/spit-code-test.ts.snap +++ b/test/__tests__/__snapshots__/spit-code-test.ts.snap @@ -42,6 +42,22 @@ export interface Response$getReferenceItems$Status$200 { books?: Schemas.Item[]; }; } +export interface Parameter$getBookById { + /** Book ID */ + id: string; +} +export interface Response$getBookById$Status$200 { + \\"application/json\\": Schemas.ObjectHasPropertiesType; +} +export interface Parameter$deleteBook { + /** Number Book ID */ + id: number; +} +export interface Response$deleteBook$Status$200 { + \\"application/json\\": { + status?: \\"ok\\"; + }; +} export type ResponseContentType$getIncludeLocalReference = keyof Response$getIncludeLocalReference$Status$200; export interface Params$getIncludeLocalReference { parameter: Parameter$getIncludeLocalReference; @@ -56,6 +72,14 @@ export interface Params$getFullRemoteReference { parameter: Parameter$getFullRemoteReference; } export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200; +export type ResponseContentType$getBookById = keyof Response$getBookById$Status$200; +export interface Params$getBookById { + parameter: Parameter$getBookById; +} +export type ResponseContentType$deleteBook = keyof Response$deleteBook$Status$200; +export interface Params$deleteBook { + parameter: Parameter$deleteBook; +} export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\"; export interface ObjectLike { [key: string]: any; @@ -68,12 +92,14 @@ export interface QueryParameter { export interface QueryParameters { [key: string]: QueryParameter; } -export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200; +export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200; export namespace ErrorResponse { export type getIncludeLocalReference = void; export type getIncludeRemoteReference = void; export type getFullRemoteReference = void; export type getReferenceItems = void; + export type getBookById = void; + export type deleteBook = void; } export interface ApiClient { request: (httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => Promise; @@ -133,6 +159,28 @@ export class Client { }; return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); } + /** + * operationId: getBookById + * Request URI: /get/books/{id} + */ + public async getBookById(params: Params$getBookById, option?: RequestOption): Promise { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); + } + /** + * operationId: deleteBook + * Request URI: /get/books/{id} + */ + public async deleteBook(params: Params$deleteBook, option?: RequestOption): Promise { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"DELETE\\", url, headers, undefined, undefined, option); + } } " `; diff --git a/test/__tests__/__snapshots__/template-only-test.ts.snap b/test/__tests__/__snapshots__/template-only-test.ts.snap index 1388f7d5..d9ad542a 100644 --- a/test/__tests__/__snapshots__/template-only-test.ts.snap +++ b/test/__tests__/__snapshots__/template-only-test.ts.snap @@ -24,6 +24,14 @@ export interface Params$getFullRemoteReference { parameter: Parameter$getFullRemoteReference; } export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200; +export type ResponseContentType$getBookById = keyof Response$getBookById$Status$200; +export interface Params$getBookById { + parameter: Parameter$getBookById; +} +export type ResponseContentType$deleteBook = keyof Response$deleteBook$Status$200; +export interface Params$deleteBook { + parameter: Parameter$deleteBook; +} export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\"; export interface ObjectLike { [key: string]: any; @@ -36,12 +44,14 @@ export interface QueryParameter { export interface QueryParameters { [key: string]: QueryParameter; } -export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200; +export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200; export namespace ErrorResponse { export type getIncludeLocalReference = void; export type getIncludeRemoteReference = void; export type getFullRemoteReference = void; export type getReferenceItems = void; + export type getBookById = void; + export type deleteBook = void; } export interface ApiClient { request: (httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => Promise; @@ -85,6 +95,20 @@ export class Client { }; return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); } + public async getBookById(params: Params$getBookById, option?: RequestOption): Promise { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); + } + public async deleteBook(params: Params$deleteBook, option?: RequestOption): Promise { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"DELETE\\", url, headers, undefined, undefined, option); + } } " `; @@ -113,6 +137,14 @@ export interface Params$getFullRemoteReference { parameter: Parameter$getFullRemoteReference; } export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200; +export type ResponseContentType$getBookById = keyof Response$getBookById$Status$200; +export interface Params$getBookById { + parameter: Parameter$getBookById; +} +export type ResponseContentType$deleteBook = keyof Response$deleteBook$Status$200; +export interface Params$deleteBook { + parameter: Parameter$deleteBook; +} export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\"; export interface ObjectLike { [key: string]: any; @@ -125,12 +157,14 @@ export interface QueryParameter { export interface QueryParameters { [key: string]: QueryParameter; } -export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200; +export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200; export namespace ErrorResponse { export type getIncludeLocalReference = void; export type getIncludeRemoteReference = void; export type getFullRemoteReference = void; export type getReferenceItems = void; + export type getBookById = void; + export type deleteBook = void; } export interface ApiClient { request: (httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => T; @@ -174,6 +208,20 @@ export class Client { }; return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); } + public getBookById(params: Params$getBookById, option?: RequestOption): Response$getBookById$Status$200[\\"application/json\\"] { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); + } + public deleteBook(params: Params$deleteBook, option?: RequestOption): Response$deleteBook$Status$200[\\"application/json\\"] { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"DELETE\\", url, headers, undefined, undefined, option); + } } " `; diff --git a/test/__tests__/__snapshots__/typedef-with-template-test.ts.snap b/test/__tests__/__snapshots__/typedef-with-template-test.ts.snap index 8f885194..44e214ff 100644 --- a/test/__tests__/__snapshots__/typedef-with-template-test.ts.snap +++ b/test/__tests__/__snapshots__/typedef-with-template-test.ts.snap @@ -318,6 +318,22 @@ export interface Response$getReferenceItems$Status$200 { books?: Schemas.Item[]; }; } +export interface Parameter$getBookById { + /** Book ID */ + id: string; +} +export interface Response$getBookById$Status$200 { + \\"application/json\\": Schemas.ObjectHasPropertiesType; +} +export interface Parameter$deleteBook { + /** Number Book ID */ + id: number; +} +export interface Response$deleteBook$Status$200 { + \\"application/json\\": { + status?: \\"ok\\"; + }; +} export type ResponseContentType$getIncludeLocalReference = keyof Response$getIncludeLocalReference$Status$200; export interface Params$getIncludeLocalReference { parameter: Parameter$getIncludeLocalReference; @@ -332,6 +348,14 @@ export interface Params$getFullRemoteReference { parameter: Parameter$getFullRemoteReference; } export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200; +export type ResponseContentType$getBookById = keyof Response$getBookById$Status$200; +export interface Params$getBookById { + parameter: Parameter$getBookById; +} +export type ResponseContentType$deleteBook = keyof Response$deleteBook$Status$200; +export interface Params$deleteBook { + parameter: Parameter$deleteBook; +} export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\"; export interface ObjectLike { [key: string]: any; @@ -344,12 +368,14 @@ export interface QueryParameter { export interface QueryParameters { [key: string]: QueryParameter; } -export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200; +export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200; export namespace ErrorResponse { export type getIncludeLocalReference = void; export type getIncludeRemoteReference = void; export type getFullRemoteReference = void; export type getReferenceItems = void; + export type getBookById = void; + export type deleteBook = void; } export interface ApiClient { request: (httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => Promise; @@ -393,6 +419,20 @@ export class Client { }; return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); } + public async getBookById(params: Params$getBookById, option?: RequestOption): Promise { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); + } + public async deleteBook(params: Params$deleteBook, option?: RequestOption): Promise { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"DELETE\\", url, headers, undefined, undefined, option); + } } " `; @@ -715,6 +755,22 @@ export interface Response$getReferenceItems$Status$200 { books?: Schemas.Item[]; }; } +export interface Parameter$getBookById { + /** Book ID */ + id: string; +} +export interface Response$getBookById$Status$200 { + \\"application/json\\": Schemas.ObjectHasPropertiesType; +} +export interface Parameter$deleteBook { + /** Number Book ID */ + id: number; +} +export interface Response$deleteBook$Status$200 { + \\"application/json\\": { + status?: \\"ok\\"; + }; +} export type ResponseContentType$getIncludeLocalReference = keyof Response$getIncludeLocalReference$Status$200; export interface Params$getIncludeLocalReference { parameter: Parameter$getIncludeLocalReference; @@ -729,6 +785,14 @@ export interface Params$getFullRemoteReference { parameter: Parameter$getFullRemoteReference; } export type ResponseContentType$getReferenceItems = keyof Response$getReferenceItems$Status$200; +export type ResponseContentType$getBookById = keyof Response$getBookById$Status$200; +export interface Params$getBookById { + parameter: Parameter$getBookById; +} +export type ResponseContentType$deleteBook = keyof Response$deleteBook$Status$200; +export interface Params$deleteBook { + parameter: Parameter$deleteBook; +} export type HttpMethod = \\"GET\\" | \\"PUT\\" | \\"POST\\" | \\"DELETE\\" | \\"OPTIONS\\" | \\"HEAD\\" | \\"PATCH\\" | \\"TRACE\\"; export interface ObjectLike { [key: string]: any; @@ -741,12 +805,14 @@ export interface QueryParameter { export interface QueryParameters { [key: string]: QueryParameter; } -export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200; +export type SuccessResponses = Response$getIncludeLocalReference$Status$200 | Response$getFullRemoteReference$Status$200 | Response$getReferenceItems$Status$200 | Response$getBookById$Status$200 | Response$deleteBook$Status$200; export namespace ErrorResponse { export type getIncludeLocalReference = void; export type getIncludeRemoteReference = void; export type getFullRemoteReference = void; export type getReferenceItems = void; + export type getBookById = void; + export type deleteBook = void; } export interface ApiClient { request: (httpMethod: HttpMethod, url: string, headers: ObjectLike | any, requestBody: ObjectLike | any, queryParameters: QueryParameters | undefined, options?: RequestOption) => T; @@ -790,6 +856,20 @@ export class Client { }; return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); } + public getBookById(params: Params$getBookById, option?: RequestOption): Response$getBookById$Status$200[\\"application/json\\"] { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"GET\\", url, headers, undefined, undefined, option); + } + public deleteBook(params: Params$deleteBook, option?: RequestOption): Response$deleteBook$Status$200[\\"application/json\\"] { + const url = this.baseUrl + \`/get/books/\${params.parameter.id}\`; + const headers = { + Accept: \\"application/json\\" + }; + return this.apiClient.request(\\"DELETE\\", url, headers, undefined, undefined, option); + } } " `; diff --git a/test/api.test.domain/index.yml b/test/api.test.domain/index.yml index 5c53f269..05e81e52 100644 --- a/test/api.test.domain/index.yml +++ b/test/api.test.domain/index.yml @@ -380,3 +380,42 @@ paths: type: array items: $ref: "./components/schemas/Item.yml" + /get/books/{id}: + parameters: + - name: id + in: path + required: true + description: Book ID + schema: + type: string + format: uuid + get: + operationId: getBookById + responses: + 200: + description: "get books" + content: + application/json: + schema: + $ref: "#/components/schemas/ObjectHasPropertiesType" + delete: + operationId: deleteBook + parameters: + - name: id + in: path + required: true + description: Number Book ID + schema: + type: number + format: uuid + responses: + 200: + description: "get books" + content: + application/json: + schema: + type: object + properties: + status: + type: string + enum: [ok]