graphql 1.9.21 → 1.10.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +0 -1
  3. data/lib/generators/graphql/install_generator.rb +0 -1
  4. data/lib/generators/graphql/mutation_generator.rb +1 -1
  5. data/lib/generators/graphql/templates/base_field.erb +4 -0
  6. data/lib/generators/graphql/templates/graphql_controller.erb +0 -5
  7. data/lib/generators/graphql/templates/mutation.erb +1 -1
  8. data/lib/generators/graphql/templates/schema.erb +1 -1
  9. data/lib/graphql.rb +1 -11
  10. data/lib/graphql/analysis/ast.rb +2 -2
  11. data/lib/graphql/analysis/ast/analyzer.rb +4 -23
  12. data/lib/graphql/analysis/ast/max_query_complexity.rb +3 -3
  13. data/lib/graphql/analysis/ast/max_query_depth.rb +3 -7
  14. data/lib/graphql/analysis/ast/query_complexity.rb +2 -2
  15. data/lib/graphql/argument.rb +6 -2
  16. data/lib/graphql/backtrace/table.rb +10 -2
  17. data/lib/graphql/base_type.rb +5 -1
  18. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  19. data/lib/graphql/define/assign_object_field.rb +2 -2
  20. data/lib/graphql/define/defined_object_proxy.rb +0 -3
  21. data/lib/graphql/define/instance_definable.rb +3 -14
  22. data/lib/graphql/enum_type.rb +4 -0
  23. data/lib/graphql/execution/directive_checks.rb +2 -2
  24. data/lib/graphql/execution/errors.rb +14 -15
  25. data/lib/graphql/execution/execute.rb +1 -1
  26. data/lib/graphql/execution/interpreter/runtime.rb +17 -39
  27. data/lib/graphql/execution/multiplex.rb +3 -3
  28. data/lib/graphql/field.rb +8 -0
  29. data/lib/graphql/filter.rb +1 -1
  30. data/lib/graphql/function.rb +1 -1
  31. data/lib/graphql/input_object_type.rb +1 -2
  32. data/lib/graphql/introspection/entry_points.rb +1 -2
  33. data/lib/graphql/introspection/input_value_type.rb +27 -9
  34. data/lib/graphql/introspection/schema_type.rb +1 -2
  35. data/lib/graphql/language/block_string.rb +2 -2
  36. data/lib/graphql/language/document_from_schema_definition.rb +5 -11
  37. data/lib/graphql/language/lexer.rb +48 -49
  38. data/lib/graphql/language/lexer.rl +48 -49
  39. data/lib/graphql/language/nodes.rb +11 -14
  40. data/lib/graphql/language/parser.rb +645 -650
  41. data/lib/graphql/language/parser.y +7 -8
  42. data/lib/graphql/language/token.rb +1 -1
  43. data/lib/graphql/non_null_type.rb +0 -10
  44. data/lib/graphql/pagination.rb +6 -0
  45. data/lib/graphql/pagination/active_record_relation_connection.rb +35 -0
  46. data/lib/graphql/pagination/array_connection.rb +78 -0
  47. data/lib/graphql/pagination/connection.rb +150 -0
  48. data/lib/graphql/pagination/connections.rb +103 -0
  49. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  50. data/lib/graphql/pagination/relation_connection.rb +157 -0
  51. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  52. data/lib/graphql/query.rb +1 -7
  53. data/lib/graphql/query/arguments.rb +3 -9
  54. data/lib/graphql/query/context.rb +9 -31
  55. data/lib/graphql/query/literal_input.rb +29 -10
  56. data/lib/graphql/query/null_context.rb +0 -4
  57. data/lib/graphql/query/variable_validation_error.rb +1 -1
  58. data/lib/graphql/query/variables.rb +2 -4
  59. data/lib/graphql/relay/base_connection.rb +7 -3
  60. data/lib/graphql/relay/edges_instrumentation.rb +1 -1
  61. data/lib/graphql/relay/node.rb +2 -2
  62. data/lib/graphql/relay/relation_connection.rb +5 -9
  63. data/lib/graphql/schema.rb +27 -68
  64. data/lib/graphql/schema/argument.rb +31 -5
  65. data/lib/graphql/schema/base_64_bp.rb +2 -3
  66. data/lib/graphql/schema/build_from_definition.rb +113 -179
  67. data/lib/graphql/schema/build_from_definition/resolve_map.rb +10 -4
  68. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  69. data/lib/graphql/schema/directive.rb +6 -7
  70. data/lib/graphql/schema/directive/feature.rb +1 -1
  71. data/lib/graphql/schema/enum.rb +1 -0
  72. data/lib/graphql/schema/enum_value.rb +4 -1
  73. data/lib/graphql/schema/field.rb +37 -39
  74. data/lib/graphql/schema/field/connection_extension.rb +11 -1
  75. data/lib/graphql/schema/input_object.rb +2 -5
  76. data/lib/graphql/schema/interface.rb +2 -0
  77. data/lib/graphql/schema/introspection_system.rb +1 -4
  78. data/lib/graphql/schema/loader.rb +6 -12
  79. data/lib/graphql/schema/member.rb +2 -0
  80. data/lib/graphql/schema/member/base_dsl_methods.rb +2 -2
  81. data/lib/graphql/schema/member/build_type.rb +4 -0
  82. data/lib/graphql/schema/member/cached_graphql_definition.rb +5 -0
  83. data/lib/graphql/schema/member/has_ast_node.rb +17 -0
  84. data/lib/graphql/schema/member/has_fields.rb +10 -16
  85. data/lib/graphql/schema/member/instrumentation.rb +1 -6
  86. data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
  87. data/lib/graphql/schema/mutation.rb +1 -1
  88. data/lib/graphql/schema/object.rb +5 -6
  89. data/lib/graphql/schema/possible_types.rb +3 -3
  90. data/lib/graphql/schema/printer.rb +1 -3
  91. data/lib/graphql/schema/relay_classic_mutation.rb +2 -6
  92. data/lib/graphql/schema/resolver.rb +5 -35
  93. data/lib/graphql/schema/scalar.rb +1 -0
  94. data/lib/graphql/schema/subscription.rb +6 -6
  95. data/lib/graphql/schema/timeout_middleware.rb +2 -3
  96. data/lib/graphql/schema/type_expression.rb +27 -17
  97. data/lib/graphql/schema/union.rb +7 -26
  98. data/lib/graphql/schema/validation.rb +1 -17
  99. data/lib/graphql/schema/warden.rb +3 -77
  100. data/lib/graphql/schema/wrapper.rb +1 -1
  101. data/lib/graphql/static_validation/definition_dependencies.rb +12 -21
  102. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +9 -4
  103. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +10 -7
  104. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
  105. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  106. data/lib/graphql/static_validation/rules/fields_will_merge.rb +4 -4
  107. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +3 -3
  108. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -3
  109. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +5 -6
  110. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  111. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -1
  112. data/lib/graphql/subscriptions.rb +7 -7
  113. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +2 -2
  114. data/lib/graphql/subscriptions/event.rb +5 -19
  115. data/lib/graphql/subscriptions/instrumentation.rb +9 -4
  116. data/lib/graphql/subscriptions/subscription_root.rb +2 -10
  117. data/lib/graphql/tracing/skylight_tracing.rb +0 -1
  118. data/lib/graphql/types/int.rb +1 -1
  119. data/lib/graphql/types/relay/base_connection.rb +3 -1
  120. data/lib/graphql/union_type.rb +23 -58
  121. data/lib/graphql/upgrader/member.rb +1 -1
  122. data/lib/graphql/version.rb +1 -1
  123. metadata +20 -13
  124. data/lib/generators/graphql/templates/base_mutation.erb +0 -8
  125. data/lib/graphql/schema/type_membership.rb +0 -34
