diff --git a/.changeset/silly-spiders-switch.md b/.changeset/silly-spiders-switch.md new file mode 100644 index 0000000..c21605e --- /dev/null +++ b/.changeset/silly-spiders-switch.md @@ -0,0 +1,5 @@ +--- +"typed-openapi": minor +--- + +Fix default response behavior (only use "default" as a fallback) diff --git a/packages/typed-openapi/src/map-openapi-endpoints.ts b/packages/typed-openapi/src/map-openapi-endpoints.ts index a7107fb..dd386cb 100644 --- a/packages/typed-openapi/src/map-openapi-endpoints.ts +++ b/packages/typed-openapi/src/map-openapi-endpoints.ts @@ -103,17 +103,16 @@ export const mapOpenApiEndpoints = (doc: OpenAPIObject) => { endpoint.parameters = Object.keys(params).length ? (params as any as EndpointParameters) : undefined; } - let responseObject; - // Match the default response or first 2xx-3xx response found - if (operation.responses.default) { + // Match the first 2xx-3xx response found, or fallback to default one otherwise + let responseObject: ResponseObject | undefined; + Object.entries(operation.responses).map(([status, responseOrRef]) => { + const statusCode = Number(status); + if (statusCode >= 200 && statusCode < 300) { + responseObject = refs.unwrap(responseOrRef); + } + }); + if (!responseObject && operation.responses.default) { responseObject = refs.unwrap(operation.responses.default); - } else { - Object.entries(operation.responses).map(([status, responseOrRef]) => { - const statusCode = Number(status); - if (statusCode >= 200 && statusCode < 300) { - responseObject = refs.unwrap(responseOrRef); - } - }); } const content = responseObject?.content; diff --git a/packages/typed-openapi/tests/generator.test.ts b/packages/typed-openapi/tests/generator.test.ts index 0826840..e1cdbce 100644 --- a/packages/typed-openapi/tests/generator.test.ts +++ b/packages/typed-openapi/tests/generator.test.ts @@ -161,7 +161,7 @@ describe("generator", () => { parameters: { body: Array; }; - response: unknown; + response: Schemas.User; }; export type get_LoginUser = { method: "GET"; diff --git a/packages/typed-openapi/tests/map-openapi-endpoints.test.ts b/packages/typed-openapi/tests/map-openapi-endpoints.test.ts index 3082a24..042aece 100644 --- a/packages/typed-openapi/tests/map-openapi-endpoints.test.ts +++ b/packages/typed-openapi/tests/map-openapi-endpoints.test.ts @@ -2196,8 +2196,8 @@ describe("map-openapi-endpoints", () => { }, "path": "/user/createWithList", "response": { - "type": "keyword", - "value": "unknown", + "type": "ref", + "value": "User", }, }, { diff --git a/packages/typed-openapi/tests/snapshots/petstore.arktype.ts b/packages/typed-openapi/tests/snapshots/petstore.arktype.ts index dd78826..4cb0f4a 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.arktype.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.arktype.ts @@ -187,7 +187,7 @@ export const types = scope({ parameters: { body: "User[]", }, - response: "unknown", + response: "User", }, get_LoginUser: { method: '"GET"', diff --git a/packages/typed-openapi/tests/snapshots/petstore.client.ts b/packages/typed-openapi/tests/snapshots/petstore.client.ts index afadedd..dc1ddd6 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.client.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.client.ts @@ -151,7 +151,7 @@ export namespace Endpoints { parameters: { body: Array; }; - response: unknown; + response: Schemas.User; }; export type get_LoginUser = { method: "GET"; diff --git a/packages/typed-openapi/tests/snapshots/petstore.io-ts.ts b/packages/typed-openapi/tests/snapshots/petstore.io-ts.ts index c1e0141..932df4b 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.io-ts.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.io-ts.ts @@ -234,7 +234,7 @@ export const post_CreateUsersWithListInput = t.type({ parameters: t.type({ body: t.array(User), }), - response: t.unknown, + response: User, }); export type get_LoginUser = t.TypeOf; diff --git a/packages/typed-openapi/tests/snapshots/petstore.typebox.ts b/packages/typed-openapi/tests/snapshots/petstore.typebox.ts index 6492c31..8955ad0 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.typebox.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.typebox.ts @@ -257,7 +257,7 @@ export const post_CreateUsersWithListInput = Type.Object({ parameters: Type.Object({ body: Type.Array(User), }), - response: Type.Unknown(), + response: User, }); export type get_LoginUser = Static; diff --git a/packages/typed-openapi/tests/snapshots/petstore.valibot.ts b/packages/typed-openapi/tests/snapshots/petstore.valibot.ts index 02fcf5f..2b8de58 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.valibot.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.valibot.ts @@ -233,7 +233,7 @@ export const post_CreateUsersWithListInput = v.object({ parameters: v.object({ body: v.array(User), }), - response: v.unknown(), + response: User, }); export type get_LoginUser = v.Output; diff --git a/packages/typed-openapi/tests/snapshots/petstore.yup.ts b/packages/typed-openapi/tests/snapshots/petstore.yup.ts index 7195796..731bd47 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.yup.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.yup.ts @@ -265,7 +265,7 @@ export const post_CreateUsersWithListInput = { parameters: y.object({ body: y.array(User), }), - response: y.mixed((value): value is any => true).required() as y.MixedSchema, + response: User, }; export type get_LoginUser = typeof get_LoginUser; diff --git a/packages/typed-openapi/tests/snapshots/petstore.zod.ts b/packages/typed-openapi/tests/snapshots/petstore.zod.ts index ef19b64..3377d42 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.zod.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.zod.ts @@ -228,7 +228,7 @@ export const post_CreateUsersWithListInput = { parameters: z.object({ body: z.array(User), }), - response: z.unknown(), + response: User, }; export type get_LoginUser = typeof get_LoginUser;