Skip to content

Commit 33b8211

Browse files
authored
feat: let requestMiddleware override url (#397)
1 parent 09d9a10 commit 33b8211

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

src/index.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
MaybeFunction,
2727
Response,
2828
RemoveIndex,
29+
RequestMiddlware,
2930
} from './types'
3031
import * as Dom from './types.dom'
3132
import { resolveRequestDocument } from './resolveRequestDocument'
@@ -156,11 +157,11 @@ const post = async <V = Variables>({
156157
variables?: V
157158
headers?: Dom.RequestInit['headers']
158159
operationName?: string
159-
middleware?: (request: Dom.RequestInit) => Dom.RequestInit | Promise<Dom.RequestInit>
160+
middleware?: RequestMiddlware
160161
}) => {
161162
const body = createRequestBody(query, variables, operationName, fetchOptions.jsonSerializer)
162163

163-
let options: Dom.RequestInit = {
164+
let init: Dom.RequestInit = {
164165
method: 'POST',
165166
headers: {
166167
...(typeof body === 'string' ? { 'Content-Type': 'application/json' } : {}),
@@ -170,9 +171,9 @@ const post = async <V = Variables>({
170171
...fetchOptions,
171172
}
172173
if (middleware) {
173-
options = await Promise.resolve(middleware(options))
174+
;({ url, ...init } = await Promise.resolve(middleware({ ...init, url })))
174175
}
175-
return await fetch(url, options)
176+
return await fetch(url, init)
176177
}
177178

178179
/**
@@ -195,7 +196,7 @@ const get = async <V = Variables>({
195196
variables?: V
196197
headers?: HeadersInit
197198
operationName?: string
198-
middleware?: (request: Dom.RequestInit) => Dom.RequestInit | Promise<Dom.RequestInit>
199+
middleware?: RequestMiddlware
199200
}) => {
200201
const queryParams = buildGetQueryParams<V>({
201202
query,
@@ -204,15 +205,15 @@ const get = async <V = Variables>({
204205
jsonSerializer: fetchOptions.jsonSerializer,
205206
} as TBuildGetQueryParams<V>)
206207

207-
let options: Dom.RequestInit = {
208+
let init: Dom.RequestInit = {
208209
method: 'GET',
209210
headers,
210211
...fetchOptions,
211212
}
212213
if (middleware) {
213-
options = await Promise.resolve(middleware(options))
214+
;({ url, ...init } = await Promise.resolve(middleware({ ...init, url })))
214215
}
215-
return await fetch(`${url}?${queryParams}`, options)
216+
return await fetch(`${url}?${queryParams}`, init)
216217
}
217218

218219
/**
@@ -461,7 +462,7 @@ async function makeRequest<T = any, V = Variables>({
461462
fetch: any
462463
method: string
463464
fetchOptions: Dom.RequestInit
464-
middleware?: (request: Dom.RequestInit) => Dom.RequestInit | Promise<Dom.RequestInit>
465+
middleware?: RequestMiddlware
465466
}): Promise<Response<T>> {
466467
const fetcher = method.toUpperCase() === 'POST' ? post : get
467468
const isBathchingQuery = Array.isArray(query)

src/types.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export interface Response<T> {
7070

7171
export type PatchedRequestInit = Omit<Dom.RequestInit, 'headers'> & {
7272
headers?: MaybeFunction<Dom.RequestInit['headers']>
73-
requestMiddleware?: (request: Dom.RequestInit) => Dom.RequestInit | Promise<Dom.RequestInit>
73+
requestMiddleware?: RequestMiddlware
7474
responseMiddleware?: (response: Response<unknown> | Error) => void
7575
}
7676

@@ -107,3 +107,11 @@ export type RequestExtendedOptions<V = Variables, T = any> = { url: string } & R
107107
export type RawRequestExtendedOptions<V = Variables> = { url: string } & RawRequestOptions<V>
108108

109109
export type BatchRequestsExtendedOptions<V = Variables> = { url: string } & BatchRequestsOptions<V>
110+
111+
export type RequestMiddlware = (
112+
request: RequestExtendedInit
113+
) => RequestExtendedInit | Promise<RequestExtendedInit>
114+
115+
type RequestExtendedInit = Dom.RequestInit & {
116+
url: string
117+
}

tests/general.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ describe('middleware', () => {
161161
await requestPromise
162162
expect(responseMiddleware).toBeCalledTimes(1)
163163
})
164+
165+
it('url changes', async () => {
166+
requestMiddleware = jest.fn((req) => ({ ...req, url: ctx.url }))
167+
const _client = new GraphQLClient('https://graphql.org', {
168+
requestMiddleware,
169+
})
170+
const requestPromise = _client.request<{ result: number }>(`x`)
171+
const res = await requestPromise
172+
expect(requestMiddleware).toBeCalledTimes(1)
173+
expect(res.result).toBe(123)
174+
})
164175
})
165176

166177
describe('async request middleware', () => {

0 commit comments

Comments
 (0)