@@ -86,7 +86,13 @@ def build(schema_superclass, document, default_resolve:, using: {}, base_types:
8686 case definition
8787 when GraphQL ::Language ::Nodes ::SchemaDefinition , GraphQL ::Language ::Nodes ::DirectiveDefinition
8888 nil # already handled
89- when GraphQL ::Language ::Nodes ::SchemaExtension
89+ when GraphQL ::Language ::Nodes ::SchemaExtension ,
90+ GraphQL ::Language ::Nodes ::ScalarTypeExtension ,
91+ GraphQL ::Language ::Nodes ::ObjectTypeExtension ,
92+ GraphQL ::Language ::Nodes ::InterfaceTypeExtension ,
93+ GraphQL ::Language ::Nodes ::UnionTypeExtension ,
94+ GraphQL ::Language ::Nodes ::EnumTypeExtension ,
95+ GraphQL ::Language ::Nodes ::InputObjectTypeExtension
9096 schema_extensions ||= [ ]
9197 schema_extensions << definition
9298 else
@@ -203,7 +209,34 @@ def self.inherited(child_class)
203209
204210 if schema_extensions
205211 schema_extensions . each do |ext |
206- build_directives ( schema_class , ext , type_resolver )
212+ case ext
213+ when GraphQL ::Language ::Nodes ::SchemaExtension
214+ build_directives ( schema_class , ext , type_resolver )
215+ when GraphQL ::Language ::Nodes ::ScalarTypeExtension
216+ build_directives ( schema_class . get_type ( ext . name ) , ext , type_resolver )
217+ when GraphQL ::Language ::Nodes ::ObjectTypeExtension
218+ object_type = schema_class . get_type ( ext . name )
219+ build_directives ( object_type , ext , type_resolver )
220+ build_fields ( object_type , ext . fields , type_resolver , default_resolve : true )
221+ build_interfaces ( object_type , ext . interfaces , type_resolver )
222+ when GraphQL ::Language ::Nodes ::InterfaceTypeExtension
223+ interface_type = schema_class . get_type ( ext . name )
224+ build_directives ( interface_type , ext , type_resolver )
225+ build_fields ( interface_type , ext . fields , type_resolver , default_resolve : nil )
226+ build_interfaces ( interface_type , ext . interfaces , type_resolver )
227+ when GraphQL ::Language ::Nodes ::UnionTypeExtension
228+ union_type = schema_class . get_type ( ext . name )
229+ build_directives ( union_type , ext , type_resolver )
230+ union_type . possible_types ( *ext . types . map { |type_name | type_resolver . call ( type_name ) } )
231+ when GraphQL ::Language ::Nodes ::EnumTypeExtension
232+ enum_type = schema_class . get_type ( ext . name )
233+ build_directives ( enum_type , ext , type_resolver )
234+ build_values ( enum_type , ext . values , type_resolver )
235+ when GraphQL ::Language ::Nodes ::InputObjectTypeExtension
236+ input_object_type = schema_class . get_type ( ext . name )
237+ build_directives ( input_object_type , ext , type_resolver )
238+ build_arguments ( input_object_type , ext . fields , type_resolver )
239+ end
207240 end
208241 end
209242
@@ -300,15 +333,19 @@ def build_enum_type(enum_type_definition, type_resolver, base_type)
300333 builder . build_directives ( self , enum_type_definition , type_resolver )
301334 description ( enum_type_definition . description )
302335 ast_node ( enum_type_definition )
303- enum_type_definition . values . each do |enum_value_definition |
304- value ( enum_value_definition . name ,
305- value : enum_value_definition . name ,
306- deprecation_reason : builder . build_deprecation_reason ( enum_value_definition . directives ) ,
307- description : enum_value_definition . description ,
308- directives : builder . prepare_directives ( enum_value_definition , type_resolver ) ,
309- ast_node : enum_value_definition ,
310- )
311- end
336+ builder . build_values ( self , enum_type_definition . values , type_resolver )
337+ end
338+ end
339+
340+ def build_values ( type_class , enum_value_definitions , type_resolver )
341+ enum_value_definitions . each do |enum_value_definition |
342+ type_class . value ( enum_value_definition . name ,
343+ value : enum_value_definition . name ,
344+ deprecation_reason : build_deprecation_reason ( enum_value_definition . directives ) ,
345+ description : enum_value_definition . description ,
346+ directives : prepare_directives ( enum_value_definition , type_resolver ) ,
347+ ast_node : enum_value_definition ,
348+ )
312349 end
313350 end
314351
@@ -364,16 +401,17 @@ def build_object_type(object_type_definition, type_resolver, base_type)
364401 description ( object_type_definition . description )
365402 ast_node ( object_type_definition )
366403 builder . build_directives ( self , object_type_definition , type_resolver )
367-
368- object_type_definition . interfaces . each do |interface_name |
369- interface_defn = type_resolver . call ( interface_name )
370- implements ( interface_defn )
371- end
372-
404+ builder . build_interfaces ( self , object_type_definition . interfaces , type_resolver )
373405 builder . build_fields ( self , object_type_definition . fields , type_resolver , default_resolve : true )
374406 end
375407 end
376408
409+ def build_interfaces ( type_class , interface_names , type_resolver )
410+ interface_names . each do |interface_name |
411+ type_class . implements ( type_resolver . call ( interface_name ) )
412+ end
413+ end
414+
377415 def build_input_object_type ( input_object_type_definition , type_resolver , base_type )
378416 builder = self
379417 Class . new ( base_type ) do
@@ -442,10 +480,7 @@ def build_interface_type(interface_type_definition, type_resolver, base_type)
442480 include base_type
443481 graphql_name ( interface_type_definition . name )
444482 description ( interface_type_definition . description )
445- interface_type_definition . interfaces . each do |interface_name |
446- interface_defn = type_resolver . call ( interface_name )
447- implements ( interface_defn )
448- end
483+ builder . build_interfaces ( self , interface_type_definition . interfaces , type_resolver )
449484 ast_node ( interface_type_definition )
450485 builder . build_directives ( self , interface_type_definition , type_resolver )
451486
0 commit comments