graphql 0.19.3 → 0.19.4
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.
- checksums.yaml +4 -4
- data/lib/graphql/analysis/max_query_complexity.rb +1 -1
- data/lib/graphql/analysis/max_query_depth.rb +1 -1
- data/lib/graphql/boolean_type.rb +2 -2
- data/lib/graphql/define/instance_definable.rb +2 -2
- data/lib/graphql/enum_type.rb +3 -3
- data/lib/graphql/field.rb +6 -6
- data/lib/graphql/float_type.rb +2 -2
- data/lib/graphql/id_type.rb +2 -2
- data/lib/graphql/input_object_type.rb +1 -1
- data/lib/graphql/int_type.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +12 -12
- data/lib/graphql/introspection/arguments_field.rb +1 -1
- data/lib/graphql/introspection/enum_value_type.rb +1 -1
- data/lib/graphql/introspection/enum_values_field.rb +1 -1
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/fields_field.rb +1 -1
- data/lib/graphql/introspection/input_fields_field.rb +1 -1
- data/lib/graphql/introspection/input_value_type.rb +2 -2
- data/lib/graphql/introspection/interfaces_field.rb +1 -1
- data/lib/graphql/introspection/of_type_field.rb +1 -1
- data/lib/graphql/introspection/possible_types_field.rb +1 -1
- data/lib/graphql/introspection/schema_field.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +5 -5
- data/lib/graphql/introspection/type_by_name_field.rb +1 -1
- data/lib/graphql/introspection/type_type.rb +6 -6
- data/lib/graphql/introspection/typename_field.rb +1 -1
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/language/comments.rb +44 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/generation.rb +35 -12
- data/lib/graphql/language/lexer.rb +29 -10
- data/lib/graphql/language/lexer.rl +25 -6
- data/lib/graphql/language/nodes.rb +30 -23
- data/lib/graphql/language/parser.rb +33 -14
- data/lib/graphql/language/parser.y +33 -14
- data/lib/graphql/language/parser_tests.rb +86 -2
- data/lib/graphql/language/token.rb +3 -2
- data/lib/graphql/language/visitor.rb +3 -3
- data/lib/graphql/object_type.rb +1 -1
- data/lib/graphql/query/arguments.rb +23 -2
- data/lib/graphql/query/serial_execution/field_resolution.rb +31 -14
- data/lib/graphql/relay/base_connection.rb +1 -3
- data/lib/graphql/relay/connection_type.rb +1 -1
- data/lib/graphql/relay/mutation.rb +1 -1
- data/lib/graphql/relay/relation_connection.rb +7 -3
- data/lib/graphql/scalar_type.rb +1 -1
- data/lib/graphql/schema.rb +19 -8
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/printer.rb +63 -8
- data/lib/graphql/schema/timeout_middleware.rb +11 -11
- data/lib/graphql/schema/validation.rb +12 -12
- data/lib/graphql/static_validation/arguments_validator.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +3 -2
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +1 -1
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +9 -4
- data/lib/graphql/static_validation/rules/fragments_are_named.rb +1 -1
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +3 -3
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +2 -2
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
- 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 +6 -6
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/string_type.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/graphql/analysis/analyze_query_spec.rb +3 -3
- data/spec/graphql/analysis/query_complexity_spec.rb +7 -7
- data/spec/graphql/introspection/directive_type_spec.rb +2 -2
- data/spec/graphql/introspection/introspection_query_spec.rb +26 -26
- data/spec/graphql/language/generation_spec.rb +137 -53
- data/spec/graphql/language/lexer_spec.rb +22 -0
- data/spec/graphql/language/visitor_spec.rb +6 -6
- data/spec/graphql/query/arguments_spec.rb +45 -1
- data/spec/graphql/query/context_spec.rb +4 -4
- data/spec/graphql/query/executor_spec.rb +1 -1
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +2 -2
- data/spec/graphql/relay/node_spec.rb +2 -2
- data/spec/graphql/relay/relation_connection_spec.rb +16 -0
- data/spec/graphql/schema/loader_spec.rb +2 -2
- data/spec/graphql/schema/middleware_chain_spec.rb +6 -6
- data/spec/graphql/schema/printer_spec.rb +268 -18
- data/spec/graphql/schema/rescue_middleware_spec.rb +1 -1
- data/spec/graphql/schema/timeout_middleware_spec.rb +2 -2
- data/spec/graphql/schema_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +13 -0
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +1 -1
- data/spec/graphql/static_validation/type_stack_spec.rb +1 -1
- data/spec/support/dairy_app.rb +25 -25
- data/spec/support/dairy_data.rb +2 -0
- data/spec/support/star_wars_data.rb +2 -1
- data/spec/support/star_wars_schema.rb +18 -18
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3f2d2dc23cdfa7b6f59817c772e9cbbc8929447
|
4
|
+
data.tar.gz: 0146b502d79a48556674a21a611abc6ea37c8519
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 145639836758f14f8e9d44aebe76d1309de31f59f86297122c267c1e7e5ab2b0a422a7b739977d63f81717da188cba2aec0bf68848139b1056f01904a58692c2
|
7
|
+
data.tar.gz: ee6cb851183047974482f5e5d8da78c3e822d008cfbae67669e6938f1dcbfb10eec45e979155ec00e775e560892d9b94c461fe42dcd81ab6670c14b606eecefb
|
@@ -11,7 +11,7 @@ module GraphQL
|
|
11
11
|
#
|
12
12
|
class MaxQueryComplexity < GraphQL::Analysis::QueryComplexity
|
13
13
|
def initialize(max_complexity)
|
14
|
-
disallow_excessive_complexity = ->
|
14
|
+
disallow_excessive_complexity = ->(query, complexity) {
|
15
15
|
if complexity > max_complexity
|
16
16
|
GraphQL::AnalysisError.new("Query has complexity of #{complexity}, which exceeds max complexity of #{max_complexity}")
|
17
17
|
else
|
@@ -11,7 +11,7 @@ module GraphQL
|
|
11
11
|
#
|
12
12
|
class MaxQueryDepth < GraphQL::Analysis::QueryDepth
|
13
13
|
def initialize(max_depth)
|
14
|
-
disallow_excessive_depth = ->
|
14
|
+
disallow_excessive_depth = ->(query, depth) {
|
15
15
|
if depth > max_depth
|
16
16
|
GraphQL::AnalysisError.new("Query has depth of #{depth}, which exceeds max depth of #{max_depth}")
|
17
17
|
else
|
data/lib/graphql/boolean_type.rb
CHANGED
@@ -2,6 +2,6 @@ GraphQL::BOOLEAN_TYPE = GraphQL::ScalarType.define do
|
|
2
2
|
name "Boolean"
|
3
3
|
description "Represents `true` or `false` values."
|
4
4
|
|
5
|
-
coerce_input ->
|
6
|
-
coerce_result ->
|
5
|
+
coerce_input ->(value) { (value == true || value == false) ? value : nil }
|
6
|
+
coerce_result ->(value) { !!value }
|
7
7
|
end
|
@@ -25,7 +25,7 @@ module GraphQL
|
|
25
25
|
# # These attrs will be defined with plain setters, `{attr}=`
|
26
26
|
# :make, :model,
|
27
27
|
# # This attr has a custom definition which applies the config to the target
|
28
|
-
# doors: ->
|
28
|
+
# doors: ->(car, doors_count) { doors_count.times { car.doors << Door.new } }
|
29
29
|
# )
|
30
30
|
#
|
31
31
|
# def initialize
|
@@ -85,7 +85,7 @@ module GraphQL
|
|
85
85
|
# make sure the previous definition_proc was executed:
|
86
86
|
ensure_defined
|
87
87
|
|
88
|
-
@definition_proc = ->
|
88
|
+
@definition_proc = ->(obj) {
|
89
89
|
kwargs.each do |keyword, value|
|
90
90
|
public_send(keyword, value)
|
91
91
|
end
|
data/lib/graphql/enum_type.rb
CHANGED
@@ -28,7 +28,7 @@ module GraphQL
|
|
28
28
|
# @example Defining an enum input
|
29
29
|
# field :coders, types[CoderType] do
|
30
30
|
# argument :knowing, types[LanguageType]
|
31
|
-
# resolve ->
|
31
|
+
# resolve ->(obj, args, ctx) {
|
32
32
|
# Coder.where(language: args[:knowing])
|
33
33
|
# }
|
34
34
|
# end
|
@@ -51,7 +51,7 @@ module GraphQL
|
|
51
51
|
#
|
52
52
|
# # Now, resolve functions will receive `:rb` instead of `"RUBY"`
|
53
53
|
# field :favoriteLanguage, LanguageEnum
|
54
|
-
# resolve ->
|
54
|
+
# resolve ->(obj, args, ctx) {
|
55
55
|
# args[:favoriteLanguage] # => :rb
|
56
56
|
# }
|
57
57
|
#
|
@@ -91,7 +91,7 @@ module GraphQL
|
|
91
91
|
result = GraphQL::Query::InputValidationResult.new
|
92
92
|
|
93
93
|
if !@values_by_name.key?(value_name)
|
94
|
-
result.add_problem("Expected #{JSON.
|
94
|
+
result.add_problem("Expected #{JSON.generate(value_name, quirks_mode: true)} to be one of: #{@values_by_name.keys.join(', ')}")
|
95
95
|
end
|
96
96
|
|
97
97
|
result
|
data/lib/graphql/field.rb
CHANGED
@@ -55,7 +55,7 @@ module GraphQL
|
|
55
55
|
# @example Create a field with an argument
|
56
56
|
# field :students, types[StudentType] do
|
57
57
|
# argument :grade, types.Int
|
58
|
-
# resolve ->
|
58
|
+
# resolve ->(obj, args, ctx) {
|
59
59
|
# Student.where(grade: args[:grade])
|
60
60
|
# }
|
61
61
|
# end
|
@@ -66,7 +66,7 @@ module GraphQL
|
|
66
66
|
# field :events, types[EventType] do
|
67
67
|
# # by default, don't include past events
|
68
68
|
# argument :includePast, types.Boolean, default_value: false
|
69
|
-
# resolve ->
|
69
|
+
# resolve ->(obj, args, ctx) {
|
70
70
|
# args[:includePast] # => false if no value was provided in the query
|
71
71
|
# # ...
|
72
72
|
# }
|
@@ -95,14 +95,14 @@ module GraphQL
|
|
95
95
|
#
|
96
96
|
# # Or inside the block:
|
97
97
|
# field :expensive_calculation_2, !types.Int do
|
98
|
-
# complexity ->
|
98
|
+
# complexity ->(ctx, args, child_complexity) { ctx[:current_user].staff? ? 0 : 10 }
|
99
99
|
# end
|
100
100
|
#
|
101
101
|
# @example Calculating the complexity of a list field
|
102
102
|
# field :items, types[ItemType] do
|
103
103
|
# argument :limit, !types.Int
|
104
104
|
# # Mulitply the child complexity by the possible items on the list
|
105
|
-
# complexity ->
|
105
|
+
# complexity ->(ctx, args, child_complexity) { child_complexity * args[:limit] }
|
106
106
|
# end
|
107
107
|
#
|
108
108
|
# @example Creating a field, then assigning it to a type
|
@@ -110,7 +110,7 @@ module GraphQL
|
|
110
110
|
# name("Name")
|
111
111
|
# type(!types.String)
|
112
112
|
# description("The name of this thing")
|
113
|
-
# resolve ->
|
113
|
+
# resolve ->(object, arguments, context) { object.name }
|
114
114
|
# end
|
115
115
|
#
|
116
116
|
# NamedType = GraphQL::ObjectType.define do
|
@@ -142,7 +142,7 @@ module GraphQL
|
|
142
142
|
# @return [GraphQL::Relay::Mutation, nil] The mutation this field was derived from, if it was derived from a mutation
|
143
143
|
|
144
144
|
# @!attribute complexity
|
145
|
-
# @return [Numeric, Proc] The complexity for this field (default: 1), as a constant or a proc like `->
|
145
|
+
# @return [Numeric, Proc] The complexity for this field (default: 1), as a constant or a proc like `->(query_ctx, args, child_complexity) { } # Numeric`
|
146
146
|
|
147
147
|
def initialize
|
148
148
|
@complexity = 1
|
data/lib/graphql/float_type.rb
CHANGED
@@ -2,6 +2,6 @@ GraphQL::FLOAT_TYPE = GraphQL::ScalarType.define do
|
|
2
2
|
name "Float"
|
3
3
|
description "Represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point)."
|
4
4
|
|
5
|
-
coerce_input ->
|
6
|
-
coerce_result ->
|
5
|
+
coerce_input ->(value) { value.is_a?(Numeric) ? value.to_f : nil }
|
6
|
+
coerce_result ->(value) { value.to_f }
|
7
7
|
end
|
data/lib/graphql/id_type.rb
CHANGED
@@ -2,8 +2,8 @@ GraphQL::ID_TYPE = GraphQL::ScalarType.define do
|
|
2
2
|
name "ID"
|
3
3
|
description "Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"VXNlci0xMA==\"`) or integer (such as `4`) input value will be accepted as an ID."
|
4
4
|
|
5
|
-
coerce_result ->
|
6
|
-
coerce_input ->
|
5
|
+
coerce_result ->(value) { value.to_s }
|
6
|
+
coerce_input ->(value) {
|
7
7
|
case value
|
8
8
|
when String, Fixnum, Bignum
|
9
9
|
value.to_s
|
@@ -15,7 +15,7 @@ module GraphQL
|
|
15
15
|
# In a `resolve` function, you can access the values by making nested lookups on `args`.
|
16
16
|
#
|
17
17
|
# @example Accessing input values in a resolve function
|
18
|
-
# resolve ->
|
18
|
+
# resolve ->(obj, args, ctx) {
|
19
19
|
# args[:player][:name] # => "Tony Gwynn"
|
20
20
|
# args[:player][:number] # => 19
|
21
21
|
# args[:player].to_h # { "name" => "Tony Gwynn", "number" => 19 }
|
data/lib/graphql/int_type.rb
CHANGED
@@ -2,6 +2,6 @@ GraphQL::INT_TYPE = GraphQL::ScalarType.define do
|
|
2
2
|
name "Int"
|
3
3
|
description "Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1."
|
4
4
|
|
5
|
-
coerce_input ->
|
6
|
-
coerce_result ->
|
5
|
+
coerce_input ->(value) { value.is_a?(Numeric) ? value.to_i : nil }
|
6
|
+
coerce_result ->(value) { value.to_i }
|
7
7
|
end
|
@@ -31,7 +31,7 @@ module GraphQL
|
|
31
31
|
def validate(context)
|
32
32
|
visitor = context.visitor
|
33
33
|
|
34
|
-
visitor[Nodes::OperationDefinition].enter << ->
|
34
|
+
visitor[Nodes::OperationDefinition].enter << ->(ast_node, prev_ast_node) {
|
35
35
|
node = Node.new(
|
36
36
|
return_type: context.type_definition && context.type_definition.unwrap,
|
37
37
|
ast_node: ast_node,
|
@@ -42,7 +42,7 @@ module GraphQL
|
|
42
42
|
@operations[ast_node.name] = node
|
43
43
|
}
|
44
44
|
|
45
|
-
visitor[Nodes::Field].enter << ->
|
45
|
+
visitor[Nodes::Field].enter << ->(ast_node, prev_ast_node) {
|
46
46
|
parent_node = @nodes.last
|
47
47
|
node_name = ast_node.alias || ast_node.name
|
48
48
|
# This node might not be novel, eg inside an inline fragment
|
@@ -64,11 +64,11 @@ module GraphQL
|
|
64
64
|
@parent_directives.push([])
|
65
65
|
}
|
66
66
|
|
67
|
-
visitor[Nodes::InlineFragment].enter << ->
|
67
|
+
visitor[Nodes::InlineFragment].enter << ->(ast_node, prev_ast_node) {
|
68
68
|
@parent_directives.push(InlineFragmentDirectives.new)
|
69
69
|
}
|
70
70
|
|
71
|
-
visitor[Nodes::Directive].enter << ->
|
71
|
+
visitor[Nodes::Directive].enter << ->(ast_node, prev_ast_node) {
|
72
72
|
# It could be a query error where a directive is somewhere it shouldn't be
|
73
73
|
if @parent_directives.any?
|
74
74
|
directive_irep_node = Node.new(
|
@@ -83,7 +83,7 @@ module GraphQL
|
|
83
83
|
end
|
84
84
|
}
|
85
85
|
|
86
|
-
visitor[Nodes::FragmentSpread].enter << ->
|
86
|
+
visitor[Nodes::FragmentSpread].enter << ->(ast_node, prev_ast_node) {
|
87
87
|
parent_node = @nodes.last
|
88
88
|
# Record _both sides_ of the dependency
|
89
89
|
spread_node = Node.new(
|
@@ -100,7 +100,7 @@ module GraphQL
|
|
100
100
|
@parent_directives.push([])
|
101
101
|
}
|
102
102
|
|
103
|
-
visitor[Nodes::FragmentDefinition].enter << ->
|
103
|
+
visitor[Nodes::FragmentDefinition].enter << ->(ast_node, prev_ast_node) {
|
104
104
|
node = Node.new(
|
105
105
|
parent: nil,
|
106
106
|
name: ast_node.name,
|
@@ -111,11 +111,11 @@ module GraphQL
|
|
111
111
|
@fragments[ast_node.name] = node
|
112
112
|
}
|
113
113
|
|
114
|
-
visitor[Nodes::InlineFragment].leave << ->
|
114
|
+
visitor[Nodes::InlineFragment].leave << ->(ast_node, prev_ast_node) {
|
115
115
|
@parent_directives.pop
|
116
116
|
}
|
117
117
|
|
118
|
-
visitor[Nodes::FragmentSpread].leave << ->
|
118
|
+
visitor[Nodes::FragmentSpread].leave << ->(ast_node, prev_ast_node) {
|
119
119
|
# Capture any directives that apply to this spread
|
120
120
|
# so that they can be applied to fields when
|
121
121
|
# the fragment is merged in later
|
@@ -125,7 +125,7 @@ module GraphQL
|
|
125
125
|
spread_node.directives.merge(applicable_directives)
|
126
126
|
}
|
127
127
|
|
128
|
-
visitor[Nodes::FragmentDefinition].leave << ->
|
128
|
+
visitor[Nodes::FragmentDefinition].leave << ->(ast_node, prev_ast_node) {
|
129
129
|
# This fragment doesn't depend on any others,
|
130
130
|
# we should save it as the starting point for dependency resolution
|
131
131
|
frag_node = @nodes.pop
|
@@ -134,11 +134,11 @@ module GraphQL
|
|
134
134
|
end
|
135
135
|
}
|
136
136
|
|
137
|
-
visitor[Nodes::OperationDefinition].leave << ->
|
137
|
+
visitor[Nodes::OperationDefinition].leave << ->(ast_node, prev_ast_node) {
|
138
138
|
@nodes.pop
|
139
139
|
}
|
140
140
|
|
141
|
-
visitor[Nodes::Field].leave << ->
|
141
|
+
visitor[Nodes::Field].leave << ->(ast_node, prev_ast_node) {
|
142
142
|
# Pop this field's node
|
143
143
|
# and record any directives that were visited
|
144
144
|
# during this field & before it (eg, inline fragments)
|
@@ -148,7 +148,7 @@ module GraphQL
|
|
148
148
|
field_node.included ||= GraphQL::Execution::DirectiveChecks.include?(applicable_directives, context.query)
|
149
149
|
}
|
150
150
|
|
151
|
-
visitor[Nodes::Document].leave << ->
|
151
|
+
visitor[Nodes::Document].leave << ->(ast_node, prev_ast_node) {
|
152
152
|
# Resolve fragment dependencies. Start with fragments with no
|
153
153
|
# dependencies and work along the spreads.
|
154
154
|
while fragment_node = @independent_fragments.pop
|
@@ -6,7 +6,7 @@ GraphQL::Introspection::EnumValueType = GraphQL::ObjectType.define do
|
|
6
6
|
field :name, !types.String
|
7
7
|
field :description, types.String
|
8
8
|
field :isDeprecated, !types.Boolean do
|
9
|
-
resolve ->
|
9
|
+
resolve ->(obj, a, c) { !!obj.deprecation_reason }
|
10
10
|
end
|
11
11
|
field :deprecationReason, types.String, property: :deprecation_reason
|
12
12
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
GraphQL::Introspection::EnumValuesField = GraphQL::Field.define do
|
2
2
|
type types[!GraphQL::Introspection::EnumValueType]
|
3
3
|
argument :includeDeprecated, types.Boolean, default_value: false
|
4
|
-
resolve ->
|
4
|
+
resolve ->(object, arguments, context) do
|
5
5
|
return nil if !object.kind.enum?
|
6
6
|
fields = object.values.values
|
7
7
|
if !arguments["includeDeprecated"]
|
@@ -7,7 +7,7 @@ GraphQL::Introspection::FieldType = GraphQL::ObjectType.define do
|
|
7
7
|
field :args, GraphQL::Introspection::ArgumentsField
|
8
8
|
field :type, !GraphQL::Introspection::TypeType
|
9
9
|
field :isDeprecated, !types.Boolean do
|
10
|
-
resolve ->
|
10
|
+
resolve ->(obj, a, c) { !!obj.deprecation_reason }
|
11
11
|
end
|
12
12
|
field :deprecationReason, types.String, property: :deprecation_reason
|
13
13
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
GraphQL::Introspection::FieldsField = GraphQL::Field.define do
|
2
2
|
type -> { types[!GraphQL::Introspection::FieldType] }
|
3
3
|
argument :includeDeprecated, GraphQL::BOOLEAN_TYPE, default_value: false
|
4
|
-
resolve ->
|
4
|
+
resolve ->(object, arguments, context) {
|
5
5
|
return nil if !object.kind.fields?
|
6
6
|
fields = object.all_fields
|
7
7
|
if !arguments["includeDeprecated"]
|
@@ -1,7 +1,7 @@
|
|
1
1
|
GraphQL::Introspection::InputFieldsField = GraphQL::Field.define do
|
2
2
|
name "inputFields"
|
3
3
|
type types[!GraphQL::Introspection::InputValueType]
|
4
|
-
resolve ->
|
4
|
+
resolve ->(target, a, c) {
|
5
5
|
if target.kind.input_object?
|
6
6
|
target.input_fields.values
|
7
7
|
else
|
@@ -7,9 +7,9 @@ GraphQL::Introspection::InputValueType = GraphQL::ObjectType.define do
|
|
7
7
|
field :description, types.String
|
8
8
|
field :type, !GraphQL::Introspection::TypeType
|
9
9
|
field :defaultValue, types.String, "A GraphQL-formatted string representing the default value for this input value." do
|
10
|
-
resolve ->
|
10
|
+
resolve ->(obj, args, ctx) {
|
11
11
|
value = obj.default_value
|
12
|
-
value.nil? ? nil : JSON.
|
12
|
+
value.nil? ? nil : JSON.generate(obj.type.coerce_result(value), quirks_mode: true)
|
13
13
|
}
|
14
14
|
end
|
15
15
|
end
|
@@ -1,4 +1,4 @@
|
|
1
1
|
GraphQL::Introspection::InterfacesField = GraphQL::Field.define do
|
2
2
|
type -> { types[!GraphQL::Introspection::TypeType] }
|
3
|
-
resolve ->
|
3
|
+
resolve ->(target, a, c) { target.kind.object? ? target.interfaces : nil }
|
4
4
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
GraphQL::Introspection::OfTypeField = GraphQL::Field.define do
|
2
2
|
name "ofType"
|
3
3
|
type -> { GraphQL::Introspection::TypeType }
|
4
|
-
resolve ->
|
4
|
+
resolve ->(obj, args, ctx) { obj.kind.wraps? ? obj.of_type : nil }
|
5
5
|
end
|
@@ -5,22 +5,22 @@ GraphQL::Introspection::SchemaType = GraphQL::ObjectType.define do
|
|
5
5
|
"query, mutation, and subscription operations."
|
6
6
|
|
7
7
|
field :types, !types[!GraphQL::Introspection::TypeType], "A list of all types supported by this server." do
|
8
|
-
resolve ->
|
8
|
+
resolve ->(obj, arg, ctx) { obj.types.values }
|
9
9
|
end
|
10
10
|
|
11
11
|
field :queryType, !GraphQL::Introspection::TypeType, "The type that query operations will be rooted at." do
|
12
|
-
resolve ->
|
12
|
+
resolve ->(obj, arg, ctx) { obj.query }
|
13
13
|
end
|
14
14
|
|
15
15
|
field :mutationType, GraphQL::Introspection::TypeType, "If this server supports mutation, the type that mutation operations will be rooted at." do
|
16
|
-
resolve ->
|
16
|
+
resolve ->(obj, arg, ctx) { obj.mutation }
|
17
17
|
end
|
18
18
|
|
19
19
|
field :subscriptionType, GraphQL::Introspection::TypeType, "If this server support subscription, the type that subscription operations will be rooted at." do
|
20
|
-
resolve ->
|
20
|
+
resolve ->(obj, arg, ctx) { obj.subscription }
|
21
21
|
end
|
22
22
|
|
23
23
|
field :directives, !types[!GraphQL::Introspection::DirectiveType], "A list of all directives supported by this server." do
|
24
|
-
resolve ->
|
24
|
+
resolve ->(obj, arg, ctx) { obj.directives.values }
|
25
25
|
end
|
26
26
|
end
|
@@ -8,7 +8,7 @@ module GraphQL
|
|
8
8
|
description("A type in the GraphQL system")
|
9
9
|
type(GraphQL::Introspection::TypeType)
|
10
10
|
argument :name, !types.String
|
11
|
-
resolve ->
|
11
|
+
resolve ->(o, args, c) { type_hash.fetch(args["name"], nil) }
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -8,16 +8,16 @@ GraphQL::Introspection::TypeType = GraphQL::ObjectType.define do
|
|
8
8
|
"they describe. Abstract types, Union and Interface, provide the Object types "\
|
9
9
|
"possible at runtime. List and NonNull types compose other types."
|
10
10
|
|
11
|
-
field :name, types.String
|
12
|
-
field :description, types.String
|
13
11
|
field :kind do
|
14
12
|
type !GraphQL::Introspection::TypeKindEnum
|
15
|
-
resolve ->
|
13
|
+
resolve ->(target, a, c) { target.kind.name }
|
16
14
|
end
|
15
|
+
field :name, types.String
|
16
|
+
field :description, types.String
|
17
17
|
field :fields, field: GraphQL::Introspection::FieldsField
|
18
|
-
field :
|
19
|
-
field :inputFields, field: GraphQL::Introspection::InputFieldsField
|
18
|
+
field :interfaces, field: GraphQL::Introspection::InterfacesField
|
20
19
|
field :possibleTypes, field: GraphQL::Introspection::PossibleTypesField
|
21
20
|
field :enumValues, field: GraphQL::Introspection::EnumValuesField
|
22
|
-
field :
|
21
|
+
field :inputFields, field: GraphQL::Introspection::InputFieldsField
|
22
|
+
field :ofType, field: GraphQL::Introspection::OfTypeField
|
23
23
|
end
|