@@ -52,7 +52,8 @@ import type {
5252 EnumTypeDefinitionNode ,
5353 EnumValueDefinitionNode ,
5454 InputObjectTypeDefinitionNode ,
55- TypeExtensionNode ,
55+ TypeSystemExtensionNode ,
56+ SchemaExtensionNode ,
5657 ScalarTypeExtensionNode ,
5758 ObjectTypeExtensionNode ,
5859 InterfaceTypeExtensionNode ,
@@ -751,9 +752,9 @@ export function parseNamedType(lexer: Lexer<*>): NamedTypeNode {
751752
752753/**
753754 * TypeSystemDefinition :
755+ * - TypeSystemExtension
754756 * - SchemaDefinition
755757 * - TypeDefinition
756- * - TypeExtension
757758 * - DirectiveDefinition
758759 *
759760 * TypeDefinition :
@@ -785,7 +786,7 @@ function parseTypeSystemDefinition(lexer: Lexer<*>): TypeSystemDefinitionNode {
785786 case 'input' :
786787 return parseInputObjectTypeDefinition ( lexer ) ;
787788 case 'extend' :
788- return parseTypeExtension ( lexer ) ;
789+ return parseTypeSystemExtension ( lexer ) ;
789790 case 'directive' :
790791 return parseDirectiveDefinition ( lexer ) ;
791792 }
@@ -1141,6 +1142,10 @@ function parseInputFieldsDefinition(
11411142}
11421143
11431144/**
1145+ * TypeSystemExtension :
1146+ * - SchemaExtension
1147+ * - TypeExtension
1148+ *
11441149 * TypeExtension :
11451150 * - ScalarTypeExtension
11461151 * - ObjectTypeExtension
@@ -1149,11 +1154,13 @@ function parseInputFieldsDefinition(
11491154 * - EnumTypeExtension
11501155 * - InputObjectTypeDefinition
11511156 */
1152- function parseTypeExtension ( lexer : Lexer < * > ) : TypeExtensionNode {
1157+ function parseTypeSystemExtension ( lexer : Lexer < * > ) : TypeSystemExtensionNode {
11531158 const keywordToken = lexer . lookahead ( ) ;
11541159
11551160 if ( keywordToken . kind === TokenKind . NAME ) {
11561161 switch ( keywordToken . value ) {
1162+ case 'schema' :
1163+ return parseSchemaExtension ( lexer ) ;
11571164 case 'scalar' :
11581165 return parseScalarTypeExtension ( lexer ) ;
11591166 case 'type' :
@@ -1172,6 +1179,35 @@ function parseTypeExtension(lexer: Lexer<*>): TypeExtensionNode {
11721179 throw unexpected ( lexer , keywordToken ) ;
11731180}
11741181
1182+ /**
1183+ * SchemaExtension :
1184+ * - extend schema Directives[Const]? { OperationTypeDefinition+ }
1185+ * - extend schema Directives[Const]
1186+ */
1187+ function parseSchemaExtension ( lexer : Lexer < * > ) : SchemaExtensionNode {
1188+ const start = lexer . token ;
1189+ expectKeyword ( lexer , 'extend' ) ;
1190+ expectKeyword ( lexer , 'schema' ) ;
1191+ const directives = parseDirectives ( lexer , true ) ;
1192+ const operationTypes = peek ( lexer , TokenKind . BRACE_L )
1193+ ? many (
1194+ lexer ,
1195+ TokenKind . BRACE_L ,
1196+ parseOperationTypeDefinition ,
1197+ TokenKind . BRACE_R ,
1198+ )
1199+ : [ ] ;
1200+ if ( directives . length === 0 && operationTypes . length === 0 ) {
1201+ throw unexpected ( lexer ) ;
1202+ }
1203+ return {
1204+ kind : Kind . SCHEMA_EXTENSION ,
1205+ directives,
1206+ operationTypes,
1207+ loc : loc ( lexer , start ) ,
1208+ } ;
1209+ }
1210+
11751211/**
11761212 * ScalarTypeExtension :
11771213 * - extend scalar Name Directives[Const]
0 commit comments