@@ -8,7 +8,7 @@ module GraphQL
8
8
  @value = value
9
9
  @validation_result = validation_result
10
10
 
11
- msg = "Variable #{variable_ast.name} of type #{type} was provided invalid value"
11
+ msg = "Variable $#{variable_ast.name} of type #{type.to_type_signature} was provided invalid value"
12
12
 
13
13
  if problem_fields.any?
14
14
  msg += " for #{problem_fields.join(", ")}"
@@ -21,7 +21,7 @@ module GraphQL
21
21
  # - First, use the value provided at runtime
22
22
  # - Then, fall back to the default value from the query string
23
23
  # If it's still nil, raise an error if it's required.
24
- variable_type = schema.type_from_ast(ast_variable.type)
24
+ variable_type = schema.type_from_ast(ast_variable.type, context: ctx)
25
25
  if variable_type.nil?
26
26
  # Pass -- it will get handled by a validator
27
27
  else
@@ -35,9 +35,7 @@ module GraphQL
35
35
  if validation_result.valid?
36
36
  if value_was_provided
37
37
  # Add the variable if a value was provided
38
- memo[variable_name] = schema.error_handler.with_error_handling(context) do
39
- variable_type.coerce_input(provided_value, ctx)
40
- end
38
+ memo[variable_name] = variable_type.coerce_input(provided_value, ctx)
41
39
  elsif default_value != nil
