UNPKG

5.32 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.GraphQLRequestVisitor = void 0;
4const tslib_1 = require("tslib");
5const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common");
6const auto_bind_1 = tslib_1.__importDefault(require("auto-bind"));
7const graphql_1 = require("graphql");
8const additionalExportedTypes = `
9export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string) => Promise<T>;
10`;
11class GraphQLRequestVisitor extends visitor_plugin_common_1.ClientSideBaseVisitor {
12 constructor(schema, fragments, rawConfig) {
13 super(schema, fragments, rawConfig, {
14 rawRequest: (0, visitor_plugin_common_1.getConfigValue)(rawConfig.rawRequest, false),
15 extensionsType: (0, visitor_plugin_common_1.getConfigValue)(rawConfig.extensionsType, 'any'),
16 });
17 this._operationsToInclude = [];
18 (0, auto_bind_1.default)(this);
19 const typeImport = this.config.useTypeImports ? 'import type' : 'import';
20 const fileExtension = this.config.emitLegacyCommonJSImports ? '' : '.js';
21 this._additionalImports.push(`${typeImport} { GraphQLClient } from 'graphql-request';`);
22 this._additionalImports.push(`${typeImport} * as Dom from 'graphql-request/dist/types.dom${fileExtension}';`);
23 if (this.config.rawRequest && this.config.documentMode !== visitor_plugin_common_1.DocumentMode.string) {
24 this._additionalImports.push(`import { print } from 'graphql'`);
25 }
26 this._externalImportPrefix = this.config.importOperationTypesFrom ? `${this.config.importOperationTypesFrom}.` : '';
27 }
28 OperationDefinition(node) {
29 var _a;
30 const operationName = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value;
31 if (!operationName) {
32 // eslint-disable-next-line no-console
33 console.warn(`Anonymous GraphQL operation was ignored in "typescript-graphql-request", please make sure to name your operation: `, (0, graphql_1.print)(node));
34 return null;
35 }
36 return super.OperationDefinition(node);
37 }
38 buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) {
39 operationResultType = this._externalImportPrefix + operationResultType;
40 operationVariablesTypes = this._externalImportPrefix + operationVariablesTypes;
41 this._operationsToInclude.push({
42 node,
43 documentVariableName,
44 operationType,
45 operationResultType,
46 operationVariablesTypes,
47 });
48 return null;
49 }
50 getDocumentNodeVariable(documentVariableName) {
51 return this.config.documentMode === visitor_plugin_common_1.DocumentMode.external
52 ? `Operations.${documentVariableName}`
53 : documentVariableName;
54 }
55 get sdkContent() {
56 const extraVariables = [];
57 const allPossibleActions = this._operationsToInclude
58 .map(o => {
59 const operationType = o.node.operation;
60 const operationName = o.node.name.value;
61 const optionalVariables = !o.node.variableDefinitions ||
62 o.node.variableDefinitions.length === 0 ||
63 o.node.variableDefinitions.every(v => v.type.kind !== graphql_1.Kind.NON_NULL_TYPE || v.defaultValue);
64 const docVarName = this.getDocumentNodeVariable(o.documentVariableName);
65 if (this.config.rawRequest) {
66 let docArg = docVarName;
67 if (this.config.documentMode !== visitor_plugin_common_1.DocumentMode.string) {
68 docArg = `${docVarName}String`;
69 extraVariables.push(`const ${docArg} = print(${docVarName});`);
70 }
71 return `${operationName}(variables${optionalVariables ? '?' : ''}: ${o.operationVariablesTypes}, requestHeaders?: Dom.RequestInit["headers"]): Promise<{ data: ${o.operationResultType}; extensions?: ${this.config.extensionsType}; headers: Dom.Headers; status: number; }> {
72 return withWrapper((wrappedRequestHeaders) => client.rawRequest<${o.operationResultType}>(${docArg}, variables, {...requestHeaders, ...wrappedRequestHeaders}), '${operationName}', '${operationType}');
73}`;
74 }
75 return `${operationName}(variables${optionalVariables ? '?' : ''}: ${o.operationVariablesTypes}, requestHeaders?: Dom.RequestInit["headers"]): Promise<${o.operationResultType}> {
76 return withWrapper((wrappedRequestHeaders) => client.request<${o.operationResultType}>(${docVarName}, variables, {...requestHeaders, ...wrappedRequestHeaders}), '${operationName}', '${operationType}');
77}`;
78 })
79 .filter(Boolean)
80 .map(s => (0, visitor_plugin_common_1.indentMultiline)(s, 2));
81 return `${additionalExportedTypes}
82
83const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action();
84${extraVariables.join('\n')}
85export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
86 return {
87${allPossibleActions.join(',\n')}
88 };
89}
90export type Sdk = ReturnType<typeof getSdk>;`;
91 }
92}
93exports.GraphQLRequestVisitor = GraphQLRequestVisitor;