From 0d0575eca0b791cf59f70b166f1e8b3812b076e3 Mon Sep 17 00:00:00 2001 From: axel7083 <42176370+axel7083@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:55:30 +0100 Subject: [PATCH 1/3] fix: incorrect format when using reusable response schema --- src/schema-routes/schema-routes.ts | 4 +- tests/__snapshots__/extended.test.ts.snap | 23 ++ tests/__snapshots__/simple.test.ts.snap | 23 ++ .../axios/__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 308 ++++++++++++++++++ tests/spec/extractResponseRef/basic.test.ts | 34 ++ tests/spec/extractResponseRef/schema.json | 69 ++++ .../spec/js/__snapshots__/basic.test.ts.snap | 1 + .../jsAxios/__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../patch/__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + .../__snapshots__/basic.test.ts.snap | 1 + 18 files changed, 471 insertions(+), 2 deletions(-) create mode 100644 tests/spec/extractResponseRef/__snapshots__/basic.test.ts.snap create mode 100644 tests/spec/extractResponseRef/basic.test.ts create mode 100644 tests/spec/extractResponseRef/schema.json diff --git a/src/schema-routes/schema-routes.ts b/src/schema-routes/schema-routes.ts index 0d64813f7..5156141ab 100644 --- a/src/schema-routes/schema-routes.ts +++ b/src/schema-routes/schema-routes.ts @@ -412,12 +412,11 @@ export class SchemaRoutes { parsedSchemas, operationId, defaultType, + contentTypes }) => lodash.reduce( requestInfos, (acc, requestInfo, status) => { - const contentTypes = this.getContentTypes([requestInfo], operationId); - return [ ...acc, { @@ -460,6 +459,7 @@ export class SchemaRoutes { parsedSchemas, operationId, defaultType: this.config.defaultResponseType, + contentTypes, }); const successResponse = responseInfos.find( diff --git a/tests/__snapshots__/extended.test.ts.snap b/tests/__snapshots__/extended.test.ts.snap index e95bc232a..34dbabe85 100644 --- a/tests/__snapshots__/extended.test.ts.snap +++ b/tests/__snapshots__/extended.test.ts.snap @@ -9363,6 +9363,7 @@ export class Api< this.request({ path: \`/wrong-path-params1/\${pathParam1}/\${pathParam2}/\${pathParam3}/\${pathParam4}\`, method: "DELETE", + format: "json", ...params, }), }; @@ -9381,6 +9382,7 @@ export class Api< this.request({ path: \`/wrong-path-params2\`, method: "DELETE", + format: "json", ...params, }), }; @@ -9621,6 +9623,7 @@ export class Api< this.request({ path: \`/scope/\${job}\`, method: "HEAD", + format: "json", ...params, }), @@ -52055,6 +52058,7 @@ export class Api< this.request({ path: \`/gists/\${gistId}/star\`, method: "GET", + format: "json", ...params, }), @@ -54093,6 +54097,7 @@ export class Api< this.request({ path: \`/orgs/\${org}/blocks/\${username}\`, method: "GET", + format: "json", ...params, }), @@ -54150,6 +54155,7 @@ export class Api< >({ path: \`/orgs/\${org}/outside_collaborators/\${username}\`, method: "PUT", + format: "json", ...params, }), @@ -54584,6 +54590,7 @@ export class Api< >({ path: \`/orgs/\${org}/outside_collaborators/\${username}\`, method: "DELETE", + format: "json", ...params, }), @@ -55055,6 +55062,7 @@ export class Api< method: "PUT", body: data, type: ContentType.Json, + format: "json", ...params, }), @@ -55820,6 +55828,7 @@ export class Api< this.request({ path: \`/projects/\${projectId}\`, method: "DELETE", + format: "json", ...params, }), @@ -55838,6 +55847,7 @@ export class Api< this.request({ path: \`/projects/columns/cards/\${cardId}\`, method: "DELETE", + format: "json", ...params, }), @@ -57888,6 +57898,7 @@ export class Api< >({ path: \`/repos/\${owner}/\${repo}/assignees/\${assignee}\`, method: "GET", + format: "json", ...params, }), @@ -60237,6 +60248,7 @@ export class Api< this.request({ path: \`/repos/\${owner}/\${repo}\`, method: "DELETE", + format: "json", ...params, }), @@ -63439,6 +63451,7 @@ export class Api< this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), @@ -63498,6 +63511,7 @@ export class Api< method: "PUT", body: data, type: ContentType.Json, + format: "json", ...params, }), @@ -64187,6 +64201,7 @@ export class Api< >({ path: \`/user/starred/\${owner}/\${repo}\`, method: "GET", + format: "json", ...params, }), @@ -64935,6 +64950,7 @@ export class Api< this.request({ path: \`/user/blocks/\${username}\`, method: "GET", + format: "json", ...params, }), @@ -64956,6 +64972,7 @@ export class Api< >({ path: \`/user/following/\${username}\`, method: "GET", + format: "json", ...params, }), @@ -70618,6 +70635,7 @@ export class Api< this.request({ path: \`/pets\`, method: "POST", + format: "json", ...params, }), @@ -71047,6 +71065,7 @@ export class Api< this.request({ path: \`/pets\`, method: "POST", + format: "json", ...params, }), @@ -71533,6 +71552,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), @@ -72079,6 +72099,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), @@ -72894,6 +72915,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), @@ -74641,6 +74663,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), diff --git a/tests/__snapshots__/simple.test.ts.snap b/tests/__snapshots__/simple.test.ts.snap index 710b23008..accc3e29d 100644 --- a/tests/__snapshots__/simple.test.ts.snap +++ b/tests/__snapshots__/simple.test.ts.snap @@ -5914,6 +5914,7 @@ export class Api< this.request({ path: \`/wrong-path-params1/\${pathParam1}/\${pathParam2}/\${pathParam3}/\${pathParam4}\`, method: "DELETE", + format: "json", ...params, }), }; @@ -5929,6 +5930,7 @@ export class Api< this.request({ path: \`/wrong-path-params2\`, method: "DELETE", + format: "json", ...params, }), }; @@ -6219,6 +6221,7 @@ export class Api< this.request({ path: \`/scope/\${job}\`, method: "HEAD", + format: "json", ...params, }), @@ -19759,6 +19762,7 @@ export class Api< this.request({ path: \`/gists/\${gistId}/star\`, method: "GET", + format: "json", ...params, }), @@ -21609,6 +21613,7 @@ export class Api< this.request({ path: \`/orgs/\${org}/blocks/\${username}\`, method: "GET", + format: "json", ...params, }), @@ -22675,6 +22680,7 @@ export class Api< >({ path: \`/orgs/\${org}/outside_collaborators/\${username}\`, method: "PUT", + format: "json", ...params, }), @@ -22700,6 +22706,7 @@ export class Api< >({ path: \`/orgs/\${org}/outside_collaborators/\${username}\`, method: "DELETE", + format: "json", ...params, }), @@ -23980,6 +23987,7 @@ export class Api< method: "PUT", body: data, type: ContentType.Json, + format: "json", ...params, }), @@ -24271,6 +24279,7 @@ export class Api< >({ path: \`/projects/columns/cards/\${cardId}\`, method: "DELETE", + format: "json", ...params, }), @@ -24598,6 +24607,7 @@ export class Api< >({ path: \`/projects/\${projectId}\`, method: "DELETE", + format: "json", ...params, }), @@ -24963,6 +24973,7 @@ export class Api< >({ path: \`/repos/\${owner}/\${repo}\`, method: "DELETE", + format: "json", ...params, }), @@ -25988,6 +25999,7 @@ export class Api< this.request({ path: \`/repos/\${owner}/\${repo}/assignees/\${assignee}\`, method: "GET", + format: "json", ...params, }), @@ -35495,6 +35507,7 @@ export class Api< >({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), @@ -35713,6 +35726,7 @@ export class Api< method: "PUT", body: data, type: ContentType.Json, + format: "json", ...params, }), @@ -36053,6 +36067,7 @@ export class Api< this.request({ path: \`/user/blocks/\${username}\`, method: "GET", + format: "json", ...params, }), @@ -36279,6 +36294,7 @@ export class Api< this.request({ path: \`/user/following/\${username}\`, method: "GET", + format: "json", ...params, }), @@ -37448,6 +37464,7 @@ export class Api< this.request({ path: \`/user/starred/\${owner}/\${repo}\`, method: "GET", + format: "json", ...params, }), @@ -42161,6 +42178,7 @@ export class Api< this.request({ path: \`/pets\`, method: "POST", + format: "json", ...params, }), @@ -42515,6 +42533,7 @@ export class Api< this.request({ path: \`/pets\`, method: "POST", + format: "json", ...params, }), @@ -42902,6 +42921,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), }; @@ -43311,6 +43331,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), }; @@ -43998,6 +44019,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), }; @@ -45107,6 +45129,7 @@ export class Api< this.request({ path: \`/pets/\${id}\`, method: "DELETE", + format: "json", ...params, }), }; diff --git a/tests/spec/axios/__snapshots__/basic.test.ts.snap b/tests/spec/axios/__snapshots__/basic.test.ts.snap index ba768ef9a..d9866d463 100644 --- a/tests/spec/axios/__snapshots__/basic.test.ts.snap +++ b/tests/spec/axios/__snapshots__/basic.test.ts.snap @@ -6009,6 +6009,7 @@ export class Api< this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), diff --git a/tests/spec/axiosSingleHttpClient/__snapshots__/basic.test.ts.snap b/tests/spec/axiosSingleHttpClient/__snapshots__/basic.test.ts.snap index ca053dec1..32cbdf83d 100644 --- a/tests/spec/axiosSingleHttpClient/__snapshots__/basic.test.ts.snap +++ b/tests/spec/axiosSingleHttpClient/__snapshots__/basic.test.ts.snap @@ -6013,6 +6013,7 @@ export class Api { this.http.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), diff --git a/tests/spec/defaultAsSuccess/__snapshots__/basic.test.ts.snap b/tests/spec/defaultAsSuccess/__snapshots__/basic.test.ts.snap index 3b1386313..edc6ccdcc 100644 --- a/tests/spec/defaultAsSuccess/__snapshots__/basic.test.ts.snap +++ b/tests/spec/defaultAsSuccess/__snapshots__/basic.test.ts.snap @@ -608,6 +608,7 @@ export class Api< this.request({ path: \`/scope/\${job}\`, method: "HEAD", + format: "json", ...params, }), diff --git a/tests/spec/extractRequestParams/__snapshots__/basic.test.ts.snap b/tests/spec/extractRequestParams/__snapshots__/basic.test.ts.snap index 985bf2f25..954552315 100644 --- a/tests/spec/extractRequestParams/__snapshots__/basic.test.ts.snap +++ b/tests/spec/extractRequestParams/__snapshots__/basic.test.ts.snap @@ -769,6 +769,7 @@ export class Api< this.request({ path: \`/scope/\${job}\`, method: "HEAD", + format: "json", ...params, }), diff --git a/tests/spec/extractResponseRef/__snapshots__/basic.test.ts.snap b/tests/spec/extractResponseRef/__snapshots__/basic.test.ts.snap new file mode 100644 index 000000000..a09cb9ca1 --- /dev/null +++ b/tests/spec/extractResponseRef/__snapshots__/basic.test.ts.snap @@ -0,0 +1,308 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`basic > --extract-response-body 1`] = ` +"/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +export interface PetTTT { + id?: string; +} + +export type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to \`true\` for call \`securityWorker\` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit< + FullRequestParams, + "body" | "method" | "query" | "path" +>; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: ( + securityData: SecurityDataType | null, + ) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse + extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = "application/json", + JsonApi = "application/vnd.api+json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export class HttpClient { + public baseUrl: string = "http://petstore.swagger.io/v2"; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => + fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: "same-origin", + headers: {}, + redirect: "follow", + referrerPolicy: "no-referrer", + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return \`\${encodedKey}=\${encodeURIComponent(typeof value === "number" ? value : \`\${value}\`)}\`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter( + (key) => "undefined" !== typeof query[key], + ); + return keys + .map((key) => + Array.isArray(query[key]) + ? this.addArrayQueryParam(query, key) + : this.addQueryParam(query, key), + ) + .join("&"); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? \`?\${queryString}\` : ""; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.JsonApi]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.Text]: (input: any) => + input !== null && typeof input !== "string" + ? JSON.stringify(input) + : input, + [ContentType.FormData]: (input: any) => { + if (input instanceof FormData) { + return input; + } + + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === "object" && property !== null + ? JSON.stringify(property) + : \`\${property}\`, + ); + return formData; + }, new FormData()); + }, + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams( + params1: RequestParams, + params2?: RequestParams, + ): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = ( + cancelToken: CancelToken, + ): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch( + \`\${baseUrl || this.baseUrl || ""}\${path}\${queryString ? \`?\${queryString}\` : ""}\`, + { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { "Content-Type": type } + : {}), + }, + signal: + (cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal) || null, + body: + typeof body === "undefined" || body === null + ? null + : payloadFormatter(body), + }, + ).then(async (response) => { + const r = response as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const responseToParse = responseFormat ? response.clone() : response; + const data = !responseFormat + ? r + : await responseToParse[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} + +/** + * @title Swagger Petstore + * @version 1.0.0 + * @license Apache-2.0 (http://www.apache.org/licenses/LICENSE-2.0.html) + * @termsOfService http://swagger.io/terms/ + * @baseUrl http://petstore.swagger.io/v2 + * @externalDocs http://swagger.io + * @contact + * + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key \`special-key\` to test the authorization filters. + */ +export class Api< + SecurityDataType extends unknown, +> extends HttpClient { + pet = { + /** + * No description + * + * @tags pet + * @name GetPet + * @summary dummy get + * @request GET:/pet + */ + getPet: (params: RequestParams = {}) => + this.request({ + path: \`/pet\`, + method: "GET", + format: "json", + ...params, + }), + }; +} +" +`; diff --git a/tests/spec/extractResponseRef/basic.test.ts b/tests/spec/extractResponseRef/basic.test.ts new file mode 100644 index 000000000..0e9e1abab --- /dev/null +++ b/tests/spec/extractResponseRef/basic.test.ts @@ -0,0 +1,34 @@ +import * as fs from "node:fs/promises"; +import * as os from "node:os"; +import * as path from "node:path"; +import { afterAll, beforeAll, describe, expect, test } from "vitest"; +import { generateApi } from "../../../src/index.js"; + +describe("basic", async () => { + let tmpdir = ""; + + beforeAll(async () => { + tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), "swagger-typescript-api")); + }); + + afterAll(async () => { + await fs.rm(tmpdir, { recursive: true }); + }); + + test("--extract-response-body", async () => { + await generateApi({ + fileName: "schema", + input: path.resolve(import.meta.dirname, "schema.json"), + output: tmpdir, + silent: true, + extractResponseBody: true, + typeSuffix: "TTT", + }); + + const content = await fs.readFile(path.join(tmpdir, "schema.ts"), { + encoding: "utf8", + }); + + expect(content).toMatchSnapshot(); + }); +}); diff --git a/tests/spec/extractResponseRef/schema.json b/tests/spec/extractResponseRef/schema.json new file mode 100644 index 000000000..f72930b2d --- /dev/null +++ b/tests/spec/extractResponseRef/schema.json @@ -0,0 +1,69 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache-2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + } + ], + "schemes": ["http"], + "paths": { + "/pet": { + "get": { + "tags": ["pet"], + "summary": "dummy get", + "description": "", + "operationId": "getPet", + "produces": ["application/json"], + "parameters": [], + "responses": { + "200": { + "$ref": "#/responses/GetPetResponse" + } + } + } + } + }, + "definitions": { + "Pet": { + "type": "object", + "required": ["name"], + "properties": { + "id": { + "type": "string" + } + } + } + }, + "responses": { + "GetPetResponse": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" + } + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } +} diff --git a/tests/spec/js/__snapshots__/basic.test.ts.snap b/tests/spec/js/__snapshots__/basic.test.ts.snap index 019ed5c26..fb7ea47b1 100644 --- a/tests/spec/js/__snapshots__/basic.test.ts.snap +++ b/tests/spec/js/__snapshots__/basic.test.ts.snap @@ -2807,6 +2807,7 @@ export class Api extends HttpClient { this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), /** diff --git a/tests/spec/jsAxios/__snapshots__/basic.test.ts.snap b/tests/spec/jsAxios/__snapshots__/basic.test.ts.snap index 0b4dbc534..1ef4009a0 100644 --- a/tests/spec/jsAxios/__snapshots__/basic.test.ts.snap +++ b/tests/spec/jsAxios/__snapshots__/basic.test.ts.snap @@ -2889,6 +2889,7 @@ export class Api extends HttpClient { this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), /** diff --git a/tests/spec/on-insert-path-param/__snapshots__/basic.test.ts.snap b/tests/spec/on-insert-path-param/__snapshots__/basic.test.ts.snap index 9328e352a..f00765be6 100644 --- a/tests/spec/on-insert-path-param/__snapshots__/basic.test.ts.snap +++ b/tests/spec/on-insert-path-param/__snapshots__/basic.test.ts.snap @@ -299,6 +299,7 @@ export class Api< this.request({ path: \`/wrong-path-params1/\${encodeURIComponent(pathParam1)}/\${encodeURIComponent(pathParam2)}/\${encodeURIComponent(pathParam3)}/\${encodeURIComponent(pathParam4)}\`, method: "DELETE", + format: "json", ...params, }), }; diff --git a/tests/spec/patch/__snapshots__/basic.test.ts.snap b/tests/spec/patch/__snapshots__/basic.test.ts.snap index a307e33c9..fdc14721d 100644 --- a/tests/spec/patch/__snapshots__/basic.test.ts.snap +++ b/tests/spec/patch/__snapshots__/basic.test.ts.snap @@ -5774,6 +5774,7 @@ export class Api< this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), diff --git a/tests/spec/responses/__snapshots__/basic.test.ts.snap b/tests/spec/responses/__snapshots__/basic.test.ts.snap index c368fa923..b8943bf37 100644 --- a/tests/spec/responses/__snapshots__/basic.test.ts.snap +++ b/tests/spec/responses/__snapshots__/basic.test.ts.snap @@ -701,6 +701,7 @@ export class Api< this.request({ path: \`/scope/\${job}\`, method: "HEAD", + format: "json", ...params, }), diff --git a/tests/spec/sortTypes-false/__snapshots__/basic.test.ts.snap b/tests/spec/sortTypes-false/__snapshots__/basic.test.ts.snap index 69d5302ed..08d0169f4 100644 --- a/tests/spec/sortTypes-false/__snapshots__/basic.test.ts.snap +++ b/tests/spec/sortTypes-false/__snapshots__/basic.test.ts.snap @@ -5745,6 +5745,7 @@ export class Api< this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), diff --git a/tests/spec/sortTypes/__snapshots__/basic.test.ts.snap b/tests/spec/sortTypes/__snapshots__/basic.test.ts.snap index 785d970ce..2a03cbbe5 100644 --- a/tests/spec/sortTypes/__snapshots__/basic.test.ts.snap +++ b/tests/spec/sortTypes/__snapshots__/basic.test.ts.snap @@ -5745,6 +5745,7 @@ export class Api< this.request({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), diff --git a/tests/spec/typeSuffixPrefix/__snapshots__/basic.test.ts.snap b/tests/spec/typeSuffixPrefix/__snapshots__/basic.test.ts.snap index aef88befe..2ae27ed04 100644 --- a/tests/spec/typeSuffixPrefix/__snapshots__/basic.test.ts.snap +++ b/tests/spec/typeSuffixPrefix/__snapshots__/basic.test.ts.snap @@ -6256,6 +6256,7 @@ export class Api< >({ path: \`/teams/\${teamId}/members/\${username}\`, method: "PUT", + format: "json", ...params, }), From f0b21019854ab17775ed524933f1a6c2d18b178b Mon Sep 17 00:00:00 2001 From: axel7083 <42176370+axel7083@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:55:58 +0100 Subject: [PATCH 2/3] fix: prettier --- src/schema-routes/schema-routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schema-routes/schema-routes.ts b/src/schema-routes/schema-routes.ts index 5156141ab..0f3f391a1 100644 --- a/src/schema-routes/schema-routes.ts +++ b/src/schema-routes/schema-routes.ts @@ -412,7 +412,7 @@ export class SchemaRoutes { parsedSchemas, operationId, defaultType, - contentTypes + contentTypes, }) => lodash.reduce( requestInfos, From 5971174250a777b8ebf20c54d1894d3ae938de92 Mon Sep 17 00:00:00 2001 From: axel7083 <42176370+axel7083@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:59:50 +0100 Subject: [PATCH 3/3] docs: adding changeset --- .changeset/stale-masks-hug.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stale-masks-hug.md diff --git a/.changeset/stale-masks-hug.md b/.changeset/stale-masks-hug.md new file mode 100644 index 000000000..7c0b8bb82 --- /dev/null +++ b/.changeset/stale-masks-hug.md @@ -0,0 +1,5 @@ +--- +"swagger-typescript-api": patch +--- + +fix: incorrect format detection when using ref/responses