graphql 1.12.12 → 2.4.8

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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +3 -8
  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 +60 -4
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  12. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_generator.rb +5 -30
  14. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  15. data/lib/generators/graphql/object_generator.rb +10 -38
  16. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  17. data/lib/generators/graphql/relay.rb +23 -12
  18. data/lib/generators/graphql/scalar_generator.rb +4 -2
  19. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  20. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  21. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  22. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  23. data/lib/generators/graphql/templates/base_field.erb +2 -0
  24. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  25. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  26. data/lib/generators/graphql/templates/base_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  28. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  29. data/lib/generators/graphql/templates/base_union.erb +2 -0
  30. data/lib/generators/graphql/templates/enum.erb +5 -1
  31. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  32. data/lib/generators/graphql/templates/input.erb +9 -0
  33. data/lib/generators/graphql/templates/interface.erb +4 -2
  34. data/lib/generators/graphql/templates/loader.erb +2 -0
  35. data/lib/generators/graphql/templates/mutation.erb +3 -1
  36. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  37. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  39. data/lib/generators/graphql/templates/node_type.erb +2 -0
  40. data/lib/generators/graphql/templates/object.erb +4 -2
  41. data/lib/generators/graphql/templates/query_type.erb +2 -0
  42. data/lib/generators/graphql/templates/scalar.erb +3 -1
  43. data/lib/generators/graphql/templates/schema.erb +22 -2
  44. data/lib/generators/graphql/templates/union.erb +4 -2
  45. data/lib/generators/graphql/type_generator.rb +46 -10
  46. data/lib/generators/graphql/union_generator.rb +5 -5
  47. data/lib/graphql/analysis/analyzer.rb +89 -0
  48. data/lib/graphql/analysis/field_usage.rb +65 -28
  49. data/lib/graphql/analysis/max_query_complexity.rb +11 -17
  50. data/lib/graphql/analysis/max_query_depth.rb +13 -19
  51. data/lib/graphql/analysis/query_complexity.rb +156 -61
  52. data/lib/graphql/analysis/query_depth.rb +38 -23
  53. data/lib/graphql/analysis/visitor.rb +283 -0
  54. data/lib/graphql/analysis.rb +90 -6
  55. data/lib/graphql/autoload.rb +38 -0
  56. data/lib/graphql/backtrace/inspect_result.rb +0 -12
  57. data/lib/graphql/backtrace/table.rb +4 -22
  58. data/lib/graphql/backtrace/trace.rb +93 -0
  59. data/lib/graphql/backtrace/tracer.rb +8 -6
  60. data/lib/graphql/backtrace.rb +3 -8
  61. data/lib/graphql/coercion_error.rb +1 -9
  62. data/lib/graphql/current.rb +52 -0
  63. data/lib/graphql/dataloader/async_dataloader.rb +89 -0
  64. data/lib/graphql/dataloader/null_dataloader.rb +4 -2
  65. data/lib/graphql/dataloader/request.rb +5 -0
  66. data/lib/graphql/dataloader/source.rb +125 -33
  67. data/lib/graphql/dataloader.rb +193 -143
  68. data/lib/graphql/date_encoding_error.rb +16 -0
  69. data/lib/graphql/dig.rb +1 -1
  70. data/lib/graphql/duration_encoding_error.rb +16 -0
  71. data/lib/graphql/execution/errors.rb +12 -81
  72. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  73. data/lib/graphql/execution/interpreter/arguments.rb +2 -2
  74. data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
  75. data/lib/graphql/execution/interpreter/resolve.rb +38 -4
  76. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
  77. data/lib/graphql/execution/interpreter/runtime.rb +447 -403
  78. data/lib/graphql/execution/interpreter.rb +126 -80
  79. data/lib/graphql/execution/lazy.rb +11 -21
  80. data/lib/graphql/execution/lookahead.rb +133 -55
  81. data/lib/graphql/execution/multiplex.rb +4 -172
  82. data/lib/graphql/execution.rb +11 -4
  83. data/lib/graphql/integer_encoding_error.rb +18 -2
  84. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  85. data/lib/graphql/introspection/directive_type.rb +6 -4
  86. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  87. data/lib/graphql/introspection/entry_points.rb +11 -18
  88. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  89. data/lib/graphql/introspection/field_type.rb +4 -4
  90. data/lib/graphql/introspection/input_value_type.rb +10 -4
  91. data/lib/graphql/introspection/schema_type.rb +17 -15
  92. data/lib/graphql/introspection/type_type.rb +29 -16
  93. data/lib/graphql/introspection.rb +6 -2
  94. data/lib/graphql/invalid_null_error.rb +1 -1
  95. data/lib/graphql/language/block_string.rb +37 -25
  96. data/lib/graphql/language/cache.rb +13 -0
  97. data/lib/graphql/language/comment.rb +18 -0
  98. data/lib/graphql/language/definition_slice.rb +1 -1
  99. data/lib/graphql/language/document_from_schema_definition.rb +122 -81
  100. data/lib/graphql/language/lexer.rb +364 -1467
  101. data/lib/graphql/language/nodes.rb +197 -106
  102. data/lib/graphql/language/parser.rb +799 -1920
  103. data/lib/graphql/language/printer.rb +372 -160
  104. data/lib/graphql/language/sanitized_printer.rb +25 -27
  105. data/lib/graphql/language/static_visitor.rb +167 -0
  106. data/lib/graphql/language/visitor.rb +188 -141
  107. data/lib/graphql/language.rb +62 -1
  108. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  109. data/lib/graphql/name_validator.rb +0 -4
  110. data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
  111. data/lib/graphql/pagination/array_connection.rb +8 -6
  112. data/lib/graphql/pagination/connection.rb +61 -7
  113. data/lib/graphql/pagination/connections.rb +22 -23
  114. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  115. data/lib/graphql/pagination/relation_connection.rb +60 -28
  116. data/lib/graphql/query/context/scoped_context.rb +101 -0
  117. data/lib/graphql/query/context.rb +146 -222
  118. data/lib/graphql/query/input_validation_result.rb +10 -1
  119. data/lib/graphql/query/null_context.rb +15 -32
  120. data/lib/graphql/query/validation_pipeline.rb +15 -39
  121. data/lib/graphql/query/variable_validation_error.rb +3 -3
  122. data/lib/graphql/query/variables.rb +35 -17
  123. data/lib/graphql/query.rb +149 -82
  124. data/lib/graphql/railtie.rb +15 -109
  125. data/lib/graphql/rake_task/validate.rb +1 -1
  126. data/lib/graphql/rake_task.rb +30 -11
  127. data/lib/graphql/relay/range_add.rb +9 -16
  128. data/lib/graphql/relay.rb +0 -15
  129. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  130. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  131. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  132. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  133. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  134. data/lib/graphql/rubocop.rb +6 -0
  135. data/lib/graphql/schema/addition.rb +98 -54
  136. data/lib/graphql/schema/always_visible.rb +14 -0
  137. data/lib/graphql/schema/argument.rb +179 -82
  138. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  139. data/lib/graphql/schema/build_from_definition.rb +77 -39
  140. data/lib/graphql/schema/directive/feature.rb +1 -1
  141. data/lib/graphql/schema/directive/flagged.rb +4 -4
  142. data/lib/graphql/schema/directive/include.rb +1 -1
  143. data/lib/graphql/schema/directive/one_of.rb +24 -0
  144. data/lib/graphql/schema/directive/skip.rb +1 -1
  145. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  146. data/lib/graphql/schema/directive/transform.rb +2 -2
  147. data/lib/graphql/schema/directive.rb +36 -22
  148. data/lib/graphql/schema/enum.rb +158 -63
  149. data/lib/graphql/schema/enum_value.rb +12 -21
  150. data/lib/graphql/schema/field/connection_extension.rb +7 -17
  151. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  152. data/lib/graphql/schema/field.rb +521 -359
  153. data/lib/graphql/schema/field_extension.rb +86 -2
  154. data/lib/graphql/schema/find_inherited_value.rb +3 -7
  155. data/lib/graphql/schema/finder.rb +5 -5
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +148 -99
  158. data/lib/graphql/schema/interface.rb +41 -64
  159. data/lib/graphql/schema/introspection_system.rb +12 -26
  160. data/lib/graphql/schema/late_bound_type.rb +12 -2
  161. data/lib/graphql/schema/list.rb +18 -7
  162. data/lib/graphql/schema/loader.rb +6 -5
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
  164. data/lib/graphql/schema/member/build_type.rb +16 -13
  165. data/lib/graphql/schema/member/has_arguments.rb +270 -86
  166. data/lib/graphql/schema/member/has_ast_node.rb +12 -0
  167. data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
  168. data/lib/graphql/schema/member/has_directives.rb +81 -61
  169. data/lib/graphql/schema/member/has_fields.rb +169 -31
  170. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  171. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  172. data/lib/graphql/schema/member/has_validators.rb +32 -6
  173. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  174. data/lib/graphql/schema/member/scoped.rb +19 -0
  175. data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
  176. data/lib/graphql/schema/member/validates_input.rb +6 -6
  177. data/lib/graphql/schema/member.rb +1 -6
  178. data/lib/graphql/schema/mutation.rb +7 -9
  179. data/lib/graphql/schema/non_null.rb +7 -7
  180. data/lib/graphql/schema/object.rb +38 -119
  181. data/lib/graphql/schema/printer.rb +24 -25
  182. data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
  183. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
  184. data/lib/graphql/schema/resolver.rb +118 -115
  185. data/lib/graphql/schema/scalar.rb +20 -21
  186. data/lib/graphql/schema/subscription.rb +95 -21
  187. data/lib/graphql/schema/timeout.rb +25 -29
  188. data/lib/graphql/schema/type_expression.rb +2 -2
  189. data/lib/graphql/schema/type_membership.rb +21 -4
  190. data/lib/graphql/schema/union.rb +16 -16
  191. data/lib/graphql/schema/unique_within_type.rb +1 -1
  192. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  193. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  194. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  195. data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
  196. data/lib/graphql/schema/validator/format_validator.rb +4 -5
  197. data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
  198. data/lib/graphql/schema/validator/length_validator.rb +5 -3
  199. data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
  200. data/lib/graphql/schema/validator/required_validator.rb +56 -18
  201. data/lib/graphql/schema/validator.rb +38 -28
  202. data/lib/graphql/schema/visibility/migration.rb +188 -0
  203. data/lib/graphql/schema/visibility/profile.rb +359 -0
  204. data/lib/graphql/schema/visibility/visit.rb +190 -0
  205. data/lib/graphql/schema/visibility.rb +294 -0
  206. data/lib/graphql/schema/warden.rb +423 -134
  207. data/lib/graphql/schema/wrapper.rb +0 -5
  208. data/lib/graphql/schema.rb +1015 -1057
  209. data/lib/graphql/static_validation/all_rules.rb +3 -1
  210. data/lib/graphql/static_validation/base_visitor.rb +15 -28
  211. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  212. data/lib/graphql/static_validation/error.rb +3 -1
  213. data/lib/graphql/static_validation/literal_validator.rb +24 -7
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  215. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  216. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
  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/fragment_types_exist.rb +12 -2
  225. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  226. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  227. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  228. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  229. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  230. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  231. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  232. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  233. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +7 -5
  234. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  235. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
  236. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
  237. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  238. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  239. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
  240. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  241. data/lib/graphql/static_validation/validation_context.rb +32 -6
  242. data/lib/graphql/static_validation/validator.rb +11 -27
  243. data/lib/graphql/static_validation.rb +0 -3
  244. data/lib/graphql/string_encoding_error.rb +13 -3
  245. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
  246. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  247. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
  248. data/lib/graphql/subscriptions/event.rb +87 -38
  249. data/lib/graphql/subscriptions/serialize.rb +27 -3
  250. data/lib/graphql/subscriptions.rb +63 -49
  251. data/lib/graphql/testing/helpers.rb +155 -0
  252. data/lib/graphql/testing.rb +2 -0
  253. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  254. data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
  255. data/lib/graphql/tracing/appoptics_trace.rb +253 -0
  256. data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
  257. data/lib/graphql/tracing/appsignal_trace.rb +79 -0
  258. data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
  259. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  260. data/lib/graphql/tracing/data_dog_trace.rb +185 -0
  261. data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
  262. data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
  263. data/lib/graphql/tracing/legacy_trace.rb +12 -0
  264. data/lib/graphql/tracing/new_relic_trace.rb +77 -0
  265. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  266. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  267. data/lib/graphql/tracing/notifications_tracing.rb +61 -0
  268. data/lib/graphql/tracing/null_trace.rb +9 -0
  269. data/lib/graphql/tracing/platform_trace.rb +118 -0
  270. data/lib/graphql/tracing/platform_tracing.rb +46 -49
  271. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
  272. data/lib/graphql/tracing/prometheus_trace.rb +94 -0
  273. data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
  274. data/lib/graphql/tracing/scout_trace.rb +74 -0
  275. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  276. data/lib/graphql/tracing/sentry_trace.rb +114 -0
  277. data/lib/graphql/tracing/statsd_trace.rb +58 -0
  278. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  279. data/lib/graphql/tracing/trace.rb +79 -0
  280. data/lib/graphql/tracing.rb +29 -52
  281. data/lib/graphql/type_kinds.rb +7 -4
  282. data/lib/graphql/types/big_int.rb +5 -1
  283. data/lib/graphql/types/int.rb +1 -1
  284. data/lib/graphql/types/iso_8601_date.rb +17 -6
  285. data/lib/graphql/types/iso_8601_date_time.rb +12 -1
  286. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  287. data/lib/graphql/types/relay/base_connection.rb +16 -6
  288. data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
  289. data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
  290. data/lib/graphql/types/relay/has_node_field.rb +2 -2
  291. data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
  292. data/lib/graphql/types/relay/node_behaviors.rb +12 -2
  293. data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
  294. data/lib/graphql/types/relay.rb +0 -3
  295. data/lib/graphql/types/string.rb +2 -2
  296. data/lib/graphql/types.rb +18 -10
  297. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  298. data/lib/graphql/unauthorized_error.rb +1 -1
  299. data/lib/graphql/version.rb +1 -1
  300. data/lib/graphql.rb +82 -137
  301. data/readme.md +13 -6
  302. metadata +127 -186
  303. data/lib/graphql/analysis/analyze_query.rb +0 -98
  304. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  305. data/lib/graphql/analysis/ast/field_usage.rb +0 -28
  306. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
  307. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  308. data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
  309. data/lib/graphql/analysis/ast/query_depth.rb +0 -56
  310. data/lib/graphql/analysis/ast/visitor.rb +0 -268
  311. data/lib/graphql/analysis/ast.rb +0 -91
  312. data/lib/graphql/analysis/reducer_state.rb +0 -48
  313. data/lib/graphql/argument.rb +0 -131
  314. data/lib/graphql/authorization.rb +0 -82
  315. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  316. data/lib/graphql/backwards_compatibility.rb +0 -61
  317. data/lib/graphql/base_type.rb +0 -230
  318. data/lib/graphql/boolean_type.rb +0 -2
  319. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  320. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  321. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  322. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  323. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  324. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  325. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  326. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  327. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  328. data/lib/graphql/compatibility.rb +0 -5
  329. data/lib/graphql/define/assign_argument.rb +0 -12
  330. data/lib/graphql/define/assign_connection.rb +0 -13
  331. data/lib/graphql/define/assign_enum_value.rb +0 -18
  332. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  333. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  334. data/lib/graphql/define/assign_object_field.rb +0 -42
  335. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  336. data/lib/graphql/define/instance_definable.rb +0 -240
  337. data/lib/graphql/define/no_definition_error.rb +0 -7
  338. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  339. data/lib/graphql/define/type_definer.rb +0 -31
  340. data/lib/graphql/define.rb +0 -31
  341. data/lib/graphql/deprecated_dsl.rb +0 -47
  342. data/lib/graphql/deprecation.rb +0 -13
  343. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  344. data/lib/graphql/directive/include_directive.rb +0 -2
  345. data/lib/graphql/directive/skip_directive.rb +0 -2
  346. data/lib/graphql/directive.rb +0 -111
  347. data/lib/graphql/enum_type.rb +0 -129
  348. data/lib/graphql/execution/execute.rb +0 -333
  349. data/lib/graphql/execution/flatten.rb +0 -40
  350. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  351. data/lib/graphql/execution/typecast.rb +0 -50
  352. data/lib/graphql/field/resolve.rb +0 -59
  353. data/lib/graphql/field.rb +0 -226
  354. data/lib/graphql/filter.rb +0 -53
  355. data/lib/graphql/float_type.rb +0 -2
  356. data/lib/graphql/function.rb +0 -128
  357. data/lib/graphql/id_type.rb +0 -2
  358. data/lib/graphql/input_object_type.rb +0 -138
  359. data/lib/graphql/int_type.rb +0 -2
  360. data/lib/graphql/interface_type.rb +0 -72
  361. data/lib/graphql/internal_representation/document.rb +0 -27
  362. data/lib/graphql/internal_representation/node.rb +0 -206
  363. data/lib/graphql/internal_representation/print.rb +0 -51
  364. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  365. data/lib/graphql/internal_representation/scope.rb +0 -88
  366. data/lib/graphql/internal_representation/visit.rb +0 -36
  367. data/lib/graphql/internal_representation.rb +0 -7
  368. data/lib/graphql/language/lexer.rl +0 -262
  369. data/lib/graphql/language/parser.y +0 -543
  370. data/lib/graphql/language/token.rb +0 -38
  371. data/lib/graphql/list_type.rb +0 -80
  372. data/lib/graphql/non_null_type.rb +0 -71
  373. data/lib/graphql/object_type.rb +0 -130
  374. data/lib/graphql/query/arguments.rb +0 -189
  375. data/lib/graphql/query/arguments_cache.rb +0 -24
  376. data/lib/graphql/query/executor.rb +0 -52
  377. data/lib/graphql/query/literal_input.rb +0 -136
  378. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  379. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  380. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  381. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  382. data/lib/graphql/query/serial_execution.rb +0 -40
  383. data/lib/graphql/relay/array_connection.rb +0 -83
  384. data/lib/graphql/relay/base_connection.rb +0 -189
  385. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  386. data/lib/graphql/relay/connection_resolve.rb +0 -43
  387. data/lib/graphql/relay/connection_type.rb +0 -41
  388. data/lib/graphql/relay/edge.rb +0 -27
  389. data/lib/graphql/relay/edge_type.rb +0 -19
  390. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  391. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  392. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  393. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  394. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  395. data/lib/graphql/relay/mutation/result.rb +0 -38
  396. data/lib/graphql/relay/mutation.rb +0 -106
  397. data/lib/graphql/relay/node.rb +0 -39
  398. data/lib/graphql/relay/page_info.rb +0 -7
  399. data/lib/graphql/relay/relation_connection.rb +0 -188
  400. data/lib/graphql/relay/type_extensions.rb +0 -32
  401. data/lib/graphql/scalar_type.rb +0 -91
  402. data/lib/graphql/schema/base_64_bp.rb +0 -26
  403. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  404. data/lib/graphql/schema/default_parse_error.rb +0 -10
  405. data/lib/graphql/schema/default_type_error.rb +0 -17
  406. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  407. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  408. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  409. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  410. data/lib/graphql/schema/middleware_chain.rb +0 -82
  411. data/lib/graphql/schema/possible_types.rb +0 -44
  412. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  413. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  414. data/lib/graphql/schema/traversal.rb +0 -228
  415. data/lib/graphql/schema/validation.rb +0 -313
  416. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  417. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  418. data/lib/graphql/static_validation/type_stack.rb +0 -216
  419. data/lib/graphql/string_type.rb +0 -2
  420. data/lib/graphql/subscriptions/instrumentation.rb +0 -79
  421. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  422. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  423. data/lib/graphql/types/relay/default_relay.rb +0 -27
  424. data/lib/graphql/types/relay/node_field.rb +0 -25
  425. data/lib/graphql/types/relay/nodes_field.rb +0 -27
  426. data/lib/graphql/union_type.rb +0 -115
  427. data/lib/graphql/upgrader/member.rb +0 -937
  428. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -1,268 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Analysis
