UNPKG

4.91 kBJavaScriptView Raw
1import { generateInfiniteQueryKey, generateMutationKey, generateQueryKey, generateQueryVariablesSignature, } from './variables-generator.js';
2export class FetchFetcher {
3 constructor(visitor) {
4 this.visitor = visitor;
5 }
6 generateFetcherImplementaion() {
7 return `
8function fetcher<TData, TVariables>(endpoint: string, requestInit: RequestInit, query: string, variables?: TVariables) {
9 return async (): Promise<TData> => {
10 const res = await fetch(endpoint, {
11 method: 'POST',
12 ...requestInit,
13 body: JSON.stringify({ query, variables }),
14 });
15
16 const json = await res.json();
17
18 if (json.errors) {
19 const { message } = json.errors[0];
20
21 throw new Error(message);
22 }
23
24 return json.data;
25 }
26}`;
27 }
28 generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
29 const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
30 const hookConfig = this.visitor.queryMethodMap;
31 this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
32 this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
33 const options = `options?: ${hookConfig.infiniteQuery.options}<${operationResultType}, TError, TData>`;
34 return `export const useInfinite${operationName} = <
35 TData = ${operationResultType},
36 TError = ${this.visitor.config.errorType}
37 >(
38 dataSource: { endpoint: string, fetchParams?: RequestInit },
39 pageParamKey: keyof ${operationVariablesTypes},
40 ${variables},
41 ${options}
42 ) =>
43 ${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
44 ${generateInfiniteQueryKey(node, hasRequiredVariables)},
45 (metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, {...variables, ...(metaData.pageParam ? {[pageParamKey]: metaData.pageParam} : {})})(),
46 options
47 );`;
48 }
49 generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
50 const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
51 const hookConfig = this.visitor.queryMethodMap;
52 this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
53 this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
54 const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
55 return `export const use${operationName} = <
56 TData = ${operationResultType},
57 TError = ${this.visitor.config.errorType}
58 >(
59 dataSource: { endpoint: string, fetchParams?: RequestInit },
60 ${variables},
61 ${options}
62 ) =>
63 ${hookConfig.query.hook}<${operationResultType}, TError, TData>(
64 ${generateQueryKey(node, hasRequiredVariables)},
65 fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables),
66 options
67 );`;
68 }
69 generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
70 const variables = `variables?: ${operationVariablesTypes}`;
71 const hookConfig = this.visitor.queryMethodMap;
72 this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
73 this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
74 const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
75 return `export const use${operationName} = <
76 TError = ${this.visitor.config.errorType},
77 TContext = unknown
78 >(
79 dataSource: { endpoint: string, fetchParams?: RequestInit },
80 ${options}
81 ) =>
82 ${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
83 ${generateMutationKey(node)},
84 (${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables)(),
85 options
86 );`;
87 }
88 generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
89 const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
90 return `\nuse${operationName}.fetcher = (dataSource: { endpoint: string, fetchParams?: RequestInit }, ${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables);`;
91 }
92}