@@ -48,59 +48,86 @@ def append_selection(ast_node)
4848 nil
4949 end
5050
51- def coerce_arguments ( argument_owner , ast_arguments_or_hash )
51+ def coerce_arguments ( argument_owner , ast_arguments_or_hash , run_loads = true )
5252 arg_defns = @selections_step . query . types . arguments ( argument_owner )
5353 if arg_defns . empty?
5454 return EmptyObjects ::EMPTY_HASH
5555 end
5656 args_hash = { }
57- if ast_arguments_or_hash . is_a? ( Hash )
58- ast_arguments_or_hash . each do |key , value |
59- key_s = nil
60- arg_defn = arg_defns . find { |a |
61- a . keyword == key || a . graphql_name == ( key_s ||= String ( key ) )
62- }
63- coerce_argument_value ( args_hash , arg_defn , value )
64- end
65- else
66- ast_arguments_or_hash . each { |arg_node |
67- arg_defn = arg_defns . find { |ad | ad . graphql_name == arg_node . name }
68- coerce_argument_value ( args_hash , arg_defn , arg_node . value )
69- }
57+
58+ if ast_arguments_or_hash . nil? # This can happen with `.trigger`
59+ return args_hash
7060 end
71- # TODO refactor the loop above into this one
72- arg_defns . each do |arg_defn |
73- if arg_defn . default_value? && !args_hash . key? ( arg_defn . keyword )
74- coerce_argument_value ( args_hash , arg_defn , arg_defn . default_value )
61+
62+ arg_inputs_are_h = ast_arguments_or_hash . is_a? ( Hash )
63+
64+ arg_defns . each do |arg_graphql_name , arg_defn |
65+ arg_value = nil
66+ was_found = false
67+ if arg_inputs_are_h
68+ ast_arguments_or_hash . each do |key , value |
69+ if key == arg_defn . keyword || key . to_s == arg_defn . graphql_name
70+ arg_value = value
71+ was_found = true
72+ break
73+ end
74+ end
75+ else
76+ ast_arguments_or_hash . each do |arg_node |
77+ if arg_node . name == arg_defn . graphql_name
78+ arg_value = arg_node . value
79+ was_found = true
80+ break
81+ end
82+ end
83+ end
84+
85+ if arg_value . is_a? ( Language ::Nodes ::VariableIdentifier )
86+ vars = @selections_step . query . variables
87+ arg_value = if vars . key? ( arg_value . name )
88+ vars [ arg_value . name ]
89+ elsif vars . key? ( arg_value . name . to_sym )
90+ vars [ arg_value . name . to_sym ]
91+ else
92+ was_found = false
93+ nil
94+ end
95+ end
96+
97+ if !was_found && arg_defn . default_value?
98+ was_found = true
99+ arg_value = arg_defn . default_value
100+ end
101+
102+ if was_found
103+ coerce_argument_value ( args_hash , arg_defn , arg_value , run_loads )
75104 end
76105 end
77106
78107 args_hash
79108 end
80109
81- def coerce_argument_value ( arguments , arg_defn , arg_value , target_keyword : arg_defn . keyword , as_type : nil )
110+ def coerce_argument_value ( arguments , arg_defn , arg_value , run_loads , target_keyword : run_loads ? arg_defn . keyword : arg_defn . graphql_name , as_type : nil )
82111 arg_t = as_type || arg_defn . type
83112 if arg_t . non_null?
84113 arg_t = arg_t . of_type
85114 end
86115
87- arg_value = if arg_value . is_a? ( Language ::Nodes ::VariableIdentifier )
116+ if arg_value . is_a? ( Language ::Nodes ::VariableIdentifier )
88117 vars = @selections_step . query . variables
89- if vars . key? ( arg_value . name )
118+ arg_value = if vars . key? ( arg_value . name )
90119 vars [ arg_value . name ]
91120 elsif vars . key? ( arg_value . name . to_sym )
92121 vars [ arg_value . name . to_sym ]
93122 else
94- return # not present
123+ nil
95124 end
96- elsif arg_value . is_a? ( Language ::Nodes ::NullValue )
97- nil
125+ end
126+
127+ if arg_value . is_a? ( Language ::Nodes ::NullValue )
128+ arg_value = nil
98129 elsif arg_value . is_a? ( Language ::Nodes ::Enum )
99- arg_value . name
100- elsif arg_value . is_a? ( Language ::Nodes ::InputObject )
101- arg_value . arguments # rubocop:disable Development/ContextIsPassedCop
102- else
103- arg_value
130+ arg_value = arg_value . name
104131 end
105132
106133 ctx = @selections_step . query . context
@@ -111,7 +138,7 @@ def coerce_argument_value(arguments, arg_defn, arg_value, target_keyword: arg_de
111138 arg_value = Array ( arg_value )
112139 inner_t = arg_t . of_type
113140 result = Array . new ( arg_value . size )
114- arg_value . each_with_index { |v , i | coerce_argument_value ( result , arg_defn , v , target_keyword : i , as_type : inner_t ) }
141+ arg_value . each_with_index { |v , i | coerce_argument_value ( result , arg_defn , v , run_loads , target_keyword : i , as_type : inner_t ) }
115142 result
116143 end
117144 elsif arg_t . kind . leaf?
@@ -125,7 +152,8 @@ def coerce_argument_value(arguments, arg_defn, arg_value, target_keyword: arg_de
125152 end
126153 end
127154 elsif arg_t . kind . input_object?
128- input_obj_args = coerce_arguments ( arg_t , arg_value )
155+ input_obj_vals = arg_value . is_a? ( Language ::Nodes ::InputObject ) ? arg_value . arguments : arg_value # rubocop:disable Development/ContextIsPassedCop
156+ input_obj_args = coerce_arguments ( arg_t , input_obj_vals )
129157 arg_t . new ( nil , ruby_kwargs : input_obj_args , context : @selections_step . query . context , defaults_used : nil )
130158 else
131159 raise "Unsupported argument value: #{ arg_t . to_type_signature } / #{ arg_value . class } (#{ arg_value . inspect } )"
@@ -145,7 +173,7 @@ def coerce_argument_value(arguments, arg_defn, arg_value, target_keyword: arg_de
145173
146174 if arg_value . is_a? ( GraphQL ::Error )
147175 @arguments = arg_value
148- elsif arg_defn . loads && as_type . nil? && !arg_value . nil?
176+ elsif run_loads && arg_defn . loads && as_type . nil? && !arg_value . nil?
149177 # This is for legacy compat:
150178 load_receiver = if ( r = @field_definition . resolver )
151179 r . new ( field : @field_definition , context : @selections_step . query . context , object : nil )
@@ -256,7 +284,7 @@ def build_arguments
256284 @arguments ||= arguments # may have already been set to an error
257285
258286 if ( @pending_steps . nil? || @pending_steps . size == 0 ) &&
259- @field_results . nil? # Make sure this wasn 't continue via inline dataloader execution
287+ @field_results . nil? # Make sure the arguments flow didn 't already call through
260288 execute_field
261289 end
262290 end
@@ -316,6 +344,14 @@ def execute_field
316344 is_authed = @field_definition . authorized? ( o , @arguments , ctx )
317345 if is_authed
318346 authorized_objects << o
347+ else
348+ begin
349+ err = GraphQL ::UnauthorizedFieldError . new ( object : o , type : @parent_type , context : ctx , field : @field_definition )
350+ authorized_objects << query . schema . unauthorized_object ( err )
351+ is_authed = true
352+ rescue GraphQL ::ExecutionError => exec_err
353+ add_graphql_error ( exec_err )
354+ end
319355 end
320356 is_authed
321357 }
@@ -609,29 +645,35 @@ def resolve_batch(objects, context, args_hash)
609645 method_receiver = @field_definition . dynamic_introspection ? @field_definition . owner : @parent_type
610646 case @field_definition . execution_next_mode
611647 when :resolve_batch
612- if args_hash . empty?
613- method_receiver . public_send ( @field_definition . execution_next_mode_key , objects , context )
614- else
648+ begin
615649 method_receiver . public_send ( @field_definition . execution_next_mode_key , objects , context , **args_hash )
650+ rescue GraphQL ::ExecutionError => exec_err
651+ Array . new ( objects . size , exec_err )
616652 end
617653 when :resolve_static
618- result = if args_hash . empty?
619- method_receiver . public_send ( @field_definition . execution_next_mode_key , context )
620- else
621- method_receiver . public_send ( @field_definition . execution_next_mode_key , context , **args_hash )
622- end
654+ result = method_receiver . public_send ( @field_definition . execution_next_mode_key , context , **args_hash )
623655 Array . new ( objects . size , result )
624656 when :resolve_each
625- if args_hash . empty?
626- objects . map { | o | method_receiver . public_send ( @field_definition . execution_next_mode_key , o , context ) }
627- else
628- objects . map { | o | method_receiver . public_send ( @field_definition . execution_next_mode_key , o , context , ** args_hash ) }
657+ objects . map do | o |
658+ method_receiver . public_send ( @field_definition . execution_next_mode_key , o , context , ** args_hash )
659+ rescue GraphQL :: ExecutionError => err
660+ err
629661 end
630662 when :hash_key
631663 objects . map { |o | o [ @field_definition . execution_next_mode_key ] }
632664 when :direct_send
633665 if args_hash . empty?
634- objects . map { |o | o . public_send ( @field_definition . execution_next_mode_key ) }
666+ objects . map do |o |
667+ o . public_send ( @field_definition . execution_next_mode_key )
668+ rescue GraphQL ::ExecutionError => err
669+ err
670+ rescue StandardError => stderr
671+ begin
672+ @selections_step . query . handle_or_reraise ( stderr )
673+ rescue GraphQL ::ExecutionError => ex_err
674+ ex_err
675+ end
676+ end
635677 else
636678 objects . map { |o | o . public_send ( @field_definition . execution_next_mode_key , **args_hash ) }
637679 end
@@ -677,19 +719,14 @@ def resolve_batch(objects, context, args_hash)
677719 if @field_definition . dynamic_introspection
678720 obj_inst = @owner . wrap ( obj_inst , context )
679721 end
680- if args_hash . empty?
681- obj_inst . public_send ( @field_definition . execution_next_mode_key )
682- else
683- obj_inst . public_send ( @field_definition . execution_next_mode_key , **args_hash )
684- end
722+ obj_inst . public_send ( @field_definition . execution_next_mode_key , **args_hash )
685723 rescue GraphQL ::ExecutionError => exec_err
686724 exec_err
687725 end
688726 else
689727 raise "Batching execution for #{ path } not implemented (execution_next_mode: #{ @execution_next_mode . inspect } ); provide `resolve_static:`, `resolve_batch:`, `hash_key:`, `method:`, or use a compatibility plug-in"
690728 end
691729 end
692-
693730 end
694731
695732 class RawValueFieldResolveStep < FieldResolveStep
0 commit comments