@graphql-codegen/typescript-react-query
Version:
GraphQL Code Generator plugin for generating a ready-to-use React-Query Hooks based on GraphQL operations
72 lines (67 loc) • 3.23 kB
JavaScript
import autoBind from 'auto-bind';
import { FetcherRenderer } from './fetcher.js';
export class FetchFetcher extends FetcherRenderer {
constructor(visitor) {
super(visitor);
this.visitor = visitor;
autoBind(this);
}
generateFetcherImplementation() {
return `
function fetcher<TData, TVariables>(endpoint: string, requestInit: RequestInit, query: string, variables?: TVariables) {
return async (): Promise<TData> => {
const res = await fetch(endpoint, {
method: 'POST',
...requestInit,
body: JSON.stringify({ query, variables }),
});
const json = await res.json();
if (json.errors) {
const { message } = json.errors[0];
throw new Error(message);
}
return json.data;
}
}`;
}
generateInfiniteQueryHook(config, isSuspense = false) {
const { generateBaseInfiniteQueryHook, variables, options } = this.generateInfiniteQueryHelper(config, isSuspense);
const { documentVariableName, operationResultType, operationVariablesTypes } = config;
return generateBaseInfiniteQueryHook({
implArguments: `
dataSource: { endpoint: string, fetchParams?: RequestInit },
${variables},
${options}
`,
implFetcher: `(metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, {...variables, ...(metaData.pageParam ?? {})})()`,
});
}
generateQueryHook(config, isSuspense = false) {
const { generateBaseQueryHook, variables, options } = this.generateQueryHelper(config, isSuspense);
const { documentVariableName, operationResultType, operationVariablesTypes } = config;
return generateBaseQueryHook({
implArguments: `
dataSource: { endpoint: string, fetchParams?: RequestInit },
${variables},
${options}
`,
implFetcher: `fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables)`,
});
}
generateMutationHook(config) {
const { generateBaseMutationHook, variables, options } = this.generateMutationHelper(config);
const { documentVariableName, operationResultType, operationVariablesTypes } = config;
return generateBaseMutationHook({
implArguments: `
dataSource: { endpoint: string, fetchParams?: RequestInit },
${options}
`,
implFetcher: `(${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables)()`,
});
}
generateFetcherFetch(config) {
const { documentVariableName, operationResultType, operationVariablesTypes, operationName } = config;
const variables = this.generateQueryVariablesSignature(config);
return `\nuse${operationName}.fetcher = (dataSource: { endpoint: string, fetchParams?: RequestInit }, ${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables);`;
}
}