From 9307e16c8d3260151c11ee7c2aec67c13ad1f7d4 Mon Sep 17 00:00:00 2001 From: Tobias <14044957+tobiasdcl@users.noreply.github.com> Date: Tue, 10 Sep 2024 23:28:31 +0200 Subject: [PATCH 1/4] feat(openapi-fetch): allow usage of custom Request class --- packages/openapi-fetch/src/index.d.ts | 2 ++ packages/openapi-fetch/src/index.js | 25 ++++++++----------- .../openapi-fetch/test/common/request.test.ts | 23 +++++++++++++++++ 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/packages/openapi-fetch/src/index.d.ts b/packages/openapi-fetch/src/index.d.ts index c2e9ebda3..e3fd5ccfc 100644 --- a/packages/openapi-fetch/src/index.d.ts +++ b/packages/openapi-fetch/src/index.d.ts @@ -17,6 +17,8 @@ export interface ClientOptions extends Omit { baseUrl?: string; /** custom fetch (defaults to globalThis.fetch) */ fetch?: (input: Request) => Promise; + /** custom Request (defaults to globalThis.Request) */ + Request?: typeof Request; /** global querySerializer */ querySerializer?: QuerySerializer | QuerySerializerOptions; /** global bodySerializer */ diff --git a/packages/openapi-fetch/src/index.js b/packages/openapi-fetch/src/index.js index cc9952ec6..56c4826d5 100644 --- a/packages/openapi-fetch/src/index.js +++ b/packages/openapi-fetch/src/index.js @@ -1,20 +1,6 @@ // settings & const 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 (!(key in this)) { - this[key] = init[key]; - } - } - } -} - /** * Returns a cheap, non-cryptographically-secure random ID * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya) @@ -30,6 +16,7 @@ export function randomID() { export default function createClient(clientOptions) { let { baseUrl = "", + Request: CustomRequest = globalThis.Request, fetch: baseFetch = globalThis.fetch, querySerializer: globalQuerySerializer, bodySerializer: globalBodySerializer, @@ -48,6 +35,7 @@ export default function createClient(clientOptions) { const { baseUrl: localBaseUrl, fetch = baseFetch, + Request = CustomRequest, headers, params = {}, parseAs = "json", @@ -98,6 +86,13 @@ export default function createClient(clientOptions) { let options; let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit); + /** Add custom parameters to Request object */ + for (const key in init) { + if (!(key in request)) { + request[key] = init[key]; + } + } + if (middlewares.length) { id = randomID(); @@ -119,7 +114,7 @@ export default function createClient(clientOptions) { id, }); if (result) { - if (!(result instanceof Request)) { + if (!(result instanceof CustomRequest)) { throw new Error("onRequest: must return new Request() when modifying the request"); } request = result; diff --git a/packages/openapi-fetch/test/common/request.test.ts b/packages/openapi-fetch/test/common/request.test.ts index 8b9ea2763..f726774fc 100644 --- a/packages/openapi-fetch/test/common/request.test.ts +++ b/packages/openapi-fetch/test/common/request.test.ts @@ -282,6 +282,29 @@ describe("request", () => { expect(headers.get("cookie")).toEqual("session=1234"); }); + test("uses provided Request class", async () => { + // santity check to make sure the profided fetch function is actually called + expect.assertions(1); + + class SpecialRequestImplementation extends Request { + static special = "special"; + } + + const specialFetch = async (input: Request) => { + // make sure that the request is actually an instance of the custom request we provided + expect(input).instanceOf(SpecialRequestImplementation); + return Promise.resolve(Response.json({ hello: "world" })); + }; + + const client = createClient({ + baseUrl: "https://fakeurl.example", + fetch: specialFetch, + Request: SpecialRequestImplementation, + }); + + await client.GET("/resources"); + }); + test("can attach custom properties to request", async () => { function createCustomFetch(data: any) { const response = { From 3f4244d8f23856f4491d407822c00c6014e7d665 Mon Sep 17 00:00:00 2001 From: Tobias <14044957+tobiasdcl@users.noreply.github.com> Date: Tue, 10 Sep 2024 23:39:54 +0200 Subject: [PATCH 2/4] chore: added changeset --- .changeset/brave-days-invent.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/brave-days-invent.md diff --git a/.changeset/brave-days-invent.md b/.changeset/brave-days-invent.md new file mode 100644 index 000000000..91d9ae6b3 --- /dev/null +++ b/.changeset/brave-days-invent.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": minor +--- + +allow usage of custom Request class From 52eb47496275ffa052a000a48c486fda4e63fa13 Mon Sep 17 00:00:00 2001 From: Tobias <14044957+tobiasdcl@users.noreply.github.com> Date: Tue, 10 Sep 2024 23:41:57 +0200 Subject: [PATCH 3/4] fix: make linter happy --- packages/openapi-fetch/test/common/request.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/openapi-fetch/test/common/request.test.ts b/packages/openapi-fetch/test/common/request.test.ts index f726774fc..e4d294ef4 100644 --- a/packages/openapi-fetch/test/common/request.test.ts +++ b/packages/openapi-fetch/test/common/request.test.ts @@ -286,9 +286,7 @@ describe("request", () => { // santity check to make sure the profided fetch function is actually called expect.assertions(1); - class SpecialRequestImplementation extends Request { - static special = "special"; - } + class SpecialRequestImplementation extends Request {} const specialFetch = async (input: Request) => { // make sure that the request is actually an instance of the custom request we provided From 92a069e928a398634391daf71e738db3116a54a4 Mon Sep 17 00:00:00 2001 From: Tobi <14044957+tobiasdcl@users.noreply.github.com> Date: Fri, 20 Sep 2024 17:43:45 +0200 Subject: [PATCH 4/4] Update brave-days-invent.md Co-authored-by: Drew Powers --- .changeset/brave-days-invent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/brave-days-invent.md b/.changeset/brave-days-invent.md index 91d9ae6b3..7ffaa90ef 100644 --- a/.changeset/brave-days-invent.md +++ b/.changeset/brave-days-invent.md @@ -1,5 +1,5 @@ --- -"openapi-fetch": minor +"openapi-fetch": patch --- allow usage of custom Request class