graphql 1.9.21 → 2.0.16

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 (403) 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 +45 -8
  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 +49 -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 +25 -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 +31 -2
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +17 -8
  53. data/lib/graphql/analysis/ast.rb +14 -14
  54. data/lib/graphql/analysis.rb +0 -7
  55. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  56. data/lib/graphql/backtrace/table.rb +37 -16
  57. data/lib/graphql/backtrace/traced_error.rb +0 -1
  58. data/lib/graphql/backtrace/tracer.rb +39 -9
  59. data/lib/graphql/backtrace.rb +20 -17
  60. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  61. data/lib/graphql/dataloader/request.rb +19 -0
  62. data/lib/graphql/dataloader/request_all.rb +19 -0
  63. data/lib/graphql/dataloader/source.rb +164 -0
  64. data/lib/graphql/dataloader.rb +311 -0
  65. data/lib/graphql/date_encoding_error.rb +16 -0
  66. data/lib/graphql/deprecation.rb +9 -0
  67. data/lib/graphql/dig.rb +1 -1
  68. data/lib/graphql/execution/directive_checks.rb +2 -2
  69. data/lib/graphql/execution/errors.rb +77 -45
  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 +44 -25
  75. data/lib/graphql/execution/interpreter/runtime.rb +755 -395
  76. data/lib/graphql/execution/interpreter.rb +201 -74
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +5 -9
  79. data/lib/graphql/execution/lookahead.rb +65 -136
  80. data/lib/graphql/execution/multiplex.rb +5 -152
  81. data/lib/graphql/execution.rb +11 -4
  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 +34 -17
  96. data/lib/graphql/introspection.rb +100 -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 +104 -68
  102. data/lib/graphql/language/lexer.rb +83 -40
  103. data/lib/graphql/language/lexer.rl +31 -9
  104. data/lib/graphql/language/nodes.rb +64 -93
  105. data/lib/graphql/language/parser.rb +940 -896
  106. data/lib/graphql/language/parser.y +130 -103
  107. data/lib/graphql/language/printer.rb +48 -23
  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 +79 -0
  115. data/lib/graphql/pagination/connection.rb +253 -0
  116. data/lib/graphql/pagination/connections.rb +135 -0
  117. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  118. data/lib/graphql/pagination/relation_connection.rb +228 -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 +172 -198
  123. data/lib/graphql/query/fingerprint.rb +26 -0
  124. data/lib/graphql/query/input_validation_result.rb +33 -7
  125. data/lib/graphql/query/null_context.rb +21 -8
  126. data/lib/graphql/query/validation_pipeline.rb +16 -38
  127. data/lib/graphql/query/variable_validation_error.rb +3 -3
  128. data/lib/graphql/query/variables.rb +39 -12
  129. data/lib/graphql/query.rb +74 -38
  130. data/lib/graphql/railtie.rb +6 -102
  131. data/lib/graphql/rake_task/validate.rb +4 -1
  132. data/lib/graphql/rake_task.rb +41 -10
  133. data/lib/graphql/relay/range_add.rb +17 -10
  134. data/lib/graphql/relay.rb +0 -15
  135. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  136. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  137. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  138. data/lib/graphql/rubocop.rb +4 -0
  139. data/lib/graphql/schema/addition.rb +245 -0
  140. data/lib/graphql/schema/argument.rb +286 -31
  141. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  142. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  143. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  144. data/lib/graphql/schema/build_from_definition.rb +334 -220
  145. data/lib/graphql/schema/built_in_types.rb +5 -5
  146. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  147. data/lib/graphql/schema/directive/feature.rb +1 -1
  148. data/lib/graphql/schema/directive/flagged.rb +57 -0
  149. data/lib/graphql/schema/directive/include.rb +2 -2
  150. data/lib/graphql/schema/directive/one_of.rb +12 -0
  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 +113 -22
  155. data/lib/graphql/schema/enum_value.rb +16 -21
  156. data/lib/graphql/schema/field/connection_extension.rb +50 -20
  157. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  158. data/lib/graphql/schema/field.rb +491 -329
  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 +182 -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 +7 -2
  166. data/lib/graphql/schema/list.rb +61 -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 +24 -15
  170. data/lib/graphql/schema/member/has_arguments.rb +261 -24
  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 +113 -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/relay_shortcuts.rb +28 -2
  179. data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
  180. data/lib/graphql/schema/member/validates_input.rb +33 -0
  181. data/lib/graphql/schema/member.rb +11 -6
  182. data/lib/graphql/schema/mutation.rb +4 -9
  183. data/lib/graphql/schema/non_null.rb +34 -4
  184. data/lib/graphql/schema/object.rb +38 -60
  185. data/lib/graphql/schema/printer.rb +16 -35
  186. data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
  187. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -6
  188. data/lib/graphql/schema/resolver.rb +146 -93
  189. data/lib/graphql/schema/scalar.rb +40 -15
  190. data/lib/graphql/schema/subscription.rb +55 -26
  191. data/lib/graphql/schema/timeout.rb +29 -15
  192. data/lib/graphql/schema/type_expression.rb +21 -13
  193. data/lib/graphql/schema/type_membership.rb +22 -5
  194. data/lib/graphql/schema/union.rb +48 -14
  195. data/lib/graphql/schema/unique_within_type.rb +1 -2
  196. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  197. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  198. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  199. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  200. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  201. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  202. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  203. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  204. data/lib/graphql/schema/validator.rb +171 -0
  205. data/lib/graphql/schema/warden.rb +187 -33
  206. data/lib/graphql/schema/wrapper.rb +0 -5
  207. data/lib/graphql/schema.rb +773 -892
  208. data/lib/graphql/static_validation/all_rules.rb +3 -0
  209. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  210. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  211. data/lib/graphql/static_validation/error.rb +3 -1
  212. data/lib/graphql/static_validation/literal_validator.rb +55 -26
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  215. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  216. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  222. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  223. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  224. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  226. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  227. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  228. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  229. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  230. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  231. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  232. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  233. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  234. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  235. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  236. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  237. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  238. data/lib/graphql/static_validation/type_stack.rb +2 -2
  239. data/lib/graphql/static_validation/validation_context.rb +13 -3
  240. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  241. data/lib/graphql/static_validation/validator.rb +31 -19
  242. data/lib/graphql/static_validation.rb +1 -2
  243. data/lib/graphql/string_encoding_error.rb +13 -3
  244. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
  245. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  246. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  247. data/lib/graphql/subscriptions/event.rb +85 -31
  248. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  249. data/lib/graphql/subscriptions/serialize.rb +53 -6
  250. data/lib/graphql/subscriptions.rb +137 -57
  251. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  252. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  253. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  254. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  255. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  256. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  257. data/lib/graphql/tracing/platform_tracing.rb +67 -38
  258. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  259. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  260. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  261. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  262. data/lib/graphql/tracing.rb +15 -36
  263. data/lib/graphql/types/big_int.rb +5 -1
  264. data/lib/graphql/types/int.rb +10 -3
  265. data/lib/graphql/types/iso_8601_date.rb +20 -9
  266. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  267. data/lib/graphql/types/relay/base_connection.rb +18 -90
  268. data/lib/graphql/types/relay/base_edge.rb +2 -34
  269. data/lib/graphql/types/relay/connection_behaviors.rb +158 -0
  270. data/lib/graphql/types/relay/default_relay.rb +27 -0
  271. data/lib/graphql/types/relay/edge_behaviors.rb +65 -0
  272. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  273. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  274. data/lib/graphql/types/relay/node.rb +2 -4
  275. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  276. data/lib/graphql/types/relay/page_info.rb +2 -14
  277. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  278. data/lib/graphql/types/relay.rb +11 -5
  279. data/lib/graphql/types/string.rb +8 -2
  280. data/lib/graphql/unauthorized_error.rb +2 -2
  281. data/lib/graphql/unresolved_type_error.rb +2 -2
  282. data/lib/graphql/version.rb +1 -1
  283. data/lib/graphql.rb +41 -58
  284. data/readme.md +3 -6
  285. metadata +103 -237
  286. data/lib/graphql/analysis/analyze_query.rb +0 -91
  287. data/lib/graphql/analysis/field_usage.rb +0 -45
  288. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  289. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  290. data/lib/graphql/analysis/query_complexity.rb +0 -88
  291. data/lib/graphql/analysis/query_depth.rb +0 -43
  292. data/lib/graphql/analysis/reducer_state.rb +0 -48
  293. data/lib/graphql/argument.rb +0 -159
  294. data/lib/graphql/authorization.rb +0 -82
  295. data/lib/graphql/backwards_compatibility.rb +0 -60
  296. data/lib/graphql/base_type.rb +0 -226
  297. data/lib/graphql/boolean_type.rb +0 -2
  298. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  299. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  300. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  301. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  302. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  303. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  304. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  305. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  306. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  307. data/lib/graphql/compatibility.rb +0 -5
  308. data/lib/graphql/define/assign_argument.rb +0 -12
  309. data/lib/graphql/define/assign_connection.rb +0 -13
  310. data/lib/graphql/define/assign_enum_value.rb +0 -18
  311. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  312. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  313. data/lib/graphql/define/assign_object_field.rb +0 -42
  314. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  315. data/lib/graphql/define/instance_definable.rb +0 -311
  316. data/lib/graphql/define/no_definition_error.rb +0 -7
  317. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  318. data/lib/graphql/define/type_definer.rb +0 -31
  319. data/lib/graphql/define.rb +0 -31
  320. data/lib/graphql/deprecated_dsl.rb +0 -42
  321. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  322. data/lib/graphql/directive/include_directive.rb +0 -2
  323. data/lib/graphql/directive/skip_directive.rb +0 -2
  324. data/lib/graphql/directive.rb +0 -104
  325. data/lib/graphql/enum_type.rb +0 -193
  326. data/lib/graphql/execution/execute.rb +0 -326
  327. data/lib/graphql/execution/flatten.rb +0 -40
  328. data/lib/graphql/execution/instrumentation.rb +0 -92
  329. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  330. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  331. data/lib/graphql/execution/typecast.rb +0 -50
  332. data/lib/graphql/field/resolve.rb +0 -59
  333. data/lib/graphql/field.rb +0 -330
  334. data/lib/graphql/float_type.rb +0 -2
  335. data/lib/graphql/function.rb +0 -153
  336. data/lib/graphql/id_type.rb +0 -2
  337. data/lib/graphql/input_object_type.rb +0 -154
  338. data/lib/graphql/int_type.rb +0 -2
  339. data/lib/graphql/interface_type.rb +0 -86
  340. data/lib/graphql/internal_representation/document.rb +0 -27
  341. data/lib/graphql/internal_representation/node.rb +0 -206
  342. data/lib/graphql/internal_representation/print.rb +0 -51
  343. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  344. data/lib/graphql/internal_representation/scope.rb +0 -88
  345. data/lib/graphql/internal_representation/visit.rb +0 -36
  346. data/lib/graphql/internal_representation.rb +0 -7
  347. data/lib/graphql/list_type.rb +0 -80
  348. data/lib/graphql/literal_validation_error.rb +0 -6
  349. data/lib/graphql/non_null_type.rb +0 -81
  350. data/lib/graphql/object_type.rb +0 -141
  351. data/lib/graphql/query/arguments.rb +0 -187
  352. data/lib/graphql/query/arguments_cache.rb +0 -25
  353. data/lib/graphql/query/executor.rb +0 -53
  354. data/lib/graphql/query/literal_input.rb +0 -116
  355. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  356. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  357. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  358. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  359. data/lib/graphql/query/serial_execution.rb +0 -39
  360. data/lib/graphql/relay/array_connection.rb +0 -85
  361. data/lib/graphql/relay/base_connection.rb +0 -172
  362. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  363. data/lib/graphql/relay/connection_resolve.rb +0 -43
  364. data/lib/graphql/relay/connection_type.rb +0 -40
  365. data/lib/graphql/relay/edge.rb +0 -27
  366. data/lib/graphql/relay/edge_type.rb +0 -18
  367. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  368. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  369. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  370. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  371. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  372. data/lib/graphql/relay/mutation/result.rb +0 -38
  373. data/lib/graphql/relay/mutation.rb +0 -190
  374. data/lib/graphql/relay/node.rb +0 -36
  375. data/lib/graphql/relay/page_info.rb +0 -7
  376. data/lib/graphql/relay/relation_connection.rb +0 -190
  377. data/lib/graphql/relay/type_extensions.rb +0 -30
  378. data/lib/graphql/scalar_type.rb +0 -133
  379. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  380. data/lib/graphql/schema/default_parse_error.rb +0 -10
  381. data/lib/graphql/schema/default_type_error.rb +0 -15
  382. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  383. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  384. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  385. data/lib/graphql/schema/middleware_chain.rb +0 -82
  386. data/lib/graphql/schema/possible_types.rb +0 -39
  387. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  388. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  389. data/lib/graphql/schema/traversal.rb +0 -228
  390. data/lib/graphql/schema/validation.rb +0 -303
  391. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  392. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  393. data/lib/graphql/string_type.rb +0 -2
  394. data/lib/graphql/subscriptions/subscription_root.rb +0 -74
  395. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  396. data/lib/graphql/types/relay/base_field.rb +0 -22
  397. data/lib/graphql/types/relay/base_interface.rb +0 -29
  398. data/lib/graphql/types/relay/base_object.rb +0 -26
  399. data/lib/graphql/types/relay/node_field.rb +0 -43
  400. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  401. data/lib/graphql/union_type.rb +0 -135
  402. data/lib/graphql/upgrader/member.rb +0 -936
  403. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class ArrayConnection < BaseConnection
