graphql-code-generator-community
graphql-code-generator-community copied to clipboard
Operation descriptions should appear in JSDoc doc comments
Is your feature request related to a problem? Please describe.
I'm frustrated when my GraphQL operation descriptions are lost in the translation to TypeScript.
Describe the solution you'd like
I'd like the descriptions to appear in JSDoc doc comments. For example, request document
""" Get summary information about the specified user. """
query user {
user(id: 1) {
id
username
email
}
}
should produce typescript-generic-sdk output like
export function getSdk<C>(requester: Requester<C>) {
return {
+ /** Get summary information about the specified user. */
user(variables?: UserQueryVariables, options?: C): Promise<UserQuery> {
return requester<UserQuery, UserQueryVariables>(UserDocument, variables, options) as Promise<UserQuery>;
}
};
}
export type Sdk = ReturnType<typeof getSdk>;
Describe alternatives you've considered
The translation could be subject to a configuration option, but I'm having difficulty imagining a scenario where someone would go to the trouble of writing a description but would not want that in their editor autocompletion.
Proposed patch:
diff --git i/packages/plugins/typescript/generic-sdk/src/visitor.ts w/packages/plugins/typescript/generic-sdk/src/visitor.ts
index c05a1b817..709cf5d4f 100644
--- i/packages/plugins/typescript/generic-sdk/src/visitor.ts
+++ w/packages/plugins/typescript/generic-sdk/src/visitor.ts
@@ -6,6 +6,7 @@ import {
DocumentMode,
getConfigValue,
indentMultiline,
+ transformComment,
LoadedFragment,
} from '@graphql-codegen/visitor-plugin-common';
import { RawGenericSdkPluginConfig } from './config.js';
@@ -110,6 +111,7 @@ export class GenericSdkVisitor extends ClientSideBaseVisitor<
const allPossibleActions = this._operationsToInclude
.map(o => {
const operationName = o.node.name.value;
+ const operationDocComment = transformComment(o.node.description);
const optionalVariables =
!o.node.variableDefinitions ||
o.node.variableDefinitions.length === 0 ||
@@ -125,7 +127,7 @@ export class GenericSdkVisitor extends ClientSideBaseVisitor<
const resultData = this.config.rawRequest
? `ExecutionResult<${o.operationResultType}, E>`
: o.operationResultType;
- return `${operationName}(variables${optionalVariables ? '?' : ''}: ${
+ return `${operationDocComment}${operationName}(variables${optionalVariables ? '?' : ''}: ${
o.operationVariablesTypes
}, options?: C): ${returnType}<${resultData}> {
return requester<${o.operationResultType}, ${
diff --git i/packages/plugins/typescript/graphql-request/src/visitor.ts w/packages/plugins/typescript/graphql-request/src/visitor.ts
index a2afd8559..0191adb53 100644
--- i/packages/plugins/typescript/graphql-request/src/visitor.ts
+++ w/packages/plugins/typescript/graphql-request/src/visitor.ts
@@ -6,6 +6,7 @@ import {
DocumentMode,
getConfigValue,
indentMultiline,
+ transformComment,
LoadedFragment,
} from '@graphql-codegen/visitor-plugin-common';
import { RawGraphQLRequestPluginConfig } from './config.js';
@@ -116,6 +117,7 @@ export class GraphQLRequestVisitor extends ClientSideBaseVisitor<
.map(o => {
const operationType = o.node.operation;
const operationName = o.node.name.value;
+ const operationDocComment = transformComment(o.node.description);
const optionalVariables =
!o.node.variableDefinitions ||
o.node.variableDefinitions.length === 0 ||
@@ -130,7 +132,7 @@ export class GraphQLRequestVisitor extends ClientSideBaseVisitor<
docArg = `${docVarName}String`;
extraVariables.push(`const ${docArg} = print(${docVarName});`);
}
- return `${operationName}(variables${optionalVariables ? '?' : ''}: ${
+ return `${operationDocComment}${operationName}(variables${optionalVariables ? '?' : ''}: ${
o.operationVariablesTypes
}, requestHeaders?: GraphQLClientRequestHeaders): Promise<{ data: ${
o.operationResultType
@@ -142,7 +144,7 @@ export class GraphQLRequestVisitor extends ClientSideBaseVisitor<
}>(${docArg}, variables, {...requestHeaders, ...wrappedRequestHeaders}), '${operationName}', '${operationType}', variables);
}`;
}
- return `${operationName}(variables${optionalVariables ? '?' : ''}: ${
+ return `${operationDocComment}${operationName}(variables${optionalVariables ? '?' : ''}: ${
o.operationVariablesTypes
}, requestHeaders?: GraphQLClientRequestHeaders, signal?: RequestInit['signal']): Promise<${o.operationResultType}> {
return withWrapper((wrappedRequestHeaders) => client.request<${
diff --git i/packages/plugins/typescript/jit-sdk/src/visitor.ts w/packages/plugins/typescript/jit-sdk/src/visitor.ts
index 003e27817..e236e503d 100644
--- i/packages/plugins/typescript/jit-sdk/src/visitor.ts
+++ w/packages/plugins/typescript/jit-sdk/src/visitor.ts
@@ -5,6 +5,7 @@ import {
ClientSideBaseVisitor,
DocumentMode,
indentMultiline,
+ transformComment,
LoadedFragment,
} from '@graphql-codegen/visitor-plugin-common';
import { RawJitSdkPluginConfig } from './config.js';
@@ -83,6 +84,7 @@ export class JitSdkVisitor extends ClientSideBaseVisitor<
let hasSubscription = false;
for (const o of this._operationsToInclude) {
const operationName = o.node.name.value;
+ const operationDocComment = transformComment(o.node.description);
const compiledQueryVariableName = `${operationName}Compiled`;
compiledQueries.push(
indentMultiline(
@@ -115,7 +117,7 @@ if(!(isCompiledQuery(${compiledQueryVariableName}))) {
}
sdkMethods.push(
indentMultiline(
- `async ${operationName}(variables${optionalVariables ? '?' : ''}: ${
+ `${operationDocComment}async ${operationName}(variables${optionalVariables ? '?' : ''}: ${
o.operationVariablesTypes
}, context?: TOperationContext, root?: TOperationRoot): Promise<${returnType}> {
const result = await ${compiledQueryVariableName}.${methodName}({
diff --git i/packages/plugins/typescript/react-apollo/src/visitor.ts w/packages/plugins/typescript/react-apollo/src/visitor.ts
index f70d04dac..b12c769f4 100644
--- i/packages/plugins/typescript/react-apollo/src/visitor.ts
+++ w/packages/plugins/typescript/react-apollo/src/visitor.ts
@@ -7,6 +7,7 @@ import {
ClientSideBaseVisitor,
DocumentMode,
getConfigValue,
+ transformComment,
LoadedFragment,
OMIT_TYPE,
} from '@graphql-codegen/visitor-plugin-common';
@@ -526,10 +527,11 @@ export class ReactApolloVisitor extends ClientSideBaseVisitor<
suffix: this._getHookSuffix(nodeName, operationType),
useTypesPrefix: false,
}) + this.config.hooksSuffix;
+ const operationDocComment = transformComment(node.description);
const optional = hasRequiredVariables(node) ? '' : '?';
- return `export function refetch${operationName}(variables${optional}: ${operationVariablesTypes}) {
+ return `${operationDocComment}export function refetch${operationName}(variables${optional}: ${operationVariablesTypes}) {
return { query: ${this.getDocumentNodeVariable(
node,
documentVariableName,
Hello @gibson042 ! Would you like to send a PR through to fix it?
#1282