42
40
  # Add the variable if it wasn't provided but it has a default value (including `null`)
43
41
  memo[variable_name] = GraphQL::Query::LiteralInput.coerce(variable_type, default_value, self)
@@ -25,6 +25,10 @@ module GraphQL
25
25
  # @param nodes [Object] A collection of nodes (eg, Array, AR::Relation)
26
26
  # @return [subclass of BaseConnection] a connection Class for wrapping `nodes`
27
27
  def connection_for_nodes(nodes)
28
+ # If it's a new-style connection object, it's already ready to go
29
+ if nodes.is_a?(GraphQL::Pagination::Connection)
30
+ return nodes
31
+ end
28
32
  # Check for class _names_ because classes can be redefined in Rails development
29
33
  nodes.class.ancestors.each do |ancestor|
30
34
  conn_impl = CONNECTION_IMPLEMENTATIONS[ancestor.name]
@@ -139,7 +143,7 @@ module GraphQL
139
143
 
140
144
  # An opaque operation which returns a connection-specific cursor.
141
145
  def cursor_from_node(object)
142
- raise GraphQL::RequiredImplementationMissingError, "must return a cursor for this object/connection pair"
146
+ raise NotImplementedError, "must return a cursor for this object/connection pair"
143
147
  end
144
148
 
145
149
  def inspect
@@ -161,11 +165,11 @@ module GraphQL
161
165
  end
162
166
 
163
167
  def paged_nodes
164
- raise GraphQL::RequiredImplementationMissingError, "must return nodes for this connection after paging"
168
+ raise NotImplementedError, "must return nodes for this connection after paging"
165
169
  end
166
170
 
167
171
  def sliced_nodes
168
- raise GraphQL::RequiredImplementationMissingError, "must return all nodes for this connection after chopping off first and last"
172
+ raise NotImplementedError, "must return all nodes for this connection after chopping off first and last"
169
173
  end
170
174
  end
171
175
  end
@@ -31,7 +31,7 @@ module GraphQL
31
31
  if ctx.schema.lazy?(nodes)
32
32
  nodes
33
33
  else
34
- nodes.map { |item| @edge_class.new(item, parent) }
34
+ nodes.map { |item| item.is_a?(GraphQL::Pagination::Connection::Edge) ? item : @edge_class.new(item, parent) }
35
35
  end
36
36
  end
37
37
  end
@@ -11,7 +11,7 @@ module GraphQL
11
11
  field = GraphQL::Types::Relay::NodeField.graphql_definition
12
12
 
13
13
  if kwargs.any? || block
14
- field = field.redefine(**kwargs, &block)
14
+ field = field.redefine(kwargs, &block)
15
15
  end
16
16
 
17
17
  field
@@ -21,7 +21,7 @@ module GraphQL
21
21
  field = GraphQL::Types::Relay::NodesField.graphql_definition
22
22
 
23
23
  if kwargs.any? || block
24
- field = field.redefine(**kwargs, &block)
24
+ field = field.redefine(kwargs, &block)
25
25
  end
26
26
 
27
27
  field
@@ -25,16 +25,12 @@ module GraphQL
25
25
 
26
26
  def has_next_page
27
27
  if first
28
- if defined?(ActiveRecord::Relation) && nodes.is_a?(ActiveRecord::Relation)
29
- initial_offset = after ? offset_from_cursor(after) : 0
30
- return paged_nodes.length >= first && nodes.offset(first + initial_offset).exists?
31
- end
32
- return paged_nodes.length >= first && sliced_nodes_count > first
33
- end
34
- if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
35
- return sliced_nodes_count >= last
28
+ paged_nodes.length >= first && sliced_nodes_count > first
29
+ elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && last
30
+ sliced_nodes_count >= last
31
+ else
32
+ false
36
33
  end
37
- false
38
34
  end
39
35
 
40
36
  def has_previous_page
