graphql 2.0.30 → 2.3.6
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/generators/graphql/install/mutation_root_generator.rb +2 -2
- data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +3 -0
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_resolver.erb +6 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +2 -0
- data/lib/generators/graphql/templates/node_type.erb +2 -0
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/schema.erb +5 -0
- data/lib/graphql/analysis/analyzer.rb +89 -0
- data/lib/graphql/analysis/field_usage.rb +82 -0
- data/lib/graphql/analysis/max_query_complexity.rb +20 -0
- data/lib/graphql/analysis/max_query_depth.rb +20 -0
- data/lib/graphql/analysis/query_complexity.rb +183 -0
- data/lib/graphql/analysis/query_depth.rb +58 -0
- data/lib/graphql/analysis/visitor.rb +282 -0
- data/lib/graphql/analysis.rb +92 -1
- data/lib/graphql/backtrace/inspect_result.rb +0 -12
- data/lib/graphql/backtrace/trace.rb +12 -15
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/dataloader/async_dataloader.rb +88 -0
- data/lib/graphql/dataloader/null_dataloader.rb +1 -1
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +11 -3
- data/lib/graphql/dataloader.rb +112 -142
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
- data/lib/graphql/execution/interpreter/runtime.rb +163 -365
- data/lib/graphql/execution/interpreter.rb +92 -158
- data/lib/graphql/execution/lookahead.rb +88 -21
- data/lib/graphql/introspection/dynamic_fields.rb +1 -1
- data/lib/graphql/introspection/entry_points.rb +11 -5
- data/lib/graphql/introspection/schema_type.rb +3 -1
- data/lib/graphql/language/block_string.rb +34 -18
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +38 -38
- data/lib/graphql/language/lexer.rb +305 -193
- data/lib/graphql/language/nodes.rb +113 -66
- data/lib/graphql/language/parser.rb +787 -1986
- data/lib/graphql/language/printer.rb +303 -146
- data/lib/graphql/language/sanitized_printer.rb +20 -22
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/visitor.rb +20 -81
- data/lib/graphql/language.rb +61 -0
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/pagination/array_connection.rb +6 -6
- data/lib/graphql/pagination/connection.rb +28 -1
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +66 -131
- data/lib/graphql/query/null_context.rb +4 -11
- data/lib/graphql/query/validation_pipeline.rb +4 -4
- data/lib/graphql/query/variables.rb +3 -3
- data/lib/graphql/query.rb +17 -26
- data/lib/graphql/railtie.rb +9 -6
- data/lib/graphql/rake_task.rb +3 -12
- data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
- data/lib/graphql/schema/addition.rb +21 -11
- data/lib/graphql/schema/argument.rb +43 -8
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +9 -12
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive.rb +3 -1
- data/lib/graphql/schema/enum.rb +3 -3
- data/lib/graphql/schema/field/connection_extension.rb +1 -15
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +49 -35
- data/lib/graphql/schema/has_single_input_argument.rb +157 -0
- data/lib/graphql/schema/input_object.rb +4 -4
- data/lib/graphql/schema/interface.rb +10 -10
- data/lib/graphql/schema/introspection_system.rb +4 -2
- data/lib/graphql/schema/late_bound_type.rb +4 -0
- data/lib/graphql/schema/list.rb +2 -2
- data/lib/graphql/schema/loader.rb +2 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +2 -1
- data/lib/graphql/schema/member/has_arguments.rb +63 -73
- data/lib/graphql/schema/member/has_directives.rb +1 -1
- data/lib/graphql/schema/member/has_fields.rb +8 -5
- data/lib/graphql/schema/member/has_interfaces.rb +23 -9
- data/lib/graphql/schema/member/relay_shortcuts.rb +1 -1
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +1 -2
- data/lib/graphql/schema/member/validates_input.rb +3 -3
- data/lib/graphql/schema/mutation.rb +7 -0
- data/lib/graphql/schema/object.rb +8 -0
- data/lib/graphql/schema/printer.rb +8 -7
- data/lib/graphql/schema/relay_classic_mutation.rb +6 -128
- data/lib/graphql/schema/resolver.rb +27 -13
- data/lib/graphql/schema/scalar.rb +3 -3
- data/lib/graphql/schema/subscription.rb +11 -4
- data/lib/graphql/schema/union.rb +1 -1
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/warden.rb +96 -95
- data/lib/graphql/schema.rb +323 -102
- data/lib/graphql/static_validation/all_rules.rb +1 -1
- data/lib/graphql/static_validation/base_visitor.rb +1 -1
- data/lib/graphql/static_validation/literal_validator.rb +2 -3
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +2 -2
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +5 -5
- data/lib/graphql/static_validation/validator.rb +3 -0
- data/lib/graphql/static_validation.rb +0 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +4 -3
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +1 -1
- data/lib/graphql/subscriptions/event.rb +8 -2
- data/lib/graphql/subscriptions/serialize.rb +2 -0
- data/lib/graphql/subscriptions.rb +15 -13
- data/lib/graphql/testing/helpers.rb +151 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/appoptics_trace.rb +2 -2
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
- data/lib/graphql/tracing/legacy_hooks_trace.rb +74 -0
- data/lib/graphql/tracing/platform_tracing.rb +3 -1
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +3 -1
- data/lib/graphql/tracing/prometheus_trace.rb +9 -9
- data/lib/graphql/tracing/sentry_trace.rb +112 -0
- data/lib/graphql/tracing/trace.rb +1 -0
- data/lib/graphql/tracing.rb +3 -1
- data/lib/graphql/type_kinds.rb +1 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +32 -2
- data/lib/graphql/types/relay/edge_behaviors.rb +7 -0
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +13 -13
- data/readme.md +12 -2
- metadata +33 -26
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -57
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -22
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
- data/lib/graphql/analysis/ast/query_depth.rb +0 -55
- data/lib/graphql/analysis/ast/visitor.rb +0 -276
- data/lib/graphql/analysis/ast.rb +0 -81
- data/lib/graphql/deprecation.rb +0 -9
- data/lib/graphql/filter.rb +0 -59
- data/lib/graphql/language/parser.y +0 -560
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/subscriptions/instrumentation.rb +0 -28
|
@@ -15,6 +15,25 @@ module GraphQL
|
|
|
15
15
|
def scope_items(items, context)
|
|
16
16
|
items
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
def reauthorize_scoped_objects(new_value = nil)
|
|
20
|
+
if new_value.nil?
|
|
21
|
+
if @reauthorize_scoped_objects != nil
|
|
22
|
+
@reauthorize_scoped_objects
|
|
23
|
+
else
|
|
24
|
+
find_inherited_value(:reauthorize_scoped_objects, true)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
@reauthorize_scoped_objects = new_value
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def inherited(subclass)
|
|
32
|
+
super
|
|
33
|
+
subclass.class_eval do
|
|
34
|
+
@reauthorize_scoped_objects = nil
|
|
35
|
+
end
|
|
36
|
+
end
|
|
18
37
|
end
|
|
19
38
|
end
|
|
20
39
|
end
|
|
@@ -4,12 +4,11 @@ module GraphQL
|
|
|
4
4
|
class Schema
|
|
5
5
|
class Member
|
|
6
6
|
module TypeSystemHelpers
|
|
7
|
-
def initialize(
|
|
7
|
+
def initialize(...)
|
|
8
8
|
super
|
|
9
9
|
@to_non_null_type ||= nil
|
|
10
10
|
@to_list_type ||= nil
|
|
11
11
|
end
|
|
12
|
-
ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
|
|
13
12
|
|
|
14
13
|
# @return [Schema::NonNull] Make a non-null-type representation of this type
|
|
15
14
|
def to_non_null_type
|
|
@@ -17,15 +17,15 @@ module GraphQL
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def valid_isolated_input?(v)
|
|
20
|
-
valid_input?(v, GraphQL::Query::NullContext)
|
|
20
|
+
valid_input?(v, GraphQL::Query::NullContext.instance)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def coerce_isolated_input(v)
|
|
24
|
-
coerce_input(v, GraphQL::Query::NullContext)
|
|
24
|
+
coerce_input(v, GraphQL::Query::NullContext.instance)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def coerce_isolated_result(v)
|
|
28
|
-
coerce_result(v, GraphQL::Query::NullContext)
|
|
28
|
+
coerce_result(v, GraphQL::Query::NullContext.instance)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -62,6 +62,13 @@ module GraphQL
|
|
|
62
62
|
extend GraphQL::Schema::Member::HasFields
|
|
63
63
|
extend GraphQL::Schema::Resolver::HasPayloadType
|
|
64
64
|
|
|
65
|
+
# @api private
|
|
66
|
+
def call_resolve(_args_hash)
|
|
67
|
+
# Clear any cached values from `loads` or authorization:
|
|
68
|
+
dataloader.clear_cache
|
|
69
|
+
super
|
|
70
|
+
end
|
|
71
|
+
|
|
65
72
|
class << self
|
|
66
73
|
def visible?(context)
|
|
67
74
|
true
|
|
@@ -30,6 +30,10 @@ module GraphQL
|
|
|
30
30
|
# @see authorized_new to make instances
|
|
31
31
|
protected :new
|
|
32
32
|
|
|
33
|
+
def wrap_scoped(object, context)
|
|
34
|
+
scoped_new(object, context)
|
|
35
|
+
end
|
|
36
|
+
|
|
33
37
|
# This is called by the runtime to return an object to call methods on.
|
|
34
38
|
def wrap(object, context)
|
|
35
39
|
authorized_new(object, context)
|
|
@@ -91,6 +95,10 @@ module GraphQL
|
|
|
91
95
|
end
|
|
92
96
|
end
|
|
93
97
|
end
|
|
98
|
+
|
|
99
|
+
def scoped_new(object, context)
|
|
100
|
+
self.new(object, context)
|
|
101
|
+
end
|
|
94
102
|
end
|
|
95
103
|
|
|
96
104
|
def initialize(object, context)
|
|
@@ -36,15 +36,11 @@ module GraphQL
|
|
|
36
36
|
|
|
37
37
|
# @param schema [GraphQL::Schema]
|
|
38
38
|
# @param context [Hash]
|
|
39
|
-
# @param only [<#call(member, ctx)>]
|
|
40
|
-
# @param except [<#call(member, ctx)>]
|
|
41
39
|
# @param introspection [Boolean] Should include the introspection types in the string?
|
|
42
|
-
def initialize(schema, context: nil,
|
|
40
|
+
def initialize(schema, context: nil, introspection: false)
|
|
43
41
|
@document_from_schema = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
|
44
42
|
schema,
|
|
45
43
|
context: context,
|
|
46
|
-
only: only,
|
|
47
|
-
except: except,
|
|
48
44
|
include_introspection_types: introspection,
|
|
49
45
|
)
|
|
50
46
|
|
|
@@ -61,7 +57,12 @@ module GraphQL
|
|
|
61
57
|
false
|
|
62
58
|
end
|
|
63
59
|
end
|
|
64
|
-
schema = Class.new(GraphQL::Schema) {
|
|
60
|
+
schema = Class.new(GraphQL::Schema) {
|
|
61
|
+
query(query_root)
|
|
62
|
+
def self.visible?(member, _ctx)
|
|
63
|
+
member.graphql_name != "Root"
|
|
64
|
+
end
|
|
65
|
+
}
|
|
65
66
|
|
|
66
67
|
introspection_schema_ast = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
|
67
68
|
schema,
|
|
@@ -94,7 +95,7 @@ module GraphQL
|
|
|
94
95
|
|
|
95
96
|
class IntrospectionPrinter < GraphQL::Language::Printer
|
|
96
97
|
def print_schema_definition(schema)
|
|
97
|
-
"schema {\n query: Root\n}"
|
|
98
|
+
print_string("schema {\n query: Root\n}")
|
|
98
99
|
end
|
|
99
100
|
end
|
|
100
101
|
end
|
|
@@ -21,6 +21,10 @@ module GraphQL
|
|
|
21
21
|
# @see {GraphQL::Schema::Mutation} for an example, it's basically the same.
|
|
22
22
|
#
|
|
23
23
|
class RelayClassicMutation < GraphQL::Schema::Mutation
|
|
24
|
+
include GraphQL::Schema::HasSingleInputArgument
|
|
25
|
+
|
|
26
|
+
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
|
27
|
+
|
|
24
28
|
# The payload should always include this field
|
|
25
29
|
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation.")
|
|
26
30
|
# Relay classic default:
|
|
@@ -31,34 +35,14 @@ module GraphQL
|
|
|
31
35
|
def resolve_with_support(**inputs)
|
|
32
36
|
input = inputs[:input].to_kwargs
|
|
33
37
|
|
|
34
|
-
new_extras = field ? field.extras : []
|
|
35
|
-
all_extras = self.class.extras + new_extras
|
|
36
|
-
|
|
37
|
-
# Transfer these from the top-level hash to the
|
|
38
|
-
# shortcutted `input:` object
|
|
39
|
-
all_extras.each do |ext|
|
|
40
|
-
# It's possible that the `extra` was not passed along by this point,
|
|
41
|
-
# don't re-add it if it wasn't given here.
|
|
42
|
-
if inputs.key?(ext)
|
|
43
|
-
input[ext] = inputs[ext]
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
38
|
if input
|
|
48
39
|
# This is handled by Relay::Mutation::Resolve, a bit hacky, but here we are.
|
|
49
40
|
input_kwargs = input.to_h
|
|
50
41
|
client_mutation_id = input_kwargs.delete(:client_mutation_id)
|
|
51
|
-
|
|
52
|
-
# Relay Classic Mutations with no `argument`s
|
|
53
|
-
# don't require `input:`
|
|
54
|
-
input_kwargs = {}
|
|
42
|
+
inputs[:input] = input_kwargs
|
|
55
43
|
end
|
|
56
44
|
|
|
57
|
-
return_value =
|
|
58
|
-
super(**input_kwargs)
|
|
59
|
-
else
|
|
60
|
-
super()
|
|
61
|
-
end
|
|
45
|
+
return_value = super(**inputs)
|
|
62
46
|
|
|
63
47
|
context.query.after_lazy(return_value) do |return_hash|
|
|
64
48
|
# It might be an error
|
|
@@ -68,112 +52,6 @@ module GraphQL
|
|
|
68
52
|
return_hash
|
|
69
53
|
end
|
|
70
54
|
end
|
|
71
|
-
|
|
72
|
-
class << self
|
|
73
|
-
def dummy
|
|
74
|
-
@dummy ||= begin
|
|
75
|
-
d = Class.new(GraphQL::Schema::Resolver)
|
|
76
|
-
d.argument_class(self.argument_class)
|
|
77
|
-
# TODO make this lazier?
|
|
78
|
-
d.argument(:input, input_type, description: "Parameters for #{self.graphql_name}")
|
|
79
|
-
d
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def field_arguments(context = GraphQL::Query::NullContext)
|
|
84
|
-
dummy.arguments(context)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def get_field_argument(name, context = GraphQL::Query::NullContext)
|
|
88
|
-
dummy.get_argument(name, context)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def own_field_arguments
|
|
92
|
-
dummy.own_arguments
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def all_field_argument_definitions
|
|
96
|
-
dummy.all_argument_definitions
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# Also apply this argument to the input type:
|
|
100
|
-
def argument(*args, own_argument: false, **kwargs, &block)
|
|
101
|
-
it = input_type # make sure any inherited arguments are already added to it
|
|
102
|
-
arg = super(*args, **kwargs, &block)
|
|
103
|
-
|
|
104
|
-
# This definition might be overriding something inherited;
|
|
105
|
-
# if it is, remove the inherited definition so it's not confused at runtime as having multiple definitions
|
|
106
|
-
prev_args = it.own_arguments[arg.graphql_name]
|
|
107
|
-
case prev_args
|
|
108
|
-
when GraphQL::Schema::Argument
|
|
109
|
-
if prev_args.owner != self
|
|
110
|
-
it.own_arguments.delete(arg.graphql_name)
|
|
111
|
-
end
|
|
112
|
-
when Array
|
|
113
|
-
prev_args.reject! { |a| a.owner != self }
|
|
114
|
-
if prev_args.empty?
|
|
115
|
-
it.own_arguments.delete(arg.graphql_name)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it.add_argument(arg)
|
|
120
|
-
arg
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# The base class for generated input object types
|
|
124
|
-
# @param new_class [Class] The base class to use for generating input object definitions
|
|
125
|
-
# @return [Class] The base class for this mutation's generated input object (default is {GraphQL::Schema::InputObject})
|
|
126
|
-
def input_object_class(new_class = nil)
|
|
127
|
-
if new_class
|
|
128
|
-
@input_object_class = new_class
|
|
129
|
-
end
|
|
130
|
-
@input_object_class || (superclass.respond_to?(:input_object_class) ? superclass.input_object_class : GraphQL::Schema::InputObject)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# @param new_input_type [Class, nil] If provided, it configures this mutation to accept `new_input_type` instead of generating an input type
|
|
134
|
-
# @return [Class] The generated {Schema::InputObject} class for this mutation's `input`
|
|
135
|
-
def input_type(new_input_type = nil)
|
|
136
|
-
if new_input_type
|
|
137
|
-
@input_type = new_input_type
|
|
138
|
-
end
|
|
139
|
-
@input_type ||= generate_input_type
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
private
|
|
143
|
-
|
|
144
|
-
# Generate the input type for the `input:` argument
|
|
145
|
-
# To customize how input objects are generated, override this method
|
|
146
|
-
# @return [Class] a subclass of {.input_object_class}
|
|
147
|
-
def generate_input_type
|
|
148
|
-
mutation_args = all_argument_definitions
|
|
149
|
-
mutation_class = self
|
|
150
|
-
Class.new(input_object_class) do
|
|
151
|
-
class << self
|
|
152
|
-
def default_graphql_name
|
|
153
|
-
"#{self.mutation.graphql_name}Input"
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def description(new_desc = nil)
|
|
157
|
-
super || "Autogenerated input type of #{self.mutation.graphql_name}"
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
mutation(mutation_class)
|
|
161
|
-
# these might be inherited:
|
|
162
|
-
mutation_args.each do |arg|
|
|
163
|
-
add_argument(arg)
|
|
164
|
-
end
|
|
165
|
-
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
private
|
|
171
|
-
|
|
172
|
-
def authorize_arguments(args, values)
|
|
173
|
-
# remove the `input` wrapper to match values
|
|
174
|
-
input_args = args["input"].type.unwrap.arguments(context)
|
|
175
|
-
super(input_args, values)
|
|
176
|
-
end
|
|
177
55
|
end
|
|
178
56
|
end
|
|
179
57
|
end
|
|
@@ -25,6 +25,7 @@ module GraphQL
|
|
|
25
25
|
extend GraphQL::Schema::Member::HasValidators
|
|
26
26
|
include Schema::Member::HasPath
|
|
27
27
|
extend Schema::Member::HasPath
|
|
28
|
+
extend Schema::Member::HasDirectives
|
|
28
29
|
|
|
29
30
|
# @param object [Object] The application object that this field is being resolved on
|
|
30
31
|
# @param context [GraphQL::Query::Context]
|
|
@@ -103,11 +104,7 @@ module GraphQL
|
|
|
103
104
|
end
|
|
104
105
|
elsif authorized_val
|
|
105
106
|
# Finally, all the hooks have passed, so resolve it
|
|
106
|
-
|
|
107
|
-
public_send(self.class.resolve_method, **loaded_args)
|
|
108
|
-
else
|
|
109
|
-
public_send(self.class.resolve_method)
|
|
110
|
-
end
|
|
107
|
+
call_resolve(loaded_args)
|
|
111
108
|
else
|
|
112
109
|
raise GraphQL::UnauthorizedFieldError.new(context: context, object: object, type: field.owner, field: field)
|
|
113
110
|
end
|
|
@@ -117,6 +114,15 @@ module GraphQL
|
|
|
117
114
|
end
|
|
118
115
|
end
|
|
119
116
|
|
|
117
|
+
# @api private {GraphQL::Schema::Mutation} uses this to clear the dataloader cache
|
|
118
|
+
def call_resolve(args_hash)
|
|
119
|
+
if args_hash.any?
|
|
120
|
+
public_send(self.class.resolve_method, **args_hash)
|
|
121
|
+
else
|
|
122
|
+
public_send(self.class.resolve_method)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
120
126
|
# Do the work. Everything happens here.
|
|
121
127
|
# @return [Object] An object corresponding to the return type
|
|
122
128
|
def resolve(**args)
|
|
@@ -166,11 +172,15 @@ module GraphQL
|
|
|
166
172
|
args.each_value do |argument|
|
|
167
173
|
arg_keyword = argument.keyword
|
|
168
174
|
if inputs.key?(arg_keyword) && !(arg_value = inputs[arg_keyword]).nil? && (arg_value != argument.default_value)
|
|
169
|
-
|
|
170
|
-
if
|
|
171
|
-
return
|
|
172
|
-
|
|
173
|
-
|
|
175
|
+
auth_result = argument.authorized?(self, arg_value, context)
|
|
176
|
+
if auth_result.is_a?(Array)
|
|
177
|
+
# only return this second value if the application returned a second value
|
|
178
|
+
arg_auth, err = auth_result
|
|
179
|
+
if !arg_auth
|
|
180
|
+
return arg_auth, err
|
|
181
|
+
end
|
|
182
|
+
elsif auth_result == false
|
|
183
|
+
return auth_result
|
|
174
184
|
end
|
|
175
185
|
else
|
|
176
186
|
true
|
|
@@ -205,16 +215,20 @@ module GraphQL
|
|
|
205
215
|
end
|
|
206
216
|
end
|
|
207
217
|
|
|
208
|
-
def get_argument(name, context = GraphQL::Query::NullContext)
|
|
218
|
+
def get_argument(name, context = GraphQL::Query::NullContext.instance)
|
|
209
219
|
self.class.get_argument(name, context)
|
|
210
220
|
end
|
|
211
221
|
|
|
212
222
|
class << self
|
|
213
|
-
def field_arguments(context = GraphQL::Query::NullContext)
|
|
223
|
+
def field_arguments(context = GraphQL::Query::NullContext.instance)
|
|
214
224
|
arguments(context)
|
|
215
225
|
end
|
|
216
226
|
|
|
217
|
-
def
|
|
227
|
+
def any_field_arguments?
|
|
228
|
+
any_arguments?
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def get_field_argument(name, context = GraphQL::Query::NullContext.instance)
|
|
218
232
|
get_argument(name, context)
|
|
219
233
|
end
|
|
220
234
|
|
|
@@ -19,9 +19,9 @@ module GraphQL
|
|
|
19
19
|
|
|
20
20
|
def specified_by_url(new_url = nil)
|
|
21
21
|
if new_url
|
|
22
|
-
|
|
23
|
-
elsif
|
|
24
|
-
|
|
22
|
+
directive(GraphQL::Schema::Directive::SpecifiedBy, url: new_url)
|
|
23
|
+
elsif (directive = directives.find { |dir| dir.graphql_name == "specifiedBy" })
|
|
24
|
+
directive.arguments[:url] # rubocop:disable Development/ContextIsPassedCop
|
|
25
25
|
elsif superclass.respond_to?(:specified_by_url)
|
|
26
26
|
superclass.specified_by_url
|
|
27
27
|
else
|
|
@@ -28,14 +28,19 @@ module GraphQL
|
|
|
28
28
|
def resolve_with_support(**args)
|
|
29
29
|
result = nil
|
|
30
30
|
unsubscribed = true
|
|
31
|
-
catch :graphql_subscription_unsubscribed do
|
|
31
|
+
unsubscribed_result = catch :graphql_subscription_unsubscribed do
|
|
32
32
|
result = super
|
|
33
33
|
unsubscribed = false
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
if unsubscribed
|
|
38
|
-
|
|
38
|
+
if unsubscribed_result
|
|
39
|
+
context.namespace(:subscriptions)[:final_update] = true
|
|
40
|
+
unsubscribed_result
|
|
41
|
+
else
|
|
42
|
+
context.skip
|
|
43
|
+
end
|
|
39
44
|
else
|
|
40
45
|
result
|
|
41
46
|
end
|
|
@@ -94,9 +99,11 @@ module GraphQL
|
|
|
94
99
|
end
|
|
95
100
|
|
|
96
101
|
# Call this to halt execution and remove this subscription from the system
|
|
97
|
-
|
|
102
|
+
# @param update_value [Object] if present, deliver this update before unsubscribing
|
|
103
|
+
# @return [void]
|
|
104
|
+
def unsubscribe(update_value = nil)
|
|
98
105
|
context.namespace(:subscriptions)[:unsubscribed] = true
|
|
99
|
-
throw :graphql_subscription_unsubscribed
|
|
106
|
+
throw :graphql_subscription_unsubscribed, update_value
|
|
100
107
|
end
|
|
101
108
|
|
|
102
109
|
READING_SCOPE = ::Object.new
|
data/lib/graphql/schema/union.rb
CHANGED
|
@@ -10,7 +10,7 @@ module GraphQL
|
|
|
10
10
|
super
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def possible_types(*types, context: GraphQL::Query::NullContext, **options)
|
|
13
|
+
def possible_types(*types, context: GraphQL::Query::NullContext.instance, **options)
|
|
14
14
|
if types.any?
|
|
15
15
|
types.each do |t|
|
|
16
16
|
assert_valid_union_member(t)
|