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,55 +1,14 @@
1
1
  # frozen_string_literal: true
2
- # test_via: ../execution/execute.rb
3
- # test_via: ../execution/lazy.rb
4
2
  module GraphQL
5
3
  class Query
6
4
  # Expose some query-specific info to field resolve functions.
7
5
  # It delegates `[]` to the hash that's passed to `GraphQL::Query#initialize`.
8
6
  class Context
9
7
  module SharedMethods
10
- # @return [Object] The target for field resolution
11
- attr_accessor :object
12
-
13
- # @return [Hash, Array, String, Integer, Float, Boolean, nil] The resolved value for this field
14
- attr_reader :value
15
-
16
- # @return [Boolean] were any fields of this selection skipped?
17
- attr_reader :skipped
18
- alias :skipped? :skipped
19
-
20
- # @api private
21
- attr_writer :skipped
22
-
23
8
  # Return this value to tell the runtime
24
9
  # to exclude this field from the response altogether
25
10
  def skip
26
- GraphQL::Execution::Execute::SKIP
27
- end
28
-
29
- # @return [Boolean] True if this selection has been nullified by a null child
30
- def invalid_null?
31
- @invalid_null
32
- end
33
-
34
- # Remove this child from the result value
35
- # (used for null propagation and skip)
36
- # @api private
37
- def delete(child_ctx)
38
- @value.delete(child_ctx.key)
39
- end
40
-
41
- # Create a child context to use for `key`
42
- # @param key [String, Integer] The key in the response (name or index)
43
- # @param irep_node [InternalRepresentation::Node] The node being evaluated
44
- # @api private
45
- def spawn_child(key:, irep_node:, object:)
46
- FieldResolutionContext.new(
47
- @context,
48
- key,
49
- irep_node,
50
- self,
51
- object
52
- )
11
+ GraphQL::Execution::SKIP
53
12
  end
54
13
 
55
14
  # Add error at query-level.
@@ -74,12 +33,6 @@ module GraphQL
74
33
  def execution_errors
75
34
  @execution_errors ||= ExecutionErrors.new(self)
76
35
  end
77
-
78
- def lookahead
79
- ast_nodes = irep_node.ast_nodes
80
- field = irep_node.definition.metadata[:type_class] || raise("Lookahead is only compatible with class-based schemas")
81
- Execution::Lookahead.new(query: query, ast_nodes: ast_nodes, field: field)
82
- end
83
36
  end
84
37
 
85
38
  class ExecutionErrors
@@ -107,27 +60,6 @@ module GraphQL
107
60
  include SharedMethods
108
61
  extend Forwardable
109
62
 
110
- attr_reader :execution_strategy
111
- # `strategy` is required by GraphQL::Batch
112
- alias_method :strategy, :execution_strategy
113
-
114
- def execution_strategy=(new_strategy)
115
- # GraphQL::Batch re-assigns this value but it was previously not used
116
- # (ExecutionContext#strategy was used instead)
117
- # now it _is_ used, but it breaks GraphQL::Batch tests
118
- @execution_strategy ||= new_strategy
119
- end
120
-
121
- # @return [GraphQL::InternalRepresentation::Node] The internal representation for this query node
122
- def irep_node
123
- @irep_node ||= query.irep_selection
124
- end
125
-
126
- # @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
127
- def ast_node
128
- @irep_node.ast_node
129
- end
130
-
131
63
  # @return [Array<GraphQL::ExecutionError>] errors returned during execution
132
64
  attr_reader :errors
133
65
 
@@ -154,8 +86,101 @@ module GraphQL
154
86
  @errors = []
155
87
  @path = []
156
88
  @value = nil
