graphql 1.11.4 → 1.11.8

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/object_generator.rb +2 -0
  3. data/lib/generators/graphql/templates/union.erb +1 -1
  4. data/lib/graphql.rb +17 -0
  5. data/lib/graphql/argument.rb +3 -3
  6. data/lib/graphql/backtrace/tracer.rb +2 -1
  7. data/lib/graphql/define/assign_global_id_field.rb +2 -2
  8. data/lib/graphql/execution/interpreter.rb +10 -0
  9. data/lib/graphql/execution/interpreter/arguments.rb +21 -6
  10. data/lib/graphql/execution/interpreter/arguments_cache.rb +8 -0
  11. data/lib/graphql/execution/interpreter/runtime.rb +70 -42
  12. data/lib/graphql/integer_decoding_error.rb +17 -0
  13. data/lib/graphql/introspection.rb +96 -0
  14. data/lib/graphql/introspection/field_type.rb +7 -3
  15. data/lib/graphql/introspection/input_value_type.rb +6 -0
  16. data/lib/graphql/introspection/introspection_query.rb +6 -92
  17. data/lib/graphql/introspection/type_type.rb +7 -3
  18. data/lib/graphql/invalid_null_error.rb +1 -1
  19. data/lib/graphql/language/block_string.rb +24 -5
  20. data/lib/graphql/language/lexer.rb +7 -3
  21. data/lib/graphql/language/lexer.rl +7 -3
  22. data/lib/graphql/language/nodes.rb +1 -1
  23. data/lib/graphql/language/parser.rb +107 -103
  24. data/lib/graphql/language/parser.y +4 -0
  25. data/lib/graphql/language/sanitized_printer.rb +59 -26
  26. data/lib/graphql/name_validator.rb +6 -7
  27. data/lib/graphql/pagination/connections.rb +11 -3
  28. data/lib/graphql/query.rb +6 -3
  29. data/lib/graphql/query/context.rb +14 -3
  30. data/lib/graphql/query/validation_pipeline.rb +1 -1
  31. data/lib/graphql/relay/array_connection.rb +2 -2
  32. data/lib/graphql/relay/range_add.rb +14 -5
  33. data/lib/graphql/schema.rb +47 -19
  34. data/lib/graphql/schema/argument.rb +56 -5
  35. data/lib/graphql/schema/build_from_definition.rb +67 -38
  36. data/lib/graphql/schema/default_type_error.rb +2 -0
  37. data/lib/graphql/schema/directive/deprecated.rb +1 -1
  38. data/lib/graphql/schema/field.rb +32 -16
  39. data/lib/graphql/schema/field/connection_extension.rb +8 -7
  40. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  41. data/lib/graphql/schema/input_object.rb +5 -3
  42. data/lib/graphql/schema/interface.rb +1 -1
  43. data/lib/graphql/schema/late_bound_type.rb +2 -2
  44. data/lib/graphql/schema/loader.rb +1 -0
  45. data/lib/graphql/schema/member/build_type.rb +14 -4
  46. data/lib/graphql/schema/member/has_arguments.rb +54 -53
  47. data/lib/graphql/schema/member/has_fields.rb +2 -2
  48. data/lib/graphql/schema/member/type_system_helpers.rb +2 -2
  49. data/lib/graphql/schema/relay_classic_mutation.rb +4 -2
  50. data/lib/graphql/schema/timeout.rb +29 -15
  51. data/lib/graphql/schema/unique_within_type.rb +1 -2
  52. data/lib/graphql/schema/validation.rb +8 -0
  53. data/lib/graphql/static_validation.rb +1 -0
  54. data/lib/graphql/static_validation/all_rules.rb +1 -0
  55. data/lib/graphql/static_validation/rules/fields_will_merge.rb +25 -17
  56. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  57. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  58. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  59. data/lib/graphql/static_validation/validator.rb +29 -7
  60. data/lib/graphql/subscriptions.rb +1 -3
  61. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +21 -7
  62. data/lib/graphql/tracing/platform_tracing.rb +1 -1
  63. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  64. data/lib/graphql/types/int.rb +9 -2
  65. data/lib/graphql/types/relay/base_connection.rb +2 -1
  66. data/lib/graphql/types/relay/base_edge.rb +2 -1
  67. data/lib/graphql/types/string.rb +7 -1
  68. data/lib/graphql/unauthorized_error.rb +1 -1
  69. data/lib/graphql/version.rb +1 -1
  70. data/readme.md +1 -1
  71. metadata +7 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5bf42de25927dab863bd600879d33d204c54bdf124b2b4cc5b27c4c16d4f28b
