@@ -86,7 +86,13 @@ def build(schema_superclass, document, default_resolve:, using: {}, base_types:
86
86
case definition
87
87
when GraphQL ::Language ::Nodes ::SchemaDefinition , GraphQL ::Language ::Nodes ::DirectiveDefinition
88
88
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
90
96
schema_extensions ||= [ ]
91
97
schema_extensions << definition
92
98
else
@@ -133,6 +139,34 @@ def build(schema_superclass, document, default_resolve:, using: {}, base_types:
133
139
134
140
raise InvalidDocumentError . new ( 'Must provide schema definition with query type or a type named Query.' ) unless query_root_type
135
141
142
+ schema_extensions &.each do |ext |
143
+ next if ext . is_a? ( GraphQL ::Language ::Nodes ::SchemaExtension )
144
+
145
+ built_type = types [ ext . name ]
146
+
147
+ case ext
148
+ when GraphQL ::Language ::Nodes ::ScalarTypeExtension
149
+ build_directives ( built_type , ext , type_resolver )
150
+ when GraphQL ::Language ::Nodes ::ObjectTypeExtension
151
+ build_directives ( built_type , ext , type_resolver )
152
+ build_fields ( built_type , ext . fields , type_resolver , default_resolve : true )
153
+ build_interfaces ( built_type , ext . interfaces , type_resolver )
154
+ when GraphQL ::Language ::Nodes ::InterfaceTypeExtension
155
+ build_directives ( built_type , ext , type_resolver )
156
+ build_fields ( built_type , ext . fields , type_resolver , default_resolve : nil )
157
+ build_interfaces ( built_type , ext . interfaces , type_resolver )
158
+ when GraphQL ::Language ::Nodes ::UnionTypeExtension
159
+ build_directives ( built_type , ext , type_resolver )
160
+ built_type . possible_types ( *ext . types . map { |type_name | type_resolver . call ( type_name ) } )
161
+ when GraphQL ::Language ::Nodes ::EnumTypeExtension
162
+ build_directives ( built_type , ext , type_resolver )
163
+ build_values ( built_type , ext . values , type_resolver )
164
+ when GraphQL ::Language ::Nodes ::InputObjectTypeExtension
165
+ build_directives ( built_type , ext , type_resolver )
166
+ build_arguments ( built_type , ext . fields , type_resolver )
167
+ end
168
+ end
169
+
136
170
builder = self
137
171
138
172
found_types = types . values
@@ -201,8 +235,8 @@ def self.inherited(child_class)
201
235
end
202
236
end
203
237
204
- if schema_extensions
205
- schema_extensions . each do | ext |
238
+ schema_extensions &. each do | ext |
239
+ if ext . is_a? ( GraphQL :: Language :: Nodes :: SchemaExtension )
206
240
build_directives ( schema_class , ext , type_resolver )
207
241
end
208
242
end
@@ -300,15 +334,19 @@ def build_enum_type(enum_type_definition, type_resolver, base_type)
300
334
builder . build_directives ( self , enum_type_definition , type_resolver )
301
335
description ( enum_type_definition . description )
302
336
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
337
+ builder . build_values ( self , enum_type_definition . values , type_resolver )
338
+ end
339
+ end
340
+
341
+ def build_values ( type_class , enum_value_definitions , type_resolver )
342
+ enum_value_definitions . each do |enum_value_definition |
343
+ type_class . value ( enum_value_definition . name ,
344
+ value : enum_value_definition . name ,
345
+ deprecation_reason : build_deprecation_reason ( enum_value_definition . directives ) ,
346
+ description : enum_value_definition . description ,
347
+ directives : prepare_directives ( enum_value_definition , type_resolver ) ,
348
+ ast_node : enum_value_definition ,
349
+ )
312
350
end
313
351
end
314
352
@@ -364,16 +402,17 @@ def build_object_type(object_type_definition, type_resolver, base_type)
364
402
description ( object_type_definition . description )
365
403
ast_node ( object_type_definition )
366
404
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
-
405
+ builder . build_interfaces ( self , object_type_definition . interfaces , type_resolver )
373
406
builder . build_fields ( self , object_type_definition . fields , type_resolver , default_resolve : true )
374
407
end
375
408
end
376
409
410
+ def build_interfaces ( type_class , interface_names , type_resolver )
411
+ interface_names . each do |interface_name |
412
+ type_class . implements ( type_resolver . call ( interface_name ) )
413
+ end
414
+ end
415
+
377
416
def build_input_object_type ( input_object_type_definition , type_resolver , base_type )
378
417
builder = self
379
418
Class . new ( base_type ) do
@@ -442,10 +481,7 @@ def build_interface_type(interface_type_definition, type_resolver, base_type)
442
481
include base_type
443
482
graphql_name ( interface_type_definition . name )
444
483
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
484
+ builder . build_interfaces ( self , interface_type_definition . interfaces , type_resolver )
449
485
ast_node ( interface_type_definition )
450
486
builder . build_directives ( self , interface_type_definition , type_resolver )
451
487
0 commit comments