157
- @context = self # for SharedMethods
158
- @scoped_context = {}
89
+ @context = self # for SharedMethods TODO delete sharedmethods
90
+ @scoped_context = ScopedContext.new(self)
91
+ end
92
+
93
+ class ScopedContext
94
+ def initialize(query_context)
95
+ @query_context = query_context
96
+ @scoped_contexts = {}
97
+ @no_path = [].freeze
98
+ end
99
+
100
+ def merged_context
101
+ merged_ctx = {}
102
+ each_present_path_ctx do |path_ctx|
103
+ merged_ctx = path_ctx.merge(merged_ctx)
104
+ end
105
+ merged_ctx
106
+ end
107
+
108
+ def merge!(hash)
109
+ ctx = @scoped_contexts
110
+ current_path.each do |path_part|
111
+ ctx = ctx[path_part] ||= { parent: ctx }
112
+ end
113
+ this_scoped_ctx = ctx[:scoped_context] ||= {}
114
+ this_scoped_ctx.merge!(hash)
115
+ end
116
+
117
+ def current_path
118
+ thread_info = Thread.current[:__graphql_runtime_info]
119
+ (thread_info && thread_info[:current_path]) || @no_path
120
+ end
121
+
122
+ def key?(key)
123
+ each_present_path_ctx do |path_ctx|
124
+ if path_ctx.key?(key)
125
+ return true
126
+ end
127
+ end
128
+ false
129
+ end
130
+
131
+ def [](key)
132
+ each_present_path_ctx do |path_ctx|
133
+ if path_ctx.key?(key)
134
+ return path_ctx[key]
135
+ end
136
+ end
137
+ nil
138
+ end
139
+
140
+ def dig(key, *other_keys)
141
+ each_present_path_ctx do |path_ctx|
142
+ if path_ctx.key?(key)
143
+ found_value = path_ctx[key]
144
+ if other_keys.any?
145
+ return found_value.dig(*other_keys)
146
+ else
147
+ return found_value
148
+ end
149
+ end
150
+ end
151
+ nil
152
+ end
153
+
154
+ private
155
+
156
+ # Start at the current location,
157
+ # but look up the tree for previously-assigned scoped values
158
+ def each_present_path_ctx
159
+ ctx = @scoped_contexts
160
+ current_path.each do |path_part|
161
+ if ctx.key?(path_part)
162
+ ctx = ctx[path_part]
163
+ else
164
+ break
165
+ end
166
+ end
167
+
168
+ while ctx
169
+ if (scoped_ctx = ctx[:scoped_context])
170
+ yield(scoped_ctx)
171
+ end
172
+ ctx = ctx[:parent]
173
+ end
174
+ end
175
+ end
176
+
177
+ # @return [Hash] A hash that will be added verbatim to the result hash, as `"extensions" => { ... }`
178
+ def response_extensions
179
+ namespace(:__query_result_extensions__)
180
+ end
181
+
182
+ def dataloader
183
+ @dataloader ||= self[:dataloader] || (query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new)
159
184
  end
160
185
 
161
186
  # @api private
@@ -165,24 +190,79 @@ module GraphQL
165
190
  attr_writer :value
166
191
 
167
192
  # @api private
168
- attr_accessor :scoped_context
193
+ attr_reader :scoped_context
194
+
195
+ def []=(key, value)
196
+ @provided_values[key] = value
197
+ end
169
198
 
170
- def_delegators :@provided_values, :[]=
171
- def_delegators :to_h, :fetch, :dig
172
199
  def_delegators :@query, :trace, :interpreter?
173
200
 
201
+ RUNTIME_METADATA_KEYS = Set.new([:current_object, :current_arguments, :current_field, :current_path])
174
202
  # @!method []=(key, value)
175
203
  # Reassign `key` to the hash passed to {Schema#execute} as `context:`
176
204
 
177
205
  # Lookup `key` from the hash passed to {Schema#execute} as `context:`
178
206
  def [](key)
