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

93 lines (91 loc) 5.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GraphQLRequestVisitor = void 0; const tslib_1 = require("tslib"); const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common"); const auto_bind_1 = tslib_1.__importDefault(require("auto-bind")); const graphql_1 = require("graphql"); const additionalExportedTypes = ` export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string) => 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 } from 'graphql-request';`); this._additionalImports.push(`${typeImport} * as Dom from 'graphql-request/dist/types.dom';`); if (this.config.rawRequest && this.config.documentMode !== visitor_plugin_common_1.DocumentMode.string) { this._additionalImports.push(`import { print } from 'graphql'`); } 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?: Dom.RequestInit["headers"]): Promise<{ data: ${o.operationResultType}; extensions?: ${this.config.extensionsType}; headers: Dom.Headers; status: number; }> { return withWrapper((wrappedRequestHeaders) => client.rawRequest<${o.operationResultType}>(${docArg}, variables, {...requestHeaders, ...wrappedRequestHeaders}), '${operationName}', '${operationType}'); }`; } return `${operationName}(variables${optionalVariables ? '?' : ''}: ${o.operationVariablesTypes}, requestHeaders?: Dom.RequestInit["headers"]): Promise<${o.operationResultType}> { return withWrapper((wrappedRequestHeaders) => client.request<${o.operationResultType}>(${docVarName}, variables, {...requestHeaders, ...wrappedRequestHeaders}), '${operationName}', '${operationType}'); }`; }) .filter(Boolean) .map(s => (0, visitor_plugin_common_1.indentMultiline)(s, 2)); return `${additionalExportedTypes} const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => 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;