lib/graphql/schema/build_from_definition.rb in graphql-1.10.14 vs lib/graphql/schema/build_from_definition.rb in graphql-1.11.0
- old
+ new
@@ -41,13 +41,11 @@
when GraphQL::Language::Nodes::SchemaDefinition
nil # already handled
when GraphQL::Language::Nodes::EnumTypeDefinition
types[definition.name] = build_enum_type(definition, type_resolver)
when GraphQL::Language::Nodes::ObjectTypeDefinition
- is_subscription_root = (definition.name == "Subscription" && (schema_definition.nil? || schema_definition.subscription.nil?)) || (schema_definition && (definition.name == schema_definition.subscription))
- should_extend_subscription_root = is_subscription_root && interpreter
- types[definition.name] = build_object_type(definition, type_resolver, default_resolve: default_resolve, extend_subscription_root: should_extend_subscription_root)
+ types[definition.name] = build_object_type(definition, type_resolver, default_resolve: default_resolve)
when GraphQL::Language::Nodes::InterfaceTypeDefinition
types[definition.name] = build_interface_type(definition, type_resolver)
when GraphQL::Language::Nodes::UnionTypeDefinition
types[definition.name] = build_union_type(definition, type_resolver)
when GraphQL::Language::Nodes::ScalarTypeDefinition
@@ -202,24 +200,20 @@
possible_types(*union_type_definition.types.map { |type_name| type_resolver.call(type_name) })
ast_node(union_type_definition)
end
end
- def build_object_type(object_type_definition, type_resolver, default_resolve:, extend_subscription_root:)
+ def build_object_type(object_type_definition, type_resolver, default_resolve:)
builder = self
type_def = nil
typed_resolve_fn = ->(field, obj, args, ctx) { default_resolve.call(type_def, field, obj, args, ctx) }
Class.new(GraphQL::Schema::Object) do
type_def = self
graphql_name(object_type_definition.name)
description(object_type_definition.description)
ast_node(object_type_definition)
- if extend_subscription_root
- # This has to come before `field ...` configurations since it modifies them
- extend Subscriptions::SubscriptionRoot
- end
object_type_definition.interfaces.each do |interface_name|
interface_defn = type_resolver.call(interface_name)
implements(interface_defn)
end
@@ -301,11 +295,11 @@
def build_fields(owner, field_definitions, type_resolver, default_resolve:)
builder = self
field_definitions.map do |field_definition|
type_name = resolve_type_name(field_definition.type)
-
+ resolve_method_name = "resolve_field_#{field_definition.name}"
owner.field(
field_definition.name,
description: field_definition.description,
type: type_resolver.call(field_definition.type),
null: true,
@@ -313,17 +307,18 @@
connection_extension: nil,
deprecation_reason: build_deprecation_reason(field_definition.directives),
ast_node: field_definition,
method_conflict_warning: false,
camelize: false,
+ resolver_method: resolve_method_name,
) do
builder.build_arguments(self, field_definition.arguments, type_resolver)
# Don't do this for interfaces
if default_resolve
- # TODO fragile hack. formalize this API?
- define_singleton_method :resolve_field_method do |obj, args, ctx|
- default_resolve.call(self, obj.object, args, ctx)
+ owner.send(:define_method, resolve_method_name) do |**args|
+ field_instance = self.class.get_field(field_definition.name)
+ default_resolve.call(field_instance, object, args, context)
end
end
end
end
end