179
- return @scoped_context[key] if @scoped_context.key?(key)
180
- @provided_values[key]
207
+ if @scoped_context.key?(key)
208
+ @scoped_context[key]
209
+ elsif @provided_values.key?(key)
210
+ @provided_values[key]
211
+ elsif RUNTIME_METADATA_KEYS.include?(key)
212
+ thread_info = Thread.current[:__graphql_runtime_info]
213
+ thread_info && thread_info[key]
214
+ else
215
+ # not found
216
+ nil
217
+ end
218
+ end
219
+
220
+ def delete(key)
221
+ if @scoped_context.key?(key)
222
+ @scoped_context.delete(key)
223
+ else
224
+ @provided_values.delete(key)
225
+ end
226
+ end
227
+
228
+ UNSPECIFIED_FETCH_DEFAULT = Object.new
229
+
230
+ def fetch(key, default = UNSPECIFIED_FETCH_DEFAULT)
231
+ if RUNTIME_METADATA_KEYS.include?(key)
232
+ (thread_info = Thread.current[:__graphql_runtime_info]) &&
233
+ thread_info[key]
234
+ elsif @scoped_context.key?(key)
235
+ scoped_context[key]
236
+ elsif @provided_values.key?(key)
237
+ @provided_values[key]
238
+ elsif default != UNSPECIFIED_FETCH_DEFAULT
239
+ default
240
+ elsif block_given?
241
+ yield(self, key)
242
+ else
243
+ raise KeyError.new(key: key)
244
+ end
245
+ end
246
+
247
+ def dig(key, *other_keys)
248
+ if RUNTIME_METADATA_KEYS.include?(key)
249
+ (thread_info = Thread.current[:__graphql_runtime_info]).key?(key) &&
250
+ thread_info.dig(key, *other_keys)
251
+ elsif @scoped_context.key?(key)
252
+ @scoped_context.dig(key, *other_keys)
253
+ else
254
+ @provided_values.dig(key, *other_keys)
255
+ end
181
256
  end
182
257
 
183
258
  def to_h
184
- @provided_values.merge(@scoped_context)
259
+ if (current_scoped_context = @scoped_context.merged_context)
260
+ @provided_values.merge(current_scoped_context)
261
+ else
262
+ @provided_values
263
+ end
185
264
  end
265
+
186
266
  alias :to_hash :to_h
187
267
 
188
268
  def key?(key)
@@ -191,146 +271,40 @@ module GraphQL
191
271
 
192
272
  # @return [GraphQL::Schema::Warden]
193
273
  def warden
194
- @warden ||= @query.warden
274
+ @warden ||= (@query && @query.warden)
195
275
  end
196
276
 
277
+ # @api private
278
+ attr_writer :warden
279
+
197
280
  # Get an isolated hash for `ns`. Doesn't affect user-provided storage.
198
281
  # @param ns [Object] a usage-specific namespace identifier
199
282
  # @return [Hash] namespaced storage
200
283
  def namespace(ns)
201
- @storage[ns]
284
+ if ns == :interpreter
285
+ self
286
+ else
287
+ @storage[ns]
288
+ end
202
289
  end
203
290
 
204
- def inspect
205
- "#<Query::Context ...>"
291
+ # @return [Boolean] true if this namespace was accessed before
292
+ def namespace?(ns)
293
+ @storage.key?(ns)
206
294
  end
207
295
 
208
- # @api private
209
- def received_null_child
210
- @invalid_null = true
211
- @value = nil
296
+ def inspect
297
+ "#<Query::Context ...>"
212
298
  end
213
299
 
214
300
  def scoped_merge!(hash)
215
- @scoped_context = @scoped_context.merge(hash)
301
+ @scoped_context.merge!(hash)
216
302
  end
217
303
 
218
304
  def scoped_set!(key, value)
219
305
  scoped_merge!(key => value)
220
306
  nil
221
307
  end
