1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.GraphQLRequestVisitor = void 0;
|
4 | const tslib_1 = require("tslib");
|
5 | const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common");
|
6 | const auto_bind_1 = tslib_1.__importDefault(require("auto-bind"));
|
7 | const graphql_1 = require("graphql");
|
8 | const additionalExportedTypes = `
|
9 | export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string) => Promise<T>;
|
10 | `;
|
11 | class 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 |
|
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 |
|
83 | const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action();
|
84 | ${extraVariables.join('\n')}
|
85 | export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
|
86 | return {
|
87 | ${allPossibleActions.join(',\n')}
|
88 | };
|
89 | }
|
90 | export type Sdk = ReturnType<typeof getSdk>;`;
|
91 | }
|
92 | }
|
93 | exports.GraphQLRequestVisitor = GraphQLRequestVisitor;
|