4
- data.tar.gz: 58b21a4dd5ba80ec0f6c3362013a6adb07c2f1af243e5a851d4c3f08554fe09d
3
+ metadata.gz: 4b72615f5488c1aa58c921128dd067d9f098b4617c954ac267e37efa72a9107c
4
+ data.tar.gz: 4690738202ecd5d048802c80f1fc87095e0c1de4a02adcba26e88415f401908c
5
5
  SHA512:
6
- metadata.gz: f199d24a190910e44b189340b6a3d2a3c121ab56ba10ec6cf44d8801107db8d73541f24788b00b13ee7dd357f7bfe6ecff7001f053fe417c777bca59db5851db
7
- data.tar.gz: fd0955c7f67b20370ea376d6a286fdf0ac7272ac5b243d6c309d2159a780cd0b8f92fd0e06ca312a69a16b7c8ad0ebd7bb4587feac9dc77b27da507c9a44cd8f
6
+ metadata.gz: 744ca52fc03919a071013a27139112c2c18e487f333ee335ea374feaef06bb904079d4c54e0ddf088d2b5dfa345172efb3063faefa792c1c8ade38616752fa1a
7
+ data.tar.gz: 90fffd6928d128f2516e4f49c9d729a26a57101683e19d0a90818c45f431bae221e4b8b1bf8d7bc374e20c8e98e3f0a0963877e818ae946f999d40942182cddd
@@ -40,6 +40,8 @@ module Graphql
40
40
  case type_expression
41
41
  when "Text"
42
42
  ["String", null]
43
+ when "Decimal"
44
+ ["Float", null]
43
45
  when "DateTime", "Datetime"
44
46
  ["GraphQL::Types::ISO8601DateTime", null]
45
47
  when "Date"
@@ -1,7 +1,7 @@
1
1
  <% module_namespacing_when_supported do -%>
2
2
  module Types
3
3
  class <%= type_ruby_name.split('::')[-1] %> < Types::BaseUnion
4
- <% if possible_types.any? %> possible_types [<%= normalized_possible_types.join(", ") %>]
4
+ <% if possible_types.any? %> possible_types <%= normalized_possible_types.join(", ") %>
5
5
  <% end %> end
6
6
  end
7
7
  <% end -%>
data/lib/graphql.rb CHANGED
@@ -21,6 +21,14 @@ module GraphQL
21
21
  class RequiredImplementationMissingError < Error
22
22
  end
23
23
 
24
+ class << self
25
+ def default_parser
26
+ @default_parser ||= GraphQL::Language::Parser
27
+ end
28
+
29
+ attr_writer :default_parser
30
+ end
31
+
24
32
  # Turn a query string or schema definition into an AST
25
33
  # @param graphql_string [String] a GraphQL query string or schema definition
26
34
  # @return [GraphQL::Language::Nodes::Document]
@@ -61,6 +69,14 @@ module GraphQL
61
69
  end
62
70
  end
63
71
  end
72
+
73
+ module StringMatchBackport
74
+ refine String do
75
+ def match?(pattern)
76
+ self =~ pattern
77
+ end
78
+ end
79
+ end
64
80
  end
65
81
 
66
82
  # Order matters for these:
@@ -113,6 +129,7 @@ require "graphql/introspection"
113
129
  require "graphql/analysis_error"
114
130
  require "graphql/coercion_error"
115
131
  require "graphql/invalid_name_error"
132
+ require "graphql/integer_decoding_error"
116
133
  require "graphql/integer_encoding_error"
117
134
  require "graphql/string_encoding_error"
118
135
  require "graphql/internal_representation"
@@ -3,14 +3,14 @@ module GraphQL
3
3
  # @api deprecated
4
4
  class Argument
5
5
  include GraphQL::Define::InstanceDefinable
6
- accepts_definitions :name, :type, :description, :default_value, :as, :prepare, :method_access
6
+ accepts_definitions :name, :type, :description, :default_value, :as, :prepare, :method_access, :deprecation_reason
7
7
  attr_reader :default_value
