Skip to content

Commit fc5cf08

Browse files
rumurilloLenz Weber
and
Lenz Weber
authored
Add prepareHeader to graphqlrequestbasequery (reduxjs#1828)
* Add prepareHeaders to graphqlRequestBaseQuery. * Leave current options.requestHeaders for backward compatibility. * review * Pass requestHeaders to stripUndefined. Co-authored-by: Lenz Weber <lenz.weber@mayflower.de>
1 parent c0d2078 commit fc5cf08

File tree

4 files changed

+79
-28
lines changed

4 files changed

+79
-28
lines changed

packages/rtk-query-graphql-request-base-query/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"graphql-request": "^3.4.0"
2323
},
2424
"peerDependencies": {
25-
"@reduxjs/toolkit": "^1.6.0",
25+
"@reduxjs/toolkit": "^1.7.1",
2626
"graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
2727
},
2828
"devDependencies": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import type { BaseQueryApi } from '@reduxjs/toolkit/dist/query/baseQueryTypes'
2+
import type { GraphQLClient } from 'graphql-request'
3+
4+
type P = Parameters<GraphQLClient['request']>
5+
export type Document = P[0]
6+
export type Variables = P[1]
7+
export type RequestHeaders = P[2]
8+
9+
export type GraphqlRequestBaseQueryArgs = {
10+
options:
11+
| {
12+
url: string
13+
requestHeaders?: RequestHeaders
14+
}
15+
| { client: GraphQLClient }
16+
prepareHeaders?: (
17+
headers: Headers,
18+
api: Pick<BaseQueryApi, 'getState' | 'endpoint' | 'type' | 'forced'>
19+
) => MaybePromise<Headers>
20+
}
21+
22+
export type QueryReturnValue<T = unknown, E = unknown, M = unknown> =
23+
| {
24+
error: E
25+
data?: undefined
26+
meta?: M
27+
}
28+
| {
29+
error?: undefined
30+
data: T
31+
meta?: M
32+
}
33+
export type MaybePromise<T> = T | PromiseLike<T>
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,54 @@
1-
import { BaseQueryFn } from "@reduxjs/toolkit/query/react";
2-
import { DocumentNode } from "graphql";
3-
import { GraphQLClient, ClientError } from "graphql-request";
1+
import { isPlainObject } from '@reduxjs/toolkit'
2+
import type { BaseQueryFn } from '@reduxjs/toolkit/query'
3+
import type { DocumentNode } from 'graphql'
4+
import { GraphQLClient, ClientError } from 'graphql-request'
5+
import type {
6+
GraphqlRequestBaseQueryArgs,
7+
RequestHeaders,
8+
} from './GraphqlBaseQueryTypes'
49

5-
type P = Parameters<GraphQLClient["request"]>;
6-
export type Document = P[0];
7-
export type Variables = P[1];
8-
export type RequestHeaders = P[2];
9-
10-
export const graphqlRequestBaseQuery = (
11-
options:
12-
| { url: string; requestHeaders?: RequestHeaders }
13-
| { client: GraphQLClient }
14-
): BaseQueryFn<
10+
export const graphqlRequestBaseQuery = ({
11+
options,
12+
prepareHeaders = (x) => x,
13+
}: GraphqlRequestBaseQueryArgs): BaseQueryFn<
1514
{ document: string | DocumentNode; variables?: any },
1615
unknown,
17-
Pick<ClientError, "name" | "message" | "stack">,
18-
Partial<Pick<ClientError, "request" | "response">>
16+
Pick<ClientError, 'name' | 'message' | 'stack'>,
17+
Partial<Pick<ClientError, 'request' | 'response'>>
1918
> => {
2019
const client =
21-
"client" in options ? options.client : new GraphQLClient(options.url);
22-
if ("requestHeaders" in options) {
23-
client.setHeaders(options.requestHeaders);
24-
}
25-
return async ({ document, variables }) => {
20+
'client' in options ? options.client : new GraphQLClient(options.url)
21+
const requestHeaders: RequestHeaders =
22+
'requestHeaders' in options ? options.requestHeaders : {}
23+
24+
return async (
25+
{ document, variables },
26+
{ getState, endpoint, forced, type }
27+
) => {
2628
try {
27-
return { data: await client.request(document, variables), meta: {} };
29+
const headers = new Headers(stripUndefined(requestHeaders))
30+
31+
client.setHeaders(
32+
await prepareHeaders(headers, { getState, endpoint, forced, type })
33+
)
34+
return { data: await client.request(document, variables), meta: {} }
2835
} catch (error) {
2936
if (error instanceof ClientError) {
30-
const { name, message, stack, request, response } = error;
31-
return { error: { name, message, stack }, meta: { request, response } };
37+
const { name, message, stack, request, response } = error
38+
return { error: { name, message, stack }, meta: { request, response } }
3239
}
33-
throw error;
40+
throw error
3441
}
35-
};
36-
};
42+
}
43+
}
44+
45+
function stripUndefined(obj: any) {
46+
if (!isPlainObject(obj)) {
47+
return obj
48+
}
49+
const copy: Record<string, any> = { ...obj }
50+
for (const [k, v] of Object.entries(copy)) {
51+
if (typeof v === 'undefined') delete copy[k]
52+
}
53+
return copy
54+
}

yarn.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -5580,7 +5580,7 @@ __metadata:
55805580
microbundle: ^0.13.3
55815581
typescript: ^4.3.4
55825582
peerDependencies:
5583-
"@reduxjs/toolkit": ^1.6.0
5583+
"@reduxjs/toolkit": ^1.7.1
55845584
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0
55855585
languageName: unknown
55865586
linkType: soft

0 commit comments

Comments
 (0)