222
-
223
- class FieldResolutionContext
224
- include SharedMethods
225
- include Tracing::Traceable
226
- extend Forwardable
227
-
228
- attr_reader :irep_node, :field, :parent_type, :query, :schema, :parent, :key, :type
229
- alias :selection :irep_node
230
-
231
- def initialize(context, key, irep_node, parent, object)
232
- @context = context
233
- @key = key
234
- @parent = parent
235
- @object = object
236
- @irep_node = irep_node
237
- @field = irep_node.definition
238
- @parent_type = irep_node.owner_type
239
- @type = field.type
240
- # This is needed constantly, so set it ahead of time:
241
- @query = context.query
242
- @schema = context.schema
243
- @tracers = @query.tracers
244
- # This hack flag is required by ConnectionResolve
245
- @wrapped_connection = false
246
- @wrapped_object = false
247
- end
248
-
249
- # @api private
250
- attr_accessor :wrapped_connection, :wrapped_object
251
-
252
- def path
253
- @path ||= @parent.path.dup << @key
254
- end
255
-
256
- def_delegators :@context,
257
- :[], :[]=, :key?, :fetch, :to_h, :namespace, :dig,
258
- :spawn, :warden, :errors,
259
- :execution_strategy, :strategy, :interpreter?
260
-
261
- # @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
262
- def ast_node
263
- @irep_node.ast_node
264
- end
265
-
266
- # Add error to current field resolution.
267
- # @param error [GraphQL::ExecutionError] an execution error
268
- # @return [void]
269
- def add_error(error)
270
- super
271
- error.ast_node ||= irep_node.ast_node
272
- error.path ||= path
273
- nil
274
- end
275
-
276
- def inspect
277
- "#<GraphQL Context @ #{irep_node.owner_type.name}.#{field.name}>"
278
- end
279
-
280
- # Set a new value for this field in the response.
281
- # It may be updated after resolving a {Lazy}.
282
- # If it is {Execute::PROPAGATE_NULL}, tell the owner to propagate null.
283
- # If it's {Execute::Execution::SKIP}, remove this field result from its parent
284
- # @param new_value [Any] The GraphQL-ready value
285
- # @api private
286
- def value=(new_value)
287
- case new_value
288
- when GraphQL::Execution::Execute::PROPAGATE_NULL, nil
289
- @invalid_null = true
290
- @value = nil
291
- if @type.kind.non_null?
292
- @parent.received_null_child
293
- end
294
- when GraphQL::Execution::Execute::SKIP
295
- @parent.skipped = true
296
- @parent.delete(self)
297
- else
298
- @value = new_value
299
- end
300
- end
301
-
302
- protected
303
-
304
- def received_null_child
305
- case @value
306
- when Hash
307
- self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
308
- when Array
309
- if list_of_non_null_items?(@type)
310
- self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
311
- end
312
- when nil
313
- # TODO This is a hack
314
- # It was already nulled out but it's getting reassigned
315
- else
316
- raise "Unexpected value for received_null_child (#{self.value.class}): #{value}"
317
- end
318
- end
319
-
320
- private
321
-
322
- def list_of_non_null_items?(type)
323
- case type
324
- when GraphQL::NonNullType
325
- # Unwrap [T]!
326
- list_of_non_null_items?(type.of_type)
327
- when GraphQL::ListType
328
- type.of_type.is_a?(GraphQL::NonNullType)
329
- else
330
- raise "Unexpected list_of_non_null_items check: #{type}"
331
- end
332
- end
333
- end
334
308
  end
335
309
  end
336
310
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest/sha2'
4
+
5
+ module GraphQL
6
+ class Query
7
+ # @api private
8
+ # @see Query#query_fingerprint
9
+ # @see Query#variables_fingerprint
10
+ # @see Query#fingerprint
11
+ module Fingerprint
12
+ # Make an obfuscated hash of the given string (either a query string or variables JSON)
13
+ # @param string [String]
14
+ # @return [String] A normalized, opaque hash
15
+ def self.generate(input_str)
16
+ # Implemented to be:
17
+ # - Short (and uniform) length
18
+ # - Stable
19
+ # - Irreversibly Opaque (don't want to leak variable values)
20
+ # - URL-friendly
21
+ bytes = Digest::SHA256.digest(input_str)
22
+ Base64.urlsafe_encode64(bytes)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -4,23 +4,49 @@ module GraphQL
4
4
  class InputValidationResult
5
5
  attr_accessor :problems
6
6
 
