graphql 1.9.21 → 1.10.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +0 -1
- data/lib/generators/graphql/install_generator.rb +0 -1
- data/lib/generators/graphql/mutation_generator.rb +1 -1
- data/lib/generators/graphql/templates/base_field.erb +4 -0
- data/lib/generators/graphql/templates/graphql_controller.erb +0 -5
- data/lib/generators/graphql/templates/mutation.erb +1 -1
- data/lib/generators/graphql/templates/schema.erb +1 -1
- data/lib/graphql.rb +1 -11
- data/lib/graphql/analysis/ast.rb +2 -2
- data/lib/graphql/analysis/ast/analyzer.rb +4 -23
- data/lib/graphql/analysis/ast/max_query_complexity.rb +3 -3
- data/lib/graphql/analysis/ast/max_query_depth.rb +3 -7
- data/lib/graphql/analysis/ast/query_complexity.rb +2 -2
- data/lib/graphql/argument.rb +6 -2
- data/lib/graphql/backtrace/table.rb +10 -2
- data/lib/graphql/base_type.rb +5 -1
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
- data/lib/graphql/define/assign_object_field.rb +2 -2
- data/lib/graphql/define/defined_object_proxy.rb +0 -3
- data/lib/graphql/define/instance_definable.rb +3 -14
- data/lib/graphql/enum_type.rb +4 -0
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +14 -15
- data/lib/graphql/execution/execute.rb +1 -1
- data/lib/graphql/execution/interpreter/runtime.rb +17 -39
- data/lib/graphql/execution/multiplex.rb +3 -3
- data/lib/graphql/field.rb +8 -0
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/function.rb +1 -1
- data/lib/graphql/input_object_type.rb +1 -2
- data/lib/graphql/introspection/entry_points.rb +1 -2
- data/lib/graphql/introspection/input_value_type.rb +27 -9
- data/lib/graphql/introspection/schema_type.rb +1 -2
- data/lib/graphql/language/block_string.rb +2 -2
- data/lib/graphql/language/document_from_schema_definition.rb +5 -11
- data/lib/graphql/language/lexer.rb +48 -49
- data/lib/graphql/language/lexer.rl +48 -49
- data/lib/graphql/language/nodes.rb +11 -14
- data/lib/graphql/language/parser.rb +645 -650
- data/lib/graphql/language/parser.y +7 -8
- data/lib/graphql/language/token.rb +1 -1
- data/lib/graphql/non_null_type.rb +0 -10
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/pagination/active_record_relation_connection.rb +35 -0
- data/lib/graphql/pagination/array_connection.rb +78 -0
- data/lib/graphql/pagination/connection.rb +150 -0
- data/lib/graphql/pagination/connections.rb +103 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +157 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/query.rb +1 -7
- data/lib/graphql/query/arguments.rb +3 -9
- data/lib/graphql/query/context.rb +9 -31
- data/lib/graphql/query/literal_input.rb +29 -10
- data/lib/graphql/query/null_context.rb +0 -4
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query/variables.rb +2 -4
- data/lib/graphql/relay/base_connection.rb +7 -3
- data/lib/graphql/relay/edges_instrumentation.rb +1 -1
- data/lib/graphql/relay/node.rb +2 -2
- data/lib/graphql/relay/relation_connection.rb +5 -9
- data/lib/graphql/schema.rb +27 -68
- data/lib/graphql/schema/argument.rb +31 -5
- data/lib/graphql/schema/base_64_bp.rb +2 -3
- data/lib/graphql/schema/build_from_definition.rb +113 -179
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +10 -4
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/directive.rb +6 -7
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/enum.rb +1 -0
- data/lib/graphql/schema/enum_value.rb +4 -1
- data/lib/graphql/schema/field.rb +37 -39
- data/lib/graphql/schema/field/connection_extension.rb +11 -1
- data/lib/graphql/schema/input_object.rb +2 -5
- data/lib/graphql/schema/interface.rb +2 -0
- data/lib/graphql/schema/introspection_system.rb +1 -4
- data/lib/graphql/schema/loader.rb +6 -12
- data/lib/graphql/schema/member.rb +2 -0
- data/lib/graphql/schema/member/base_dsl_methods.rb +2 -2
- data/lib/graphql/schema/member/build_type.rb +4 -0
- data/lib/graphql/schema/member/cached_graphql_definition.rb +5 -0
- data/lib/graphql/schema/member/has_ast_node.rb +17 -0
- data/lib/graphql/schema/member/has_fields.rb +10 -16
- data/lib/graphql/schema/member/instrumentation.rb +1 -6
- data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
- data/lib/graphql/schema/mutation.rb +1 -1
- data/lib/graphql/schema/object.rb +5 -6
- data/lib/graphql/schema/possible_types.rb +3 -3
- data/lib/graphql/schema/printer.rb +1 -3
- data/lib/graphql/schema/relay_classic_mutation.rb +2 -6
- data/lib/graphql/schema/resolver.rb +5 -35
- data/lib/graphql/schema/scalar.rb +1 -0
- data/lib/graphql/schema/subscription.rb +6 -6
- data/lib/graphql/schema/timeout_middleware.rb +2 -3
- data/lib/graphql/schema/type_expression.rb +27 -17
- data/lib/graphql/schema/union.rb +7 -26
- data/lib/graphql/schema/validation.rb +1 -17
- data/lib/graphql/schema/warden.rb +3 -77
- data/lib/graphql/schema/wrapper.rb +1 -1
- data/lib/graphql/static_validation/definition_dependencies.rb +12 -21
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +9 -4
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +10 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +4 -4
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +3 -3
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -3
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +5 -6
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -1
- data/lib/graphql/subscriptions.rb +7 -7
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +2 -2
- data/lib/graphql/subscriptions/event.rb +5 -19
- data/lib/graphql/subscriptions/instrumentation.rb +9 -4
- data/lib/graphql/subscriptions/subscription_root.rb +2 -10
- data/lib/graphql/tracing/skylight_tracing.rb +0 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/relay/base_connection.rb +3 -1
- data/lib/graphql/union_type.rb +23 -58
- data/lib/graphql/upgrader/member.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- metadata +20 -13
- data/lib/generators/graphql/templates/base_mutation.erb +0 -8
- data/lib/graphql/schema/type_membership.rb +0 -34
@@ -1,7 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'set'
|
4
|
-
|
5
2
|
module GraphQL
|
6
3
|
class Schema
|
7
4
|
# Restrict access to a {GraphQL::Schema} with a user-defined filter.
|
@@ -43,8 +40,7 @@ module GraphQL
|
|
43
40
|
# @param deep_check [Boolean]
|
44
41
|
def initialize(filter, context:, schema:)
|
45
42
|
@schema = schema
|
46
|
-
@
|
47
|
-
@visibility_cache = read_through { |m| filter.call(m, @context) }
|
43
|
+
@visibility_cache = read_through { |m| filter.call(m, context) }
|
48
44
|
end
|
49
45
|
|
50
46
|
# @return [Array<GraphQL::BaseType>] Visible types in the schema
|
@@ -66,17 +62,6 @@ module GraphQL
|
|
66
62
|
@visible_types[type_name]
|
67
63
|
end
|
68
64
|
|
69
|
-
# @return [Array<GraphQL::BaseType>] Visible and reachable types in the schema
|
70
|
-
def reachable_types
|
71
|
-
@reachable_types ||= reachable_type_set.to_a
|
72
|
-
end
|
73
|
-
|
74
|
-
# @return Boolean True if the type is visible and reachable in the schema
|
75
|
-
def reachable_type?(type_name)
|
76
|
-
type = get_type(type_name)
|
77
|
-
type && reachable_type_set.include?(type)
|
78
|
-
end
|
79
|
-
|
80
65
|
# @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`, if it exists
|
81
66
|
def get_field(parent_type, field_name)
|
82
67
|
|
@@ -96,7 +81,7 @@ module GraphQL
|
|
96
81
|
|
97
82
|
# @return [Array<GraphQL::BaseType>] The types which may be member of `type_defn`
|
98
83
|
def possible_types(type_defn)
|
99
|
-
@visible_possible_types ||= read_through { |type_defn| @schema.possible_types(type_defn
|
84
|
+
@visible_possible_types ||= read_through { |type_defn| @schema.possible_types(type_defn).select { |t| visible_type?(t) } }
|
100
85
|
@visible_possible_types[type_defn]
|
101
86
|
end
|
102
87
|
|
@@ -185,7 +170,7 @@ module GraphQL
|
|
185
170
|
end
|
186
171
|
|
187
172
|
def visible_possible_types?(type_defn)
|
188
|
-
@schema.possible_types(type_defn
|
173
|
+
@schema.possible_types(type_defn).any? { |t| visible_type?(t) }
|
189
174
|
end
|
190
175
|
|
191
176
|
def visible?(member)
|
@@ -195,65 +180,6 @@ module GraphQL
|
|
195
180
|
def read_through
|
196
181
|
Hash.new { |h, k| h[k] = yield(k) }
|
197
182
|
end
|
198
|
-
|
199
|
-
def reachable_type_set
|
200
|
-
return @reachable_type_set if defined?(@reachable_type_set)
|
201
|
-
|
202
|
-
@reachable_type_set = Set.new
|
203
|
-
|
204
|
-
unvisited_types = []
|
205
|
-
['query', 'mutation', 'subscription'].each do |op_name|
|
206
|
-
root_type = root_type_for_operation(op_name)
|
207
|
-
unvisited_types << root_type if root_type
|
208
|
-
end
|
209
|
-
unvisited_types.concat(@schema.introspection_system.object_types)
|
210
|
-
@schema.orphan_types.each do |orphan_type|
|
211
|
-
unvisited_types << orphan_type.graphql_definition if get_type(orphan_type.graphql_name)
|
212
|
-
end
|
213
|
-
|
214
|
-
until unvisited_types.empty?
|
215
|
-
type = unvisited_types.pop
|
216
|
-
if @reachable_type_set.add?(type)
|
217
|
-
if type.kind.input_object?
|
218
|
-
# recurse into visible arguments
|
219
|
-
arguments(type).each do |argument|
|
220
|
-
argument_type = argument.type.unwrap
|
221
|
-
unvisited_types << argument_type
|
222
|
-
end
|
223
|
-
elsif type.kind.union?
|
224
|
-
# recurse into visible possible types
|
225
|
-
possible_types(type).each do |possible_type|
|
226
|
-
unvisited_types << possible_type
|
227
|
-
end
|
228
|
-
elsif type.kind.fields?
|
229
|
-
if type.kind.interface?
|
230
|
-
# recurse into visible possible types
|
231
|
-
possible_types(type).each do |possible_type|
|
232
|
-
unvisited_types << possible_type
|
233
|
-
end
|
234
|
-
elsif type.kind.object?
|
235
|
-
# recurse into visible implemented interfaces
|
236
|
-
interfaces(type).each do |interface|
|
237
|
-
unvisited_types << interface
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
# recurse into visible fields
|
242
|
-
fields(type).each do |field|
|
243
|
-
field_type = field.type.unwrap
|
244
|
-
unvisited_types << field_type
|
245
|
-
# recurse into visible arguments
|
246
|
-
arguments(field).each do |argument|
|
247
|
-
argument_type = argument.type.unwrap
|
248
|
-
unvisited_types << argument_type
|
249
|
-
end
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
@reachable_type_set
|
256
|
-
end
|
257
183
|
end
|
258
184
|
end
|
259
185
|
end
|
@@ -11,11 +11,11 @@ module GraphQL
|
|
11
11
|
super
|
12
12
|
@defdep_node_paths = {}
|
13
13
|
|
14
|
-
# { name =>
|
15
|
-
@defdep_fragment_definitions =
|
14
|
+
# { name => node } pairs for fragments
|
15
|
+
@defdep_fragment_definitions = {}
|
16
16
|
|
17
17
|
# This tracks dependencies from fragment to Node where it was used
|
18
|
-
# {
|
18
|
+
# { fragment_definition_node => [dependent_node, dependent_node]}
|
19
19
|
@defdep_dependent_definitions = Hash.new { |h, k| h[k] = Set.new }
|
20
20
|
|
21
21
|
# First-level usages of spreads within definitions
|
@@ -32,7 +32,7 @@ module GraphQL
|
|
32
32
|
def on_document(node, parent)
|
33
33
|
node.definitions.each do |definition|
|
34
34
|
if definition.is_a? GraphQL::Language::Nodes::FragmentDefinition
|
35
|
-
@defdep_fragment_definitions[definition.name]
|
35
|
+
@defdep_fragment_definitions[definition.name] = definition
|
36
36
|
end
|
37
37
|
end
|
38
38
|
super
|
@@ -42,7 +42,7 @@ module GraphQL
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def on_operation_definition(node, prev_node)
|
45
|
-
@defdep_node_paths[node
|
45
|
+
@defdep_node_paths[node] = NodeWithPath.new(node, context.path)
|
46
46
|
@defdep_current_parent = node
|
47
47
|
super
|
48
48
|
@defdep_current_parent = nil
|
@@ -59,7 +59,7 @@ module GraphQL
|
|
59
59
|
@defdep_node_paths[node] = NodeWithPath.new(node, context.path)
|
60
60
|
|
61
61
|
# Track both sides of the dependency
|
62
|
-
@defdep_dependent_definitions[node.name] << @defdep_current_parent
|
62
|
+
@defdep_dependent_definitions[@defdep_fragment_definitions[node.name]] << @defdep_current_parent
|
63
63
|
@defdep_immediate_dependencies[@defdep_current_parent] << node
|
64
64
|
super
|
65
65
|
end
|
@@ -116,28 +116,24 @@ module GraphQL
|
|
116
116
|
dependency_map = DependencyMap.new
|
117
117
|
# Don't allow the loop to run more times
|
118
118
|
# than the number of fragments in the document
|
119
|
-
max_loops =
|
120
|
-
@defdep_fragment_definitions.each_value do |v|
|
121
|
-
max_loops += v.size
|
122
|
-
end
|
123
|
-
|
119
|
+
max_loops = @defdep_fragment_definitions.size
|
124
120
|
loops = 0
|
125
121
|
|
126
122
|
# Instead of tracking independent fragments _as you visit_,
|
127
123
|
# determine them at the end. This way, we can treat fragments with the
|
128
124
|
# same name as if they were the same name. If _any_ of the fragments
|
129
125
|
# with that name has a dependency, we record it.
|
130
|
-
independent_fragment_nodes = @defdep_fragment_definitions.values
|
126
|
+
independent_fragment_nodes = @defdep_fragment_definitions.values - @defdep_immediate_dependencies.keys
|
131
127
|
|
132
128
|
while fragment_node = independent_fragment_nodes.pop
|
133
129
|
loops += 1
|
134
130
|
if loops > max_loops
|
135
|
-
raise("Resolution loops exceeded the number of definitions; infinite loop detected.
|
131
|
+
raise("Resolution loops exceeded the number of definitions; infinite loop detected.")
|
136
132
|
end
|
137
133
|
# Since it's independent, let's remove it from here.
|
138
134
|
# That way, we can use the remainder to identify cycles
|
139
135
|
@defdep_immediate_dependencies.delete(fragment_node)
|
140
|
-
fragment_usages = @defdep_dependent_definitions[fragment_node
|
136
|
+
fragment_usages = @defdep_dependent_definitions[fragment_node]
|
141
137
|
if fragment_usages.empty?
|
142
138
|
# If we didn't record any usages during the visit,
|
143
139
|
# then this fragment is unused.
|
@@ -155,15 +151,10 @@ module GraphQL
|
|
155
151
|
if block_given?
|
156
152
|
yield(definition_node, removed, fragment_node)
|
157
153
|
end
|
158
|
-
if remaining.empty? &&
|
159
|
-
definition_node.is_a?(GraphQL::Language::Nodes::FragmentDefinition) &&
|
160
|
-
definition_node.name != fragment_node.name
|
154
|
+
if remaining.empty? && definition_node.is_a?(GraphQL::Language::Nodes::FragmentDefinition)
|
161
155
|
# If all of this definition's dependencies have
|
162
156
|
# been resolved, we can now resolve its
|
163
157
|
# own dependents.
|
164
|
-
#
|
165
|
-
# But, it's possible to have a duplicate-named fragment here.
|
166
|
-
# Skip it in that case
|
167
158
|
independent_fragment_nodes << definition_node
|
168
159
|
end
|
169
160
|
end
|
@@ -175,7 +166,7 @@ module GraphQL
|
|
175
166
|
# then they're still in there
|
176
167
|
@defdep_immediate_dependencies.each do |defn_node, deps|
|
177
168
|
deps.each do |spread|
|
178
|
-
if
|
169
|
+
if @defdep_fragment_definitions[spread.name].nil?
|
179
170
|
dependency_map.unmet_dependencies[@defdep_node_paths[defn_node]] << @defdep_node_paths[spread]
|
180
171
|
deps.delete(spread)
|
181
172
|
end
|
@@ -11,7 +11,7 @@ module GraphQL
|
|
11
11
|
nil
|
12
12
|
else
|
13
13
|
arg_ret_type = arg_defn.type.unwrap
|
14
|
-
if !arg_ret_type.
|
14
|
+
if !arg_ret_type.kind.input_object?
|
15
15
|
nil
|
16
16
|
else
|
17
17
|
arg_ret_type
|
@@ -54,7 +54,7 @@ module GraphQL
|
|
54
54
|
node.value.arguments.include?(err.ast_value)
|
55
55
|
else
|
56
56
|
# otherwise we just check equality
|
57
|
-
node.value ==
|
57
|
+
node.value == err.ast_value
|
58
58
|
end
|
59
59
|
if !matched
|
60
60
|
# This node isn't the node that caused the error,
|
@@ -67,9 +67,14 @@ module GraphQL
|
|
67
67
|
error ||= begin
|
68
68
|
kind_of_node = node_type(parent)
|
69
69
|
error_arg_name = parent_name(parent, parent_defn)
|
70
|
+
string_value = if node.value == Float::INFINITY
|
71
|
+
""
|
72
|
+
else
|
73
|
+
" (#{GraphQL::Language::Printer.new.print(node.value)})"
|
74
|
+
end
|
70
75
|
|
71
76
|
GraphQL::StaticValidation::ArgumentLiteralsAreCompatibleError.new(
|
72
|
-
"Argument '#{node.name}' on #{kind_of_node} '#{error_arg_name}' has an invalid value. Expected type '#{arg_defn.type}'.",
|
77
|
+
"Argument '#{node.name}' on #{kind_of_node} '#{error_arg_name}' has an invalid value#{string_value}. Expected type '#{arg_defn.type.to_type_signature}'.",
|
73
78
|
nodes: parent,
|
74
79
|
type: kind_of_node,
|
75
80
|
argument: node.name
|
@@ -92,7 +97,7 @@ module GraphQL
|
|
92
97
|
elsif parent.is_a?(GraphQL::Language::Nodes::InputObject)
|
93
98
|
type_defn.name
|
94
99
|
else
|
95
|
-
parent.
|
100
|
+
parent.graphql_name
|
96
101
|
end
|
97
102
|
end
|
98
103
|
|
@@ -10,10 +10,10 @@ module GraphQL
|
|
10
10
|
nil
|
11
11
|
else
|
12
12
|
arg_ret_type = arg_defn.type.unwrap
|
13
|
-
if
|
14
|
-
nil
|
15
|
-
else
|
13
|
+
if arg_ret_type.kind.input_object?
|
16
14
|
arg_ret_type
|
15
|
+
else
|
16
|
+
nil
|
17
17
|
end
|
18
18
|
end
|
19
19
|
when GraphQL::Language::Nodes::Directive
|
@@ -45,12 +45,15 @@ module GraphQL
|
|
45
45
|
private
|
46
46
|
|
47
47
|
def parent_name(parent, type_defn)
|
48
|
-
|
48
|
+
case parent
|
49
|
+
when GraphQL::Language::Nodes::Field
|
49
50
|
parent.alias || parent.name
|
50
|
-
|
51
|
-
type_defn.
|
52
|
-
|
51
|
+
when GraphQL::Language::Nodes::InputObject
|
52
|
+
type_defn.graphql_name
|
53
|
+
when GraphQL::Language::Nodes::Argument, GraphQL::Language::Nodes::Directive
|
53
54
|
parent.name
|
55
|
+
else
|
56
|
+
raise "Invariant: Unexpected parent #{parent.inspect} (#{parent.class})"
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
@@ -56,7 +56,7 @@ module GraphQL
|
|
56
56
|
"'@#{directive_defn.graphql_name}' can't be applied to #{location_name} (allowed: #{allowed_location_names.join(", ")})",
|
57
57
|
nodes: directive_ast,
|
58
58
|
target: location_name,
|
59
|
-
name: directive_defn.
|
59
|
+
name: directive_defn.graphql_name
|
60
60
|
))
|
61
61
|
end
|
62
62
|
end
|
@@ -27,12 +27,12 @@ module GraphQL
|
|
27
27
|
nil
|
28
28
|
elsif resolved_type.kind.scalar? && ast_node.selections.any?
|
29
29
|
if ast_node.selections.first.is_a?(GraphQL::Language::Nodes::InlineFragment)
|
30
|
-
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.
|
30
|
+
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.graphql_name} but has inline fragments [#{ast_node.selections.map(&:type).map(&:name).join(", ")}])"
|
31
31
|
else
|
32
|
-
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.
|
32
|
+
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.graphql_name} but has selections [#{ast_node.selections.map(&:name).join(", ")}])"
|
33
33
|
end
|
34
34
|
elsif resolved_type.kind.fields? && ast_node.selections.empty?
|
35
|
-
"Field must have selections (%{node_name} returns #{resolved_type.
|
35
|
+
"Field must have selections (%{node_name} returns #{resolved_type.graphql_name} but has no selections. Did you mean '#{ast_node.name} { ... }'?)"
|
36
36
|
else
|
37
37
|
nil
|
38
38
|
end
|
@@ -55,13 +55,13 @@ module GraphQL
|
|
55
55
|
"name": node_name.to_s
|
56
56
|
}
|
57
57
|
unless resolved_type.nil?
|
58
|
-
extensions["type"] = resolved_type.
|
58
|
+
extensions["type"] = resolved_type.to_type_signature
|
59
59
|
end
|
60
60
|
add_error(GraphQL::StaticValidation::FieldsHaveAppropriateSelectionsError.new(
|
61
61
|
msg % { node_name: node_name },
|
62
62
|
nodes: ast_node,
|
63
63
|
node_name: node_name.to_s,
|
64
|
-
type: resolved_type.nil? ? nil : resolved_type.
|
64
|
+
type: resolved_type.nil? ? nil : resolved_type.graphql_name,
|
65
65
|
))
|
66
66
|
false
|
67
67
|
else
|
@@ -93,8 +93,8 @@ module GraphQL
|
|
93
93
|
|
94
94
|
return if fragment1.nil? || fragment2.nil?
|
95
95
|
|
96
|
-
fragment_type1 = context.
|
97
|
-
fragment_type2 = context.
|
96
|
+
fragment_type1 = context.warden.get_type(fragment1.type.name)
|
97
|
+
fragment_type2 = context.warden.get_type(fragment2.type.name)
|
98
98
|
|
99
99
|
return if fragment_type1.nil? || fragment_type2.nil?
|
100
100
|
|
@@ -146,7 +146,7 @@ module GraphQL
|
|
146
146
|
fragment = context.fragments[fragment_name]
|
147
147
|
return if fragment.nil?
|
148
148
|
|
149
|
-
fragment_type = context.
|
149
|
+
fragment_type = context.warden.get_type(fragment.type.name)
|
150
150
|
return if fragment_type.nil?
|
151
151
|
|
152
152
|
fragment_fields, fragment_spreads = fields_and_fragments_from_selection(fragment, owner_type: fragment_type, parents: [*fragment_spread.parents, fragment_type])
|
@@ -316,7 +316,7 @@ module GraphQL
|
|
316
316
|
definition = context.schema.get_field(owner_type, node.name)
|
317
317
|
fields << Field.new(node, definition, owner_type, parents)
|
318
318
|
when GraphQL::Language::Nodes::InlineFragment
|
319
|
-
fragment_type = node.type ? context.
|
319
|
+
fragment_type = node.type ? context.warden.get_type(node.type.name) : owner_type
|
320
320
|
find_fields_and_fragments(node.selections, parents: [*parents, fragment_type], owner_type: owner_type, fields: fields, fragment_spreads: fragment_spreads) if fragment_type
|
321
321
|
when GraphQL::Language::Nodes::FragmentSpread
|
322
322
|
fragment_spreads << FragmentSpread.new(node.name, parents)
|
@@ -46,10 +46,10 @@ module GraphQL
|
|
46
46
|
path = [*context.path, missing_field]
|
47
47
|
missing_field_type = parent_type.arguments[missing_field].type
|
48
48
|
add_error(RequiredInputObjectAttributesArePresentError.new(
|
49
|
-
"Argument '#{missing_field}' on InputObject '#{parent_type}' is required. Expected type #{missing_field_type}",
|
49
|
+
"Argument '#{missing_field}' on InputObject '#{parent_type.to_type_signature}' is required. Expected type #{missing_field_type.to_type_signature}",
|
50
50
|
argument_name: missing_field,
|
51
|
-
argument_type: missing_field_type.
|
52
|
-
input_object_type: parent_type.
|
51
|
+
argument_type: missing_field_type.to_type_signature,
|
52
|
+
input_object_type: parent_type.to_type_signature,
|
53
53
|
path: path,
|
54
54
|
nodes: ast_node,
|
55
55
|
))
|
@@ -13,7 +13,7 @@ module GraphQL
|
|
13
13
|
error_type: VariableDefaultValuesAreCorrectlyTypedError::VIOLATIONS[:INVALID_ON_NON_NULL]
|
14
14
|
))
|
15
15
|
else
|
16
|
-
type = context.schema.type_from_ast(node.type)
|
16
|
+
type = context.schema.type_from_ast(node.type, context: context)
|
17
17
|
if type.nil?
|
18
18
|
# This is handled by another validator
|
19
19
|
else
|
@@ -26,13 +26,13 @@ module GraphQL
|
|
26
26
|
end
|
27
27
|
|
28
28
|
if !valid
|
29
|
-
error_message ||= "Default value for $#{node.name} doesn't match type #{type}"
|
29
|
+
error_message ||= "Default value for $#{node.name} doesn't match type #{type.to_type_signature}"
|
30
30
|
VariableDefaultValuesAreCorrectlyTypedError
|
31
31
|
add_error(GraphQL::StaticValidation::VariableDefaultValuesAreCorrectlyTypedError.new(
|
32
32
|
error_message,
|
33
33
|
nodes: node,
|
34
34
|
name: node.name,
|
35
|
-
type: type.
|
35
|
+
type: type.to_type_signature,
|
36
36
|
error_type: VariableDefaultValuesAreCorrectlyTypedError::VIOLATIONS[:INVALID_TYPE]
|
37
37
|
))
|
38
38
|
end
|
@@ -52,17 +52,16 @@ module GraphQL
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def validate_usage(arguments, arg_node, ast_var)
|
55
|
-
var_type = context.schema.type_from_ast(ast_var.type)
|
55
|
+
var_type = context.schema.type_from_ast(ast_var.type, context: context)
|
56
56
|
if var_type.nil?
|
57
57
|
return
|
58
58
|
end
|
59
59
|
if !ast_var.default_value.nil?
|
60
|
-
unless var_type.
|
60
|
+
unless var_type.kind.non_null?
|
61
61
|
# If the value is required, but the argument is not,
|
62
62
|
# and yet there's a non-nil default, then we impliclty
|
63
63
|
# make the argument also a required type.
|
64
|
-
|
65
|
-
var_type = GraphQL::NonNullType.new(of_type: var_type)
|
64
|
+
var_type = var_type.to_non_null_type
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
@@ -85,10 +84,10 @@ module GraphQL
|
|
85
84
|
|
86
85
|
def create_error(error_message, var_type, ast_var, arg_defn, arg_node)
|
87
86
|
add_error(GraphQL::StaticValidation::VariableUsagesAreAllowedError.new(
|
88
|
-
"#{error_message} on variable $#{ast_var.name} and argument #{arg_node.name} (#{var_type.
|
87
|
+
"#{error_message} on variable $#{ast_var.name} and argument #{arg_node.name} (#{var_type.to_type_signature} / #{arg_defn.type.to_type_signature})",
|
89
88
|
nodes: arg_node,
|
90
89
|
name: ast_var.name,
|
91
|
-
type: var_type.
|
90
|
+
type: var_type.to_type_signature,
|
92
91
|
argument: arg_node.name,
|
93
92
|
error: error_message
|
94
93
|
))
|
@@ -15,7 +15,7 @@ module GraphQL
|
|
15
15
|
))
|
16
16
|
elsif !type.kind.input?
|
17
17
|
add_error(GraphQL::StaticValidation::VariablesAreInputTypesError.new(
|
18
|
-
"#{type.
|
18
|
+
"#{type.graphql_name} isn't a valid input type (on $#{node.name})",
|
19
19
|
nodes: node,
|
20
20
|
name: node.name,
|
21
21
|
type: type_name
|