UNPKG

5.45 kBJavaScriptView Raw
1import { generateInfiniteQueryKey, generateMutationKey, generateQueryKey, generateQueryVariablesSignature, } from './variables-generator.js';
2export class GraphQLRequestClientFetcher {
3 constructor(visitor) {
4 this.visitor = visitor;
5 }
6 generateFetcherImplementaion() {
7 return `
8function fetcher<TData, TVariables extends { [key: string]: any }>(client: GraphQLClient, query: string, variables?: TVariables, requestHeaders?: RequestInit['headers']) {
9 return async (): Promise<TData> => client.request({
10 document: query,
11 variables,
12 requestHeaders
13 });
14}`;
15 }
16 generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
17 const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
18 const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
19 this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
20 const hookConfig = this.visitor.queryMethodMap;
21 this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
22 this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
23 const options = `options?: ${hookConfig.infiniteQuery.options}<${operationResultType}, TError, TData>`;
24 return `export const useInfinite${operationName} = <
25 TData = ${operationResultType},
26 TError = ${this.visitor.config.errorType}
27 >(
28 pageParamKey: keyof ${operationVariablesTypes},
29 client: GraphQLClient,
30 ${variables},
31 ${options},
32 headers?: RequestInit['headers']
33 ) =>
34 ${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
35 ${generateInfiniteQueryKey(node, hasRequiredVariables)},
36 (metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, {...variables, ...(metaData.pageParam ? {[pageParamKey]: metaData.pageParam} : {})}, headers)(),
37 options
38 );`;
39 }
40 generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
41 const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
42 const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
43 this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
44 this.visitor.imports.add(`${typeImport} { RequestInit } from 'graphql-request/dist/types.dom';`);
45 const hookConfig = this.visitor.queryMethodMap;
46 this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
47 this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
48 const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
49 return `export const use${operationName} = <
50 TData = ${operationResultType},
51 TError = ${this.visitor.config.errorType}
52 >(
53 client: GraphQLClient,
54 ${variables},
55 ${options},
56 headers?: RequestInit['headers']
57 ) =>
58 ${hookConfig.query.hook}<${operationResultType}, TError, TData>(
59 ${generateQueryKey(node, hasRequiredVariables)},
60 fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers),
61 options
62 );`;
63 }
64 generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
65 const variables = `variables?: ${operationVariablesTypes}`;
66 const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
67 this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
68 const hookConfig = this.visitor.queryMethodMap;
69 this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
70 this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
71 const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
72 return `export const use${operationName} = <
73 TError = ${this.visitor.config.errorType},
74 TContext = unknown
75 >(
76 client: GraphQLClient,
77 ${options},
78 headers?: RequestInit['headers']
79 ) =>
80 ${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
81 ${generateMutationKey(node)},
82 (${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers)(),
83 options
84 );`;
85 }
86 generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
87 const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
88 const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
89 this.visitor.imports.add(`${typeImport} { RequestInit } from 'graphql-request/dist/types.dom';`);
90 return `\nuse${operationName}.fetcher = (client: GraphQLClient, ${variables}, headers?: RequestInit['headers']) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers);`;
91 }
92}