diff --git a/.changeset/red-pants-cover.md b/.changeset/red-pants-cover.md new file mode 100644 index 000000000..7f3bb7429 --- /dev/null +++ b/.changeset/red-pants-cover.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": patch +--- + +Let request object have custom properties diff --git a/packages/openapi-fetch/src/index.d.ts b/packages/openapi-fetch/src/index.d.ts index 0593075c5..92a36b873 100644 --- a/packages/openapi-fetch/src/index.d.ts +++ b/packages/openapi-fetch/src/index.d.ts @@ -166,7 +166,7 @@ export type ClientMethod, M extends Ht I extends MaybeOptionalInit, >( url: P, - ...init: HasRequiredKeys extends never ? [I?] : [I] + ...init: HasRequiredKeys extends never ? [(I & { [key: string]: unknown })?] : [I] ) => Promise>; export default function createClient( diff --git a/packages/openapi-fetch/src/index.js b/packages/openapi-fetch/src/index.js index c4cede7ef..b2796934a 100644 --- a/packages/openapi-fetch/src/index.js +++ b/packages/openapi-fetch/src/index.js @@ -5,6 +5,22 @@ const DEFAULT_HEADERS = { const PATH_PARAM_RE = /\{[^{}]+\}/g; +/** + * Add custom parameters to Request object + */ +class CustomRequest extends Request { + constructor(input, init) { + super(input, init); + + // add custom parameters + for (const key in init) { + if (!this[key]) { + this[key] = init[key]; + } + } + } +} + /** * Create an openapi-fetch client. * @type {import("./index.js").default} @@ -67,7 +83,7 @@ export default function createClient(clientOptions) { if (requestInit.body instanceof FormData) { requestInit.headers.delete("Content-Type"); } - let request = new Request(createFinalURL(url, { baseUrl, params, querySerializer }), requestInit); + let request = new CustomRequest(createFinalURL(url, { baseUrl, params, querySerializer }), requestInit); // middleware (request) const mergedOptions = { baseUrl, diff --git a/packages/openapi-fetch/test/index.test.ts b/packages/openapi-fetch/test/index.test.ts index f86ab768e..f49979740 100644 --- a/packages/openapi-fetch/test/index.test.ts +++ b/packages/openapi-fetch/test/index.test.ts @@ -854,6 +854,29 @@ describe("client", () => { expect(req.headers.get("foo")).toBe("bar"); }); + it("can attach custom properties to request", async () => { + function createCustomFetch(data: any) { + const response = { + clone: () => ({ ...response }), + headers: new Headers(), + json: async () => data, + status: 200, + ok: true, + } as Response; + return async (input: Request) => { + expect(input).toHaveProperty("customProperty", "value"); + return Promise.resolve(response); + }; + } + + const customFetch = createCustomFetch({}); + const client = createClient({ fetch: customFetch, baseUrl }); + + client.GET("/self", { + customProperty: "value", + }); + }); + it("can modify response", async () => { const toUnix = (date: string) => new Date(date).getTime();