@@ -19,6 +19,7 @@ import type {
1919 Document ,
2020 Definition ,
2121 OperationDefinition ,
22+ OperationType ,
2223 VariableDefinition ,
2324 SelectionSet ,
2425 Selection ,
@@ -41,6 +42,9 @@ import type {
4142
4243 TypeSystemDefinition ,
4344
45+ SchemaDefinition ,
46+ OperationTypeDefinition ,
47+
4448 ScalarTypeDefinition ,
4549 ObjectTypeDefinition ,
4650 FieldDefinition ,
@@ -86,6 +90,9 @@ import {
8690 LIST_TYPE ,
8791 NON_NULL_TYPE ,
8892
93+ SCHEMA_DEFINITION ,
94+ OPERATION_TYPE_DEFINITION ,
95+
8996 SCALAR_TYPE_DEFINITION ,
9097 OBJECT_TYPE_DEFINITION ,
9198 FIELD_DEFINITION ,
@@ -203,6 +210,7 @@ function parseDefinition(parser: Parser): Definition {
203210 case 'fragment' : return parseFragmentDefinition ( parser ) ;
204211
205212 // Note: the Type System IDL is an experimental non-spec addition.
213+ case 'schema' :
206214 case 'scalar' :
207215 case 'type' :
208216 case 'interface' :
@@ -224,8 +232,6 @@ function parseDefinition(parser: Parser): Definition {
224232 * OperationDefinition :
225233 * - SelectionSet
226234 * - OperationType Name? VariableDefinitions? Directives? SelectionSet
227- *
228- * OperationType : one of query mutation
229235 */
230236function parseOperationDefinition ( parser : Parser ) : OperationDefinition {
231237 const start = parser . token . start ;
@@ -240,12 +246,7 @@ function parseOperationDefinition(parser: Parser): OperationDefinition {
240246 loc : loc ( parser , start )
241247 } ;
242248 }
243- const operationToken = expect ( parser , TokenKind . NAME ) ;
244- const operation =
245- operationToken . value === 'mutation' ? 'mutation' :
246- operationToken . value === 'subscription' ? 'subscription' :
247- operationToken . value === 'query' ? 'query' :
248- ( ( ) => { throw unexpected ( parser , operationToken ) ; } ) ( ) ;
249+ const operation = parseOperationType ( parser ) ;
249250 let name ;
250251 if ( peek ( parser , TokenKind . NAME ) ) {
251252 name = parseName ( parser ) ;
@@ -261,6 +262,21 @@ function parseOperationDefinition(parser: Parser): OperationDefinition {
261262 } ;
262263}
263264
265+ /**
266+ * OperationType : one of query mutation subscription
267+ */
268+ function parseOperationType ( parser : Parser ) : OperationType {
269+ const operationToken = expect ( parser , TokenKind . NAME ) ;
270+ switch ( operationToken . value ) {
271+ case 'query' : return 'query' ;
272+ case 'mutation' : return 'mutation' ;
273+ // Note: subscription is an experimental non-spec addition.
274+ case 'subscription' : return 'subscription' ;
275+ }
276+
277+ throw unexpected ( parser , operationToken ) ;
278+ }
279+
264280/**
265281 * VariableDefinitions : ( VariableDefinition+ )
266282 */
@@ -666,6 +682,7 @@ export function parseNamedType(parser: Parser): NamedType {
666682function parseTypeSystemDefinition ( parser : Parser ) : TypeSystemDefinition {
667683 if ( peek ( parser , TokenKind . NAME ) ) {
668684 switch ( parser . token . value ) {
685+ case 'schema' : return parseSchemaDefinition ( parser ) ;
669686 case 'scalar' : return parseScalarTypeDefinition ( parser ) ;
670687 case 'type' : return parseObjectTypeDefinition ( parser ) ;
671688 case 'interface' : return parseInterfaceTypeDefinition ( parser ) ;
@@ -680,6 +697,40 @@ function parseTypeSystemDefinition(parser: Parser): TypeSystemDefinition {
680697 throw unexpected ( parser ) ;
681698}
682699
700+ /**
701+ * SchemaDefinition : schema { OperationTypeDefinition+ }
702+ *
703+ * OperationTypeDefinition : OperationType : NamedType
704+ */
705+ function parseSchemaDefinition ( parser : Parser ) : SchemaDefinition {
706+ const start = parser . token . start ;
707+ expectKeyword ( parser , 'schema' ) ;
708+ const operationTypes = many (
709+ parser ,
710+ TokenKind . BRACE_L ,
711+ parseOperationTypeDefinition ,
712+ TokenKind . BRACE_R
713+ ) ;
714+ return {
715+ kind : SCHEMA_DEFINITION ,
716+ operationTypes,
717+ loc : loc ( parser , start ) ,
718+ } ;
719+ }
720+
721+ function parseOperationTypeDefinition ( parser : Parser ) : OperationTypeDefinition {
722+ const start = parser . token . start ;
723+ const operation = parseOperationType ( parser ) ;
724+ expect ( parser , TokenKind . COLON ) ;
725+ const type = parseNamedType ( parser ) ;
726+ return {
727+ kind : OPERATION_TYPE_DEFINITION ,
728+ operation,
729+ type,
730+ loc : loc ( parser , start ) ,
731+ } ;
732+ }
733+
683734/**
684735 * ScalarTypeDefinition : scalar Name
685736 */
0 commit comments