@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
JavaScript
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;
;