7
+ def self.from_problem(explanation, path = nil, extensions: nil, message: nil)
8
+ result = self.new
9
+ result.add_problem(explanation, path, extensions: extensions, message: message)
10
+ result
11
+ end
12
+
13
+ def initialize(valid: true, problems: nil)
14
+ @valid = valid
15
+ @problems = problems
16
+ end
17
+
7
18
  def valid?
8
- @problems.nil?
19
+ @valid
9
20
  end
10
21
 
11
- def add_problem(explanation, path = nil)
22
+ def add_problem(explanation, path = nil, extensions: nil, message: nil)
12
23
  @problems ||= []
13
- @problems.push({ "path" => path || [], "explanation" => explanation })
24
+ @valid = false
25
+ problem = { "path" => path || [], "explanation" => explanation }
26
+ if extensions
27
+ problem["extensions"] = extensions
28
+ end
29
+ if message
30
+ problem["message"] = message
31
+ end
32
+ @problems.push(problem)
14
33
  end
15
34
 
16
35
  def merge_result!(path, inner_result)
17
- return if inner_result.valid?
36
+ return if inner_result.nil? || inner_result.valid?
18
37
 
19
- inner_result.problems.each do |p|
20
- item_path = [path, *p["path"]]
21
- add_problem(p["explanation"], item_path)
38
+ if inner_result.problems
39
+ inner_result.problems.each do |p|
40
+ item_path = [path, *p["path"]]
41
+ add_problem(p["explanation"], item_path, message: p["message"], extensions: p["extensions"])
42
+ end
22
43
  end
44
+ # It could have been explicitly set on inner_result (if it had no problems)
45
+ @valid = false
23
46
  end
47
+
48
+ VALID = self.new
49
+ VALID.freeze
24
50
  end
25
51
  end
26
52
  end
@@ -4,16 +4,25 @@ module GraphQL
4
4
  # This object can be `ctx` in places where there is no query
5
5
  class NullContext
6
6
  class NullWarden < GraphQL::Schema::Warden
7
- def visible?(t); true; end
8
- def visible_field?(t); true; end
9
- def visible_type?(t); true; end
7
+ def visible_field?(field, ctx); true; end
8
+ def visible_argument?(arg, ctx); true; end
9
+ def visible_type?(type, ctx); true; end
10
+ def visible_enum_value?(ev, ctx); true; end
11
+ def visible_type_membership?(tm, ctx); true; end
10
12
  end
11
13
 
12
- attr_reader :schema, :query, :warden
14
+ class NullQuery
15
+ end
16
+
17
+ class NullSchema < GraphQL::Schema
18
+ end
19
+
20
+ attr_reader :schema, :query, :warden, :dataloader
13
21
 
14
22
  def initialize
