Skip to content

Commit e39d11e

Browse files
authored
Improve middleware type definition (#1918)
* Improve middleware type definition * Add type test for middleware * Add changeset
1 parent d2cb020 commit e39d11e

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

.changeset/short-lizards-rescue.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"openapi-fetch": patch
3+
---
4+
5+
Improve `Middleware` type definition to require either onRequest or onResponse

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

+16-6
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,22 @@ export interface MiddlewareCallbackParams {
146146
readonly options: MergedOptions;
147147
}
148148

149-
export interface Middleware {
150-
onRequest?: (options: MiddlewareCallbackParams) => void | Request | undefined | Promise<Request | undefined | void>;
151-
onResponse?: (
152-
options: MiddlewareCallbackParams & { response: Response },
153-
) => void | Response | undefined | Promise<Response | undefined | void>;
154-
}
149+
type MiddlewareOnRequest = (
150+
options: MiddlewareCallbackParams,
151+
) => void | Request | undefined | Promise<Request | undefined | void>;
152+
type MiddlewareOnResponse = (
153+
options: MiddlewareCallbackParams & { response: Response },
154+
) => void | Response | undefined | Promise<Response | undefined | void>;
155+
156+
export type Middleware =
157+
| {
158+
onRequest: MiddlewareOnRequest;
159+
onResponse?: MiddlewareOnResponse;
160+
}
161+
| {
162+
onRequest?: MiddlewareOnRequest;
163+
onResponse: MiddlewareOnResponse;
164+
};
155165

156166
/** This type helper makes the 2nd function param required if params/requestBody are required; otherwise, optional */
157167
export type MaybeOptionalInit<Params, Location extends keyof Params> = RequiredKeysOf<

packages/openapi-fetch/test/middleware/middleware.test.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expect, test } from "vitest";
1+
import { expect, test, expectTypeOf, assertType } from "vitest";
22
import { createObservedClient } from "../helpers.js";
33
import type { Middleware, MiddlewareCallbackParams } from "../../src/index.js";
44
import type { paths } from "./schemas/middleware.js";
@@ -354,3 +354,12 @@ test("auth header", async () => {
354354
});
355355
expect(headers.get("authorization")).toBe(`Bearer ${accessToken}`);
356356
});
357+
358+
test("type error occurs only when neither onRequest nor onResponse is specified", async () => {
359+
expectTypeOf<Middleware>().not.toEqualTypeOf({});
360+
const onRequest = async ({ request }: MiddlewareCallbackParams) => request;
361+
const onResponse = async ({ response }: MiddlewareCallbackParams & { response: Response }) => response;
362+
assertType<Middleware>({ onRequest });
363+
assertType<Middleware>({ onResponse });
364+
assertType<Middleware>({ onRequest, onResponse });
365+
});

0 commit comments

Comments
 (0)