UNPKG

@graphql-codegen/typescript-graphql-request

Version:

GraphQL Code Generator plugin for generating a ready-to-use SDK based on graphql-request and GraphQL operations

100 lines (98 loc) 5.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GraphQLRequestVisitor = void 0; const tslib_1 = require("tslib"); const auto_bind_1 = tslib_1.__importDefault(require("auto-bind")); const graphql_1 = require("graphql"); const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common"); const additionalExportedTypes = ` export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string, variables?: any) => Promise<T>; `; class GraphQLRequestVisitor extends visitor_plugin_common_1.ClientSideBaseVisitor { constructor(schema, fragments, rawConfig) { super(schema, fragments, rawConfig, { rawRequest: (0, visitor_plugin_common_1.getConfigValue)(rawConfig.rawRequest, false), extensionsType: (0, visitor_plugin_common_1.getConfigValue)(rawConfig.extensionsType, 'any'), }); this._operationsToInclude = []; (0, auto_bind_1.default)(this); const typeImport = this.config.useTypeImports ? 'import type' : 'import'; this._additionalImports.push(`${typeImport} { GraphQLClient, RequestOptions } from 'graphql-request';`); if (this.config.rawRequest) { if (this.config.documentMode !== visitor_plugin_common_1.DocumentMode.string) { this._additionalImports.push(`import { GraphQLError, print } from 'graphql'`); } else { this._additionalImports.push(`import { GraphQLError } from 'graphql'`); } } this._additionalImports.push(`type GraphQLClientRequestHeaders = RequestOptions['requestHeaders'];`); this._externalImportPrefix = this.config.importOperationTypesFrom ? `${this.config.importOperationTypesFrom}.` : ''; } OperationDefinition(node) { var _a; const operationName = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value; if (!operationName) { // eslint-disable-next-line no-console console.warn(`Anonymous GraphQL operation was ignored in "typescript-graphql-request", please make sure to name your operation: `, (0, graphql_1.print)(node)); return null; } return super.OperationDefinition(node); } buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) { operationResultType = this._externalImportPrefix + operationResultType; operationVariablesTypes = this._externalImportPrefix + operationVariablesTypes; this._operationsToInclude.push({ node, documentVariableName, operationType, operationResultType, operationVariablesTypes, }); return null; } getDocumentNodeVariable(documentVariableName) { return this.config.documentMode === visitor_plugin_common_1.DocumentMode.external ? `Operations.${documentVariableName}` : documentVariableName; } get sdkContent() { const extraVariables = []; const allPossibleActions = this._operationsToInclude .map(o => { const operationType = o.node.operation; const operationName = o.node.name.value; const optionalVariables = !o.node.variableDefinitions || o.node.variableDefinitions.length === 0 || o.node.variableDefinitions.every(v => v.type.kind !== graphql_1.Kind.NON_NULL_TYPE || v.defaultValue); const docVarName = this.getDocumentNodeVariable(o.documentVariableName); if (this.config.rawRequest) { let docArg = docVarName; if (this.config.documentMode !== visitor_plugin_common_1.DocumentMode.string) { docArg = `${docVarName}String`; extraVariables.push(`const ${docArg} = print(${docVarName});`); } return `${operationName}(variables${optionalVariables ? '?' : ''}: ${o.operationVariablesTypes}, requestHeaders?: GraphQLClientRequestHeaders): Promise<{ data: ${o.operationResultType}; errors?: GraphQLError[]; extensions?: ${this.config.extensionsType}; headers: Headers; status: number; }> { return withWrapper((wrappedRequestHeaders) => client.rawRequest<${o.operationResultType}>(${docArg}, variables, {...requestHeaders, ...wrappedRequestHeaders}), '${operationName}', '${operationType}', variables); }`; } return `${operationName}(variables${optionalVariables ? '?' : ''}: ${o.operationVariablesTypes}, requestHeaders?: GraphQLClientRequestHeaders, signal?: RequestInit['signal']): Promise<${o.operationResultType}> { return withWrapper((wrappedRequestHeaders) => client.request<${o.operationResultType}>({ document: ${docVarName}, variables, requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders }, signal }), '${operationName}', '${operationType}', variables); }`; }) .filter(Boolean) .map(s => (0, visitor_plugin_common_1.indentMultiline)(s, 2)); return `${additionalExportedTypes} const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) => action(); ${extraVariables.join('\n')} export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { ${allPossibleActions.join(',\n')} }; } export type Sdk = ReturnType<typeof getSdk>;`; } } exports.GraphQLRequestVisitor = GraphQLRequestVisitor;