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