UNPKG

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