8
- attr_accessor :description, :name, :as
8
+ attr_accessor :description, :name, :as, :deprecation_reason
9
9
  attr_accessor :ast_node
10
10
  attr_accessor :method_access
11
11
  alias :graphql_name :name
12
12
 
13
- ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as, :prepare, :method_access)
13
+ ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as, :prepare, :method_access, :deprecation_reason)
14
14
 
15
15
  # @api private
16
16
  module DefaultPrepare
@@ -15,7 +15,8 @@ module GraphQL
15
15
  when "validate", "analyze_query", "execute_query", "execute_query_lazy"
16
16
  metadata[:query] || metadata[:queries]
17
17
  when "execute_field", "execute_field_lazy"
18
- metadata[:context]
18
+ # The interpreter passes `query:`, legacy passes `context:`
19
+ metadata[:context] || ((q = metadata[:query]) && q.context)
19
20
  else
20
21
  # Custom key, no backtrace data for this
21
22
  nil
@@ -2,9 +2,9 @@
2
2
  module GraphQL
3
3
  module Define
4
4
  module AssignGlobalIdField
5
- def self.call(type_defn, field_name)
5
+ def self.call(type_defn, field_name, **field_kwargs)
6
6
  resolve = GraphQL::Relay::GlobalIdResolve.new(type: type_defn)
7
- GraphQL::Define::AssignObjectField.call(type_defn, field_name, type: GraphQL::ID_TYPE.to_non_null_type, resolve: resolve)
7
+ GraphQL::Define::AssignObjectField.call(type_defn, field_name, **field_kwargs, type: GraphQL::ID_TYPE.to_non_null_type, resolve: resolve)
8
8
  end
9
9
  end
10
10
  end
@@ -93,6 +93,16 @@ module GraphQL
93
93
  tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
94
94
  Interpreter::Resolve.resolve_all(final_values)
95
95
  end
96
+ queries.each do |query|
97
+ runtime = query.context.namespace(:interpreter)[:runtime]
98
+ if runtime
99
+ runtime.delete_interpreter_context(:current_path)
100
+ runtime.delete_interpreter_context(:current_field)
101
+ runtime.delete_interpreter_context(:current_object)
102
+ runtime.delete_interpreter_context(:current_arguments)
103
+ end
104
+ end
105
+ nil
96
106
  end
97
107
 
98
108
  class ListResultFailedError < GraphQL::Error
@@ -14,18 +14,33 @@ module GraphQL
14
14
  # This hash is the one used at runtime.
15
15
  #
16
16
  # @return [Hash<Symbol, Object>]
17
- attr_reader :keyword_arguments
17
+ def keyword_arguments
18
+ @keyword_arguments ||= begin
19
+ kwargs = {}
20
+ argument_values.each do |name, arg_val|
21
+ kwargs[name] = arg_val.value
22
+ end
23
+ kwargs
24
+ end
25
+ end
18
26
 
19
- def initialize(keyword_arguments:, argument_values:)
20
- @keyword_arguments = keyword_arguments
27
+ # @param argument_values [nil, Hash{Symbol => ArgumentValue}]
28
+ def initialize(argument_values:)
21
29
  @argument_values = argument_values
30
+ @empty = argument_values.nil? || argument_values.empty?
22
31
  end
23
32
 
24
33
  # @return [Hash{Symbol => ArgumentValue}]
25
- attr_reader :argument_values
34
+ def argument_values
35
+ @argument_values ||= {}
36
+ end
37
+
38
+ def empty?
39
+ @empty
40
+ end
26
41
 
27
- def_delegators :@keyword_arguments, :key?, :[], :keys, :each, :values
28
- def_delegators :@argument_values, :each_value
42
+ def_delegators :keyword_arguments, :key?, :[], :fetch, :keys, :each, :values
43
+ def_delegators :argument_values, :each_value
29
44
 
30
45
  def inspect
31
46
  "#<#{self.class} @keyword_arguments=#{keyword_arguments.inspect}>"
@@ -29,11 +29,16 @@ module GraphQL
29
29
 
30
30
  private
31
31
 
32
+ NO_ARGUMENTS = {}.freeze
33
+
32
34
  NO_VALUE_GIVEN = Object.new
33
35
 
