@graphql-codegen/typescript-react-query
Version:
GraphQL Code Generator plugin for generating a ready-to-use React-Query Hooks based on GraphQL operations
93 lines (92 loc) • 5.66 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.GraphQLRequestClientFetcher = void 0;
const variables_generator_js_1 = require("./variables-generator.js");
class GraphQLRequestClientFetcher {
constructor(visitor) {
this.visitor = visitor;
}
generateFetcherImplementaion() {
return `
function fetcher<TData, TVariables>(client: GraphQLClient, query: string, variables?: TVariables, headers?: RequestInit['headers']) {
return async (): Promise<TData> => client.request<TData, TVariables>(query, variables, headers);
}`;
}
generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
const variables = (0, variables_generator_js_1.generateQueryVariablesSignature)(hasRequiredVariables, operationVariablesTypes);
const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
const hookConfig = this.visitor.queryMethodMap;
this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
const options = `options?: ${hookConfig.infiniteQuery.options}<${operationResultType}, TError, TData>`;
return `export const useInfinite${operationName} = <
TData = ${operationResultType},
TError = ${this.visitor.config.errorType}
>(
pageParamKey: keyof ${operationVariablesTypes},
client: GraphQLClient,
${variables},
${options},
headers?: RequestInit['headers']
) =>
${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
${(0, variables_generator_js_1.generateInfiniteQueryKey)(node, hasRequiredVariables)},
(metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, {...variables, [pageParamKey]: metaData.pageParam }, headers)(),
options
);`;
}
generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
const variables = (0, variables_generator_js_1.generateQueryVariablesSignature)(hasRequiredVariables, operationVariablesTypes);
const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
this.visitor.imports.add(`${typeImport} { RequestInit } from 'graphql-request/dist/types.dom';`);
const hookConfig = this.visitor.queryMethodMap;
this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
return `export const use${operationName} = <
TData = ${operationResultType},
TError = ${this.visitor.config.errorType}
>(
client: GraphQLClient,
${variables},
${options},
headers?: RequestInit['headers']
) =>
${hookConfig.query.hook}<${operationResultType}, TError, TData>(
${(0, variables_generator_js_1.generateQueryKey)(node, hasRequiredVariables)},
fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers),
options
);`;
}
generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
const variables = `variables?: ${operationVariablesTypes}`;
const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
const hookConfig = this.visitor.queryMethodMap;
this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
return `export const use${operationName} = <
TError = ${this.visitor.config.errorType},
TContext = unknown
>(
client: GraphQLClient,
${options},
headers?: RequestInit['headers']
) =>
${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
${(0, variables_generator_js_1.generateMutationKey)(node)},
(${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers)(),
options
);`;
}
generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
const variables = (0, variables_generator_js_1.generateQueryVariablesSignature)(hasRequiredVariables, operationVariablesTypes);
const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
this.visitor.imports.add(`${typeImport} { RequestInit } from 'graphql-request/dist/types.dom';`);
return `\nuse${operationName}.fetcher = (client: GraphQLClient, ${variables}, headers?: RequestInit['headers']) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers);`;
}
}
exports.GraphQLRequestClientFetcher = GraphQLRequestClientFetcher;
;