UNPKG

@graphql-codegen/typescript-react-query

Version:

GraphQL Code Generator plugin for generating a ready-to-use React-Query Hooks based on GraphQL operations

83 lines (82 loc) 4.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CustomMapperFetcher = void 0; const tslib_1 = require("tslib"); const auto_bind_1 = tslib_1.__importDefault(require("auto-bind")); const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common"); const fetcher_js_1 = require("./fetcher.js"); class CustomMapperFetcher extends fetcher_js_1.FetcherRenderer { constructor(visitor, customFetcher) { super(visitor); this.visitor = visitor; if (typeof customFetcher === 'string') { customFetcher = { func: customFetcher }; } this._mapper = (0, visitor_plugin_common_1.parseMapper)(customFetcher.func); this._isReactHook = customFetcher.isReactHook; (0, auto_bind_1.default)(this); } getFetcherFnName(operationResultType, operationVariablesTypes) { return `${this._mapper.type}<${operationResultType}, ${operationVariablesTypes}>`; } generateFetcherImplementation() { if (this._mapper.isExternal) { return (0, visitor_plugin_common_1.buildMapperImport)(this._mapper.source, [ { identifier: this._mapper.type, asDefault: this._mapper.default, }, ], this.visitor.config.useTypeImports); } return null; } generateInfiniteQueryHook(config, isSuspense = false) { const { documentVariableName, operationResultType, operationVariablesTypes } = config; const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes); const implHookOuter = this._isReactHook ? `const query = ${typedFetcher}(${documentVariableName})` : ''; const implFetcher = this._isReactHook ? `(metaData) => query({...variables, ...(metaData.pageParam ?? {})})` : `(metaData) => ${typedFetcher}(${documentVariableName}, {...variables, ...(metaData.pageParam ?? {})})()`; const { generateBaseInfiniteQueryHook } = this.generateInfiniteQueryHelper(config, isSuspense); return generateBaseInfiniteQueryHook({ implHookOuter, implFetcher, }); } generateQueryHook(config, isSuspense = false) { const { generateBaseQueryHook } = this.generateQueryHelper(config, isSuspense); const { documentVariableName, operationResultType, operationVariablesTypes } = config; const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes); const implFetcher = this._isReactHook ? `${typedFetcher}(${documentVariableName}).bind(null, variables)` : `${typedFetcher}(${documentVariableName}, variables)`; return generateBaseQueryHook({ implFetcher, }); } generateMutationHook(config) { const { documentVariableName, operationResultType, operationVariablesTypes } = config; const { generateBaseMutationHook, variables } = this.generateMutationHelper(config); const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes); const implFetcher = this._isReactHook ? `${typedFetcher}(${documentVariableName})` : `(${variables}) => ${typedFetcher}(${documentVariableName}, variables)()`; return generateBaseMutationHook({ implFetcher, }); } generateFetcherFetch(config) { const { documentVariableName, operationResultType, operationVariablesTypes, hasRequiredVariables, operationName, } = config; // We can't generate a fetcher field since we can't call react hooks outside of a React Fucntion Component // Related: https://reactjs.org/docs/hooks-rules.html if (this._isReactHook) return ''; const variables = `variables${hasRequiredVariables ? '' : '?'}: ${operationVariablesTypes}`; const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes); const impl = `${typedFetcher}(${documentVariableName}, variables, options)`; return `\nuse${operationName}.fetcher = (${variables}, options?: RequestInit['headers']) => ${impl};`; } } exports.CustomMapperFetcher = CustomMapperFetcher;