15
- @query = nil
16
- @schema = GraphQL::Schema.new
23
+ @query = NullQuery.new
24
+ @dataloader = GraphQL::Dataloader::NullDataloader.new
25
+ @schema = NullSchema
17
26
  @warden = NullWarden.new(
18
27
  GraphQL::Filter.new,
19
28
  context: self,
@@ -23,16 +32,20 @@ module GraphQL
23
32
 
24
33
  def [](key); end
25
34
 
35
+ def interpreter?
36
+ true
37
+ end
38
+
26
39
  class << self
27
40
  extend Forwardable
28
41
 
29
42
  def [](key); end
30
43
 
31
44
  def instance
32
- @instance = self.new
45
+ @instance ||= self.new
33
46
  end
34
47
 
35
- def_delegators :instance, :query, :schema, :warden
48
+ def_delegators :instance, :query, :warden, :schema, :interpreter?, :dataloader
36
49
  end
37
50
  end
38
51
  end
@@ -16,10 +16,8 @@ module GraphQL
16
16
  class ValidationPipeline
17
17
  attr_reader :max_depth, :max_complexity
18
18
 
19
- def initialize(query:, validate:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
19
+ def initialize(query:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
20
20
  @validation_errors = []
21
- @internal_representation = nil
22
- @validate = validate
23
21
  @parse_error = parse_error
24
22
  @operation_name_error = operation_name_error
25
23
  @query = query
@@ -36,23 +34,21 @@ module GraphQL
36
34
  @valid
37
35
  end
38
36
 
39
- # @return [Array<GraphQL::StaticValidation::Error >] Static validation errors for the query string
37
+ # @return [Array<GraphQL::StaticValidation::Error, GraphQL::Query::VariableValidationError>] Static validation errors for the query string
40
38
  def validation_errors
41
39
  ensure_has_validated
42
40
  @validation_errors
43
41
  end
44
42
 
45
- # @return [Hash<String, nil => GraphQL::InternalRepresentation::Node] Operation name -> Irep node pairs
46
- def internal_representation
47
- ensure_has_validated
48
- @internal_representation
49
- end
50
-
51
43
  def analyzers
52
44
  ensure_has_validated
53
45
  @query_analyzers
54
46
  end
55
47
 
48
+ def has_validated?
49
+ @has_validated == true
50
+ end
51
+
56
52
  private
57
53
 
58
54
  # If the pipeline wasn't run yet, run it.
@@ -63,7 +59,7 @@ module GraphQL
63
59
 
64
60
  if @parse_error
65
61
  # This is kind of crazy: we push the parse error into `ctx`
66
- # in {DefaultParseError} so that users can _opt out_ by redefining that hook.
62
+ # in `def self.parse_error` by default so that users can _opt out_ by redefining that hook.
67
63
  # That means we can't _re-add_ the error here (otherwise we'd either
68
64
  # add it twice _or_ override the user's choice to not add it).
69
65
  # So we just have to know that it was invalid and go from there.
@@ -72,9 +68,8 @@ module GraphQL
72
68
  elsif @operation_name_error
73
69
  @validation_errors << @operation_name_error
74
70
  else
75
- validation_result = @schema.static_validator.validate(@query, validate: @validate)
71
+ validation_result = @schema.static_validator.validate(@query, validate: @query.validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
76
72
  @validation_errors.concat(validation_result[:errors])
77
- @internal_representation = validation_result[:irep]
78
73
 
79
74
  if @validation_errors.empty?
80
75
  @validation_errors.concat(@query.variables.errors)
@@ -90,6 +85,9 @@ module GraphQL
90
85
  end
91
86
 
92
87
  @valid = @validation_errors.empty?
88
+ rescue SystemStackError => err
89
+ @valid = false
90
+ @schema.query_stack_error(@query, err)
93
91
  end
94
92
 
95
93
  # If there are max_* values, add them,
@@ -97,35 +95,15 @@ module GraphQL
97
95
  def build_analyzers(schema, max_depth, max_complexity)
98
96
  qa = schema.query_analyzers.dup
99
97
 
100
- # Filter out the built in authorization analyzer.
101
- # It is deprecated and does not have an AST analyzer alternative.
102
- qa = qa.select do |analyzer|
103
- if analyzer == GraphQL::Authorization::Analyzer && schema.using_ast_analysis?
104
- raise "The Authorization analyzer is not supported with AST Analyzers"
105
- else
106
- true
107
- end
108
- end
109
-
110
98
  if max_depth || max_complexity
111
99
  # Depending on the analysis engine, we must use different analyzers
112
100
  # remove this once everything has switched over to AST analyzers
113
- if schema.using_ast_analysis?
114
- if max_depth
115
- qa << GraphQL::Analysis::AST::MaxQueryDepth
116
- end
117
- if max_complexity
118
- qa << GraphQL::Analysis::AST::MaxQueryComplexity
119
- end
120
- else
121
- if max_depth
122
- qa << GraphQL::Analysis::MaxQueryDepth.new(max_depth)
123
- end
124
- if max_complexity
125
- qa << GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)
126
- end
101
+ if max_depth
102
+ qa << GraphQL::Analysis::AST::MaxQueryDepth
103
+ end
104
+ if max_complexity
105
+ qa << GraphQL::Analysis::AST::MaxQueryComplexity
127
106
  end
128
-
129
107
  qa
130
108
  else
131
109
  qa