You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
564 lines
17 KiB
564 lines
17 KiB
import type { Maybe } from '../jsutils/Maybe'; |
|
import type { GraphQLError } from '../error/GraphQLError'; |
|
import type { |
|
ArgumentNode, |
|
ConstArgumentNode, |
|
ConstDirectiveNode, |
|
ConstListValueNode, |
|
ConstObjectFieldNode, |
|
ConstObjectValueNode, |
|
ConstValueNode, |
|
DefinitionNode, |
|
DirectiveDefinitionNode, |
|
DirectiveNode, |
|
DocumentNode, |
|
EnumTypeDefinitionNode, |
|
EnumTypeExtensionNode, |
|
EnumValueDefinitionNode, |
|
FieldDefinitionNode, |
|
FieldNode, |
|
FragmentDefinitionNode, |
|
FragmentSpreadNode, |
|
InlineFragmentNode, |
|
InputObjectTypeDefinitionNode, |
|
InputObjectTypeExtensionNode, |
|
InputValueDefinitionNode, |
|
InterfaceTypeDefinitionNode, |
|
InterfaceTypeExtensionNode, |
|
ListValueNode, |
|
NamedTypeNode, |
|
NameNode, |
|
ObjectFieldNode, |
|
ObjectTypeDefinitionNode, |
|
ObjectTypeExtensionNode, |
|
ObjectValueNode, |
|
OperationDefinitionNode, |
|
OperationTypeDefinitionNode, |
|
ScalarTypeDefinitionNode, |
|
ScalarTypeExtensionNode, |
|
SchemaDefinitionNode, |
|
SchemaExtensionNode, |
|
SelectionNode, |
|
SelectionSetNode, |
|
StringValueNode, |
|
Token, |
|
TypeNode, |
|
TypeSystemExtensionNode, |
|
UnionTypeDefinitionNode, |
|
UnionTypeExtensionNode, |
|
ValueNode, |
|
VariableDefinitionNode, |
|
VariableNode, |
|
} from './ast'; |
|
import { Location, OperationTypeNode } from './ast'; |
|
import { Lexer } from './lexer'; |
|
import { Source } from './source'; |
|
import { TokenKind } from './tokenKind'; |
|
/** |
|
* Configuration options to control parser behavior |
|
*/ |
|
export interface ParseOptions { |
|
/** |
|
* By default, the parser creates AST nodes that know the location |
|
* in the source that they correspond to. This configuration flag |
|
* disables that behavior for performance or testing. |
|
*/ |
|
noLocation?: boolean; |
|
/** |
|
* Parser CPU and memory usage is linear to the number of tokens in a document |
|
* however in extreme cases it becomes quadratic due to memory exhaustion. |
|
* Parsing happens before validation so even invalid queries can burn lots of |
|
* CPU time and memory. |
|
* To prevent this you can set a maximum number of tokens allowed within a document. |
|
*/ |
|
maxTokens?: number | undefined; |
|
/** |
|
* @deprecated will be removed in the v17.0.0 |
|
* |
|
* If enabled, the parser will understand and parse variable definitions |
|
* contained in a fragment definition. They'll be represented in the |
|
* `variableDefinitions` field of the FragmentDefinitionNode. |
|
* |
|
* The syntax is identical to normal, query-defined variables. For example: |
|
* |
|
* ```graphql |
|
* fragment A($var: Boolean = false) on T { |
|
* ... |
|
* } |
|
* ``` |
|
*/ |
|
allowLegacyFragmentVariables?: boolean; |
|
} |
|
/** |
|
* Given a GraphQL source, parses it into a Document. |
|
* Throws GraphQLError if a syntax error is encountered. |
|
*/ |
|
export declare function parse( |
|
source: string | Source, |
|
options?: ParseOptions | undefined, |
|
): DocumentNode; |
|
/** |
|
* Given a string containing a GraphQL value (ex. `[42]`), parse the AST for |
|
* that value. |
|
* Throws GraphQLError if a syntax error is encountered. |
|
* |
|
* This is useful within tools that operate upon GraphQL Values directly and |
|
* in isolation of complete GraphQL documents. |
|
* |
|
* Consider providing the results to the utility function: valueFromAST(). |
|
*/ |
|
export declare function parseValue( |
|
source: string | Source, |
|
options?: ParseOptions | undefined, |
|
): ValueNode; |
|
/** |
|
* Similar to parseValue(), but raises a parse error if it encounters a |
|
* variable. The return type will be a constant value. |
|
*/ |
|
export declare function parseConstValue( |
|
source: string | Source, |
|
options?: ParseOptions | undefined, |
|
): ConstValueNode; |
|
/** |
|
* Given a string containing a GraphQL Type (ex. `[Int!]`), parse the AST for |
|
* that type. |
|
* Throws GraphQLError if a syntax error is encountered. |
|
* |
|
* This is useful within tools that operate upon GraphQL Types directly and |
|
* in isolation of complete GraphQL documents. |
|
* |
|
* Consider providing the results to the utility function: typeFromAST(). |
|
*/ |
|
export declare function parseType( |
|
source: string | Source, |
|
options?: ParseOptions | undefined, |
|
): TypeNode; |
|
/** |
|
* This class is exported only to assist people in implementing their own parsers |
|
* without duplicating too much code and should be used only as last resort for cases |
|
* such as experimental syntax or if certain features could not be contributed upstream. |
|
* |
|
* It is still part of the internal API and is versioned, so any changes to it are never |
|
* considered breaking changes. If you still need to support multiple versions of the |
|
* library, please use the `versionInfo` variable for version detection. |
|
* |
|
* @internal |
|
*/ |
|
export declare class Parser { |
|
protected _options: ParseOptions; |
|
protected _lexer: Lexer; |
|
protected _tokenCounter: number; |
|
constructor(source: string | Source, options?: ParseOptions); |
|
/** |
|
* Converts a name lex token into a name parse node. |
|
*/ |
|
parseName(): NameNode; |
|
/** |
|
* Document : Definition+ |
|
*/ |
|
parseDocument(): DocumentNode; |
|
/** |
|
* Definition : |
|
* - ExecutableDefinition |
|
* - TypeSystemDefinition |
|
* - TypeSystemExtension |
|
* |
|
* ExecutableDefinition : |
|
* - OperationDefinition |
|
* - FragmentDefinition |
|
* |
|
* TypeSystemDefinition : |
|
* - SchemaDefinition |
|
* - TypeDefinition |
|
* - DirectiveDefinition |
|
* |
|
* TypeDefinition : |
|
* - ScalarTypeDefinition |
|
* - ObjectTypeDefinition |
|
* - InterfaceTypeDefinition |
|
* - UnionTypeDefinition |
|
* - EnumTypeDefinition |
|
* - InputObjectTypeDefinition |
|
*/ |
|
parseDefinition(): DefinitionNode; |
|
/** |
|
* OperationDefinition : |
|
* - SelectionSet |
|
* - OperationType Name? VariableDefinitions? Directives? SelectionSet |
|
*/ |
|
parseOperationDefinition(): OperationDefinitionNode; |
|
/** |
|
* OperationType : one of query mutation subscription |
|
*/ |
|
parseOperationType(): OperationTypeNode; |
|
/** |
|
* VariableDefinitions : ( VariableDefinition+ ) |
|
*/ |
|
parseVariableDefinitions(): Array<VariableDefinitionNode>; |
|
/** |
|
* VariableDefinition : Variable : Type DefaultValue? Directives[Const]? |
|
*/ |
|
parseVariableDefinition(): VariableDefinitionNode; |
|
/** |
|
* Variable : $ Name |
|
*/ |
|
parseVariable(): VariableNode; |
|
/** |
|
* ``` |
|
* SelectionSet : { Selection+ } |
|
* ``` |
|
*/ |
|
parseSelectionSet(): SelectionSetNode; |
|
/** |
|
* Selection : |
|
* - Field |
|
* - FragmentSpread |
|
* - InlineFragment |
|
*/ |
|
parseSelection(): SelectionNode; |
|
/** |
|
* Field : Alias? Name Arguments? Directives? SelectionSet? |
|
* |
|
* Alias : Name : |
|
*/ |
|
parseField(): FieldNode; |
|
/** |
|
* Arguments[Const] : ( Argument[?Const]+ ) |
|
*/ |
|
parseArguments(isConst: true): Array<ConstArgumentNode>; |
|
parseArguments(isConst: boolean): Array<ArgumentNode>; |
|
/** |
|
* Argument[Const] : Name : Value[?Const] |
|
*/ |
|
parseArgument(isConst: true): ConstArgumentNode; |
|
parseArgument(isConst?: boolean): ArgumentNode; |
|
parseConstArgument(): ConstArgumentNode; |
|
/** |
|
* Corresponds to both FragmentSpread and InlineFragment in the spec. |
|
* |
|
* FragmentSpread : ... FragmentName Directives? |
|
* |
|
* InlineFragment : ... TypeCondition? Directives? SelectionSet |
|
*/ |
|
parseFragment(): FragmentSpreadNode | InlineFragmentNode; |
|
/** |
|
* FragmentDefinition : |
|
* - fragment FragmentName on TypeCondition Directives? SelectionSet |
|
* |
|
* TypeCondition : NamedType |
|
*/ |
|
parseFragmentDefinition(): FragmentDefinitionNode; |
|
/** |
|
* FragmentName : Name but not `on` |
|
*/ |
|
parseFragmentName(): NameNode; |
|
/** |
|
* Value[Const] : |
|
* - [~Const] Variable |
|
* - IntValue |
|
* - FloatValue |
|
* - StringValue |
|
* - BooleanValue |
|
* - NullValue |
|
* - EnumValue |
|
* - ListValue[?Const] |
|
* - ObjectValue[?Const] |
|
* |
|
* BooleanValue : one of `true` `false` |
|
* |
|
* NullValue : `null` |
|
* |
|
* EnumValue : Name but not `true`, `false` or `null` |
|
*/ |
|
parseValueLiteral(isConst: true): ConstValueNode; |
|
parseValueLiteral(isConst: boolean): ValueNode; |
|
parseConstValueLiteral(): ConstValueNode; |
|
parseStringLiteral(): StringValueNode; |
|
/** |
|
* ListValue[Const] : |
|
* - [ ] |
|
* - [ Value[?Const]+ ] |
|
*/ |
|
parseList(isConst: true): ConstListValueNode; |
|
parseList(isConst: boolean): ListValueNode; |
|
/** |
|
* ``` |
|
* ObjectValue[Const] : |
|
* - { } |
|
* - { ObjectField[?Const]+ } |
|
* ``` |
|
*/ |
|
parseObject(isConst: true): ConstObjectValueNode; |
|
parseObject(isConst: boolean): ObjectValueNode; |
|
/** |
|
* ObjectField[Const] : Name : Value[?Const] |
|
*/ |
|
parseObjectField(isConst: true): ConstObjectFieldNode; |
|
parseObjectField(isConst: boolean): ObjectFieldNode; |
|
/** |
|
* Directives[Const] : Directive[?Const]+ |
|
*/ |
|
parseDirectives(isConst: true): Array<ConstDirectiveNode>; |
|
parseDirectives(isConst: boolean): Array<DirectiveNode>; |
|
parseConstDirectives(): Array<ConstDirectiveNode>; |
|
/** |
|
* ``` |
|
* Directive[Const] : @ Name Arguments[?Const]? |
|
* ``` |
|
*/ |
|
parseDirective(isConst: true): ConstDirectiveNode; |
|
parseDirective(isConst: boolean): DirectiveNode; |
|
/** |
|
* Type : |
|
* - NamedType |
|
* - ListType |
|
* - NonNullType |
|
*/ |
|
parseTypeReference(): TypeNode; |
|
/** |
|
* NamedType : Name |
|
*/ |
|
parseNamedType(): NamedTypeNode; |
|
peekDescription(): boolean; |
|
/** |
|
* Description : StringValue |
|
*/ |
|
parseDescription(): undefined | StringValueNode; |
|
/** |
|
* ``` |
|
* SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ } |
|
* ``` |
|
*/ |
|
parseSchemaDefinition(): SchemaDefinitionNode; |
|
/** |
|
* OperationTypeDefinition : OperationType : NamedType |
|
*/ |
|
parseOperationTypeDefinition(): OperationTypeDefinitionNode; |
|
/** |
|
* ScalarTypeDefinition : Description? scalar Name Directives[Const]? |
|
*/ |
|
parseScalarTypeDefinition(): ScalarTypeDefinitionNode; |
|
/** |
|
* ObjectTypeDefinition : |
|
* Description? |
|
* type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition? |
|
*/ |
|
parseObjectTypeDefinition(): ObjectTypeDefinitionNode; |
|
/** |
|
* ImplementsInterfaces : |
|
* - implements `&`? NamedType |
|
* - ImplementsInterfaces & NamedType |
|
*/ |
|
parseImplementsInterfaces(): Array<NamedTypeNode>; |
|
/** |
|
* ``` |
|
* FieldsDefinition : { FieldDefinition+ } |
|
* ``` |
|
*/ |
|
parseFieldsDefinition(): Array<FieldDefinitionNode>; |
|
/** |
|
* FieldDefinition : |
|
* - Description? Name ArgumentsDefinition? : Type Directives[Const]? |
|
*/ |
|
parseFieldDefinition(): FieldDefinitionNode; |
|
/** |
|
* ArgumentsDefinition : ( InputValueDefinition+ ) |
|
*/ |
|
parseArgumentDefs(): Array<InputValueDefinitionNode>; |
|
/** |
|
* InputValueDefinition : |
|
* - Description? Name : Type DefaultValue? Directives[Const]? |
|
*/ |
|
parseInputValueDef(): InputValueDefinitionNode; |
|
/** |
|
* InterfaceTypeDefinition : |
|
* - Description? interface Name Directives[Const]? FieldsDefinition? |
|
*/ |
|
parseInterfaceTypeDefinition(): InterfaceTypeDefinitionNode; |
|
/** |
|
* UnionTypeDefinition : |
|
* - Description? union Name Directives[Const]? UnionMemberTypes? |
|
*/ |
|
parseUnionTypeDefinition(): UnionTypeDefinitionNode; |
|
/** |
|
* UnionMemberTypes : |
|
* - = `|`? NamedType |
|
* - UnionMemberTypes | NamedType |
|
*/ |
|
parseUnionMemberTypes(): Array<NamedTypeNode>; |
|
/** |
|
* EnumTypeDefinition : |
|
* - Description? enum Name Directives[Const]? EnumValuesDefinition? |
|
*/ |
|
parseEnumTypeDefinition(): EnumTypeDefinitionNode; |
|
/** |
|
* ``` |
|
* EnumValuesDefinition : { EnumValueDefinition+ } |
|
* ``` |
|
*/ |
|
parseEnumValuesDefinition(): Array<EnumValueDefinitionNode>; |
|
/** |
|
* EnumValueDefinition : Description? EnumValue Directives[Const]? |
|
*/ |
|
parseEnumValueDefinition(): EnumValueDefinitionNode; |
|
/** |
|
* EnumValue : Name but not `true`, `false` or `null` |
|
*/ |
|
parseEnumValueName(): NameNode; |
|
/** |
|
* InputObjectTypeDefinition : |
|
* - Description? input Name Directives[Const]? InputFieldsDefinition? |
|
*/ |
|
parseInputObjectTypeDefinition(): InputObjectTypeDefinitionNode; |
|
/** |
|
* ``` |
|
* InputFieldsDefinition : { InputValueDefinition+ } |
|
* ``` |
|
*/ |
|
parseInputFieldsDefinition(): Array<InputValueDefinitionNode>; |
|
/** |
|
* TypeSystemExtension : |
|
* - SchemaExtension |
|
* - TypeExtension |
|
* |
|
* TypeExtension : |
|
* - ScalarTypeExtension |
|
* - ObjectTypeExtension |
|
* - InterfaceTypeExtension |
|
* - UnionTypeExtension |
|
* - EnumTypeExtension |
|
* - InputObjectTypeDefinition |
|
*/ |
|
parseTypeSystemExtension(): TypeSystemExtensionNode; |
|
/** |
|
* ``` |
|
* SchemaExtension : |
|
* - extend schema Directives[Const]? { OperationTypeDefinition+ } |
|
* - extend schema Directives[Const] |
|
* ``` |
|
*/ |
|
parseSchemaExtension(): SchemaExtensionNode; |
|
/** |
|
* ScalarTypeExtension : |
|
* - extend scalar Name Directives[Const] |
|
*/ |
|
parseScalarTypeExtension(): ScalarTypeExtensionNode; |
|
/** |
|
* ObjectTypeExtension : |
|
* - extend type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition |
|
* - extend type Name ImplementsInterfaces? Directives[Const] |
|
* - extend type Name ImplementsInterfaces |
|
*/ |
|
parseObjectTypeExtension(): ObjectTypeExtensionNode; |
|
/** |
|
* InterfaceTypeExtension : |
|
* - extend interface Name ImplementsInterfaces? Directives[Const]? FieldsDefinition |
|
* - extend interface Name ImplementsInterfaces? Directives[Const] |
|
* - extend interface Name ImplementsInterfaces |
|
*/ |
|
parseInterfaceTypeExtension(): InterfaceTypeExtensionNode; |
|
/** |
|
* UnionTypeExtension : |
|
* - extend union Name Directives[Const]? UnionMemberTypes |
|
* - extend union Name Directives[Const] |
|
*/ |
|
parseUnionTypeExtension(): UnionTypeExtensionNode; |
|
/** |
|
* EnumTypeExtension : |
|
* - extend enum Name Directives[Const]? EnumValuesDefinition |
|
* - extend enum Name Directives[Const] |
|
*/ |
|
parseEnumTypeExtension(): EnumTypeExtensionNode; |
|
/** |
|
* InputObjectTypeExtension : |
|
* - extend input Name Directives[Const]? InputFieldsDefinition |
|
* - extend input Name Directives[Const] |
|
*/ |
|
parseInputObjectTypeExtension(): InputObjectTypeExtensionNode; |
|
/** |
|
* ``` |
|
* DirectiveDefinition : |
|
* - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations |
|
* ``` |
|
*/ |
|
parseDirectiveDefinition(): DirectiveDefinitionNode; |
|
/** |
|
* DirectiveLocations : |
|
* - `|`? DirectiveLocation |
|
* - DirectiveLocations | DirectiveLocation |
|
*/ |
|
parseDirectiveLocations(): Array<NameNode>; |
|
parseDirectiveLocation(): NameNode; |
|
/** |
|
* Returns a node that, if configured to do so, sets a "loc" field as a |
|
* location object, used to identify the place in the source that created a |
|
* given parsed object. |
|
*/ |
|
node< |
|
T extends { |
|
loc?: Location; |
|
}, |
|
>(startToken: Token, node: T): T; |
|
/** |
|
* Determines if the next token is of a given kind |
|
*/ |
|
peek(kind: TokenKind): boolean; |
|
/** |
|
* If the next token is of the given kind, return that token after advancing the lexer. |
|
* Otherwise, do not change the parser state and throw an error. |
|
*/ |
|
expectToken(kind: TokenKind): Token; |
|
/** |
|
* If the next token is of the given kind, return "true" after advancing the lexer. |
|
* Otherwise, do not change the parser state and return "false". |
|
*/ |
|
expectOptionalToken(kind: TokenKind): boolean; |
|
/** |
|
* If the next token is a given keyword, advance the lexer. |
|
* Otherwise, do not change the parser state and throw an error. |
|
*/ |
|
expectKeyword(value: string): void; |
|
/** |
|
* If the next token is a given keyword, return "true" after advancing the lexer. |
|
* Otherwise, do not change the parser state and return "false". |
|
*/ |
|
expectOptionalKeyword(value: string): boolean; |
|
/** |
|
* Helper function for creating an error when an unexpected lexed token is encountered. |
|
*/ |
|
unexpected(atToken?: Maybe<Token>): GraphQLError; |
|
/** |
|
* Returns a possibly empty list of parse nodes, determined by the parseFn. |
|
* This list begins with a lex token of openKind and ends with a lex token of closeKind. |
|
* Advances the parser to the next lex token after the closing token. |
|
*/ |
|
any<T>(openKind: TokenKind, parseFn: () => T, closeKind: TokenKind): Array<T>; |
|
/** |
|
* Returns a list of parse nodes, determined by the parseFn. |
|
* It can be empty only if open token is missing otherwise it will always return non-empty list |
|
* that begins with a lex token of openKind and ends with a lex token of closeKind. |
|
* Advances the parser to the next lex token after the closing token. |
|
*/ |
|
optionalMany<T>( |
|
openKind: TokenKind, |
|
parseFn: () => T, |
|
closeKind: TokenKind, |
|
): Array<T>; |
|
/** |
|
* Returns a non-empty list of parse nodes, determined by the parseFn. |
|
* This list begins with a lex token of openKind and ends with a lex token of closeKind. |
|
* Advances the parser to the next lex token after the closing token. |
|
*/ |
|
many<T>( |
|
openKind: TokenKind, |
|
parseFn: () => T, |
|
closeKind: TokenKind, |
|
): Array<T>; |
|
/** |
|
* Returns a non-empty list of parse nodes, determined by the parseFn. |
|
* This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind. |
|
* Advances the parser to the next lex token after last item in the list. |
|
*/ |
|
delimitedMany<T>(delimiterKind: TokenKind, parseFn: () => T): Array<T>; |
|
advanceLexer(): void; |
|
}
|
|
|