graphql 1.9.21 → 2.0.0

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 (397) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +21 -10
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +44 -7
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +63 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +2 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  28. data/lib/generators/graphql/templates/base_object.erb +2 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +22 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/field_usage.rb +29 -2
  49. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  50. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  51. data/lib/graphql/analysis/ast/visitor.rb +17 -8
  52. data/lib/graphql/analysis/ast.rb +14 -14
  53. data/lib/graphql/analysis.rb +0 -7
  54. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  55. data/lib/graphql/backtrace/table.rb +37 -16
  56. data/lib/graphql/backtrace/traced_error.rb +0 -1
  57. data/lib/graphql/backtrace/tracer.rb +39 -9
  58. data/lib/graphql/backtrace.rb +20 -17
  59. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  60. data/lib/graphql/dataloader/request.rb +19 -0
  61. data/lib/graphql/dataloader/request_all.rb +19 -0
  62. data/lib/graphql/dataloader/source.rb +155 -0
  63. data/lib/graphql/dataloader.rb +308 -0
  64. data/lib/graphql/date_encoding_error.rb +16 -0
  65. data/lib/graphql/deprecation.rb +9 -0
  66. data/lib/graphql/dig.rb +1 -1
  67. data/lib/graphql/execution/directive_checks.rb +2 -2
  68. data/lib/graphql/execution/errors.rb +108 -14
  69. data/lib/graphql/execution/instrumentation.rb +1 -1
  70. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  71. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  72. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +37 -25
  75. data/lib/graphql/execution/interpreter/runtime.rb +715 -387
  76. data/lib/graphql/execution/interpreter.rb +32 -31
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +5 -1
  79. data/lib/graphql/execution/lookahead.rb +32 -114
  80. data/lib/graphql/execution/multiplex.rb +60 -92
  81. data/lib/graphql/execution.rb +11 -3
  82. data/lib/graphql/filter.rb +1 -1
  83. data/lib/graphql/integer_decoding_error.rb +17 -0
  84. data/lib/graphql/integer_encoding_error.rb +18 -2
  85. data/lib/graphql/introspection/base_object.rb +2 -5
  86. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  87. data/lib/graphql/introspection/directive_type.rb +11 -5
  88. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  89. data/lib/graphql/introspection/entry_points.rb +5 -18
  90. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  91. data/lib/graphql/introspection/field_type.rb +9 -5
  92. data/lib/graphql/introspection/input_value_type.rb +41 -11
  93. data/lib/graphql/introspection/introspection_query.rb +6 -92
  94. data/lib/graphql/introspection/schema_type.rb +10 -10
  95. data/lib/graphql/introspection/type_type.rb +27 -17
  96. data/lib/graphql/introspection.rb +99 -0
  97. data/lib/graphql/invalid_null_error.rb +18 -0
  98. data/lib/graphql/language/block_string.rb +20 -5
  99. data/lib/graphql/language/cache.rb +37 -0
  100. data/lib/graphql/language/definition_slice.rb +21 -10
  101. data/lib/graphql/language/document_from_schema_definition.rb +99 -63
  102. data/lib/graphql/language/lexer.rb +53 -27
  103. data/lib/graphql/language/lexer.rl +5 -3
  104. data/lib/graphql/language/nodes.rb +64 -93
  105. data/lib/graphql/language/parser.rb +929 -896
  106. data/lib/graphql/language/parser.y +125 -102
  107. data/lib/graphql/language/printer.rb +11 -2
  108. data/lib/graphql/language/sanitized_printer.rb +222 -0
  109. data/lib/graphql/language/token.rb +0 -4
  110. data/lib/graphql/language/visitor.rb +2 -2
  111. data/lib/graphql/language.rb +3 -1
  112. data/lib/graphql/name_validator.rb +2 -7
  113. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  114. data/lib/graphql/pagination/array_connection.rb +77 -0
  115. data/lib/graphql/pagination/connection.rb +226 -0
  116. data/lib/graphql/pagination/connections.rb +134 -0
  117. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  118. data/lib/graphql/pagination/relation_connection.rb +226 -0
  119. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  120. data/lib/graphql/pagination.rb +6 -0
  121. data/lib/graphql/parse_error.rb +0 -1
  122. data/lib/graphql/query/context.rb +51 -190
  123. data/lib/graphql/query/fingerprint.rb +26 -0
  124. data/lib/graphql/query/input_validation_result.rb +23 -6
  125. data/lib/graphql/query/literal_input.rb +26 -11
  126. data/lib/graphql/query/null_context.rb +24 -8
  127. data/lib/graphql/query/validation_pipeline.rb +12 -38
  128. data/lib/graphql/query/variable_validation_error.rb +2 -2
  129. data/lib/graphql/query/variables.rb +26 -9
  130. data/lib/graphql/query.rb +62 -32
  131. data/lib/graphql/railtie.rb +6 -102
  132. data/lib/graphql/rake_task/validate.rb +3 -0
  133. data/lib/graphql/rake_task.rb +12 -9
  134. data/lib/graphql/relay/range_add.rb +23 -9
  135. data/lib/graphql/relay.rb +0 -15
  136. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  137. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  138. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  139. data/lib/graphql/rubocop.rb +4 -0
  140. data/lib/graphql/schema/addition.rb +240 -0
  141. data/lib/graphql/schema/argument.rb +262 -28
  142. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  143. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  144. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  145. data/lib/graphql/schema/build_from_definition.rb +319 -220
  146. data/lib/graphql/schema/built_in_types.rb +5 -5
  147. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  148. data/lib/graphql/schema/directive/feature.rb +1 -1
  149. data/lib/graphql/schema/directive/flagged.rb +57 -0
  150. data/lib/graphql/schema/directive/include.rb +2 -2
  151. data/lib/graphql/schema/directive/skip.rb +2 -2
  152. data/lib/graphql/schema/directive/transform.rb +14 -2
  153. data/lib/graphql/schema/directive.rb +117 -14
  154. data/lib/graphql/schema/enum.rb +115 -22
  155. data/lib/graphql/schema/enum_value.rb +16 -21
  156. data/lib/graphql/schema/field/connection_extension.rb +46 -20
  157. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  158. data/lib/graphql/schema/field.rb +376 -291
  159. data/lib/graphql/schema/field_extension.rb +89 -2
  160. data/lib/graphql/schema/find_inherited_value.rb +17 -1
  161. data/lib/graphql/schema/finder.rb +16 -14
  162. data/lib/graphql/schema/input_object.rb +147 -60
  163. data/lib/graphql/schema/interface.rb +28 -43
  164. data/lib/graphql/schema/introspection_system.rb +101 -38
  165. data/lib/graphql/schema/late_bound_type.rb +3 -2
  166. data/lib/graphql/schema/list.rb +46 -3
  167. data/lib/graphql/schema/loader.rb +144 -102
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
  169. data/lib/graphql/schema/member/build_type.rb +23 -14
  170. data/lib/graphql/schema/member/has_arguments.rb +212 -23
  171. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  173. data/lib/graphql/schema/member/has_directives.rb +98 -0
  174. data/lib/graphql/schema/member/has_fields.rb +99 -34
  175. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  177. data/lib/graphql/schema/member/has_validators.rb +31 -0
  178. data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
  179. data/lib/graphql/schema/member/validates_input.rb +33 -0
  180. data/lib/graphql/schema/member.rb +11 -6
  181. data/lib/graphql/schema/mutation.rb +4 -9
  182. data/lib/graphql/schema/non_null.rb +34 -4
  183. data/lib/graphql/schema/object.rb +38 -65
  184. data/lib/graphql/schema/printer.rb +16 -35
  185. data/lib/graphql/schema/relay_classic_mutation.rb +57 -32
  186. data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
  187. data/lib/graphql/schema/resolver.rb +133 -79
  188. data/lib/graphql/schema/scalar.rb +40 -15
  189. data/lib/graphql/schema/subscription.rb +57 -21
  190. data/lib/graphql/schema/timeout.rb +29 -15
  191. data/lib/graphql/schema/type_expression.rb +21 -13
  192. data/lib/graphql/schema/type_membership.rb +19 -5
  193. data/lib/graphql/schema/union.rb +39 -14
  194. data/lib/graphql/schema/unique_within_type.rb +1 -2
  195. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  196. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  197. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  198. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  199. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  200. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  201. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  202. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  203. data/lib/graphql/schema/validator.rb +171 -0
  204. data/lib/graphql/schema/warden.rb +182 -32
  205. data/lib/graphql/schema/wrapper.rb +0 -5
  206. data/lib/graphql/schema.rb +687 -891
  207. data/lib/graphql/static_validation/all_rules.rb +2 -0
  208. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  209. data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
  210. data/lib/graphql/static_validation/error.rb +3 -1
  211. data/lib/graphql/static_validation/literal_validator.rb +51 -26
  212. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  214. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  215. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  216. data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
  217. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  218. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  219. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  220. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  221. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  222. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  223. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  224. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  226. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  227. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  228. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  229. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  230. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
  231. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  232. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  233. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  234. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  235. data/lib/graphql/static_validation/type_stack.rb +2 -2
  236. data/lib/graphql/static_validation/validation_context.rb +13 -3
  237. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  238. data/lib/graphql/static_validation/validator.rb +31 -19
  239. data/lib/graphql/static_validation.rb +1 -2
  240. data/lib/graphql/string_encoding_error.rb +13 -3
  241. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
  242. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  243. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  244. data/lib/graphql/subscriptions/event.rb +85 -31
  245. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  246. data/lib/graphql/subscriptions/serialize.rb +53 -6
  247. data/lib/graphql/subscriptions.rb +111 -52
  248. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  249. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  250. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  251. data/lib/graphql/tracing/data_dog_tracing.rb +14 -1
  252. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  253. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  254. data/lib/graphql/tracing/platform_tracing.rb +57 -29
  255. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  256. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  257. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  258. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  259. data/lib/graphql/tracing.rb +15 -36
  260. data/lib/graphql/types/big_int.rb +5 -1
  261. data/lib/graphql/types/int.rb +10 -3
  262. data/lib/graphql/types/iso_8601_date.rb +16 -8
  263. data/lib/graphql/types/iso_8601_date_time.rb +32 -10
  264. data/lib/graphql/types/relay/base_connection.rb +6 -88
  265. data/lib/graphql/types/relay/base_edge.rb +2 -34
  266. data/lib/graphql/types/relay/connection_behaviors.rb +170 -0
  267. data/lib/graphql/types/relay/default_relay.rb +21 -0
  268. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  269. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  270. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  271. data/lib/graphql/types/relay/node.rb +2 -4
  272. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  273. data/lib/graphql/types/relay/page_info.rb +2 -14
  274. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  275. data/lib/graphql/types/relay.rb +11 -5
  276. data/lib/graphql/types/string.rb +8 -2
  277. data/lib/graphql/unauthorized_error.rb +2 -2
  278. data/lib/graphql/unresolved_type_error.rb +2 -2
  279. data/lib/graphql/version.rb +1 -1
  280. data/lib/graphql.rb +41 -58
  281. data/readme.md +3 -6
  282. metadata +97 -231
  283. data/lib/graphql/analysis/analyze_query.rb +0 -91
  284. data/lib/graphql/analysis/field_usage.rb +0 -45
  285. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  286. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  287. data/lib/graphql/analysis/query_complexity.rb +0 -88
  288. data/lib/graphql/analysis/query_depth.rb +0 -43
  289. data/lib/graphql/analysis/reducer_state.rb +0 -48
  290. data/lib/graphql/argument.rb +0 -159
  291. data/lib/graphql/authorization.rb +0 -82
  292. data/lib/graphql/backwards_compatibility.rb +0 -60
  293. data/lib/graphql/base_type.rb +0 -226
  294. data/lib/graphql/boolean_type.rb +0 -2
  295. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  296. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  297. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  298. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  299. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  300. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  301. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  302. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  303. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  304. data/lib/graphql/compatibility.rb +0 -5
  305. data/lib/graphql/define/assign_argument.rb +0 -12
  306. data/lib/graphql/define/assign_connection.rb +0 -13
  307. data/lib/graphql/define/assign_enum_value.rb +0 -18
  308. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  309. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  310. data/lib/graphql/define/assign_object_field.rb +0 -42
  311. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  312. data/lib/graphql/define/instance_definable.rb +0 -311
  313. data/lib/graphql/define/no_definition_error.rb +0 -7
  314. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  315. data/lib/graphql/define/type_definer.rb +0 -31
  316. data/lib/graphql/define.rb +0 -31
  317. data/lib/graphql/deprecated_dsl.rb +0 -42
  318. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  319. data/lib/graphql/directive/include_directive.rb +0 -2
  320. data/lib/graphql/directive/skip_directive.rb +0 -2
  321. data/lib/graphql/directive.rb +0 -104
  322. data/lib/graphql/enum_type.rb +0 -193
  323. data/lib/graphql/execution/execute.rb +0 -326
  324. data/lib/graphql/execution/flatten.rb +0 -40
  325. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  326. data/lib/graphql/execution/typecast.rb +0 -50
  327. data/lib/graphql/field/resolve.rb +0 -59
  328. data/lib/graphql/field.rb +0 -330
  329. data/lib/graphql/float_type.rb +0 -2
  330. data/lib/graphql/function.rb +0 -153
  331. data/lib/graphql/id_type.rb +0 -2
  332. data/lib/graphql/input_object_type.rb +0 -154
  333. data/lib/graphql/int_type.rb +0 -2
  334. data/lib/graphql/interface_type.rb +0 -86
  335. data/lib/graphql/internal_representation/document.rb +0 -27
  336. data/lib/graphql/internal_representation/node.rb +0 -206
  337. data/lib/graphql/internal_representation/print.rb +0 -51
  338. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  339. data/lib/graphql/internal_representation/scope.rb +0 -88
  340. data/lib/graphql/internal_representation/visit.rb +0 -36
  341. data/lib/graphql/internal_representation.rb +0 -7
  342. data/lib/graphql/list_type.rb +0 -80
  343. data/lib/graphql/literal_validation_error.rb +0 -6
  344. data/lib/graphql/non_null_type.rb +0 -81
  345. data/lib/graphql/object_type.rb +0 -141
  346. data/lib/graphql/query/arguments.rb +0 -187
  347. data/lib/graphql/query/arguments_cache.rb +0 -25
  348. data/lib/graphql/query/executor.rb +0 -53
  349. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  350. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  351. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  352. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  353. data/lib/graphql/query/serial_execution.rb +0 -39
  354. data/lib/graphql/relay/array_connection.rb +0 -85
  355. data/lib/graphql/relay/base_connection.rb +0 -172
  356. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  357. data/lib/graphql/relay/connection_resolve.rb +0 -43
  358. data/lib/graphql/relay/connection_type.rb +0 -40
  359. data/lib/graphql/relay/edge.rb +0 -27
  360. data/lib/graphql/relay/edge_type.rb +0 -18
  361. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  362. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  363. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  364. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  365. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  366. data/lib/graphql/relay/mutation/result.rb +0 -38
  367. data/lib/graphql/relay/mutation.rb +0 -190
  368. data/lib/graphql/relay/node.rb +0 -36
  369. data/lib/graphql/relay/page_info.rb +0 -7
  370. data/lib/graphql/relay/relation_connection.rb +0 -190
  371. data/lib/graphql/relay/type_extensions.rb +0 -30
  372. data/lib/graphql/scalar_type.rb +0 -133
  373. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  374. data/lib/graphql/schema/default_parse_error.rb +0 -10
  375. data/lib/graphql/schema/default_type_error.rb +0 -15
  376. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  377. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  378. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  379. data/lib/graphql/schema/middleware_chain.rb +0 -82
  380. data/lib/graphql/schema/possible_types.rb +0 -39
  381. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  382. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  383. data/lib/graphql/schema/traversal.rb +0 -228
  384. data/lib/graphql/schema/validation.rb +0 -303
  385. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  386. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  387. data/lib/graphql/string_type.rb +0 -2
  388. data/lib/graphql/subscriptions/subscription_root.rb +0 -74
  389. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  390. data/lib/graphql/types/relay/base_field.rb +0 -22
  391. data/lib/graphql/types/relay/base_interface.rb +0 -29
  392. data/lib/graphql/types/relay/base_object.rb +0 -26
  393. data/lib/graphql/types/relay/node_field.rb +0 -43
  394. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  395. data/lib/graphql/union_type.rb +0 -135
  396. data/lib/graphql/upgrader/member.rb +0 -936
  397. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # Directives are server-defined hooks for modifying execution.
