Skip to content

Commit 81c8bb2

Browse files
committed
feat: export middleware function types
There are now types exported that you can use to type middleware functions that are defined apart from their use. Example: ```ts const requestMiddleware: RequestMiddleware = async (request) => { return { ...request, headers: { ...request.headers, 'x-auth-token': await getAccessToken(), }, } } const _client = new GraphQLClient(endpoint, { requestMiddleware }) ```
1 parent 6b3396b commit 81c8bb2

File tree

4 files changed

+19
-14
lines changed

4 files changed

+19
-14
lines changed

examples/other-middleware.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
/* eslint-disable */
2-
31
/**
42
* It's possible to use a middleware to pre-process any request or handle raw response.
53
*/
64

75
import { GraphQLClient } from '../src/index.js'
8-
import type { RequestMiddleware } from '../src/types.js'
6+
import type { RequestMiddleware, ResponseMiddleware } from '../src/types.js'
97

108
const endpoint = `https://api.spacex.land/graphql/`
119

@@ -17,10 +15,12 @@ const getAccessToken = () => Promise.resolve(`some special token here`)
1715
*/
1816

1917
const requestMiddleware: RequestMiddleware = async (request) => {
20-
const token = await getAccessToken()
2118
return {
2219
...request,
23-
headers: { ...request.headers, 'x-auth-token': token },
20+
headers: {
21+
...request.headers,
22+
'x-auth-token': await getAccessToken(),
23+
},
2424
}
2525
}
2626

@@ -46,14 +46,13 @@ const getAccessToken = () => Promise.resolve(`some special token here`)
4646
* Response middleware example (log request trace id if error caused):
4747
*/
4848

49-
// @ts-expect-error TODO export a response middleware type
50-
const responseMiddleware = (response: Response<unknown>) => {
51-
if (response.errors) {
49+
const responseMiddleware: ResponseMiddleware = (response) => {
50+
if (!(response instanceof Error) && response.errors) {
5251
const traceId = response.headers.get(`x-b3-trace-id`) || `unknown`
5352
console.error(
5453
`[${traceId}] Request error:
5554
status ${response.status}
56-
details: ${response.errors}`
55+
details: ${response.errors.map((_) => _.message).join(`, `)}`
5756
)
5857
}
5958
}

src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from './parseArgs.js'
1010
import { resolveRequestDocument } from './resolveRequestDocument.js'
1111
import type {
12+
BatchRequestDocument,
1213
FetchOptions,
1314
GraphQLClientRequestHeaders,
1415
GraphQLClientResponse,
@@ -17,10 +18,10 @@ import type {
1718
MaybeLazy,
1819
RequestConfig,
1920
RequestMiddleware,
21+
ResponseMiddleware,
2022
VariablesAndRequestHeadersArgs,
2123
} from './types.js'
2224
import {
23-
BatchRequestDocument,
2425
BatchRequestsExtendedOptions,
2526
BatchRequestsOptions,
2627
ClientError,
@@ -43,7 +44,9 @@ export {
4344
RawRequestOptions,
4445
RequestDocument,
4546
RequestExtendedOptions,
47+
RequestMiddleware,
4648
RequestOptions,
49+
ResponseMiddleware,
4750
Variables,
4851
}
4952

src/types.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export interface RequestConfig extends Omit<RequestInit, 'headers' | 'method'>,
9696
method?: HTTPMethodInput
9797
headers?: MaybeLazy<GraphQLClientRequestHeaders>
9898
requestMiddleware?: RequestMiddleware
99-
responseMiddleware?: (response: GraphQLClientResponse<unknown> | Error) => void
99+
responseMiddleware?: ResponseMiddleware
100100
jsonSerializer?: JsonSerializer
101101
}
102102

@@ -144,9 +144,10 @@ export interface BatchRequestsExtendedOptions<V extends Variables = Variables>
144144
url: string
145145
}
146146

147-
export type RequestMiddleware<V extends Variables = Variables> = (
148-
request: RequestExtendedInit<V>
149-
) => RequestExtendedInit | Promise<RequestExtendedInit>
147+
export type ResponseMiddleware = (response: GraphQLClientResponse<unknown> | Error) => void
148+
149+
// prettier-ignore
150+
export type RequestMiddleware<V extends Variables = Variables> = (request: RequestExtendedInit<V>) => RequestExtendedInit | Promise<RequestExtendedInit>
150151

151152
type RequestExtendedInit<V extends Variables = Variables> = RequestInit & {
152153
url: string

tests/exports.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/* eslint-disable */
2+
import { RequestMiddleware, ResponseMiddleware } from '../src/index.js'

0 commit comments

Comments
 (0)