Core visitor classes that provide the foundation for different types of GraphQL code generation plugins. Each visitor implements the GraphQL AST visitor pattern and provides specialized functionality for specific code generation scenarios.
The foundational visitor class that provides common functionality for name conversion, configuration parsing, and fragment handling.
/**
* Base visitor class providing common functionality for all GraphQL CodeGen visitors
*/
abstract class BaseVisitor {
/**
* Converts GraphQL names using configured naming conventions
* @param node - GraphQL AST node or string to convert
* @param options - Conversion options including prefix, suffix, and underscore handling
* @returns Converted name string
*/
convertName(node: ASTNode | string, options?: ConvertOptions): string;
/**
* Gets suffix for operation types based on configuration
* @param node - Fragment or operation definition node
* @param operationType - Type of GraphQL operation
* @returns Operation suffix string
*/
getOperationSuffix(node: FragmentDefinitionNode | OperationDefinitionNode, operationType: string): string;
/**
* Gets suffix for fragments based on configuration
* @param node - Fragment definition node or name string
* @returns Fragment suffix string
*/
getFragmentSuffix(node: FragmentDefinitionNode | string): string;
/**
* Gets converted fragment name using naming conventions
* @param node - Fragment definition node
* @returns Converted fragment name
*/
getFragmentName(node: FragmentDefinitionNode): string;
/**
* Gets fragment variable name for use in generated code
* @param node - Fragment definition node
* @returns Fragment variable name
*/
getFragmentVariableName(node: FragmentDefinitionNode): string;
}
interface BaseVisitorConvertOptions {
useTypesPrefix?: boolean;
useTypesSuffix?: boolean;
}
type InlineFragmentTypeOptions = 'inline' | 'combine' | 'mask';
interface ParsedConfig {
scalars: ParsedScalarsMap;
convert: ConvertFn;
typesPrefix: string;
typesSuffix: string;
addTypename: boolean;
nonOptionalTypename: boolean;
extractAllFieldsToTypes: boolean;
externalFragments: LoadedFragment[];
fragmentImports: ImportDeclaration<FragmentImport>[];
immutableTypes: boolean;
useTypeImports: boolean;
dedupeFragments: boolean;
allowEnumStringTypes: boolean;
inlineFragmentTypes: InlineFragmentTypeOptions;
emitLegacyCommonJSImports: boolean;
printFieldsOnNewLines: boolean;
}
interface RawConfig {
strictScalars?: boolean;
defaultScalarType?: string;
scalars?: ScalarsMap;
namingConvention?: NamingConvention;
typesPrefix?: string;
typesSuffix?: string;
skipTypename?: boolean;
nonOptionalTypename?: boolean;
useTypeImports?: boolean;
immutableTypes?: boolean;
maybeValue?: string;
inputMaybeValue?: string;
noExport?: boolean;
dedupeFragments?: boolean;
allowEnumStringTypes?: boolean;
inlineFragmentTypes?: InlineFragmentTypeOptions;
emitLegacyCommonJSImports?: boolean;
printFieldsOnNewLines?: boolean;
}Handles GraphQL document processing for operations and fragments, extending BaseVisitor with document-specific functionality.
/**
* Visitor for processing GraphQL documents (operations and fragments)
*/
class BaseDocumentsVisitor extends BaseVisitor {
/**
* Processes fragment definition nodes
* @param node - GraphQL fragment definition node
* @returns Generated fragment code
*/
FragmentDefinition(node: FragmentDefinitionNode): string;
/**
* Processes operation definition nodes
* @param node - GraphQL operation definition node
* @returns Generated operation code
*/
OperationDefinition(node: OperationDefinitionNode): string;
/**
* Returns global type declarations
* @param noExport - Whether to omit export keywords
* @returns Global declaration strings
*/
getGlobalDeclarations(noExport?: boolean): string[];
/**
* Sets the selection set handler for processing selections
* @param handler - Selection set processor instance
*/
setSelectionSetHandler(handler: SelectionSetToObject): void;
/**
* Sets the variables transformer for processing operation variables
* @param transformer - Operation variables processor instance
*/
setVariablesTransformer(transformer: OperationVariablesToObject): void;
}
interface ParsedDocumentsConfig extends ParsedTypesConfig {
addTypename: boolean;
preResolveTypes: boolean;
extractAllFieldsToTypes: boolean;
globalNamespace: boolean;
operationResultSuffix: string;
dedupeOperationSuffix: boolean;
omitOperationSuffix: boolean;
namespacedImportName: string | null;
exportFragmentSpreadSubTypes: boolean;
skipTypeNameForRoot: boolean;
experimentalFragmentVariables: boolean;
mergeFragmentTypes: boolean;
}
interface RawDocumentsConfig extends RawTypesConfig {
preResolveTypes?: boolean;
skipTypeNameForRoot?: boolean;
globalNamespace?: boolean;
operationResultSuffix?: string;
dedupeOperationSuffix?: boolean;
omitOperationSuffix?: boolean;
namespacedImportName?: string;
addTypename?: boolean;
exportFragmentSpreadSubTypes?: boolean;
extractAllFieldsToTypes?: boolean;
experimentalFragmentVariables?: boolean;
mergeFragmentTypes?: boolean;
}Generates TypeScript types for GraphQL schema types, including objects, interfaces, unions, enums, and scalars.
/**
* Visitor for generating TypeScript types from GraphQL schema types
*/
class BaseTypesVisitor extends BaseVisitor {
/**
* Generates TypeScript interface or type for GraphQL object types
* @param node - GraphQL object type definition node
* @returns Generated TypeScript code
*/
ObjectTypeDefinition(node: ObjectTypeDefinitionNode): string;
/**
* Generates TypeScript interface for GraphQL interface types
* @param node - GraphQL interface type definition node
* @returns Generated TypeScript code
*/
InterfaceTypeDefinition(node: InterfaceTypeDefinitionNode): string;
/**
* Generates TypeScript union type for GraphQL union types
* @param node - GraphQL union type definition node
* @returns Generated TypeScript code
*/
UnionTypeDefinition(node: UnionTypeDefinitionNode): string;
/**
* Generates TypeScript enum for GraphQL enum types
* @param node - GraphQL enum type definition node
* @returns Generated TypeScript code
*/
EnumTypeDefinition(node: EnumTypeDefinitionNode): string;
/**
* Generates TypeScript type alias for GraphQL scalar types
* @param node - GraphQL scalar type definition node
* @returns Generated TypeScript code
*/
ScalarTypeDefinition(node: ScalarTypeDefinitionNode): string;
/**
* Generates TypeScript interface for GraphQL input object types
* @param node - GraphQL input object type definition node
* @returns Generated TypeScript code
*/
InputObjectTypeDefinition(node: InputObjectTypeDefinitionNode): string;
/**
* Generates TypeScript property definition for GraphQL field types
* @param node - GraphQL field definition node
* @returns Generated TypeScript property code
*/
FieldDefinition(node: FieldDefinitionNode): string;
/**
* Gets field wrapper value for optional/nullable field handling
* @returns Field wrapper type string
*/
getFieldWrapperValue(): string;
/**
* Gets import statements for scalar types
* @returns Array of import statement strings
*/
getScalarsImports(): string[];
}
interface ParsedTypesConfig extends ParsedConfig {
enumValues: ParsedEnumValuesMap;
declarationKind: DeclarationKindConfig;
addUnderscoreToArgsType: boolean;
onlyEnums: boolean;
onlyOperationTypes: boolean;
enumPrefix: boolean;
enumSuffix: boolean;
fieldWrapperValue: string;
wrapFieldDefinitions: boolean;
entireFieldWrapperValue: string;
wrapEntireDefinitions: boolean;
ignoreEnumValuesFromSchema: boolean;
directiveArgumentAndInputFieldMappings: ParsedDirectiveArgumentAndInputFieldMappings;
}
interface RawTypesConfig extends RawConfig {
addUnderscoreToArgsType?: boolean;
enumValues?: EnumValuesMap;
declarationKind?: DeclarationKind | DeclarationKindConfig;
onlyEnums?: boolean;
onlyOperationTypes?: boolean;
enumPrefix?: boolean;
enumSuffix?: boolean;
fieldWrapperValue?: string;
wrapFieldDefinitions?: boolean;
entireFieldWrapperValue?: string;
wrapEntireDefinitions?: boolean;
ignoreEnumValuesFromSchema?: boolean;
directiveArgumentAndInputFieldMappings?: DirectiveArgumentAndInputFieldMappings;
}Generates resolver type signatures for GraphQL resolvers, including resolver functions, parent types, and context types.
/**
* Visitor for generating resolver type signatures
*/
class BaseResolversVisitor extends BaseTypesVisitor {
/**
* Builds ResolversTypes mapping for all GraphQL types
* @returns Generated ResolversTypes type definition
*/
buildResolversTypes(): string;
/**
* Builds ResolversParentTypes mapping for parent type resolution
* @returns Generated ResolversParentTypes type definition
*/
buildResolversParentTypes(): string;
/**
* Builds union resolver types for GraphQL union types
* @returns Generated union resolver type definitions
*/
buildResolversUnionTypes(): string;
/**
* Builds interface resolver types for GraphQL interface types
* @returns Generated interface resolver type definitions
*/
buildResolversInterfaceTypes(): string;
/**
* Gets root resolver type definition
* @returns Root resolver type string
*/
getRootResolver(): string;
/**
* Gets all directive resolver types
* @returns Generated directive resolver type definitions
*/
getAllDirectiveResolvers(): string;
/**
* Gets resolver wrapper signature for resolver return types
* @returns Resolver wrapper type string
*/
getResolverTypeWrapperSignature(): string;
}
interface ParsedResolversConfig extends ParsedConfig {
contextType: ParsedMapper;
fieldContextTypes: Array<string>;
directiveContextTypes: Array<string>;
rootValueType: ParsedMapper;
mappers: { [typeName: string]: ParsedMapper };
defaultMapper: ParsedMapper | null;
avoidOptionals: AvoidOptionalsConfig | boolean;
addUnderscoreToArgsType: boolean;
enumValues: ParsedEnumValuesMap;
resolverTypeWrapperSignature: string;
federation: boolean;
enumPrefix: boolean;
enumSuffix: boolean;
optionalResolveType: boolean;
immutableTypes: boolean;
namespacedImportName: string;
resolverTypeSuffix: string;
allResolversTypeName: string;
internalResolversPrefix: string;
onlyResolveTypeForInterfaces: boolean;
directiveResolverMappings: Record<string, string>;
resolversNonOptionalTypename: ResolversNonOptionalTypenameConfig;
}
interface RawResolversConfig extends RawConfig {
addUnderscoreToArgsType?: boolean;
contextType?: string;
fieldContextTypes?: Array<string>;
directiveContextTypes?: Array<string>;
rootValueType?: string;
mappers?: { [typeName: string]: string };
defaultMapper?: string;
avoidOptionals?: boolean | AvoidOptionalsConfig;
enumValues?: EnumValuesMap;
resolverTypeWrapperSignature?: string;
federation?: boolean;
enumPrefix?: boolean;
enumSuffix?: boolean;
optionalResolveType?: boolean;
namespacedImportName?: string;
resolverTypeSuffix?: string;
allResolversTypeName?: string;
internalResolversPrefix?: string;
onlyResolveTypeForInterfaces?: boolean;
directiveResolverMappings?: Record<string, string>;
resolversNonOptionalTypename?: boolean | ResolversNonOptionalTypenameConfig;
}Base class for client-side code generation, handling operations, hooks, and client-specific code patterns.
/**
* Abstract base visitor for client-side code generation
*/
abstract class ClientSideBaseVisitor extends BaseDocumentsVisitor {
/**
* Processes operation definitions for client-side code generation
* @param node - GraphQL operation definition node
* @returns Generated client-side operation code
*/
OperationDefinition(node: OperationDefinitionNode): string;
/**
* Gets required imports for the generated code
* @param options - Import generation options
* @returns Array of import statement strings
*/
getImports(options?: { includeFragments?: boolean }): string[];
/**
* Gets operation variable name for use in generated code
* @param node - GraphQL operation definition node
* @returns Operation variable name string
*/
getOperationVariableName(node: OperationDefinitionNode): string;
/**
* Checks if variables are required for the operation
* @param node - GraphQL operation definition node
* @returns True if variables are required
*/
checkVariablesRequirements(node: OperationDefinitionNode): boolean;
/**
* Abstract method for building operation code - must be implemented by subclasses
* @param node - GraphQL operation definition node
* @param documentVariableName - Variable name for the document
* @param operationType - Type of GraphQL operation
* @param operationResultType - TypeScript type for operation result
* @param operationVariablesTypes - TypeScript type for operation variables
* @returns Generated operation code
*/
abstract buildOperation(
node: OperationDefinitionNode,
documentVariableName: string,
operationType: string,
operationResultType: string,
operationVariablesTypes: string
): string;
}
enum DocumentMode {
graphQLTag = 'graphQLTag',
documentNode = 'documentNode',
external = 'external',
string = 'string'
}
interface RawClientSideBasePluginConfig extends RawDocumentsConfig {
documentMode?: DocumentMode;
importDocumentNodeExternallyFrom?: string;
gqlImport?: string;
documentNodeImport?: string;
noGraphQLTag?: boolean;
gqlTagName?: string;
fragmentVariablePrefix?: string;
fragmentVariableSuffix?: string;
withComponent?: boolean;
withHOC?: boolean;
withHooks?: boolean;
withMutationFn?: boolean;
withRefetchFn?: boolean;
apolloReactCommonImportFrom?: string;
apolloReactComponentsImportFrom?: string;
apolloReactHocImportFrom?: string;
apolloReactHooksImportFrom?: string;
componentSuffix?: string;
reactApolloVersion?: number;
withSubscriptionHooks?: boolean;
addDocBlocks?: boolean;
pureMagicComment?: boolean;
}
interface ClientSideBasePluginConfig extends ParsedDocumentsConfig {
documentMode: DocumentMode;
importDocumentNodeExternallyFrom: string;
gqlImport: string;
documentNodeImport: string;
noGraphQLTag: boolean;
gqlTagName: string;
fragmentVariablePrefix: string;
fragmentVariableSuffix: string;
withComponent: boolean;
withHOC: boolean;
withHooks: boolean;
withMutationFn: boolean;
withRefetchFn: boolean;
apolloReactCommonImportFrom: string;
apolloReactComponentsImportFrom: string;
apolloReactHocImportFrom: string;
apolloReactHooksImportFrom: string;
componentSuffix: string;
reactApolloVersion: number;
withSubscriptionHooks: boolean;
addDocBlocks: boolean;
pureMagicComment: boolean;
}Usage Examples:
import { BaseTypesVisitor, RawTypesConfig } from "@graphql-codegen/visitor-plugin-common";
import { GraphQLSchema } from "graphql";
// Extend BaseTypesVisitor for custom type generation
class CustomTypesVisitor extends BaseTypesVisitor {
constructor(schema: GraphQLSchema, config: RawTypesConfig) {
super(schema, config);
}
// Override to add custom object type handling
ObjectTypeDefinition(node) {
const baseResult = super.ObjectTypeDefinition(node);
return `/* Custom object type */\n${baseResult}`;
}
}
// Use with custom configuration
const visitor = new CustomTypesVisitor(schema, {
scalars: { DateTime: 'Date', JSON: 'any' },
namingConvention: 'change-case-all#pascalCase',
declarationKind: 'interface'
});