Skip to content

Commit 9299c95

Browse files
committed
fix(openapi-fetch): treat default response as error
1 parent 81128e2 commit 9299c95

File tree

7 files changed

+32
-1
lines changed

7 files changed

+32
-1
lines changed

.changeset/sixty-bobcats-jam.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"openapi-fetch": patch
3+
---
4+
5+
Treat `default` response as error

docs/src/content/docs/openapi-fetch/index.md

+1
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,5 @@ All methods return an object with **data**, **error**, and **response**.
134134

135135
- **data** will contain that endpoint’s `2xx` response if the server returned `2xx`; otherwise it will be `undefined`
136136
- **error** likewise contains that endpoint’s `4xx`/`5xx` response if the server returned either; otherwise it will be `undefined`
137+
- _Note: `default` will also be interpreted as `error`, since its intent is handling unexpected HTTP codes_
137138
- **response** has response info like `status`, `headers`, etc. It is not typechecked.

packages/openapi-fetch/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ All methods return an object with **data**, **error**, and **response**.
129129

130130
- **data** will contain that endpoint’s `2xx` response if the server returned `2xx`; otherwise it will be `undefined`
131131
- **error** likewise contains that endpoint’s `4xx`/`5xx` response if the server returned either; otherwise it will be `undefined`
132+
- _Note: `default` will also be interpreted as `error`, since its intent is handling unexpected HTTP codes_
132133
- **response** has response info like `status`, `headers`, etc. It is not typechecked.
133134

134135
## API

packages/openapi-fetch/src/index.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,18 @@ describe("client", () => {
194194
});
195195
expect((await client.get("/self", {})).data).toBe(data);
196196
});
197+
198+
it("treats `default` as an error", async () => {
199+
const client = createClient<paths>({ headers: { "Cache-Control": "max-age=10000000" } });
200+
fetchMocker.mockResponseOnce(() => ({ status: 500, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ code: 500, message: "An unexpected error occurred" }) }));
201+
const { error } = await client.get("/default-as-error", {});
202+
203+
// discard `data` object
204+
if (!error) throw new Error("treats `default` as an error: error response should be present");
205+
206+
// assert `error.message` doesn’t throw TS error
207+
expect(error.message).toBe("An unexpected error occurred");
208+
});
197209
});
198210

199211
describe("get()", () => {

packages/openapi-fetch/src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export type RequestBody<O> = undefined extends RequestBodyJSON<O> ? { body?: Req
4545
export type QuerySerializer<O> = (query: O extends { parameters: { query: any } } ? O["parameters"]["query"] : Record<string, unknown>) => string;
4646
export type RequestOptions<T> = Params<T> & RequestBody<T> & { querySerializer?: QuerySerializer<T> };
4747
export type Success<O> = FilterKeys<FilterKeys<O, OkStatus>, "content">;
48-
export type Error<O> = FilterKeys<FilterKeys<O, ErrorStatus>, "content">;
48+
export type Error<O> = FilterKeys<FilterKeys<O, ErrorStatus | "default">, "content">;
4949

5050
// fetch types
5151
export type FetchOptions<T> = RequestOptions<T> & Omit<RequestInit, "body">;

packages/openapi-fetch/test/v1.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ export interface paths {
141141
};
142142
};
143143
};
144+
"/default-as-error": {
145+
get: {
146+
responses: {
147+
default: components["responses"]["Error"];
148+
};
149+
};
150+
};
144151
"/anyMethod": {
145152
get: {
146153
responses: {

packages/openapi-fetch/test/v1.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ paths:
124124
$ref: '#/components/responses/CreateTag'
125125
500:
126126
$ref: '#/components/responses/Error'
127+
/default-as-error:
128+
get:
129+
responses:
130+
default:
131+
$ref: '#/components/responses/Error'
127132
/anyMethod:
128133
get:
129134
responses:

0 commit comments

Comments
 (0)