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.
208 lines
5.0 KiB
208 lines
5.0 KiB
/** |
|
* 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. |
|
*/ |
|
|
|
/** |
|
* The character offset at which this Node ends. |
|
*/ |
|
|
|
/** |
|
* The Token at which this Node begins. |
|
*/ |
|
|
|
/** |
|
* The Token at which this Node ends. |
|
*/ |
|
|
|
/** |
|
* The Source document the AST represents. |
|
*/ |
|
constructor(startToken, endToken, source) { |
|
this.start = startToken.start; |
|
this.end = endToken.end; |
|
this.startToken = startToken; |
|
this.endToken = endToken; |
|
this.source = source; |
|
} |
|
|
|
get [Symbol.toStringTag]() { |
|
return 'Location'; |
|
} |
|
|
|
toJSON() { |
|
return { |
|
start: this.start, |
|
end: this.end, |
|
}; |
|
} |
|
} |
|
/** |
|
* Represents a range of characters represented by a lexical token |
|
* within a Source. |
|
*/ |
|
|
|
export class Token { |
|
/** |
|
* The kind of Token. |
|
*/ |
|
|
|
/** |
|
* The character offset at which this Node begins. |
|
*/ |
|
|
|
/** |
|
* The character offset at which this Node ends. |
|
*/ |
|
|
|
/** |
|
* The 1-indexed line number on which this Token appears. |
|
*/ |
|
|
|
/** |
|
* The 1-indexed column number at which this Token begins. |
|
*/ |
|
|
|
/** |
|
* For non-punctuation tokens, represents the interpreted value of the token. |
|
* |
|
* Note: is undefined for punctuation tokens, but typed as string for |
|
* convenience in the parser. |
|
*/ |
|
|
|
/** |
|
* Tokens exist as nodes in a double-linked-list amongst all tokens |
|
* including ignored tokens. <SOF> is always the first node and <EOF> |
|
* the last. |
|
*/ |
|
constructor(kind, start, end, line, column, value) { |
|
this.kind = kind; |
|
this.start = start; |
|
this.end = end; |
|
this.line = line; |
|
this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion |
|
|
|
this.value = value; |
|
this.prev = null; |
|
this.next = null; |
|
} |
|
|
|
get [Symbol.toStringTag]() { |
|
return 'Token'; |
|
} |
|
|
|
toJSON() { |
|
return { |
|
kind: this.kind, |
|
value: this.value, |
|
line: this.line, |
|
column: this.column, |
|
}; |
|
} |
|
} |
|
/** |
|
* The list of all possible AST node types. |
|
*/ |
|
|
|
/** |
|
* @internal |
|
*/ |
|
export const QueryDocumentKeys = { |
|
Name: [], |
|
Document: ['definitions'], |
|
OperationDefinition: [ |
|
'name', |
|
'variableDefinitions', |
|
'directives', |
|
'selectionSet', |
|
], |
|
VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], |
|
Variable: ['name'], |
|
SelectionSet: ['selections'], |
|
Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], |
|
Argument: ['name', 'value'], |
|
FragmentSpread: ['name', 'directives'], |
|
InlineFragment: ['typeCondition', 'directives', 'selectionSet'], |
|
FragmentDefinition: [ |
|
'name', // Note: fragment variable definitions are deprecated and will removed in v17.0.0 |
|
'variableDefinitions', |
|
'typeCondition', |
|
'directives', |
|
'selectionSet', |
|
], |
|
IntValue: [], |
|
FloatValue: [], |
|
StringValue: [], |
|
BooleanValue: [], |
|
NullValue: [], |
|
EnumValue: [], |
|
ListValue: ['values'], |
|
ObjectValue: ['fields'], |
|
ObjectField: ['name', 'value'], |
|
Directive: ['name', 'arguments'], |
|
NamedType: ['name'], |
|
ListType: ['type'], |
|
NonNullType: ['type'], |
|
SchemaDefinition: ['description', 'directives', 'operationTypes'], |
|
OperationTypeDefinition: ['type'], |
|
ScalarTypeDefinition: ['description', 'name', 'directives'], |
|
ObjectTypeDefinition: [ |
|
'description', |
|
'name', |
|
'interfaces', |
|
'directives', |
|
'fields', |
|
], |
|
FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'], |
|
InputValueDefinition: [ |
|
'description', |
|
'name', |
|
'type', |
|
'defaultValue', |
|
'directives', |
|
], |
|
InterfaceTypeDefinition: [ |
|
'description', |
|
'name', |
|
'interfaces', |
|
'directives', |
|
'fields', |
|
], |
|
UnionTypeDefinition: ['description', 'name', 'directives', 'types'], |
|
EnumTypeDefinition: ['description', 'name', 'directives', 'values'], |
|
EnumValueDefinition: ['description', 'name', 'directives'], |
|
InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'], |
|
DirectiveDefinition: ['description', 'name', 'arguments', 'locations'], |
|
SchemaExtension: ['directives', 'operationTypes'], |
|
ScalarTypeExtension: ['name', 'directives'], |
|
ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'], |
|
InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'], |
|
UnionTypeExtension: ['name', 'directives', 'types'], |
|
EnumTypeExtension: ['name', 'directives', 'values'], |
|
InputObjectTypeExtension: ['name', 'directives', 'fields'], |
|
}; |
|
const kindValues = new Set(Object.keys(QueryDocumentKeys)); |
|
/** |
|
* @internal |
|
*/ |
|
|
|
export function isNode(maybeNode) { |
|
const maybeKind = |
|
maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind; |
|
return typeof maybeKind === 'string' && kindValues.has(maybeKind); |
|
} |
|
/** Name */ |
|
|
|
var OperationTypeNode; |
|
|
|
(function (OperationTypeNode) { |
|
OperationTypeNode['QUERY'] = 'query'; |
|
OperationTypeNode['MUTATION'] = 'mutation'; |
|
OperationTypeNode['SUBSCRIPTION'] = 'subscription'; |
|
})(OperationTypeNode || (OperationTypeNode = {})); |
|
|
|
export { OperationTypeNode };
|
|
|