5
- def cursor_from_node(item)
6
- idx = (after ? index_from_cursor(after) : 0) + sliced_nodes.find_index(item) + 1
7
- encode(idx.to_s)
8
- end
9
-
10
- def has_next_page
11
- if first
12
- # There are more items after these items
13
- sliced_nodes.count > first
14
- elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && before
15
- # The original array is longer than the `before` index
16
- index_from_cursor(before) < nodes.length + 1
17
- else
18
- false
19
- end
20
- end
21
-
22
- def has_previous_page
23
- if last
24
- # There are items preceding the ones in this result
25
- sliced_nodes.count > last
26
- elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
27
- # We've paginated into the Array a bit, there are some behind us
28
- index_from_cursor(after) > 0
29
- else
30
- false
31
- end
32
- end
33
-
34
- private
35
-
36
- def first
37
- return @first if defined? @first
38
-
39
- @first = get_limited_arg(:first)
40
- @first = max_page_size if @first && max_page_size && @first > max_page_size
41
- @first
42
- end
43
-
44
- def last
45
- return @last if defined? @last
46
-
47
- @last = get_limited_arg(:last)
48
- @last = max_page_size if @last && max_page_size && @last > max_page_size
49
- @last
50
- end
51
-
52
- # apply first / last limit results
53
- def paged_nodes
54
- @paged_nodes ||= begin
55
- items = sliced_nodes
56
-
57
- items = items.first(first) if first
58
- items = items.last(last) if last
59
- items = items.first(max_page_size) if max_page_size && !first && !last
60
-
61
- items
62
- end
63
- end
64
-
65
- # Apply cursors to edges
66
- def sliced_nodes
67
- @sliced_nodes ||= if before && after
68
- nodes[index_from_cursor(after)..index_from_cursor(before)-1] || []
69
- elsif before
70
- nodes[0..index_from_cursor(before)-2] || []
71
- elsif after
72
- nodes[index_from_cursor(after)..-1] || []
73
- else
74
- nodes
75
- end
76
- end
77
-
78
- def index_from_cursor(cursor)
79
- decode(cursor).to_i
80
- end
81
- end
82
-
83
- BaseConnection.register_connection_implementation(Array, ArrayConnection)
84
- end
85
- end
@@ -1,172 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # Subclasses must implement:
5
- # - {#cursor_from_node}, which returns an opaque cursor for the given item
6
- # - {#sliced_nodes}, which slices by `before` & `after`
7
- # - {#paged_nodes}, which applies `first` & `last` limits
8
- #
9
- # In a subclass, you have access to
10
- # - {#nodes}, the collection which the connection will wrap
11
- # - {#first}, {#after}, {#last}, {#before} (arguments passed to the field)
12
- # - {#max_page_size} (the specified maximum page size that can be returned from a connection)
13
- #
14
- class BaseConnection
15
- # Just to encode data in the cursor, use something that won't conflict
16
- CURSOR_SEPARATOR = "---"
17
-
18
- # Map of collection class names -> connection_classes
19
- # eg `{"Array" => ArrayConnection}`
20
- CONNECTION_IMPLEMENTATIONS = {}
21
-
22
- class << self
23
- # Find a connection implementation suitable for exposing `nodes`
24
- #
25
- # @param nodes [Object] A collection of nodes (eg, Array, AR::Relation)
26
- # @return [subclass of BaseConnection] a connection Class for wrapping `nodes`
27
- def connection_for_nodes(nodes)
28
- # Check for class _names_ because classes can be redefined in Rails development
29
- nodes.class.ancestors.each do |ancestor|
30
- conn_impl = CONNECTION_IMPLEMENTATIONS[ancestor.name]
31
- if conn_impl
32
- return conn_impl
33
- end
34
- end
35
- # Should have found a connection during the loop:
36
- raise("No connection implementation to wrap #{nodes.class} (#{nodes})")
37
- end
38
-
39
- # Add `connection_class` as the connection wrapper for `nodes_class`
40
- # eg, `RelationConnection` is the implementation for `AR::Relation`
41
- # @param nodes_class [Class] A class representing a collection (eg, Array, AR::Relation)
42
- # @param connection_class [Class] A class implementing Connection methods
43
- def register_connection_implementation(nodes_class, connection_class)
44
- CONNECTION_IMPLEMENTATIONS[nodes_class.name] = connection_class
45
- end
46
- end
47
-
48
- attr_reader :nodes, :arguments, :max_page_size, :parent, :field, :context
49
-
50
- # Make a connection, wrapping `nodes`
51
- # @param nodes [Object] The collection of nodes
52
- # @param arguments [GraphQL::Query::Arguments] Query arguments
53
- # @param field [GraphQL::Field] The underlying field
54
- # @param max_page_size [Int] The maximum number of results to return
55
- # @param parent [Object] The object which this collection belongs to
56
- # @param context [GraphQL::Query::Context] The context from the field being resolved
57
- def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil)
58
- @context = context
59
- @nodes = nodes
60
- @arguments = arguments
61
- @field = field
62
- @parent = parent
63
- @encoder = context ? @context.schema.cursor_encoder : GraphQL::Schema::Base64Encoder
64
- @max_page_size = max_page_size.nil? && context ? @context.schema.default_max_page_size : max_page_size
65
- end
66
-
67
- def encode(data)
68
- @encoder.encode(data, nonce: true)
69
- end
70
-
71
- def decode(data)
72
- @encoder.decode(data, nonce: true)
73
- rescue ArgumentError
74
- raise GraphQL::ExecutionError, "Invalid cursor: #{data.inspect}"
75
- end
76
-
77
- # The value passed as `first:`, if there was one. Negative numbers become `0`.
78
- # @return [Integer, nil]
79
- def first
80
- @first ||= get_limited_arg(:first)
81
- end
82
-
83
- # The value passed as `after:`, if there was one
84
- # @return [String, nil]
85
- def after
86
- arguments[:after]
87
- end
88
-
89
- # The value passed as `last:`, if there was one. Negative numbers become `0`.
90
- # @return [Integer, nil]
91
- def last
92
- @last ||= get_limited_arg(:last)
93
- end
94
-
95
- # The value passed as `before:`, if there was one
96
- # @return [String, nil]
97
- def before
98
- arguments[:before]
99
- end
100
-
101
- # These are the nodes to render for this connection,
102
- # probably wrapped by {GraphQL::Relay::Edge}
103
- def edge_nodes
104
- @edge_nodes ||= paged_nodes
105
- end
106
-
107
- # Support the `pageInfo` field
108
- def page_info
109
- self
110
- end
111
-
112
- # Used by `pageInfo`
113
- def has_next_page
114
- !!(first && sliced_nodes.count > first)
115
- end
116
-
117
- # Used by `pageInfo`
118
- def has_previous_page
119
- !!(last && sliced_nodes.count > last)
120
- end
121
-
122
- # Used by `pageInfo`
123
- def start_cursor
124
- if start_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).first
125
- return cursor_from_node(start_node)
126
- else
127
- return nil
128
- end
129
- end
130
-
131
- # Used by `pageInfo`
132
- def end_cursor
133
- if end_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).last
134
- return cursor_from_node(end_node)
135
- else
136
- return nil
137
- end
138
- end
139
-
140
- # An opaque operation which returns a connection-specific cursor.
141
- def cursor_from_node(object)
142
- raise GraphQL::RequiredImplementationMissingError, "must return a cursor for this object/connection pair"
143
- end
144
-
145
- def inspect
146
- "#<GraphQL::Relay::Connection @parent=#{@parent.inspect} @arguments=#{@arguments.to_h.inspect}>"
147
- end
148
-
149
- private
150
-
151
- # Return a sanitized `arguments[arg_name]` (don't allow negatives)
152
- def get_limited_arg(arg_name)
153
- arg_value = arguments[arg_name]
154
- if arg_value.nil?
155
- arg_value
156
- elsif arg_value < 0
157
- 0
158
- else
159
- arg_value
160
- end
161
- end
162
-
163
- def paged_nodes
164
- raise GraphQL::RequiredImplementationMissingError, "must return nodes for this connection after paging"
165
- end
166
-
167
- def sliced_nodes
168
- raise GraphQL::RequiredImplementationMissingError, "must return all nodes for this connection after chopping off first and last"
169
- end
170
- end
171
- end
172
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # Provided a GraphQL field which returns a collection of nodes,
5
- # wrap that field to expose those nodes as a connection.
6
- #
7
- # The original resolve proc is used to fetch nodes,
8
- # then a connection implementation is fetched with {BaseConnection.connection_for_nodes}.
9
- module ConnectionInstrumentation
10
- def self.default_arguments
11
- @default_arguments ||= begin
12
- argument_definitions = [
13
- ["first", GraphQL::INT_TYPE, "Returns the first _n_ elements from the list."],
14
- ["after", GraphQL::STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
15
- ["last", GraphQL::INT_TYPE, "Returns the last _n_ elements from the list."],
16
- ["before", GraphQL::STRING_TYPE, "Returns the elements in the list that come before the specified cursor."],
17
- ]
18
-
19
- argument_definitions.reduce({}) do |memo, arg_defn|
20
- argument = GraphQL::Argument.new
21
- name, type, description = arg_defn
22
- argument.name = name
23
- argument.type = type
24
- argument.description = description
25
- memo[argument.name.to_s] = argument
26
- memo
27
- end
28
- end
29
- end
30
-
31
- # Build a connection field from a {GraphQL::Field} by:
32
- # - Merging in the default arguments
33
- # - Transforming its resolve function to return a connection object
34
- def self.instrument(type, field)
35
- # Don't apply the wrapper to class-based fields, since they
36
- # use Schema::Field::ConnectionFilter
37
- if field.connection? && !field.metadata[:type_class]
38
- connection_arguments = default_arguments.merge(field.arguments)
39
- original_resolve = field.resolve_proc
40
- original_lazy_resolve = field.lazy_resolve_proc
41
- connection_resolve = GraphQL::Relay::ConnectionResolve.new(field, original_resolve)
42
- connection_lazy_resolve = GraphQL::Relay::ConnectionResolve.new(field, original_lazy_resolve)
43
- field.redefine(
44
- resolve: connection_resolve,
45
- lazy_resolve: connection_lazy_resolve,
46
- arguments: connection_arguments,
47
- )
48
- else
49
- field
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class ConnectionResolve
5
- def initialize(field, underlying_resolve)
6
- @field = field
7
- @underlying_resolve = underlying_resolve
8
- @max_page_size = field.connection_max_page_size
9
- end
10
-
11
- def call(obj, args, ctx)
12
- # in a lazy resolve hook, obj is the promise,
13
- # get the object that the promise was
14
- # originally derived from
15
- parent = ctx.object
16
-
17
- nodes = @underlying_resolve.call(obj, args, ctx)
18
-
19
- if nodes.nil? || ctx.schema.lazy?(nodes) || nodes.is_a?(GraphQL::Execution::Execute::Skip) || ctx.wrapped_connection
20
- nodes
21
- else
22
- ctx.wrapped_connection = true
23
- build_connection(nodes, args, parent, ctx)
24
- end
25
- end
26
-
27
- private
28
-
29
- def build_connection(nodes, args, parent, ctx)
30
- if nodes.is_a? GraphQL::ExecutionError
31
- ctx.add_error(nodes)
32
- nil
33
- else
34
- if parent.is_a?(GraphQL::Schema::Object)
35
- parent = parent.object
36
- end
37
- connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(nodes)
38
- connection_class.new(nodes, args, field: @field, max_page_size: @max_page_size, parent: parent, context: ctx)
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- module ConnectionType
5
- class << self
6
- # @return [Boolean] If true, connection types get a `nodes` shortcut field
7
- attr_accessor :default_nodes_field
8
- # @return [Boolean] If true, connections check for reverse-direction `has*Page` values
9
- attr_accessor :bidirectional_pagination
10
- end
11
-
12
- self.default_nodes_field = false
13
- self.bidirectional_pagination = false
14
-
15
- # Create a connection which exposes edges of this type
16
- def self.create_type(wrapped_type, edge_type: nil, edge_class: GraphQL::Relay::Edge, nodes_field: ConnectionType.default_nodes_field, &block)
17
- custom_edge_class = edge_class
18
-
19
- # Any call that would trigger `wrapped_type.ensure_defined`
20
- # must be inside this lazy block, otherwise we get weird
21
- # cyclical dependency errors :S
22
- ObjectType.define do
23
- type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
24
- edge_type ||= wrapped_type.edge_type
25
- name("#{type_name}Connection")
26
- description("The connection type for #{type_name}.")
27
- field :edges, types[edge_type], "A list of edges.", edge_class: custom_edge_class, property: :edge_nodes
28
-
29
- if nodes_field
30
- field :nodes, types[wrapped_type], "A list of nodes.", property: :edge_nodes
31
- end
32
-
33
- field :pageInfo, !PageInfo, "Information to aid in pagination.", property: :page_info
34
- relay_node_type(wrapped_type)
35
- block && instance_eval(&block)
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # Mostly an internal concern.
5
- #
6
- # Wraps an object as a `node`, and exposes a connection-specific `cursor`.
7
- class Edge
8
- attr_reader :node, :connection
9
- def initialize(node, connection)
10
- @node = node
11
- @connection = connection
12
- end
13
-
14
- def cursor
15
- @cursor ||= connection.cursor_from_node(node)
16
- end
17
-
18
- def parent
19
- @parent ||= connection.parent
20
- end
21
-
22
- def inspect
23
- "#<GraphQL::Relay::Edge (#{parent.inspect} => #{node.inspect})>"
24
- end
25
- end
26
- end
27
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- module EdgeType
5
- def self.create_type(wrapped_type, name: nil, &block)
6
- GraphQL::ObjectType.define do
7
- type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
8
- name("#{type_name}Edge")
9
- description "An edge in a connection."
10
- field :node, wrapped_type, "The item at the end of the edge."
11
- field :cursor, !types.String, "A cursor for use in pagination."
12
- relay_node_type(wrapped_type)
13
- block && instance_eval(&block)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- module EdgesInstrumentation
5
- def self.instrument(type, field)
6
- if field.edges?
7
- edges_resolve = EdgesResolve.new(edge_class: field.edge_class, resolve: field.resolve_proc)
8
- edges_lazy_resolve = EdgesResolve.new(edge_class: field.edge_class, resolve: field.lazy_resolve_proc)
9
-
10
- field.redefine(
11
- resolve: edges_resolve,
12
- lazy_resolve: edges_lazy_resolve,
13
- )
14
- else
15
- field
16
- end
17
- end
18
-
19
-
20
- class EdgesResolve
21
- def initialize(edge_class:, resolve:)
22
- @edge_class = edge_class
23
- @resolve_proc = resolve
24
- end
25
-
26
- # A user's custom Connection may return a lazy object,
27
- # if so, handle it later.
28
- def call(obj, args, ctx)
29
- parent = ctx.object
30
- nodes = @resolve_proc.call(obj, args, ctx)
31
- if ctx.schema.lazy?(nodes)
32
- nodes
33
- else
34
- nodes.map { |item| @edge_class.new(item, parent) }
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class GlobalIdResolve
5
- def initialize(type:)
6
- @type = type
7
- end
8
-
9
- def call(obj, args, ctx)
10
- if obj.is_a?(GraphQL::Schema::Object)
11
- obj = obj.object
12
- end
13
- type = @type.respond_to?(:graphql_definition) ? @type.graphql_definition : @type
14
- ctx.query.schema.id_from_object(obj, type, ctx)
15
- end
16
- end
17
- end
18
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # A connection implementation to expose MongoDB collection objects.
5
- # It works for:
6
- # - `Mongoid::Criteria`
7
- class MongoRelationConnection < RelationConnection
8
- private
9
-
10
- def relation_offset(relation)
11
- relation.options.skip
12
- end
13
-
14
- def relation_limit(relation)
15
- relation.options.limit
16
- end
17
-
18
- def relation_count(relation)
19
- # Must perform query (hence #to_a) to count results https://jira.mongodb.org/browse/MONGOID-2325
20
- relation.to_a.count
21
- end
22
-
23
- def limit_nodes(sliced_nodes, limit)
24
- if limit == 0
25
- if sliced_nodes.respond_to?(:none) # added in Mongoid 4.0
26
- sliced_nodes.without_options.none
27
- else
28
- sliced_nodes.where(id: nil) # trying to simulate #none for 3.1.7
29
- end
30
- else
31
- sliced_nodes.limit(limit)
32
- end
33
- end
34
- end
35
-
36
- if defined?(Mongoid::Criteria)
37
- BaseConnection.register_connection_implementation(Mongoid::Criteria, MongoRelationConnection)
38
- end
39
-
40
- # Mongoid 5 and 6
41
- if defined?(Mongoid::Relations::Targets::Enumerable)
42
- BaseConnection.register_connection_implementation(Mongoid::Relations::Targets::Enumerable, MongoRelationConnection)
43
- end
44
-
45
- # Mongoid 7
46
- if defined?(Mongoid::Association::Referenced::HasMany::Targets::Enumerable)
47
- BaseConnection.register_connection_implementation(Mongoid::Association::Referenced::HasMany::Targets::Enumerable, MongoRelationConnection)
48
- end
49
- end
50
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class Mutation
5
- # @api private
6
- module Instrumentation
7
- # Modify mutation `return_field` resolves by wrapping the returned object
8
- # in a {Mutation::Result}.
9
- #
10
- # By using an instrumention, we can apply our wrapper _last_,
11
- # giving users access to the original resolve function in earlier instrumentation.
12
- def self.instrument(type, field)
13
- if field.mutation.is_a?(GraphQL::Relay::Mutation) || (field.mutation.is_a?(Class) && field.mutation < GraphQL::Schema::RelayClassicMutation)
14
- new_resolve = Mutation::Resolve.new(field.mutation, field.resolve_proc)
15
- field.redefine(resolve: new_resolve)
16
- else
17
- field
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class Mutation
5
- # Wrap a user-provided resolve function,
6
- # wrapping the returned value in a {Mutation::Result}.
7
- # Also, pass the `clientMutationId` to that result object.
8
- # @api private
9
- class Resolve
10
- def initialize(mutation, resolve)
11
- @mutation = mutation
12
- @resolve = resolve
13
- @wrap_result = mutation.is_a?(GraphQL::Relay::Mutation) && mutation.has_generated_return_type?
14
- @class_based = mutation.is_a?(Class)
15
- end
16
-
17
- def call(obj, args, ctx)
18
- mutation_result = begin
19
- @resolve.call(obj, args[:input], ctx)
20
- rescue GraphQL::ExecutionError => err
21
- err
22
- end
23
-
24
- ctx.schema.after_lazy(mutation_result) do |res|
25
- build_result(res, args, ctx)
26
- end
27
- end
28
-
29
- private
30
-
31
- def build_result(mutation_result, args, ctx)
32
- if mutation_result.is_a?(GraphQL::ExecutionError)
33
- ctx.add_error(mutation_result)
34
- mutation_result = nil
35
- end
36
-
37
- if mutation_result.nil?
38
- nil
39
- elsif @wrap_result
40
- if mutation_result && !mutation_result.is_a?(Hash)
41
- raise StandardError, "Expected `#{mutation_result}` to be a Hash."\
42
- " Return a hash when using `return_field` or specify a custom `return_type`."
43
- end
44
-
45
- @mutation.result_class.new(client_mutation_id: args[:input][:clientMutationId], result: mutation_result)
46
- elsif @class_based
47
- mutation_result[:client_mutation_id] = args[:input][:client_mutation_id]
48
- mutation_result
49
- else
50
- mutation_result
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class Mutation
5
- # Use this when the mutation's return type was generated from `return_field`s.
6
- # It delegates field lookups to the hash returned from `resolve`.
7
- # @api private
8
- class Result
9
- attr_reader :client_mutation_id
10
- def initialize(client_mutation_id:, result:)
11
- @client_mutation_id = client_mutation_id
12
- result && result.each do |key, value|
13
- self.public_send("#{key}=", value)
14
- end
15
- end
16
-
17
- class << self
18
- attr_accessor :mutation
19
- end
20
-
21
- # Build a subclass whose instances have a method
22
- # for each of `mutation_defn`'s `return_field`s
23
- # @param mutation_defn [GraphQL::Relay::Mutation]
24
- # @return [Class]
25
- def self.define_subclass(mutation_defn)
26
- subclass = Class.new(self) do
27
- mutation_result_methods = mutation_defn.return_type.all_fields.map do |f|
28
- f.property || f.name
29
- end
30
- attr_accessor(*mutation_result_methods)
31
- self.mutation = mutation_defn
32
- end
33
- subclass
34
- end
35
- end
36
- end
37
- end
38
- end