diff --git a/lib/graphql/language/document_from_schema_definition.rb b/lib/graphql/language/document_from_schema_definition.rb index ff00c71605..eba810612f 100644 --- a/lib/graphql/language/document_from_schema_definition.rb +++ b/lib/graphql/language/document_from_schema_definition.rb @@ -346,10 +346,11 @@ def directives(member) end def definition_directives(member, directives_method) - dirs = if !member.respond_to?(directives_method) || member.directives.empty? + if !member.respond_to?(directives_method) || member.directives.empty? EmptyObjects::EMPTY_ARRAY else - member.public_send(directives_method).map do |dir| + visible_directives = member.public_send(directives_method).select { |dir| @types.directive_exists?(dir.graphql_name) } + visible_directives.map! do |dir| args = [] dir.arguments.argument_values.each_value do |arg_value| # rubocop:disable Development/ContextIsPassedCop -- directive instance method arg_defn = arg_value.definition @@ -373,9 +374,9 @@ def definition_directives(member, directives_method) arguments: args ) end - end - dirs + visible_directives + end end attr_reader :schema, :always_include_schema, diff --git a/spec/graphql/schema/printer_spec.rb b/spec/graphql/schema/printer_spec.rb index b00cce7847..a16304e434 100644 --- a/spec/graphql/schema/printer_spec.rb +++ b/spec/graphql/schema/printer_spec.rb @@ -8,9 +8,14 @@ module Node field :id, ID, null: false end + class HiddenDirective < GraphQL::Schema::Directive + def self.visible?(ctx); false; end + locations(GraphQL::Schema::Directive::ENUM_VALUE) + end + class Choice < GraphQL::Schema::Enum value "FOO", value: :foo - value "BAR", value: :bar + value "BAR", value: :bar, directives: { HiddenDirective => {} } value "BAZ", deprecation_reason: <<-REASON Use "BAR" instead. @@ -120,6 +125,10 @@ class Subscription < GraphQL::Schema::Object mutation(Mutation) subscription(Subscription) extra_types [MediaRating] + + if !use_visibility_profile? + use GraphQL::Schema::Warden + end end let(:schema) { PrinterTestSchema } @@ -689,7 +698,7 @@ def self.visible?(member, ctx) case member when Module if !member.respond_to?(:kind) - true + super else case member.kind.name when "SCALAR" @@ -815,7 +824,7 @@ def self.visible?(member, ctx) custom_filter_schema = Class.new(schema) do use GraphQL::Schema::Warden if ADD_WARDEN def self.visible?(member, ctx) - !(ctx[:names].include?(member.graphql_name) || (member.respond_to?(:deprecation_reason) && member.deprecation_reason)) + super && (!(ctx[:names].include?(member.graphql_name) || (member.respond_to?(:deprecation_reason) && member.deprecation_reason))) end end