import { Source } from './source'; import { TokenKindEnum } from './tokenKind'; /** * Contains a range of UTF-8 character offsets and token references that * identify the region of the source from which the AST derived. */ export class Location { /** * The character offset at which this Node begins. */ readonly start: number; /** * The character offset at which this Node ends. */ readonly end: number; /** * The Token at which this Node begins. */ readonly startToken: Token; /** * The Token at which this Node ends. */ readonly endToken: Token; /** * The Source document the AST represents. */ readonly source: Source; constructor(startToken: Token, endToken: Token, source: Source); } /** * Represents a range of characters represented by a lexical token * within a Source. */ export class Token { /** * The kind of Token. */ readonly kind: TokenKindEnum; /** * The character offset at which this Node begins. */ readonly start: number; /** * The character offset at which this Node ends. */ readonly end: number; /** * The 1-indexed line number on which this Token appears. */ readonly line: number; /** * The 1-indexed column number at which this Token begins. */ readonly column: number; /** * For non-punctuation tokens, represents the interpreted value of the token. */ readonly value: string | undefined; /** * Tokens exist as nodes in a double-linked-list amongst all tokens * including ignored tokens. is always the first node and * the last. */ readonly prev: Token | null; readonly next: Token | null; constructor( kind: TokenKindEnum, start: number, end: number, line: number, column: number, prev: Token | null, value?: string, ); } /** * @internal */ export function isNode(maybeNode: any): maybeNode is ASTNode; /** * The list of all possible AST node types. */ export type ASTNode = | NameNode | DocumentNode | OperationDefinitionNode | VariableDefinitionNode | VariableNode | SelectionSetNode | FieldNode | ArgumentNode | FragmentSpreadNode | InlineFragmentNode | FragmentDefinitionNode | IntValueNode | FloatValueNode | StringValueNode | BooleanValueNode | NullValueNode | EnumValueNode | ListValueNode | ObjectValueNode | ObjectFieldNode | DirectiveNode | NamedTypeNode | ListTypeNode | NonNullTypeNode | SchemaDefinitionNode | OperationTypeDefinitionNode | ScalarTypeDefinitionNode | ObjectTypeDefinitionNode | FieldDefinitionNode | InputValueDefinitionNode | InterfaceTypeDefinitionNode | UnionTypeDefinitionNode | EnumTypeDefinitionNode | EnumValueDefinitionNode | InputObjectTypeDefinitionNode | DirectiveDefinitionNode | SchemaExtensionNode | ScalarTypeExtensionNode | ObjectTypeExtensionNode | InterfaceTypeExtensionNode | UnionTypeExtensionNode | EnumTypeExtensionNode | InputObjectTypeExtensionNode; /** * Utility type listing all nodes indexed by their kind. */ export interface ASTKindToNode { Name: NameNode; Document: DocumentNode; OperationDefinition: OperationDefinitionNode; VariableDefinition: VariableDefinitionNode; Variable: VariableNode; SelectionSet: SelectionSetNode; Field: FieldNode; Argument: ArgumentNode; FragmentSpread: FragmentSpreadNode; InlineFragment: InlineFragmentNode; FragmentDefinition: FragmentDefinitionNode; IntValue: IntValueNode; FloatValue: FloatValueNode; StringValue: StringValueNode; BooleanValue: BooleanValueNode; NullValue: NullValueNode; EnumValue: EnumValueNode; ListValue: ListValueNode; ObjectValue: ObjectValueNode; ObjectField: ObjectFieldNode; Directive: DirectiveNode; NamedType: NamedTypeNode; ListType: ListTypeNode; NonNullType: NonNullTypeNode; SchemaDefinition: SchemaDefinitionNode; OperationTypeDefinition: OperationTypeDefinitionNode; ScalarTypeDefinition: ScalarTypeDefinitionNode; ObjectTypeDefinition: ObjectTypeDefinitionNode; FieldDefinition: FieldDefinitionNode; InputValueDefinition: InputValueDefinitionNode; InterfaceTypeDefinition: InterfaceTypeDefinitionNode; UnionTypeDefinition: UnionTypeDefinitionNode; EnumTypeDefinition: EnumTypeDefinitionNode; EnumValueDefinition: EnumValueDefinitionNode; InputObjectTypeDefinition: InputObjectTypeDefinitionNode; DirectiveDefinition: DirectiveDefinitionNode; SchemaExtension: SchemaExtensionNode; ScalarTypeExtension: ScalarTypeExtensionNode; ObjectTypeExtension: ObjectTypeExtensionNode; InterfaceTypeExtension: InterfaceTypeExtensionNode; UnionTypeExtension: UnionTypeExtensionNode; EnumTypeExtension: EnumTypeExtensionNode; InputObjectTypeExtension: InputObjectTypeExtensionNode; } // Name export interface NameNode { readonly kind: 'Name'; readonly loc?: Location; readonly value: string; } // Document export interface DocumentNode { readonly kind: 'Document'; readonly loc?: Location; readonly definitions: ReadonlyArray; } export type DefinitionNode = | ExecutableDefinitionNode | TypeSystemDefinitionNode | TypeSystemExtensionNode; export type ExecutableDefinitionNode = | OperationDefinitionNode | FragmentDefinitionNode; export interface OperationDefinitionNode { readonly kind: 'OperationDefinition'; readonly loc?: Location; readonly operation: OperationTypeNode; readonly name?: NameNode; readonly variableDefinitions?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet: SelectionSetNode; } export type OperationTypeNode = 'query' | 'mutation' | 'subscription'; export interface VariableDefinitionNode { readonly kind: 'VariableDefinition'; readonly loc?: Location; readonly variable: VariableNode; readonly type: TypeNode; readonly defaultValue?: ValueNode; readonly directives?: ReadonlyArray; } export interface VariableNode { readonly kind: 'Variable'; readonly loc?: Location; readonly name: NameNode; } export interface SelectionSetNode { kind: 'SelectionSet'; loc?: Location; selections: ReadonlyArray; } export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; export interface FieldNode { readonly kind: 'Field'; readonly loc?: Location; readonly alias?: NameNode; readonly name: NameNode; readonly arguments?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet?: SelectionSetNode; } export interface ArgumentNode { readonly kind: 'Argument'; readonly loc?: Location; readonly name: NameNode; readonly value: ValueNode; } // Fragments export interface FragmentSpreadNode { readonly kind: 'FragmentSpread'; readonly loc?: Location; readonly name: NameNode; readonly directives?: ReadonlyArray; } export interface InlineFragmentNode { readonly kind: 'InlineFragment'; readonly loc?: Location; readonly typeCondition?: NamedTypeNode; readonly directives?: ReadonlyArray; readonly selectionSet: SelectionSetNode; } export interface FragmentDefinitionNode { readonly kind: 'FragmentDefinition'; readonly loc?: Location; readonly name: NameNode; // Note: fragment variable definitions are experimental and may be changed // or removed in the future. readonly variableDefinitions?: ReadonlyArray; readonly typeCondition: NamedTypeNode; readonly directives?: ReadonlyArray; readonly selectionSet: SelectionSetNode; } // Values export type ValueNode = | VariableNode | IntValueNode | FloatValueNode | StringValueNode | BooleanValueNode | NullValueNode | EnumValueNode | ListValueNode | ObjectValueNode; export interface IntValueNode { readonly kind: 'IntValue'; readonly loc?: Location; readonly value: string; } export interface FloatValueNode { readonly kind: 'FloatValue'; readonly loc?: Location; readonly value: string; } export interface StringValueNode { readonly kind: 'StringValue'; readonly loc?: Location; readonly value: string; readonly block?: boolean; } export interface BooleanValueNode { readonly kind: 'BooleanValue'; readonly loc?: Location; readonly value: boolean; } export interface NullValueNode { readonly kind: 'NullValue'; readonly loc?: Location; } export interface EnumValueNode { readonly kind: 'EnumValue'; readonly loc?: Location; readonly value: string; } export interface ListValueNode { readonly kind: 'ListValue'; readonly loc?: Location; readonly values: ReadonlyArray; } export interface ObjectValueNode { readonly kind: 'ObjectValue'; readonly loc?: Location; readonly fields: ReadonlyArray; } export interface ObjectFieldNode { readonly kind: 'ObjectField'; readonly loc?: Location; readonly name: NameNode; readonly value: ValueNode; } // Directives export interface DirectiveNode { readonly kind: 'Directive'; readonly loc?: Location; readonly name: NameNode; readonly arguments?: ReadonlyArray; } // Type Reference export type TypeNode = NamedTypeNode | ListTypeNode | NonNullTypeNode; export interface NamedTypeNode { readonly kind: 'NamedType'; readonly loc?: Location; readonly name: NameNode; } export interface ListTypeNode { readonly kind: 'ListType'; readonly loc?: Location; readonly type: TypeNode; } export interface NonNullTypeNode { readonly kind: 'NonNullType'; readonly loc?: Location; readonly type: NamedTypeNode | ListTypeNode; } // Type System Definition export type TypeSystemDefinitionNode = | SchemaDefinitionNode | TypeDefinitionNode | DirectiveDefinitionNode; export interface SchemaDefinitionNode { readonly kind: 'SchemaDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly directives?: ReadonlyArray; readonly operationTypes: ReadonlyArray; } export interface OperationTypeDefinitionNode { readonly kind: 'OperationTypeDefinition'; readonly loc?: Location; readonly operation: OperationTypeNode; readonly type: NamedTypeNode; } // Type Definition export type TypeDefinitionNode = | ScalarTypeDefinitionNode | ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | UnionTypeDefinitionNode | EnumTypeDefinitionNode | InputObjectTypeDefinitionNode; export interface ScalarTypeDefinitionNode { readonly kind: 'ScalarTypeDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly directives?: ReadonlyArray; } export interface ObjectTypeDefinitionNode { readonly kind: 'ObjectTypeDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly interfaces?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly fields?: ReadonlyArray; } export interface FieldDefinitionNode { readonly kind: 'FieldDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly arguments?: ReadonlyArray; readonly type: TypeNode; readonly directives?: ReadonlyArray; } export interface InputValueDefinitionNode { readonly kind: 'InputValueDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly type: TypeNode; readonly defaultValue?: ValueNode; readonly directives?: ReadonlyArray; } export interface InterfaceTypeDefinitionNode { readonly kind: 'InterfaceTypeDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly interfaces?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly fields?: ReadonlyArray; } export interface UnionTypeDefinitionNode { readonly kind: 'UnionTypeDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly directives?: ReadonlyArray; readonly types?: ReadonlyArray; } export interface EnumTypeDefinitionNode { readonly kind: 'EnumTypeDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly directives?: ReadonlyArray; readonly values?: ReadonlyArray; } export interface EnumValueDefinitionNode { readonly kind: 'EnumValueDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly directives?: ReadonlyArray; } export interface InputObjectTypeDefinitionNode { readonly kind: 'InputObjectTypeDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly directives?: ReadonlyArray; readonly fields?: ReadonlyArray; } // Directive Definitions export interface DirectiveDefinitionNode { readonly kind: 'DirectiveDefinition'; readonly loc?: Location; readonly description?: StringValueNode; readonly name: NameNode; readonly arguments?: ReadonlyArray; readonly repeatable: boolean; readonly locations: ReadonlyArray; } // Type System Extensions export type TypeSystemExtensionNode = SchemaExtensionNode | TypeExtensionNode; export type SchemaExtensionNode = { readonly kind: 'SchemaExtension'; readonly loc?: Location; readonly directives?: ReadonlyArray; readonly operationTypes?: ReadonlyArray; }; // Type Extensions export type TypeExtensionNode = | ScalarTypeExtensionNode | ObjectTypeExtensionNode | InterfaceTypeExtensionNode | UnionTypeExtensionNode | EnumTypeExtensionNode | InputObjectTypeExtensionNode; export interface ScalarTypeExtensionNode { readonly kind: 'ScalarTypeExtension'; readonly loc?: Location; readonly name: NameNode; readonly directives?: ReadonlyArray; } export interface ObjectTypeExtensionNode { readonly kind: 'ObjectTypeExtension'; readonly loc?: Location; readonly name: NameNode; readonly interfaces?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly fields?: ReadonlyArray; } export interface InterfaceTypeExtensionNode { readonly kind: 'InterfaceTypeExtension'; readonly loc?: Location; readonly name: NameNode; readonly interfaces?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly fields?: ReadonlyArray; } export interface UnionTypeExtensionNode { readonly kind: 'UnionTypeExtension'; readonly loc?: Location; readonly name: NameNode; readonly directives?: ReadonlyArray; readonly types?: ReadonlyArray; } export interface EnumTypeExtensionNode { readonly kind: 'EnumTypeExtension'; readonly loc?: Location; readonly name: NameNode; readonly directives?: ReadonlyArray; readonly values?: ReadonlyArray; } export interface InputObjectTypeExtensionNode { readonly kind: 'InputObjectTypeExtension'; readonly loc?: Location; readonly name: NameNode; readonly directives?: ReadonlyArray; readonly fields?: ReadonlyArray; }