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