@@ -40,7 +40,6 @@ require "graphql/schema/directive/include"
40
40
  require "graphql/schema/directive/skip"
41
41
  require "graphql/schema/directive/feature"
42
42
  require "graphql/schema/directive/transform"
43
- require "graphql/schema/type_membership"
44
43
 
45
44
  require "graphql/schema/resolver"
46
45
  require "graphql/schema/mutation"
@@ -82,6 +81,7 @@ module GraphQL
82
81
  class Schema
83
82
  extend Forwardable
84
83
  extend GraphQL::Schema::Member::AcceptsDefinition
84
+ extend GraphQL::Schema::Member::HasAstNode
85
85
  include GraphQL::Define::InstanceDefinable
86
86
  extend GraphQL::Schema::FindInheritedValue
87
87
 
@@ -99,8 +99,6 @@ module GraphQL
99
99
  mutation: ->(schema, t) { schema.mutation = t.respond_to?(:graphql_definition) ? t.graphql_definition : t },
100
100
  subscription: ->(schema, t) { schema.subscription = t.respond_to?(:graphql_definition) ? t.graphql_definition : t },
101
101
  disable_introspection_entry_points: ->(schema) { schema.disable_introspection_entry_points = true },
102
- disable_schema_introspection_entry_point: ->(schema) { schema.disable_schema_introspection_entry_point = true },
103
- disable_type_introspection_entry_point: ->(schema) { schema.disable_type_introspection_entry_point = true },
104
102
  directives: ->(schema, directives) { schema.directives = directives.reduce({}) { |m, d| m[d.name] = d; m } },
105
103
  directive: ->(schema, directive) { schema.directives[directive.graphql_name] = directive },