4
- module AST
5
- # Depth first traversal through a query AST, calling AST analyzers
6
- # along the way.
7
- #
8
- # The visitor is a special case of GraphQL::Language::Visitor, visiting
9
- # only the selected operation, providing helpers for common use cases such
10
- # as skipped fields and visiting fragment spreads.
11
- #
12
- # @see {GraphQL::Analysis::AST::Analyzer} AST Analyzers for queries
13
- class Visitor < GraphQL::Language::Visitor
14
- def initialize(query:, analyzers:)
15
- @analyzers = analyzers
16
- @path = []
17
- @object_types = []
18
- @directives = []
19
- @field_definitions = []
20
- @argument_definitions = []
21
- @directive_definitions = []
22
- @rescued_errors = []
23
- @query = query
24
- @schema = query.schema
25
- @response_path = []
26
- @skip_stack = [false]
27
- super(query.selected_operation)
28
- end
29
-
30
- # @return [GraphQL::Query] the query being visited
31
- attr_reader :query
32
-
33
- # @return [Array<GraphQL::ObjectType>] Types whose scope we've entered
34
- attr_reader :object_types
35
-
36
- # @return [Array<GraphQL::AnalysisError]
37
- attr_reader :rescued_errors
38
-
39
- def visit
40
- return unless @document
41
- super
42
- end
43
-
44
- # Visit Helpers
45
-
46
- # @return [GraphQL::Query::Arguments] Arguments for this node, merging default values, literal values and query variables
47
- # @see {GraphQL::Query#arguments_for}
48
- def arguments_for(ast_node, field_definition)
49
- @query.arguments_for(ast_node, field_definition)
50
- end
51
-
52
- # @return [Boolean] If the visitor is currently inside a fragment definition
53
- def visiting_fragment_definition?
54
- @in_fragment_def
55
- end
56
-
57
- # @return [Boolean] If the current node should be skipped because of a skip or include directive
58
- def skipping?
59
- @skipping
60
- end
61
-
62
- # @return [Array<String>] The path to the response key for the current field
63
- def response_path
64
- @response_path.dup
65
- end
66
-
67
- # Visitor Hooks
68
-
69
- def on_operation_definition(node, parent)
70
- object_type = @schema.root_type_for_operation(node.operation_type)
71
- @object_types.push(object_type)
72
- @path.push("#{node.operation_type}#{node.name ? " #{node.name}" : ""}")
73
- call_analyzers(:on_enter_operation_definition, node, parent)
74
- super
75
- call_analyzers(:on_leave_operation_definition, node, parent)
76
- @object_types.pop
77
- @path.pop
78
- end
79
-
80
- def on_fragment_definition(node, parent)
81
- on_fragment_with_type(node) do
82
- @path.push("fragment #{node.name}")
83
- @in_fragment_def = false
84
- call_analyzers(:on_enter_fragment_definition, node, parent)
85
- super
86
- @in_fragment_def = false
87
- call_analyzers(:on_leave_fragment_definition, node, parent)
88
- end
89
- end
90
-
91
- def on_inline_fragment(node, parent)
92
- on_fragment_with_type(node) do
93
- @path.push("...#{node.type ? " on #{node.type.name}" : ""}")
94
- call_analyzers(:on_enter_inline_fragment, node, parent)
95
- super
96
- call_analyzers(:on_leave_inline_fragment, node, parent)
97
- end
98
- end
99
-
100
- def on_field(node, parent)
101
- @response_path.push(node.alias || node.name)
102
- parent_type = @object_types.last
103
- field_definition = @schema.get_field(parent_type, node.name)
104
- @field_definitions.push(field_definition)
105
- if !field_definition.nil?
106
- next_object_type = field_definition.type.unwrap
107
- @object_types.push(next_object_type)
108
- else
109
- @object_types.push(nil)
110
- end
111
- @path.push(node.alias || node.name)
112
-
113
- @skipping = @skip_stack.last || skip?(node)
114
- @skip_stack << @skipping
115
-
116
- call_analyzers(:on_enter_field, node, parent)
117
- super
118
-
119
- @skipping = @skip_stack.pop
120
-
121
- call_analyzers(:on_leave_field, node, parent)
122
- @response_path.pop
123
- @field_definitions.pop
124
- @object_types.pop
125
- @path.pop
126
- end
127
-
128
- def on_directive(node, parent)
129
- directive_defn = @schema.directives[node.name]
130
- @directive_definitions.push(directive_defn)
131
- call_analyzers(:on_enter_directive, node, parent)
132
- super
133
- call_analyzers(:on_leave_directive, node, parent)
134
- @directive_definitions.pop
135
- end
136
-
137
- def on_argument(node, parent)
138
- argument_defn = if (arg = @argument_definitions.last)
139
- arg_type = arg.type.unwrap
140
- if arg_type.kind.input_object?
141
- arg_type.arguments[node.name]
142
- else
143
- nil
144
- end
145
- elsif (directive_defn = @directive_definitions.last)
146
- directive_defn.arguments[node.name]
147
- elsif (field_defn = @field_definitions.last)
148
- field_defn.arguments[node.name]
149
- else
150
- nil
151
- end
152
-
153
- @argument_definitions.push(argument_defn)
154
- @path.push(node.name)
155
- call_analyzers(:on_enter_argument, node, parent)
156
- super
157
- call_analyzers(:on_leave_argument, node, parent)
158
- @argument_definitions.pop
159
- @path.pop
160
- end
161
-
162
- def on_fragment_spread(node, parent)
163
- @path.push("... #{node.name}")
164
- call_analyzers(:on_enter_fragment_spread, node, parent)
165
- enter_fragment_spread_inline(node)
166
- super
167
- leave_fragment_spread_inline(node)
168
- call_analyzers(:on_leave_fragment_spread, node, parent)
169
- @path.pop
170
- end
171
-
172
- def on_abstract_node(node, parent)
173
- call_analyzers(:on_enter_abstract_node, node, parent)
174
- super
175
- call_analyzers(:on_leave_abstract_node, node, parent)
176
- end
177
-
178
- # @return [GraphQL::BaseType] The current object type
179
- def type_definition
180
- @object_types.last
181
- end
182
-
183
- # @return [GraphQL::BaseType] The type which the current type came from
184
- def parent_type_definition
185
- @object_types[-2]
186
- end
187
-
188
- # @return [GraphQL::Field, nil] The most-recently-entered GraphQL::Field, if currently inside one
189
- def field_definition
190
- @field_definitions.last
191
- end
192
-
193
- # @return [GraphQL::Field, nil] The GraphQL field which returned the object that the current field belongs to
194
- def previous_field_definition
195
- @field_definitions[-2]
196
- end
197
-
198
- # @return [GraphQL::Directive, nil] The most-recently-entered GraphQL::Directive, if currently inside one
199
- def directive_definition
200
- @directive_definitions.last
201
- end
202
-
203
- # @return [GraphQL::Argument, nil] The most-recently-entered GraphQL::Argument, if currently inside one
204
- def argument_definition
205
- @argument_definitions.last
206
- end
207
-
208
- # @return [GraphQL::Argument, nil] The previous GraphQL argument
209
- def previous_argument_definition
210
- @argument_definitions[-2]
211
- end
212
-
213
- private
214
-
215
- # Visit a fragment spread inline instead of visiting the definition
216
- # by itself.
217
- def enter_fragment_spread_inline(fragment_spread)
218
- fragment_def = query.fragments[fragment_spread.name]
219
-
220
- object_type = if fragment_def.type
221
- @query.warden.get_type(fragment_def.type.name)
222
- else
223
- object_types.last
224
- end
225
-
226
- object_types << object_type
227
-
228
- fragment_def.selections.each do |selection|
229
- visit_node(selection, fragment_def)
230
- end
231
- end
232
-
233
- # Visit a fragment spread inline instead of visiting the definition
234
- # by itself.
235
- def leave_fragment_spread_inline(_fragment_spread)
236
- object_types.pop
237
- end
238
-
239
- def skip?(ast_node)
240
- dir = ast_node.directives
241
- dir.any? && !GraphQL::Execution::DirectiveChecks.include?(dir, query)
242
- end
243
-
244
- def call_analyzers(method, node, parent)
245
- @analyzers.each do |analyzer|
246
- begin
247
- analyzer.public_send(method, node, parent, self)
248
- rescue AnalysisError => err
249
- @rescued_errors << err
250
- end
251
- end
252
- end
253
-
254
- def on_fragment_with_type(node)
255
- object_type = if node.type
256
- @query.warden.get_type(node.type.name)
257
- else
258
- @object_types.last
259
- end
260
- @object_types.push(object_type)
261
- yield(node)
262
- @object_types.pop
263
- @path.pop
264
- end
265
- end
266
- end
267
- end
268
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
- require "graphql/analysis/ast/visitor"
3
- require "graphql/analysis/ast/analyzer"
4
- require "graphql/analysis/ast/field_usage"
5
- require "graphql/analysis/ast/query_complexity"
6
- require "graphql/analysis/ast/max_query_complexity"
7
- require "graphql/analysis/ast/query_depth"
8
- require "graphql/analysis/ast/max_query_depth"
9
-
10
- module GraphQL
11
- module Analysis
12
- module AST
13
- module_function
14
-
15
- def use(schema_class)
16
- if schema_class.analysis_engine == self
17
- definition_line = caller(2, 1).first
18
- GraphQL::Deprecation.warn("GraphQL::Analysis::AST is now the default; remove `use GraphQL::Analysis::AST` from the schema definition (#{definition_line})")
19
- else
20
- schema_class.analysis_engine = self
21
- end
22
- end
23
-
24
- # Analyze a multiplex, and all queries within.
25
- # Multiplex analyzers are ran for all queries, keeping state.
26
- # Query analyzers are ran per query, without carrying state between queries.
27
- #
28
- # @param multiplex [GraphQL::Execution::Multiplex]
29
- # @param analyzers [Array<GraphQL::Analysis::AST::Analyzer>]
30
- # @return [Array<Any>] Results from multiplex analyzers
31
- def analyze_multiplex(multiplex, analyzers)
32
- multiplex_analyzers = analyzers.map { |analyzer| analyzer.new(multiplex) }
33
-
34
- multiplex.trace("analyze_multiplex", { multiplex: multiplex }) do
35
- query_results = multiplex.queries.map do |query|
36
- if query.valid?
37
- analyze_query(
38
- query,
39
- query.analyzers,
40
- multiplex_analyzers: multiplex_analyzers
41
- )
42
- else
43
- []
44
- end
45
- end
46
-
47
- multiplex_results = multiplex_analyzers.map(&:result)
48
- multiplex_errors = analysis_errors(multiplex_results)
49
-
50
- multiplex.queries.each_with_index do |query, idx|
51
- query.analysis_errors = multiplex_errors + analysis_errors(query_results[idx])
52
- end
53
- multiplex_results
54
- end
55
- end
56
-
57
- # @param query [GraphQL::Query]
58
- # @param analyzers [Array<GraphQL::Analysis::AST::Analyzer>]
59
- # @return [Array<Any>] Results from those analyzers
60
- def analyze_query(query, analyzers, multiplex_analyzers: [])
61
- query.trace("analyze_query", { query: query }) do
62
- query_analyzers = analyzers
63
- .map { |analyzer| analyzer.new(query) }
64
- .select { |analyzer| analyzer.analyze? }
65
-
66
- analyzers_to_run = query_analyzers + multiplex_analyzers
67
- if analyzers_to_run.any?
68
- visitor = GraphQL::Analysis::AST::Visitor.new(
69
- query: query,
70
- analyzers: analyzers_to_run
71
- )
72
-
73
- visitor.visit
74
-
75
- if visitor.rescued_errors.any?
76
- visitor.rescued_errors
77
- else
78
- query_analyzers.map(&:result)
79
- end
80
- else
81
- []
82
- end
83
- end
84
- end
85
-
86
- def analysis_errors(results)
87
- results.flatten.select { |r| r.is_a?(GraphQL::AnalysisError) }
88
- end
89
- end
90
- end
91
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Analysis
4
- class ReducerState
5
- attr_reader :reducer
6
- attr_accessor :memo, :errors
7
-
8
- def initialize(reducer, query)
9
- @reducer = reducer
10
- @memo = initialize_reducer(reducer, query)
11
- @errors = []
12
- end
13
-
14
- def call(visit_type, irep_node)
15
- @memo = @reducer.call(@memo, visit_type, irep_node)
16
- rescue AnalysisError => err
17
- @errors << err
18
- end
19
-
20
- # Respond with any errors, if found. Otherwise, if the reducer accepts
21
- # `final_value`, send it the last memo value.
22
- # Otherwise, use the last value from the traversal.
23
- # @return [Any] final memo value
24
- def finalize_reducer
25
- if @errors.any?
26
- @errors
27
- elsif reducer.respond_to?(:final_value)
28
- reducer.final_value(@memo)
29
- else
30
- @memo
31
- end
32
- end
33
-
34
- private
35
-
36
- # If the reducer has an `initial_value` method, call it and store
37
- # the result as `memo`. Otherwise, use `nil` as memo.
38
- # @return [Any] initial memo value
39
- def initialize_reducer(reducer, query)
40
- if reducer.respond_to?(:initial_value)
41
- reducer.initial_value(query)
42
- else
43
- nil
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,131 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # @api deprecated
4
- class Argument
5
- include GraphQL::Define::InstanceDefinable
6
- accepts_definitions :name, :type, :description, :default_value, :as, :prepare, :method_access, :deprecation_reason
7
- attr_reader :default_value
8
- attr_accessor :description, :name, :as, :deprecation_reason
9
- attr_accessor :ast_node
10
- attr_accessor :method_access
11
- alias :graphql_name :name
12
-
13
- ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as, :prepare, :method_access, :deprecation_reason)
14
-
15
- # @api private
16
- module DefaultPrepare
17
- def self.call(value, ctx); value; end
18
- end
19
-
20
- def initialize
21
- @prepare_proc = DefaultPrepare
22
- end
23
-
24
- def initialize_copy(other)
25
- @expose_as = nil
26
- end
27
-
28
- def default_value?
29
- !!@has_default_value
30
- end
31
-
32
- def method_access?
33
- # Treat unset as true -- only `false` should override
34
- @method_access != false
35
- end
36
-
37
- def default_value=(new_default_value)
38
- if new_default_value == NO_DEFAULT_VALUE
39
- @has_default_value = false
40
- @default_value = nil
41
- else
42
- @has_default_value = true
43
- @default_value = GraphQL::Argument.deep_stringify(new_default_value)
44
- end
45
- end
46
-
47
- # @!attribute name
48
- # @return [String] The name of this argument on its {GraphQL::Field} or {GraphQL::InputObjectType}
49
-
50
- # @param new_input_type [GraphQL::BaseType, Proc] Assign a new input type for this argument (if it's a proc, it will be called after schema initialization)
51
- def type=(new_input_type)
52
- @clean_type = nil
53
- @dirty_type = new_input_type
54
- end
55
-
56
- # @return [GraphQL::BaseType] the input type for this argument
57
- def type
58
- @clean_type ||= GraphQL::BaseType.resolve_related_type(@dirty_type)
59
- end
60
-
61
- # @return [String] The name of this argument inside `resolve` functions
62
- def expose_as
63
- @expose_as ||= (@as || @name).to_s
64
- end
65
-
66
- # Backport this to support legacy-style directives
67
- def keyword
68
- @keyword ||= GraphQL::Schema::Member::BuildType.underscore(expose_as).to_sym
69
- end
70
-
71
- # @param value [Object] The incoming value from variables or query string literal
72
- # @param ctx [GraphQL::Query::Context]
73
- # @return [Object] The prepared `value` for this argument or `value` itself if no `prepare` function exists.
74
- def prepare(value, ctx)
75
- @prepare_proc.call(value, ctx)
76
- end
77
-
78
- # Assign a `prepare` function to prepare this argument's value before `resolve` functions are called.
79
- # @param prepare_proc [#<call(value, ctx)>]
80
- def prepare=(prepare_proc)
81
- @prepare_proc = BackwardsCompatibility.wrap_arity(prepare_proc, from: 1, to: 2, name: "Argument#prepare(value, ctx)")
82
- end
83
-
84
- def type_class
85
- metadata[:type_class]
86
- end
87
-
88
- NO_DEFAULT_VALUE = Object.new
89
- # @api private
90
- def self.from_dsl(name, type_or_argument = nil, description = nil, default_value: NO_DEFAULT_VALUE, as: nil, prepare: DefaultPrepare, **kwargs, &block)
91
- name_s = name.to_s
92
-
93
- # Move some positional args into keywords if they're present
94
- description && kwargs[:description] ||= description
95
- kwargs[:name] ||= name_s
96
- kwargs[:default_value] ||= default_value
97
- kwargs[:as] ||= as
98
-
99
- unless prepare == DefaultPrepare
100
- kwargs[:prepare] ||= prepare
101
- end
102
-
103
- if !type_or_argument.nil? && !type_or_argument.is_a?(GraphQL::Argument)
104
- # Maybe a string, proc or BaseType
105
- kwargs[:type] = type_or_argument
106
- end
107
-
108
- if type_or_argument.is_a?(GraphQL::Argument)
109
- type_or_argument.redefine(**kwargs, &block)
110
- else
111
- GraphQL::Argument.define(**kwargs, &block)
112
- end
113
- end
114
-
115
- # @api private
116
- def self.deep_stringify(val)
117
- case val
118
- when Array
119
- val.map { |v| deep_stringify(v) }
120
- when Hash
121
- new_val = {}
122
- val.each do |k, v|
123
- new_val[k.to_s] = deep_stringify(v)
124
- end
125
- new_val
126
- else
127
- val
128
- end
129
- end
130
- end
131
- end
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Authorization
4
- class InaccessibleFieldsError < GraphQL::AnalysisError
5
- # @return [Array<Schema::Field, GraphQL::Field>] Fields that failed `.accessible?` checks
6
- attr_reader :fields
7
-
8
- # @return [GraphQL::Query::Context] The current query's context
9
- attr_reader :context
10
-
11
- # @return [Array<GraphQL::InternalRepresentation::Node>] The visited nodes that failed `.accessible?` checks
12
- # @see {#fields} for the Field definitions
13
- attr_reader :irep_nodes
14
-
15
- def initialize(fields:, irep_nodes:, context:)
16
- @fields = fields
17
- @irep_nodes = irep_nodes
18
- @context = context
19
- super("Some fields in this query are not accessible: #{fields.map(&:graphql_name).join(", ")}")
20
- end
21
- end
22
-
23
- # @deprecated authorization at query runtime is generally a better idea.
24
- module Analyzer
25
- module_function
26
- def initial_value(query)
27
- {
28
- schema: query.schema,
29
- context: query.context,
30
- inaccessible_nodes: [],
31
- }
32
- end
33
-
34
- def call(memo, visit_type, irep_node)
35
- if visit_type == :enter
36
- field = irep_node.definition
37
- if field
38
- schema = memo[:schema]
39
- ctx = memo[:context]
40
- next_field_accessible = schema.accessible?(field, ctx)
41
- if !next_field_accessible
42
- memo[:inaccessible_nodes] << irep_node
43
- else
44
- arg_accessible = true
45
- irep_node.arguments.argument_values.each do |name, arg_value|
46
- arg_accessible = schema.accessible?(arg_value.definition, ctx)
47
- if !arg_accessible
48
- memo[:inaccessible_nodes] << irep_node
49
- break
50
- end
51
- end
52
- if arg_accessible
53
- return_type = field.type.unwrap
54
- next_type_accessible = schema.accessible?(return_type, ctx)
55
- if !next_type_accessible
56
- memo[:inaccessible_nodes] << irep_node
57
- end
58
- end
59
- end
60
- end
61
- end
62
- memo
63
- end
64
-
65
- def final_value(memo)
66
- nodes = memo[:inaccessible_nodes]
67
- if nodes.any?
68
- fields = nodes.map do |node|
69
- field_inst = node.definition
70
- # Get the "source of truth" for this field
71
- field_inst.metadata[:type_class] || field_inst
72
- end
73
- context = memo[:context]
74
- err = InaccessibleFieldsError.new(fields: fields, irep_nodes: nodes, context: context)
75
- context.schema.inaccessible_fields(err)
76
- else
77
- nil
78
- end
79
- end
80
- end
81
- end
82
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Backtrace
4
- module LegacyTracer
5
- module_function
6
-
7
- # Implement the {GraphQL::Tracing} API.
8
- def trace(key, metadata)
9
- case key
10
- when "lex", "parse"
11
- # No context here, don't have a query yet
12
- nil
13
- when "execute_multiplex", "analyze_multiplex"
14
- # No query context yet
15
- nil
16
- when "validate", "analyze_query", "execute_query", "execute_query_lazy"
17
- query = metadata[:query] || metadata[:queries].first
18
- push_data = query
19
- multiplex = query.multiplex
20
- when "execute_field", "execute_field_lazy"
21
- # The interpreter passes `query:`, legacy passes `context:`
22
- context = metadata[:context] || ((q = metadata[:query]) && q.context)
23
- push_data = context
24
- multiplex = context.query.multiplex
25
- else
26
- # Custom key, no backtrace data for this
27
- nil
28
- end
29
-
30
- if push_data
31
- multiplex.context[:last_graphql_backtrace_context] = push_data
32
- end
33
-
34
- if key == "execute_multiplex"
35
- begin
36
- yield
37
- rescue StandardError => err
38
- # This is an unhandled error from execution,
39
- # Re-raise it with a GraphQL trace.
40
- potential_context = metadata[:multiplex].context[:last_graphql_backtrace_context]
41
-
42
- if potential_context.is_a?(GraphQL::Query::Context) || potential_context.is_a?(GraphQL::Query::Context::FieldResolutionContext)
43
- raise TracedError.new(err, potential_context)
44
- else
45
- raise
46
- end
47
- ensure
48
- metadata[:multiplex].context.delete(:last_graphql_backtrace_context)
49
- end
50
- else
51
- yield
52
- end
53
- end
54
- end
55
- end
56
- end