34
36
  def prepare_args_hash(ast_arg_or_hash_or_value)
35
37
  case ast_arg_or_hash_or_value
36
38
  when Hash
39
+ if ast_arg_or_hash_or_value.empty?
40
+ return NO_ARGUMENTS
41
+ end
37
42
  args_hash = {}
38
43
  ast_arg_or_hash_or_value.each do |k, v|
39
44
  args_hash[k] = prepare_args_hash(v)
@@ -42,6 +47,9 @@ module GraphQL
42
47
  when Array
43
48
  ast_arg_or_hash_or_value.map { |v| prepare_args_hash(v) }
44
49
  when GraphQL::Language::Nodes::Field, GraphQL::Language::Nodes::InputObject, GraphQL::Language::Nodes::Directive
50
+ if ast_arg_or_hash_or_value.arguments.empty?
51
+ return NO_ARGUMENTS
52
+ end
45
53
  args_hash = {}
46
54
  ast_arg_or_hash_or_value.arguments.each do |arg|
47
55
  v = prepare_args_hash(arg.value)
@@ -43,23 +43,24 @@ module GraphQL
43
43
  # might be stored up in lazies.
44
44
  # @return [void]
45
45
  def run_eager
46
-
47
46
  root_operation = query.selected_operation
48
47
  root_op_type = root_operation.operation_type || "query"
49
48
  root_type = schema.root_type_for_operation(root_op_type)
50
49
  path = []
51
- @interpreter_context[:current_object] = query.root_value
52
- @interpreter_context[:current_path] = path
50
+ set_all_interpreter_context(query.root_value, nil, nil, path)
53
51
  object_proxy = authorized_new(root_type, query.root_value, context, path)
54
52
  object_proxy = schema.sync_lazy(object_proxy)
55
53
  if object_proxy.nil?
56
54
  # Root .authorized? returned false.
57
55
  write_in_response(path, nil)
58
- nil
59
56
  else
60
57
  evaluate_selections(path, context.scoped_context, object_proxy, root_type, root_operation.selections, root_operation_type: root_op_type)
61
- nil
62
58
  end
59
+ delete_interpreter_context(:current_path)
60
+ delete_interpreter_context(:current_field)
61
+ delete_interpreter_context(:current_object)
62
+ delete_interpreter_context(:current_arguments)
63
+ nil
63
64
  end
64
65
 
65
66
  def gather_selections(owner_object, owner_type, selections, selections_by_name)
@@ -116,9 +117,10 @@ module GraphQL
116
117
  end
117
118
  end
118
119
 
120
+ NO_ARGS = {}.freeze
121
+
119
122
  def evaluate_selections(path, scoped_context, owner_object, owner_type, selections, root_operation_type: nil)
120
- @interpreter_context[:current_object] = owner_object
121
- @interpreter_context[:current_path] = path
123
+ set_all_interpreter_context(owner_object, nil, nil, path)
122
124
  selections_by_name = {}
123
125
  gather_selections(owner_object, owner_type, selections, selections_by_name)
124
126
  selections_by_name.each do |result_name, field_ast_nodes_or_ast_node|
@@ -157,8 +159,7 @@ module GraphQL
157
159
  # to propagate `null`
158
160
  set_type_at_path(next_path, return_type)
159
161
  # Set this before calling `run_with_directives`, so that the directive can have the latest path
160
- @interpreter_context[:current_path] = next_path
161
- @interpreter_context[:current_field] = field_defn
162
+ set_all_interpreter_context(nil, field_defn, nil, next_path)
162
163
 
163
164
  context.scoped_context = scoped_context
164
165
  object = owner_object
@@ -169,44 +170,50 @@ module GraphQL
169
170
 
170
171
  begin
171
172
  kwarg_arguments = arguments(object, field_defn, ast_node)
172
- rescue GraphQL::ExecutionError => e
173
+ rescue GraphQL::ExecutionError, GraphQL::UnauthorizedError => e
173
174
  continue_value(next_path, e, owner_type, field_defn, return_type.non_null?, ast_node)
174
175
  next
175
176
  end
176
177
 
177
178
  after_lazy(kwarg_arguments, owner: owner_type, field: field_defn, path: next_path, scoped_context: context.scoped_context, owner_object: object, arguments: kwarg_arguments) do |resolved_arguments|
