import { AST } from 'eslint'; import { SourceLocation, Comment } from 'estree'; import { ASTNode, TypeNode, TypeInfo, DocumentNode, DefinitionNode, EnumValueDefinitionNode, EnumTypeDefinitionNode, EnumTypeExtensionNode, InputValueDefinitionNode, DirectiveDefinitionNode, FieldDefinitionNode, InputObjectTypeDefinitionNode, InputObjectTypeExtensionNode, InterfaceTypeDefinitionNode, InterfaceTypeExtensionNode, ObjectTypeDefinitionNode, ObjectTypeExtensionNode, SelectionSetNode, ExecutableDefinitionNode, FieldNode, InlineFragmentNode, SelectionNode, ListTypeNode, NonNullTypeNode, OperationTypeDefinitionNode, VariableDefinitionNode, NameNode, ArgumentNode, FragmentSpreadNode, NamedTypeNode, TypeDefinitionNode, TypeExtensionNode, VariableNode, DirectiveNode } from 'graphql'; type SafeGraphQLType = T extends { type: TypeNode; } ? Omit & { gqlType: T['type']; } : Omit; type Writeable = { -readonly [K in keyof T]: T[K]; }; type TypeInformation = { argument: ReturnType; defaultValue: ReturnType; directive: ReturnType; enumValue: ReturnType; fieldDef: ReturnType; inputType: ReturnType; parentInputType: ReturnType; parentType: ReturnType; gqlType: ReturnType; }; type NodeWithName = ArgumentNode | DirectiveDefinitionNode | EnumValueDefinitionNode | ExecutableDefinitionNode | FieldDefinitionNode | FieldNode | FragmentSpreadNode | NamedTypeNode | TypeDefinitionNode | TypeExtensionNode | VariableNode; type NodeWithType = FieldDefinitionNode | InputValueDefinitionNode | ListTypeNode | NonNullTypeNode | OperationTypeDefinitionNode | VariableDefinitionNode; type ParentNode = T extends DocumentNode ? AST.Program : T extends DefinitionNode ? DocumentNode : T extends EnumValueDefinitionNode ? EnumTypeDefinitionNode | EnumTypeExtensionNode : T extends InputValueDefinitionNode ? DirectiveDefinitionNode | FieldDefinitionNode | InputObjectTypeDefinitionNode | InputObjectTypeExtensionNode : T extends FieldDefinitionNode ? InterfaceTypeDefinitionNode | InterfaceTypeExtensionNode | ObjectTypeDefinitionNode | ObjectTypeExtensionNode : T extends SelectionSetNode ? ExecutableDefinitionNode | FieldNode | InlineFragmentNode : T extends SelectionNode ? SelectionSetNode : T extends TypeNode ? NodeWithType : T extends NameNode ? NodeWithName : T extends DirectiveNode ? InputObjectTypeDefinitionNode | ObjectTypeDefinitionNode : T extends VariableNode ? VariableDefinitionNode : unknown; type Node = Writeable> & { type: T['kind']; loc: SourceLocation; range: AST.Range; leadingComments: Comment[]; typeInfo: () => WithTypeInfo extends true ? TypeInformation : Record; rawNode: () => T; parent: GraphQLESTreeNode>; }; type GraphQLESTreeNode = T extends ASTNode ? { [K in keyof Node]: Node[K] extends ReadonlyArray | undefined ? GraphQLESTreeNode[] : GraphQLESTreeNode[K], W>; } : T extends AST.Program ? T & { parent: null; } : T; export type { GraphQLESTreeNode, TypeInformation };