4
- #
5
- # Two directives are included out-of-the-box:
6
- # - `@skip(if: ...)` Skips the tagged field if the value of `if` is true
7
- # - `@include(if: ...)` Includes the tagged field _only_ if `if` is true
8
- #
9
- class Directive
10
- include GraphQL::Define::InstanceDefinable
11
- accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
12
-
13
- attr_accessor :locations, :arguments, :name, :description, :arguments_class
14
- attr_accessor :ast_node
15
- # @api private
16
- attr_writer :default_directive
17
- ensure_defined(:locations, :arguments, :graphql_name, :name, :description, :default_directive?)
18
-
19
- # Future-compatible alias
20
- # @see {GraphQL::SchemaMember}
21
- alias :graphql_name :name
22
-
23
- # Future-compatible alias
24
- # @see {GraphQL::SchemaMember}
25
- alias :graphql_definition :itself
26
-
27
- LOCATIONS = [
28
- QUERY = :QUERY,
29
- MUTATION = :MUTATION,
30
- SUBSCRIPTION = :SUBSCRIPTION,
31
- FIELD = :FIELD,
32
- FRAGMENT_DEFINITION = :FRAGMENT_DEFINITION,
33
- FRAGMENT_SPREAD = :FRAGMENT_SPREAD,
34
- INLINE_FRAGMENT = :INLINE_FRAGMENT,
35
- SCHEMA = :SCHEMA,
36
- SCALAR = :SCALAR,
37
- OBJECT = :OBJECT,
38
- FIELD_DEFINITION = :FIELD_DEFINITION,
39
- ARGUMENT_DEFINITION = :ARGUMENT_DEFINITION,
40
- INTERFACE = :INTERFACE,
41
- UNION = :UNION,
42
- ENUM = :ENUM,
43
- ENUM_VALUE = :ENUM_VALUE,
44
- INPUT_OBJECT = :INPUT_OBJECT,
45
- INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
46
- ]
47
-
48
- DEFAULT_DEPRECATION_REASON = 'No longer supported'
49
- LOCATION_DESCRIPTIONS = {
50
- QUERY: 'Location adjacent to a query operation.',
51
- MUTATION: 'Location adjacent to a mutation operation.',
52
- SUBSCRIPTION: 'Location adjacent to a subscription operation.',
53
- FIELD: 'Location adjacent to a field.',
54
- FRAGMENT_DEFINITION: 'Location adjacent to a fragment definition.',
55
- FRAGMENT_SPREAD: 'Location adjacent to a fragment spread.',
56
- INLINE_FRAGMENT: 'Location adjacent to an inline fragment.',
57
- SCHEMA: 'Location adjacent to a schema definition.',
58
- SCALAR: 'Location adjacent to a scalar definition.',
59
- OBJECT: 'Location adjacent to an object type definition.',
60
- FIELD_DEFINITION: 'Location adjacent to a field definition.',
61
- ARGUMENT_DEFINITION: 'Location adjacent to an argument definition.',
62
- INTERFACE: 'Location adjacent to an interface definition.',
63
- UNION: 'Location adjacent to a union definition.',
64
- ENUM: 'Location adjacent to an enum definition.',
65
- ENUM_VALUE: 'Location adjacent to an enum value definition.',
66
- INPUT_OBJECT: 'Location adjacent to an input object type definition.',
67
- INPUT_FIELD_DEFINITION: 'Location adjacent to an input object field definition.',
68
- }
69
-
70
- def initialize
71
- @arguments = {}
72
- @default_directive = false
73
- end
74
-
75
- def to_s
76
- "<GraphQL::Directive #{name}>"
77
- end
78
-
79
- def on_field?
80
- locations.include?(FIELD)
81
- end
82
-
83
- def on_fragment?
84
- locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
85
- end
86
-
87
- def on_operation?
88
- locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
89
- end
90
-
91
- # @return [Boolean] Is this directive supplied by default? (eg `@skip`)
92
- def default_directive?
93
- @default_directive
94
- end
95
-
96
- def inspect
97
- "#<GraphQL::Directive #{name}>"
98
- end
99
- end
100
- end
101
-
102
- require "graphql/directive/include_directive"
103
- require "graphql/directive/skip_directive"
104
- require "graphql/directive/deprecated_directive"
@@ -1,193 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # Represents a collection of related values.
4
- # By convention, enum names are `SCREAMING_CASE_NAMES`,
5
- # but other identifiers are supported too.
6
- #
7
- # You can use as return types _or_ as inputs.
8
- #
9
- # By default, enums are passed to `resolve` functions as
10
- # the strings that identify them, but you can provide a
11
- # custom Ruby value with the `value:` keyword.
12
- #
13
- # @example An enum of programming languages
14
- # LanguageEnum = GraphQL::EnumType.define do
15
- # name "Language"
16
- # description "Programming language for Web projects"
17
- # value("PYTHON", "A dynamic, function-oriented language")
18
- # value("RUBY", "A very dynamic language aimed at programmer happiness")
19
- # value("JAVASCRIPT", "Accidental lingua franca of the web")
20
- # end
21
- #
22
- # @example Using an enum as a return type
23
- # field :favoriteLanguage, LanguageEnum, "This person's favorite coding language"
24
- # # ...
25
- # # In a query:
26
- # Schema.execute("{ coder(id: 1) { favoriteLanguage } }")
27
- # # { "data" => { "coder" => { "favoriteLanguage" => "RUBY" } } }
28
- #
29
- # @example Defining an enum input
30
- # field :coders, types[CoderType] do
31
- # argument :knowing, types[LanguageEnum]
32
- # resolve ->(obj, args, ctx) {
33
- # Coder.where(language: args[:knowing])
34
- # }
35
- # end
36
- #
37
- # @example Using an enum as input
38
- # {
39
- # # find coders who know Python and Ruby
40
- # coders(knowing: [PYTHON, RUBY]) {
41
- # name
42
- # hourlyRate
43
- # }
44
- # }
45
- #
46
- # @example Enum whose values are different in Ruby-land
47
- # GraphQL::EnumType.define do
48
- # # ...
49
- # # use the `value:` keyword:
50
- # value("RUBY", "Lisp? Smalltalk?", value: :rb)
51
- # end
52
- #
53
- # # Now, resolve functions will receive `:rb` instead of `"RUBY"`
54
- # field :favoriteLanguage, LanguageEnum
55
- # resolve ->(obj, args, ctx) {
56
- # args[:favoriteLanguage] # => :rb
57
- # }
58
- #
59
- # @example Enum whose values are different in ActiveRecord-land
60
- # class Language < ActiveRecord::Base
61
- # enum language: {
62
- # rb: 0
63
- # }
64
- # end
65
- #
66
- # # Now enum type should be defined as
67
- # GraphQL::EnumType.define do
68
- # # ...
69
- # # use the `value:` keyword:
70
- # value("RUBY", "Lisp? Smalltalk?", value: 'rb')
71
- # end
72
- #
73
-
74
- class EnumType < GraphQL::BaseType
75
- accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
76
- ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
77
- attr_accessor :ast_node
78
-
79
- def initialize
80
- super
81
- @values_by_name = {}
82
- end
83
-
84
- def initialize_copy(other)
85
- super
86
- self.values = other.values.values
87
- end
88
-
89
- # @param new_values [Array<EnumValue>] The set of values contained in this type
90
- def values=(new_values)
91
- @values_by_name = {}
92
- new_values.each { |enum_value| add_value(enum_value) }
93
- end
94
-
95
- # @param enum_value [EnumValue] A value to add to this type's set of values
96
- def add_value(enum_value)
97
- if @values_by_name.key?(enum_value.name)
98
- raise "Enum value names must be unique. Value `#{enum_value.name}` already exists on Enum `#{name}`."
99
- end
100
-
101
- @values_by_name[enum_value.name] = enum_value
102
- end
103
-
104
- # @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
105
- def values
106
- @values_by_name
107
- end
108
-
109
- def kind
110
- GraphQL::TypeKinds::ENUM
111
- end
112
-
113
- def coerce_result(value, ctx = nil)
114
- if ctx.nil?
115
- warn_deprecated_coerce("coerce_isolated_result")
116
- ctx = GraphQL::Query::NullContext
117
- end
118
-
119
- warden = ctx.warden
120
- all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
121
- enum_value = all_values.find { |val| val.value == value }
122
- if enum_value
123
- enum_value.name
124
- else
125
- raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
126
- end
127
- end
128
-
129
- def to_s
130
- name
131
- end
132
-
133
- # A value within an {EnumType}
134
- #
135
- # Created with the `value` helper
136
- class EnumValue
137
- include GraphQL::Define::InstanceDefinable
138
- ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
139
- accepts_definitions(*ATTRIBUTES)
140
- attr_accessor(*ATTRIBUTES)
141
- attr_accessor :ast_node
142
- ensure_defined(*ATTRIBUTES)
143
-
144
- undef name=
145
- def name=(new_name)
146
- # Validate that the name is correct
147
- GraphQL::NameValidator.validate!(new_name)
148
- @name = new_name
149
- end
150
-
151
- def graphql_name
152
- name
153
- end
154
- end
155
-
156
- class UnresolvedValueError < GraphQL::Error
157
- end
158
-
159
- private
160
-
161
- # Get the underlying value for this enum value
162
- #
163
- # @example get episode value from Enum
164
- # episode = EpisodeEnum.coerce("NEWHOPE")
165
- # episode # => 6
166
- #
167
- # @param value_name [String] the string representation of this enum value
168
- # @return [Object] the underlying value for this enum value
169
- def coerce_non_null_input(value_name, ctx)
170
- if @values_by_name.key?(value_name)
171
- @values_by_name.fetch(value_name).value
172
- elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
173
- # this is for matching default values, which are "inputs", but they're
174
- # the Ruby value, not the GraphQL string.
175
- match_by_value[1].value
176
- else
177
- nil
178
- end
179
- end
180
-
181
- def validate_non_null_input(value_name, ctx)
182
- result = GraphQL::Query::InputValidationResult.new
183
- allowed_values = ctx.warden.enum_values(self)
184
- matching_value = allowed_values.find { |v| v.name == value_name }
185
-
186
- if matching_value.nil?
187
- result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
188
- end
189
-
190
- result
191
- end
192
- end
193
- end
@@ -1,326 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- # A valid execution strategy
5
- # @api private
6
- class Execute
7
-
8
- # @api private
9
- class Skip; end
10
-
11
- # Just a singleton for implementing {Query::Context#skip}
12
- # @api private
13
- SKIP = Skip.new
14
-
15
- # @api private
16
- class PropagateNull
17
- end
18
- # @api private
19
- PROPAGATE_NULL = PropagateNull.new
20
-
21
- def execute(ast_operation, root_type, query)
22
- result = resolve_root_selection(query)
23
- lazy_resolve_root_selection(result, **{query: query})
24
- GraphQL::Execution::Flatten.call(query.context)
25
- end
26
-
27
- def self.begin_multiplex(_multiplex)
28
- end
29
-
30
- def self.begin_query(query, _multiplex)
31
- ExecutionFunctions.resolve_root_selection(query)
32
- end
33
-
34
- def self.finish_multiplex(results, multiplex)
35
- ExecutionFunctions.lazy_resolve_root_selection(results, multiplex: multiplex)
36
- end
37
-
38
- def self.finish_query(query, _multiplex)
39
- {
40
- "data" => Execution::Flatten.call(query.context)
41
- }
42
- end
43
-
44
- # @api private
45
- module ExecutionFunctions
46
- module_function
47
-
48
- def resolve_root_selection(query)
49
- query.trace("execute_query", query: query) do
50
- operation = query.selected_operation
51
- op_type = operation.operation_type
52
- root_type = query.root_type_for_operation(op_type)
53
- if query.context[:__root_unauthorized]
54
- # This was set by member/instrumentation.rb so that we wouldn't continue.
55
- else
56
- resolve_selection(
57
- query.root_value,
58
- root_type,
59
- query.context,
60
- mutation: query.mutation?
61
- )
62
- end
63
- end
64
- end
65
-
66
- def lazy_resolve_root_selection(result, query: nil, multiplex: nil)
67
- if query.nil? && multiplex.queries.length == 1
68
- query = multiplex.queries[0]
69
- end
70
-
71
- tracer = (query || multiplex)
72
- tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
73
- GraphQL::Execution::Lazy.resolve(result)
74
- end
75
- end
76
-
77
- def resolve_selection(object, current_type, current_ctx, mutation: false )
78
- # Assign this _before_ resolving the children
79
- # so that when a child propagates null, the selection result is
80
- # ready for it.
81
- current_ctx.value = {}
82
-
83
- selections_on_type = current_ctx.irep_node.typed_children[current_type]
84
-
85
- selections_on_type.each do |name, child_irep_node|
86
- field_ctx = current_ctx.spawn_child(
87
- key: name,
88
- object: object,
89
- irep_node: child_irep_node,
90
- )
91
-
92
- field_result = resolve_field(
93
- object,
94
- field_ctx
95
- )
96
-
97
- if field_result.is_a?(Skip)
98
- next
99
- end
100
-
101
- if mutation
102
- GraphQL::Execution::Lazy.resolve(field_ctx)
103
- end
104
-
105
-
106
- # If the last subselection caused a null to propagate to _this_ selection,
107
- # then we may as well quit executing fields because they
108
- # won't be in the response
109
- if current_ctx.invalid_null?
110
- break
111
- else
112
- current_ctx.value[name] = field_ctx
113
- end
114
- end
115
-
116
- current_ctx.value
117
- end
118
-
119
- def resolve_field(object, field_ctx)
120
- query = field_ctx.query
121
- irep_node = field_ctx.irep_node
122
- parent_type = irep_node.owner_type
123
- field = field_ctx.field
124
-
125
- raw_value = begin
126
- begin
127
- arguments = query.arguments_for(irep_node, field)
128
- field_ctx.trace("execute_field", { context: field_ctx }) do
129
- field_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
130
- end
131
- rescue GraphQL::UnauthorizedFieldError => err
132
- err.field ||= field
133
- field_ctx.schema.unauthorized_field(err)
134
- rescue GraphQL::UnauthorizedError => err
135
- field_ctx.schema.unauthorized_object(err)
136
- end
137
- rescue GraphQL::ExecutionError => err
138
- err
139
- end
140
-
141
- if field_ctx.schema.lazy?(raw_value)
142
- field_ctx.value = Execution::Lazy.new {
143
- inner_value = field_ctx.trace("execute_field_lazy", {context: field_ctx}) {
144
- begin
145
- begin
146
- field_ctx.field.lazy_resolve(raw_value, arguments, field_ctx)
147
- rescue GraphQL::UnauthorizedError => err
148
- field_ctx.schema.unauthorized_object(err)
149
- end
150
- rescue GraphQL::ExecutionError => err
151
- err
152
- end
153
- }
154
- continue_or_wait(inner_value, field_ctx.type, field_ctx)
155
- }
156
- else
157
- continue_or_wait(raw_value, field_ctx.type, field_ctx)
158
- end
159
- end
160
-
161
- # If the returned object is lazy (unfinished),
162
- # assign the lazy object to `.value=` so we can resolve it later.
163
- # When we resolve it later, reassign it to `.value=` so that
164
- # the finished value replaces the unfinished one.
165
- #
166
- # If the returned object is finished, continue to coerce
167
- # and resolve child fields
168
- def continue_or_wait(raw_value, field_type, field_ctx)
169
- if field_ctx.schema.lazy?(raw_value)
170
- field_ctx.value = Execution::Lazy.new {
171
- inner_value = begin
172
- begin
173
- field_ctx.schema.sync_lazy(raw_value)
174
- rescue GraphQL::UnauthorizedError => err
175
- field_ctx.schema.unauthorized_object(err)
176
- end
177
- rescue GraphQL::ExecutionError => err
178
- err
179
- end
180
-
181
- field_ctx.value = continue_or_wait(inner_value, field_type, field_ctx)
182
- }
183
- else
184
- field_ctx.value = continue_resolve_field(raw_value, field_type, field_ctx)
185
- end
186
- end
187
-
188
- def continue_resolve_field(raw_value, field_type, field_ctx)
189
- if field_ctx.parent.invalid_null?
190
- return nil
191
- end
192
- query = field_ctx.query
193
-
194
- case raw_value
195
- when GraphQL::ExecutionError
196
- raw_value.ast_node ||= field_ctx.ast_node
197
- raw_value.path = field_ctx.path
198
- query.context.errors.push(raw_value)
199
- when Array
200
- if field_type.non_null?
201
- # List type errors are handled above, this is for the case of fields returning an array of errors
202
- list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
203
- if list_errors.any?
204
- list_errors.each do |error, index|
205
- error.ast_node = field_ctx.ast_node
206
- error.path = field_ctx.path + (field_ctx.type.list? ? [index] : [])
207
- query.context.errors.push(error)
208
- end
209
- end
210
- end
211
- end
212
-
213
- resolve_value(
214
- raw_value,
215
- field_type,
216
- field_ctx,
217
- )
218
- end
219
-
220
- def resolve_value(value, field_type, field_ctx)
221
- field_defn = field_ctx.field
222
-
223
- if value.nil?
224
- if field_type.kind.non_null?
225
- parent_type = field_ctx.irep_node.owner_type
226
- type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
227
- field_ctx.schema.type_error(type_error, field_ctx)
228
- PROPAGATE_NULL
229
- else
230
- nil
231
- end
232
- elsif value.is_a?(GraphQL::ExecutionError)
233
- if field_type.kind.non_null?
234
- PROPAGATE_NULL
235
- else
236
- nil
237
- end
238
- elsif value.is_a?(Array) && value.any? && value.all? {|v| v.is_a?(GraphQL::ExecutionError)}
239
- if field_type.kind.non_null?
240
- PROPAGATE_NULL
241
- else
242
- nil
243
- end
244
- elsif value.is_a?(Skip)
245
- field_ctx.value = value
246
- else
247
- case field_type.kind
248
- when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
249
- field_type.coerce_result(value, field_ctx)
250
- when GraphQL::TypeKinds::LIST
251
- inner_type = field_type.of_type
252
- i = 0
253
- result = []
254
- field_ctx.value = result
255
-
256
- value.each do |inner_value|
257
- inner_ctx = field_ctx.spawn_child(
258
- key: i,
259
- object: inner_value,
260
- irep_node: field_ctx.irep_node,
261
- )
262
-
263
- inner_result = continue_or_wait(
264
- inner_value,
265
- inner_type,
266
- inner_ctx,
267
- )
268
-
269
- return PROPAGATE_NULL if inner_result == PROPAGATE_NULL
270
-
271
- result << inner_ctx
272
- i += 1
273
- end
274
-
275
- result
276
- when GraphQL::TypeKinds::NON_NULL
277
- inner_type = field_type.of_type
278
- resolve_value(
279
- value,
280
- inner_type,
281
- field_ctx,
282
- )
283
- when GraphQL::TypeKinds::OBJECT
284
- resolve_selection(
285
- value,
286
- field_type,
287
- field_ctx
288
- )
289
- when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
290
- query = field_ctx.query
291
- resolved_type_or_lazy = field_type.resolve_type(value, field_ctx)
292
- query.schema.after_lazy(resolved_type_or_lazy) do |resolved_type|
293
- possible_types = query.possible_types(field_type)
294
-
295
- if !possible_types.include?(resolved_type)
296
- parent_type = field_ctx.irep_node.owner_type
297
- type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
298
- field_ctx.schema.type_error(type_error, field_ctx)
299
- PROPAGATE_NULL
300
- else
301
- resolve_value(
302
- value,
303
- resolved_type,
304
- field_ctx,
305
- )
306
- end
307
- end
308
- else
309
- raise("Unknown type kind: #{field_type.kind}")
310
- end
311
- end
312
- end
313
- end
314
-
315
- include ExecutionFunctions
316
-
317
- # A `.call`-able suitable to be the last step in a middleware chain
318
- module FieldResolveStep
319
- # Execute the field's resolve method
320
- def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
321
- field_definition.resolve(parent_object, field_args, context)
322
- end
323
- end
324
- end
325
- end
326
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- # Starting from a root context,
5
- # create a hash out of the context tree.
6
- # @api private
7
- module Flatten
8
- def self.call(ctx)
9
- flatten(ctx)
10
- end
11
-
12
- class << self
13
- private
14
-
15
- def flatten(obj)
16
- case obj
17
- when Hash
18
- flattened = {}
19
- obj.each do |key, val|
20
- flattened[key] = flatten(val)
21
- end
22
- flattened
23
- when Array
24
- obj.map { |v| flatten(v) }
25
- when Query::Context::SharedMethods
26
- if obj.invalid_null?
27
- nil
28
- elsif obj.skipped? && obj.value.empty?
29
- nil
30
- else
31
- flatten(obj.value)
32
- end
33
- else
34
- obj
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GraphQL
4
- module Execution
5
- class Interpreter
6
- # This response class handles `#write` by accumulating
7
- # values into a Hash.
8
- class HashResponse
9
- def initialize
10
- @result = {}
11
- end
12
-
13
- def final_value
14
- @result
15
- end
16
-
17
- def inspect
18
- "#<#{self.class.name} result=#{@result.inspect}>"
19
- end
20
-
21
- # Add `value` at `path`.
22
- # @return [void]
23
- def write(path, value)
24
- if path.empty?
25
- @result = value
26
- elsif (write_target = @result)
27
- i = 0
28
- prefinal_steps = path.size - 1
29
- # Use `while` to avoid a closure
30
- while i < prefinal_steps
31
- path_part = path[i]
32
- i += 1
33
- write_target = write_target[path_part]
34
- end
35
- path_part = path[i]
36
- write_target[path_part] = value
37
- else
38
- # The response is completely nulled out
39
- end
40
-
41
- nil
42
- end
43
- end
44
- end
45
- end
46
- end