178
- if resolved_arguments.is_a? GraphQL::ExecutionError
179
+ case resolved_arguments
180
+ when GraphQL::ExecutionError, GraphQL::UnauthorizedError
179
181
  continue_value(next_path, resolved_arguments, owner_type, field_defn, return_type.non_null?, ast_node)
180
182
  next
181
183
  end
182
184
 
183
- kwarg_arguments = resolved_arguments.keyword_arguments
184
-
185
- field_defn.extras.each do |extra|
186
- case extra
187
- when :ast_node
188
- kwarg_arguments[:ast_node] = ast_node
189
- when :execution_errors
190
- kwarg_arguments[:execution_errors] = ExecutionErrors.new(context, ast_node, next_path)
191
- when :path
192
- kwarg_arguments[:path] = next_path
193
- when :lookahead
194
- if !field_ast_nodes
195
- field_ast_nodes = [ast_node]
185
+ if resolved_arguments.empty? && field_defn.extras.empty?
186
+ # We can avoid allocating the `{ Symbol => Object }` hash in this case
187
+ kwarg_arguments = NO_ARGS
188
+ else
189
+ kwarg_arguments = resolved_arguments.keyword_arguments
190
+
191
+ field_defn.extras.each do |extra|
192
+ case extra
193
+ when :ast_node
194
+ kwarg_arguments[:ast_node] = ast_node
195
+ when :execution_errors
196
+ kwarg_arguments[:execution_errors] = ExecutionErrors.new(context, ast_node, next_path)
197
+ when :path
198
+ kwarg_arguments[:path] = next_path
199
+ when :lookahead
200
+ if !field_ast_nodes
201
+ field_ast_nodes = [ast_node]
202
+ end
203
+ kwarg_arguments[:lookahead] = Execution::Lookahead.new(
204
+ query: query,
205
+ ast_nodes: field_ast_nodes,
206
+ field: field_defn,
207
+ )
208
+ when :argument_details
209
+ kwarg_arguments[:argument_details] = resolved_arguments
210
+ else
211
+ kwarg_arguments[extra] = field_defn.fetch_extra(extra, context)
196
212
  end
197
- kwarg_arguments[:lookahead] = Execution::Lookahead.new(
198
- query: query,
199
- ast_nodes: field_ast_nodes,
200
- field: field_defn,
201
- )
202
- when :argument_details
203
- kwarg_arguments[:argument_details] = resolved_arguments
204
- else
205
- kwarg_arguments[extra] = field_defn.fetch_extra(extra, context)
206
213
  end
207
214
  end
208
215
 
209
- @interpreter_context[:current_arguments] = kwarg_arguments
216
+ set_all_interpreter_context(nil, nil, kwarg_arguments, nil)
210
217
 
211
218
  # Optimize for the case that field is selected only once
212
219
  if field_ast_nodes.nil? || field_ast_nodes.size == 1
@@ -412,6 +419,21 @@ module GraphQL
412
419
  true
413
420
  end
414
421
 
422
+ def set_all_interpreter_context(object, field, arguments, path)
423
+ if object
424
+ @context[:current_object] = @interpreter_context[:current_object] = object
425
+ end
426
+ if field
427
+ @context[:current_field] = @interpreter_context[:current_field] = field
428
+ end
429
+ if arguments
430
+ @context[:current_arguments] = @interpreter_context[:current_arguments] = arguments
431
+ end
432
+ if path
433
+ @context[:current_path] = @interpreter_context[:current_path] = path
434
+ end
435
+ end
436
+
415
437
  # @param obj [Object] Some user-returned value that may want to be batched
416
438
  # @param path [Array<String>]
417
439
  # @param field [GraphQL::Schema::Field]
@@ -419,16 +441,10 @@ module GraphQL
419
441
  # @param trace [Boolean] If `false`, don't wrap this with field tracing
420
442
  # @return [GraphQL::Execution::Lazy, Object] If loading `object` will be deferred, it's a wrapper over it.
421
443
  def after_lazy(lazy_obj, owner:, field:, path:, scoped_context:, owner_object:, arguments:, eager: false, trace: true, &block)