106
104
  instrument: ->(schema, type, instrumenter, after_built_ins: false) {
@@ -156,12 +154,6 @@ module GraphQL
156
154
  # [Boolean] True if this object disables the introspection entry point fields
157
155
  attr_accessor :disable_introspection_entry_points
158
156
 
159
- # [Boolean] True if this object disables the __schema introspection entry point field
160
- attr_accessor :disable_schema_introspection_entry_point
161
-
162
- # [Boolean] True if this object disables the __type introspection entry point field
163
- attr_accessor :disable_type_introspection_entry_point
164
-
165
157
  class << self
166
158
  attr_writer :default_execution_strategy
167
159
  end
@@ -211,8 +203,6 @@ module GraphQL
211
203
  @interpreter = false
212
204
  @error_bubbling = false
213
205
  @disable_introspection_entry_points = false
214
- @disable_schema_introspection_entry_point = false
215
- @disable_type_introspection_entry_point = false
216
206
  end
217
207
 
218
208
  # @return [Boolean] True if using the new {GraphQL::Execution::Interpreter}
@@ -282,7 +272,7 @@ module GraphQL
282
272
  query = GraphQL::Query.new(self, document: doc, context: context)
283
273
  validator_opts = { schema: self }
284
274
  rules && (validator_opts[:rules] = rules)
285
- validator = GraphQL::StaticValidation::Validator.new(**validator_opts)
275
+ validator = GraphQL::StaticValidation::Validator.new(validator_opts)
286
276
  res = validator.validate(query)
287
277
  res[:errors]
288
278
  end
@@ -292,13 +282,13 @@ module GraphQL
292
282
  ensure_defined
293
283
  # Assert that all necessary configs are present:
294
284
  validation_error = Validation.validate(self)
295
- validation_error && raise(GraphQL::RequiredImplementationMissingError, validation_error)
285
+ validation_error && raise(NotImplementedError, validation_error)
296
286
  rebuild_artifacts
297
287
 
298
288
  @definition_error = nil
299
289
  nil
300
290
  rescue StandardError => err
301
- if @raise_definition_error || err.is_a?(CyclicalDefinitionError) || err.is_a?(GraphQL::RequiredImplementationMissingError)
291
+ if @raise_definition_error || err.is_a?(CyclicalDefinitionError)
302
292
  raise
303
293
  else
304
294
  # Raise this error _later_ to avoid messing with Rails constant loading
@@ -453,17 +443,16 @@ module GraphQL
453
443
  @instrumented_field_map[type.graphql_name]
454
444
  end
455
445
 
456
- def type_from_ast(ast_node)
446
+ def type_from_ast(ast_node, context:)
457
447
  GraphQL::Schema::TypeExpression.build_type(self.types, ast_node)
458
448
  end
459
449
 
460
450
  # @see [GraphQL::Schema::Warden] Restricted access to members of a schema
461
451
  # @param type_defn [GraphQL::InterfaceType, GraphQL::UnionType] the type whose members you want to retrieve
462
- # @param context [GraphQL::Query::Context] The context for the current query
463
452
  # @return [Array<GraphQL::ObjectType>] types which belong to `type_defn` in this schema
464
- def possible_types(type_defn, context = GraphQL::Query::NullContext)
453
+ def possible_types(type_defn)
465
454
  @possible_types ||= GraphQL::Schema::PossibleTypes.new(self)
466
- @possible_types.possible_types(type_defn, context)
455
+ @possible_types.possible_types(type_defn)
467
456
  end
468
457
 
469
458
  # @see [GraphQL::Schema::Warden] Resticted access to root types
@@ -504,7 +493,7 @@ module GraphQL
504
493
  def resolve_type(type, object, ctx = :__undefined__)
505
494
  check_resolved_type(type, object, ctx) do |ok_type, ok_object, ok_ctx|
506
495
  if @resolve_type_proc.nil?
507
- raise(GraphQL::RequiredImplementationMissingError, "Can't determine GraphQL type for: #{ok_object.inspect}, define `resolve_type (type, obj, ctx) -> { ... }` inside `Schema.define`.")
496
+ raise(NotImplementedError, "Can't determine GraphQL type for: #{ok_object.inspect}, define `resolve_type (type, obj, ctx) -> { ... }` inside `Schema.define`.")
508
497
  end
509
498
  @resolve_type_proc.call(ok_type, ok_object, ok_ctx)
510
499
  end
@@ -565,7 +554,7 @@ module GraphQL
565
554
  # @return [Any] The application object identified by `id`
566
555
  def object_from_id(id, ctx)
567
556
  if @object_from_id_proc.nil?
568
- raise(GraphQL::RequiredImplementationMissingError, "Can't fetch an object for id \"#{id}\" because the schema's `object_from_id (id, ctx) -> { ... }` function is not defined")
557
+ raise(NotImplementedError, "Can't fetch an object for id \"#{id}\" because the schema's `object_from_id (id, ctx) -> { ... }` function is not defined")
569
558
  else
570
559
  @object_from_id_proc.call(id, ctx)
571
560
  end
@@ -609,7 +598,6 @@ module GraphQL
609
598
  alias :_schema_class :class
610
599
  def_delegators :_schema_class, :visible?, :accessible?, :authorized?, :unauthorized_object, :unauthorized_field, :inaccessible_fields
611
600
  def_delegators :_schema_class, :directive
612
- def_delegators :_schema_class, :error_handler
613
601
 
614
602
  # A function to call when {#execute} receives an invalid query string
615
603
  #
@@ -633,7 +621,7 @@ module GraphQL
633
621
  # @return [String] a unique identifier for `object` which clients can use to refetch it
634
622
  def id_from_object(object, type, ctx)
635
623
  if @id_from_object_proc.nil?
636
- raise(GraphQL::RequiredImplementationMissingError, "Can't generate an ID for #{object.inspect} of type #{type}, schema's `id_from_object` must be defined")
624
+ raise(NotImplementedError, "Can't generate an ID for #{object.inspect} of type #{type}, schema's `id_from_object` must be defined")
637
625
  else
638
626
  @id_from_object_proc.call(object, type, ctx)
639
627
  end
@@ -689,12 +677,9 @@ module GraphQL
689
677
  end
690
678
 
691
679
  # Return the GraphQL::Language::Document IDL AST for the schema
692
- # @param context [Hash]
693
- # @param only [<#call(member, ctx)>]
694
- # @param except [<#call(member, ctx)>]
695
680
  # @return [GraphQL::Language::Document]
696
- def to_document(only: nil, except: nil, context: {})
697
- GraphQL::Language::DocumentFromSchemaDefinition.new(self, only: only, except: except, context: context).document
681
+ def to_document
682
+ GraphQL::Language::DocumentFromSchemaDefinition.new(self).document
698
683
  end
699
684
 
700
685
  # Return the Hash response of {Introspection::INTROSPECTION_QUERY}.
@@ -713,6 +698,12 @@ module GraphQL
713
698
  JSON.pretty_generate(as_json(*args))
714
699
  end
715
700
 
701
+ def new_connections?
702
+ !!connections
703
+ end
704
+
705
+ attr_accessor :connections
706
+
716
707
  class << self
717
708
  extend Forwardable
718
709
  # For compatibility, these methods all:
@@ -721,7 +712,7 @@ module GraphQL
721
712
  # Eventually, the methods will be moved into this class, removing the need for the singleton.
722
713
  def_delegators :graphql_definition,
723
714
  # Schema structure
724
- :as_json, :to_json, :to_document, :to_definition, :ast_node,
715
+ :as_json, :to_json, :to_document, :to_definition,
725
716
  # Execution
726
717
  :execute, :multiplex,
727
718
  :static_validator, :introspection_system,
@@ -745,15 +736,13 @@ module GraphQL
745
736
  :union_memberships,
746
737
  :get_field, :root_types, :references_to, :type_from_ast,
747
738
  :possible_types,
748
- :disable_introspection_entry_points=,
749
- :disable_schema_introspection_entry_point=,
750
- :disable_type_introspection_entry_point=
739
+ :disable_introspection_entry_points=
751
740
 
752
741
  def graphql_definition
753
742
  @graphql_definition ||= to_graphql
754
743
  end
755
744
 
756
- def use(plugin, **options)
745
+ def use(plugin, options = {})
757
746
  own_plugins << [plugin, options]
758
747
  end
759
748
 
@@ -773,8 +762,6 @@ module GraphQL
773
762
  schema_defn.default_max_page_size = default_max_page_size
774
763
  schema_defn.orphan_types = orphan_types
775
764
  schema_defn.disable_introspection_entry_points = disable_introspection_entry_points?
776
- schema_defn.disable_schema_introspection_entry_point = disable_schema_introspection_entry_point?
777
- schema_defn.disable_type_introspection_entry_point = disable_type_introspection_entry_point?
778
765
 
779
766
  prepped_dirs = {}
780
767
  directives.each { |k, v| prepped_dirs[k] = v.graphql_definition}
@@ -828,6 +815,9 @@ module GraphQL
828
815
  schema_defn
829
816
  end
830
817
 
818
+ # @return [GraphQL::Pagination::Connections] if installed
819
+ attr_accessor :connections
820
+
831
821
  def query(new_query_object = nil)
832
822
  if new_query_object
833
823
  @query_object = new_query_object
@@ -930,14 +920,6 @@ module GraphQL
930
920
  @disable_introspection_entry_points = true
931
921
  end
932
922
 
933
- def disable_schema_introspection_entry_point
934
- @disable_schema_introspection_entry_point = true
935
- end
936
-
937
- def disable_type_introspection_entry_point
938
- @disable_type_introspection_entry_point = true
939
- end
940
-
941
923
  def disable_introspection_entry_points?
942
924
  if instance_variable_defined?(:@disable_introspection_entry_points)
943
925
  @disable_introspection_entry_points
@@ -946,22 +928,6 @@ module GraphQL
946
928
  end
947
929
  end
948
930
 
949
- def disable_schema_introspection_entry_point?
950
- if instance_variable_defined?(:@disable_schema_introspection_entry_point)
951
- @disable_schema_introspection_entry_point
952
- else
953
- find_inherited_value(:disable_schema_introspection_entry_point?, false)
954
- end
955
- end
956
-
957
- def disable_type_introspection_entry_point?
958
- if instance_variable_defined?(:@disable_type_introspection_entry_point)
959
- @disable_type_introspection_entry_point
960
- else
961
- find_inherited_value(:disable_type_introspection_entry_point?, false)
962
- end
963
- end
964
-
965
931
  def orphan_types(*new_orphan_types)
966
932
  if new_orphan_types.any?
967
933
  own_orphan_types.concat(new_orphan_types.flatten)
@@ -1000,16 +966,16 @@ module GraphQL
1000
966
  if type.kind.object?
1001
967
  type
1002
968
  else
1003
- raise GraphQL::RequiredImplementationMissingError, "#{self.name}.resolve_type(type, obj, ctx) must be implemented to use Union types or Interface types (tried to resolve: #{type.name})"
969
+ raise NotImplementedError, "#{self.name}.resolve_type(type, obj, ctx) must be implemented to use Union types or Interface types (tried to resolve: #{type.name})"
1004
970
  end
1005
971
  end
1006
972
 
1007
973
  def object_from_id(node_id, ctx)
1008
- raise GraphQL::RequiredImplementationMissingError, "#{self.name}.object_from_id(node_id, ctx) must be implemented to load by ID (tried to load from id `#{node_id}`)"
974
+ raise NotImplementedError, "#{self.name}.object_from_id(node_id, ctx) must be implemented to load by ID (tried to load from id `#{node_id}`)"
1009
975
  end
1010
976
 
1011
977
  def id_from_object(object, type, ctx)
1012
- raise GraphQL::RequiredImplementationMissingError, "#{self.name}.id_from_object(object, type, ctx) must be implemented to create global ids (tried to create an id for `#{object.inspect}`)"
978
+ raise NotImplementedError, "#{self.name}.id_from_object(object, type, ctx) must be implemented to create global ids (tried to create an id for `#{object.inspect}`)"
1013
979
  end
1014
980
 
1015
981
  def visible?(member, context)
@@ -1071,13 +1037,6 @@ module GraphQL
1071
1037
  DefaultTypeError.call(type_err, ctx)
1072
1038
  end
1073
1039
 
1074
- attr_writer :error_handler
1075
-
1076
- # @return [GraphQL::Execution::Errors, Class<GraphQL::Execution::Errors::NullErrorHandler>]
1077
- def error_handler
1078
- @error_handler ||= GraphQL::Execution::Errors::NullErrorHandler
1079
- end
1080
-
1081
1040
  def lazy_resolve(lazy_class, value_method)
1082
1041
  lazy_classes[lazy_class] = value_method
1083
1042
  end
@@ -5,6 +5,7 @@ module GraphQL
5
5
  include GraphQL::Schema::Member::CachedGraphQLDefinition
6
6
  include GraphQL::Schema::Member::AcceptsDefinition
7
7
  include GraphQL::Schema::Member::HasPath
8
+ include GraphQL::Schema::Member::HasAstNode
8
9
 
9
10
  NO_DEFAULT = :__no_default__
10
11
 
@@ -93,7 +94,35 @@ module GraphQL
93
94
  true
94
95
  end
95
96
 
96
- def authorized?(obj, ctx)
97
+ def authorized?(obj, value, ctx)
98
+ authorized_as_type?(obj, value, ctx, as_type: type)
99
+ end
100
+
101
+ def authorized_as_type?(obj, value, ctx, as_type:)
102
+ if value.nil?
103
+ return true
104
+ end
105
+
106
+ if as_type.kind.non_null?
107
+ as_type = as_type.of_type
108
+ end
109
+
110
+ if as_type.kind.list?
111
+ value.each do |v|
112
+ if !authorized_as_type?(obj, v, ctx, as_type: as_type.of_type)
113
+ return false
114
+ end
115
+ end
116
+ elsif as_type.kind.input_object?
117
+ as_type.arguments.each do |_name, input_obj_arg|
118
+ input_obj_arg = input_obj_arg.type_class
119
+ if value.key?(input_obj_arg.keyword) && !input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
120
+ return false
121
+ end
122
+ end
123
+ end
124
+ # None of the early-return conditions were activated,
125
+ # so this is authorized.
97
126
  true
98
127
  end
99
128
 
@@ -104,6 +133,7 @@ module GraphQL
104
133
  argument.description = @description
105
134
  argument.metadata[:type_class] = self
106
135
  argument.as = @as
136
+ argument.ast_node = ast_node
107
137
  argument.method_access = @method_access
108
138
  if NO_DEFAULT != @default_value
109
139
  argument.default_value = @default_value
@@ -121,10 +151,6 @@ module GraphQL
121
151
  # Used by the runtime.
122
152
  # @api private
123
153
  def prepare_value(obj, value)
124
- if value.is_a?(GraphQL::Schema::InputObject)
125
- value = value.prepare
126
- end
127
-
128
154
  if @prepare.nil?
129
155
  value
130
156
  elsif @prepare.is_a?(String) || @prepare.is_a?(Symbol)
@@ -10,9 +10,8 @@ module Base64Bp
10
10
  module_function
11
11
 
12
12
  def urlsafe_encode64(bin, padding:)
13
- str = strict_encode64(bin)
14
- str.tr!("+/", "-_")
15
- str.delete!("=") unless padding
13
+ str = strict_encode64(bin).tr("+/", "-_")
14
+ str = str.delete("=") unless padding
16
15
  str
17
16
  end
18
17