422
- @interpreter_context[:current_object] = owner_object
423
- @interpreter_context[:current_arguments] = arguments
424
- @interpreter_context[:current_path] = path
425
- @interpreter_context[:current_field] = field
444
+ set_all_interpreter_context(owner_object, field, arguments, path)
426
445
  if schema.lazy?(lazy_obj)
427
446
  lazy = GraphQL::Execution::Lazy.new(path: path, field: field) do
428
- @interpreter_context[:current_path] = path
429
- @interpreter_context[:current_field] = field
430
- @interpreter_context[:current_object] = owner_object
431
- @interpreter_context[:current_arguments] = arguments
447
+ set_all_interpreter_context(owner_object, field, arguments, path)
432
448
  context.scoped_context = scoped_context
433
449
  # Wrap the execution of _this_ method with tracing,
434
450
  # but don't wrap the continuation below
@@ -539,6 +555,18 @@ module GraphQL
539
555
  res && res[:__dead]
540
556
  end
541
557
 
558
+ # Set this pair in the Query context, but also in the interpeter namespace,
559
+ # for compatibility.
560
+ def set_interpreter_context(key, value)
561
+ @interpreter_context[key] = value
562
+ @context[key] = value
563
+ end
564
+
565
+ def delete_interpreter_context(key)
566
+ @interpreter_context.delete(key)
567
+ @context.delete(key)
568
+ end
569
+
542
570
  def resolve_type(type, value, path)
543
571
  trace_payload = { context: context, type: type, object: value, path: path }
544
572
  resolved_type, resolved_value = query.trace("resolve_type", trace_payload) do
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # This error is raised when `Types::Int` is given an input value outside of 32-bit integer range.
4
+ #
5
+ # For really big integer values, consider `GraphQL::Types::BigInt`
6
+ #
7
+ # @see GraphQL::Types::Int which raises this error
8
+ class IntegerDecodingError < GraphQL::RuntimeTypeError
9
+ # The value which couldn't be decoded
10
+ attr_reader :integer_value
11
+
12
+ def initialize(value)
13
+ @integer_value = value
14
+ super("Integer out of bounds: #{value}. \nConsider using GraphQL::Types::BigInt instead.")
15
+ end
16
+ end
17
+ end
@@ -1,6 +1,102 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
3
  module Introspection
4
+ def self.query(include_deprecated_args: false)
5
+ # The introspection query to end all introspection queries, copied from
6
+ # https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js
7
+ <<-QUERY
8
+ query IntrospectionQuery {
9
+ __schema {
10
+ queryType { name }
11
+ mutationType { name }
12
+ subscriptionType { name }
13
+ types {
14
+ ...FullType
15
+ }
16
+ directives {
17
+ name
18
+ description
19
+ locations
20
+ args {
21
+ ...InputValue
22
+ }
23
+ }
24
+ }
25
+ }
26
+ fragment FullType on __Type {
27
+ kind
28
+ name
29
+ description
30
+ fields(includeDeprecated: true) {
31
+ name
32
+ description
33
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
34
+ ...InputValue
35
+ }
36
+ type {
37
+ ...TypeRef
38
+ }
39
+ isDeprecated
40
+ deprecationReason
41
+ }
42
+ inputFields#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
43
+ ...InputValue
44
+ }
45
+ interfaces {
46
+ ...TypeRef
47
+ }
48
+ enumValues(includeDeprecated: true) {
49
+ name
50
+ description
51
+ isDeprecated
52
+ deprecationReason
53
+ }
54
+ possibleTypes {
55
+ ...TypeRef
56
+ }
57
+ }
58
+ fragment InputValue on __InputValue {
59
+ name
60
+ description
61
+ type { ...TypeRef }
62
+ defaultValue
63
+ #{include_deprecated_args ? 'isDeprecated' : ''}
64
+ #{include_deprecated_args ? 'deprecationReason' : ''}
65
+ }
66
+ fragment TypeRef on __Type {
67
+ kind
68
+ name
69
+ ofType {
70
+ kind
71
+ name
72
+ ofType {
73
+ kind
74
+ name
75
+ ofType {
76
+ kind
77
+ name
78
+ ofType {
79
+ kind
80
+ name
81
+ ofType {
82
+ kind
83
+ name
84
+ ofType {
85
+ kind
86
+ name
87
+ ofType {
88
+ kind
89
+ name
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ QUERY
99
+ end
4
100
  end
5
101
  end
6
102