graphql_cody 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/lib/generators/graphql/core.rb +74 -0
  5. data/lib/generators/graphql/enum_generator.rb +33 -0
  6. data/lib/generators/graphql/install_generator.rb +190 -0
  7. data/lib/generators/graphql/interface_generator.rb +27 -0
  8. data/lib/generators/graphql/loader_generator.rb +21 -0
  9. data/lib/generators/graphql/mutation_generator.rb +55 -0
  10. data/lib/generators/graphql/object_generator.rb +79 -0
  11. data/lib/generators/graphql/relay.rb +63 -0
  12. data/lib/generators/graphql/relay_generator.rb +21 -0
  13. data/lib/generators/graphql/scalar_generator.rb +20 -0
  14. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  15. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  16. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  17. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  18. data/lib/generators/graphql/templates/base_field.erb +7 -0
  19. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  20. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  21. data/lib/generators/graphql/templates/base_mutation.erb +10 -0
  22. data/lib/generators/graphql/templates/base_object.erb +7 -0
  23. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  24. data/lib/generators/graphql/templates/base_union.erb +6 -0
  25. data/lib/generators/graphql/templates/enum.erb +7 -0
  26. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  27. data/lib/generators/graphql/templates/interface.erb +8 -0
  28. data/lib/generators/graphql/templates/loader.erb +19 -0
  29. data/lib/generators/graphql/templates/mutation.erb +16 -0
  30. data/lib/generators/graphql/templates/mutation_type.erb +12 -0
  31. data/lib/generators/graphql/templates/node_type.erb +9 -0
  32. data/lib/generators/graphql/templates/object.erb +8 -0
  33. data/lib/generators/graphql/templates/query_type.erb +15 -0
  34. data/lib/generators/graphql/templates/scalar.erb +15 -0
  35. data/lib/generators/graphql/templates/schema.erb +27 -0
  36. data/lib/generators/graphql/templates/union.erb +7 -0
  37. data/lib/generators/graphql/type_generator.rb +98 -0
  38. data/lib/generators/graphql/union_generator.rb +33 -0
  39. data/lib/graphql/analysis/analyze_query.rb +98 -0
  40. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  41. data/lib/graphql/analysis/ast/field_usage.rb +51 -0
  42. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  43. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  44. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  45. data/lib/graphql/analysis/ast/query_depth.rb +56 -0
  46. data/lib/graphql/analysis/ast/visitor.rb +268 -0
  47. data/lib/graphql/analysis/ast.rb +91 -0
  48. data/lib/graphql/analysis/field_usage.rb +45 -0
  49. data/lib/graphql/analysis/max_query_complexity.rb +26 -0
  50. data/lib/graphql/analysis/max_query_depth.rb +26 -0
  51. data/lib/graphql/analysis/query_complexity.rb +88 -0
  52. data/lib/graphql/analysis/query_depth.rb +43 -0
  53. data/lib/graphql/analysis/reducer_state.rb +48 -0
  54. data/lib/graphql/analysis.rb +9 -0
  55. data/lib/graphql/analysis_error.rb +5 -0
  56. data/lib/graphql/argument.rb +131 -0
  57. data/lib/graphql/authorization.rb +82 -0
  58. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  59. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  60. data/lib/graphql/backtrace/table.rb +159 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +81 -0
  63. data/lib/graphql/backtrace.rb +64 -0
  64. data/lib/graphql/backwards_compatibility.rb +61 -0
  65. data/lib/graphql/base_type.rb +230 -0
  66. data/lib/graphql/boolean_type.rb +2 -0
  67. data/lib/graphql/coercion_error.rb +13 -0
  68. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +53 -0
  69. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +200 -0
  70. data/lib/graphql/compatibility/execution_specification.rb +436 -0
  71. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +111 -0
  72. data/lib/graphql/compatibility/lazy_execution_specification.rb +215 -0
  73. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +87 -0
  74. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +79 -0
  75. data/lib/graphql/compatibility/query_parser_specification.rb +266 -0
  76. data/lib/graphql/compatibility/schema_parser_specification.rb +682 -0
  77. data/lib/graphql/compatibility.rb +5 -0
  78. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  79. data/lib/graphql/dataloader/request.rb +19 -0
  80. data/lib/graphql/dataloader/request_all.rb +19 -0
  81. data/lib/graphql/dataloader/source.rb +155 -0
  82. data/lib/graphql/dataloader.rb +308 -0
  83. data/lib/graphql/define/assign_argument.rb +12 -0
  84. data/lib/graphql/define/assign_connection.rb +13 -0
  85. data/lib/graphql/define/assign_enum_value.rb +18 -0
  86. data/lib/graphql/define/assign_global_id_field.rb +11 -0
  87. data/lib/graphql/define/assign_mutation_function.rb +34 -0
  88. data/lib/graphql/define/assign_object_field.rb +42 -0
  89. data/lib/graphql/define/defined_object_proxy.rb +53 -0
  90. data/lib/graphql/define/instance_definable.rb +240 -0
  91. data/lib/graphql/define/no_definition_error.rb +7 -0
  92. data/lib/graphql/define/non_null_with_bang.rb +16 -0
  93. data/lib/graphql/define/type_definer.rb +31 -0
  94. data/lib/graphql/define.rb +31 -0
  95. data/lib/graphql/deprecated_dsl.rb +55 -0
  96. data/lib/graphql/deprecation.rb +9 -0
  97. data/lib/graphql/dig.rb +19 -0
  98. data/lib/graphql/directive/deprecated_directive.rb +2 -0
  99. data/lib/graphql/directive/include_directive.rb +2 -0
  100. data/lib/graphql/directive/skip_directive.rb +2 -0
  101. data/lib/graphql/directive.rb +107 -0
  102. data/lib/graphql/enum_type.rb +133 -0
  103. data/lib/graphql/execution/directive_checks.rb +37 -0
  104. data/lib/graphql/execution/errors.rb +163 -0
  105. data/lib/graphql/execution/execute.rb +333 -0
  106. data/lib/graphql/execution/flatten.rb +40 -0
  107. data/lib/graphql/execution/instrumentation.rb +92 -0
  108. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  109. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  110. data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
  111. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  112. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  113. data/lib/graphql/execution/interpreter/resolve.rb +70 -0
  114. data/lib/graphql/execution/interpreter/runtime.rb +949 -0
  115. data/lib/graphql/execution/interpreter.rb +122 -0
  116. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  117. data/lib/graphql/execution/lazy/resolve.rb +91 -0
  118. data/lib/graphql/execution/lazy.rb +83 -0
  119. data/lib/graphql/execution/lookahead.rb +307 -0
  120. data/lib/graphql/execution/multiplex.rb +214 -0
  121. data/lib/graphql/execution/typecast.rb +50 -0
  122. data/lib/graphql/execution.rb +11 -0
  123. data/lib/graphql/execution_error.rb +58 -0
  124. data/lib/graphql/field/resolve.rb +59 -0
  125. data/lib/graphql/field.rb +226 -0
  126. data/lib/graphql/filter.rb +53 -0
  127. data/lib/graphql/float_type.rb +2 -0
  128. data/lib/graphql/function.rb +128 -0
  129. data/lib/graphql/id_type.rb +2 -0
  130. data/lib/graphql/input_object_type.rb +138 -0
  131. data/lib/graphql/int_type.rb +2 -0
  132. data/lib/graphql/integer_decoding_error.rb +17 -0
  133. data/lib/graphql/integer_encoding_error.rb +36 -0
  134. data/lib/graphql/interface_type.rb +72 -0
  135. data/lib/graphql/internal_representation/document.rb +27 -0
  136. data/lib/graphql/internal_representation/node.rb +206 -0
  137. data/lib/graphql/internal_representation/print.rb +51 -0
  138. data/lib/graphql/internal_representation/rewrite.rb +184 -0
  139. data/lib/graphql/internal_representation/scope.rb +88 -0
  140. data/lib/graphql/internal_representation/visit.rb +36 -0
  141. data/lib/graphql/internal_representation.rb +7 -0
  142. data/lib/graphql/introspection/base_object.rb +13 -0
  143. data/lib/graphql/introspection/directive_location_enum.rb +15 -0
  144. data/lib/graphql/introspection/directive_type.rb +29 -0
  145. data/lib/graphql/introspection/dynamic_fields.rb +17 -0
  146. data/lib/graphql/introspection/entry_points.rb +35 -0
  147. data/lib/graphql/introspection/enum_value_type.rb +23 -0
  148. data/lib/graphql/introspection/field_type.rb +28 -0
  149. data/lib/graphql/introspection/input_value_type.rb +67 -0
  150. data/lib/graphql/introspection/introspection_query.rb +7 -0
  151. data/lib/graphql/introspection/schema_type.rb +44 -0
  152. data/lib/graphql/introspection/type_kind_enum.rb +13 -0
  153. data/lib/graphql/introspection/type_type.rb +95 -0
  154. data/lib/graphql/introspection.rb +114 -0
  155. data/lib/graphql/invalid_name_error.rb +11 -0
  156. data/lib/graphql/invalid_null_error.rb +50 -0
  157. data/lib/graphql/language/block_string.rb +99 -0
  158. data/lib/graphql/language/cache.rb +37 -0
  159. data/lib/graphql/language/definition_slice.rb +41 -0
  160. data/lib/graphql/language/document_from_schema_definition.rb +347 -0
  161. data/lib/graphql/language/generation.rb +24 -0
  162. data/lib/graphql/language/lexer.rb +1467 -0
  163. data/lib/graphql/language/lexer.rl +258 -0
  164. data/lib/graphql/language/nodes.rb +707 -0
  165. data/lib/graphql/language/parser.rb +1974 -0
  166. data/lib/graphql/language/parser.y +544 -0
  167. data/lib/graphql/language/printer.rb +366 -0
  168. data/lib/graphql/language/sanitized_printer.rb +222 -0
  169. data/lib/graphql/language/token.rb +34 -0
  170. data/lib/graphql/language/visitor.rb +242 -0
  171. data/lib/graphql/language.rb +36 -0
  172. data/lib/graphql/list_type.rb +80 -0
  173. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  174. data/lib/graphql/name_validator.rb +11 -0
  175. data/lib/graphql/non_null_type.rb +71 -0
  176. data/lib/graphql/object_type.rb +130 -0
  177. data/lib/graphql/pagination/active_record_relation_connection.rb +48 -0
  178. data/lib/graphql/pagination/array_connection.rb +77 -0
  179. data/lib/graphql/pagination/connection.rb +226 -0
  180. data/lib/graphql/pagination/connections.rb +160 -0
  181. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  182. data/lib/graphql/pagination/relation_connection.rb +196 -0
  183. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  184. data/lib/graphql/pagination.rb +6 -0
  185. data/lib/graphql/parse_error.rb +24 -0
  186. data/lib/graphql/query/arguments.rb +189 -0
  187. data/lib/graphql/query/arguments_cache.rb +24 -0
  188. data/lib/graphql/query/context.rb +371 -0
  189. data/lib/graphql/query/executor.rb +52 -0
  190. data/lib/graphql/query/fingerprint.rb +26 -0
  191. data/lib/graphql/query/input_validation_result.rb +43 -0
  192. data/lib/graphql/query/literal_input.rb +136 -0
  193. data/lib/graphql/query/null_context.rb +55 -0
  194. data/lib/graphql/query/result.rb +63 -0
  195. data/lib/graphql/query/serial_execution/field_resolution.rb +92 -0
  196. data/lib/graphql/query/serial_execution/operation_resolution.rb +19 -0
  197. data/lib/graphql/query/serial_execution/selection_resolution.rb +23 -0
  198. data/lib/graphql/query/serial_execution/value_resolution.rb +87 -0
  199. data/lib/graphql/query/serial_execution.rb +40 -0
  200. data/lib/graphql/query/validation_pipeline.rb +139 -0
  201. data/lib/graphql/query/variable_validation_error.rb +44 -0
  202. data/lib/graphql/query/variables.rb +78 -0
  203. data/lib/graphql/query.rb +454 -0
  204. data/lib/graphql/railtie.rb +117 -0
  205. data/lib/graphql/rake_task/validate.rb +63 -0
  206. data/lib/graphql/rake_task.rb +145 -0
  207. data/lib/graphql/relay/array_connection.rb +83 -0
  208. data/lib/graphql/relay/base_connection.rb +189 -0
  209. data/lib/graphql/relay/connection_instrumentation.rb +54 -0
  210. data/lib/graphql/relay/connection_resolve.rb +43 -0
  211. data/lib/graphql/relay/connection_type.rb +41 -0
  212. data/lib/graphql/relay/edge.rb +27 -0
  213. data/lib/graphql/relay/edge_type.rb +19 -0
  214. data/lib/graphql/relay/edges_instrumentation.rb +39 -0
  215. data/lib/graphql/relay/global_id_resolve.rb +18 -0
  216. data/lib/graphql/relay/mongo_relation_connection.rb +50 -0
  217. data/lib/graphql/relay/mutation/instrumentation.rb +23 -0
  218. data/lib/graphql/relay/mutation/resolve.rb +56 -0
  219. data/lib/graphql/relay/mutation/result.rb +38 -0
  220. data/lib/graphql/relay/mutation.rb +106 -0
  221. data/lib/graphql/relay/node.rb +39 -0
  222. data/lib/graphql/relay/page_info.rb +7 -0
  223. data/lib/graphql/relay/range_add.rb +59 -0
  224. data/lib/graphql/relay/relation_connection.rb +188 -0
  225. data/lib/graphql/relay/type_extensions.rb +32 -0
  226. data/lib/graphql/relay.rb +18 -0
  227. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  228. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  229. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  230. data/lib/graphql/rubocop.rb +4 -0
  231. data/lib/graphql/runtime_type_error.rb +5 -0
  232. data/lib/graphql/scalar_type.rb +91 -0
  233. data/lib/graphql/schema/addition.rb +247 -0
  234. data/lib/graphql/schema/argument.rb +383 -0
  235. data/lib/graphql/schema/base_64_bp.rb +26 -0
  236. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  237. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  238. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  239. data/lib/graphql/schema/build_from_definition.rb +477 -0
  240. data/lib/graphql/schema/built_in_types.rb +12 -0
  241. data/lib/graphql/schema/catchall_middleware.rb +35 -0
  242. data/lib/graphql/schema/default_parse_error.rb +10 -0
  243. data/lib/graphql/schema/default_type_error.rb +17 -0
  244. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  245. data/lib/graphql/schema/directive/feature.rb +66 -0
  246. data/lib/graphql/schema/directive/flagged.rb +57 -0
  247. data/lib/graphql/schema/directive/include.rb +25 -0
  248. data/lib/graphql/schema/directive/skip.rb +25 -0
  249. data/lib/graphql/schema/directive/transform.rb +60 -0
  250. data/lib/graphql/schema/directive.rb +210 -0
  251. data/lib/graphql/schema/enum.rb +193 -0
  252. data/lib/graphql/schema/enum_value.rb +97 -0
  253. data/lib/graphql/schema/field/connection_extension.rb +76 -0
  254. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  255. data/lib/graphql/schema/field.rb +880 -0
  256. data/lib/graphql/schema/field_extension.rb +69 -0
  257. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  258. data/lib/graphql/schema/finder.rb +155 -0
  259. data/lib/graphql/schema/input_object.rb +253 -0
  260. data/lib/graphql/schema/interface.rb +136 -0
  261. data/lib/graphql/schema/introspection_system.rb +169 -0
  262. data/lib/graphql/schema/invalid_type_error.rb +7 -0
  263. data/lib/graphql/schema/late_bound_type.rb +33 -0
  264. data/lib/graphql/schema/list.rb +75 -0
  265. data/lib/graphql/schema/loader.rb +226 -0
  266. data/lib/graphql/schema/member/accepts_definition.rb +159 -0
  267. data/lib/graphql/schema/member/base_dsl_methods.rb +129 -0
  268. data/lib/graphql/schema/member/build_type.rb +180 -0
  269. data/lib/graphql/schema/member/cached_graphql_definition.rb +31 -0
  270. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  271. data/lib/graphql/schema/member/has_arguments.rb +332 -0
  272. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  273. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  274. data/lib/graphql/schema/member/has_directives.rb +98 -0
  275. data/lib/graphql/schema/member/has_fields.rb +163 -0
  276. data/lib/graphql/schema/member/has_interfaces.rb +90 -0
  277. data/lib/graphql/schema/member/has_path.rb +25 -0
  278. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  279. data/lib/graphql/schema/member/has_validators.rb +31 -0
  280. data/lib/graphql/schema/member/instrumentation.rb +131 -0
  281. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
  282. data/lib/graphql/schema/member/scoped.rb +21 -0
  283. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  284. data/lib/graphql/schema/member/validates_input.rb +33 -0
  285. data/lib/graphql/schema/member.rb +161 -0
  286. data/lib/graphql/schema/middleware_chain.rb +82 -0
  287. data/lib/graphql/schema/mutation.rb +94 -0
  288. data/lib/graphql/schema/non_null.rb +67 -0
  289. data/lib/graphql/schema/null_mask.rb +11 -0
  290. data/lib/graphql/schema/object.rb +150 -0
  291. data/lib/graphql/schema/possible_types.rb +44 -0
  292. data/lib/graphql/schema/printer.rb +100 -0
  293. data/lib/graphql/schema/relay_classic_mutation.rb +160 -0
  294. data/lib/graphql/schema/rescue_middleware.rb +60 -0
  295. data/lib/graphql/schema/resolver/has_payload_type.rb +96 -0
  296. data/lib/graphql/schema/resolver.rb +397 -0
  297. data/lib/graphql/schema/scalar.rb +69 -0
  298. data/lib/graphql/schema/subscription.rb +155 -0
  299. data/lib/graphql/schema/timeout.rb +123 -0
  300. data/lib/graphql/schema/timeout_middleware.rb +88 -0
  301. data/lib/graphql/schema/traversal.rb +228 -0
  302. data/lib/graphql/schema/type_expression.rb +43 -0
  303. data/lib/graphql/schema/type_membership.rb +48 -0
  304. data/lib/graphql/schema/union.rb +95 -0
  305. data/lib/graphql/schema/unique_within_type.rb +34 -0
  306. data/lib/graphql/schema/validation.rb +313 -0
  307. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  308. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  309. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  310. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  311. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  312. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  313. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  314. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  315. data/lib/graphql/schema/validator.rb +174 -0
  316. data/lib/graphql/schema/warden.rb +409 -0
  317. data/lib/graphql/schema/wrapper.rb +29 -0
  318. data/lib/graphql/schema.rb +1945 -0
  319. data/lib/graphql/static_validation/all_rules.rb +40 -0
  320. data/lib/graphql/static_validation/base_visitor.rb +217 -0
  321. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  322. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  323. data/lib/graphql/static_validation/error.rb +46 -0
  324. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  325. data/lib/graphql/static_validation/literal_validator.rb +139 -0
  326. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  327. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +66 -0
  328. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  329. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  330. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  331. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +71 -0
  332. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  333. data/lib/graphql/static_validation/rules/directives_are_defined.rb +23 -0
  334. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  335. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +65 -0
  336. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  337. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +30 -0
  338. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  339. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +73 -0
  340. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  341. data/lib/graphql/static_validation/rules/fields_will_merge.rb +418 -0
  342. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  343. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  344. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  345. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +73 -0
  346. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  347. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +39 -0
  348. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  349. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +21 -0
  350. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  351. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  352. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  353. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +37 -0
  354. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  355. data/lib/graphql/static_validation/rules/fragments_are_used.rb +32 -0
  356. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  357. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  358. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  359. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  360. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  361. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  362. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  363. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  364. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  365. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +37 -0
  366. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  367. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  368. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  369. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  370. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  371. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +50 -0
  372. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  373. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +46 -0
  374. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  375. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  376. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  377. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +153 -0
  378. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  379. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +39 -0
  380. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  381. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +155 -0
  382. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  383. data/lib/graphql/static_validation/type_stack.rb +216 -0
  384. data/lib/graphql/static_validation/validation_context.rb +49 -0
  385. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  386. data/lib/graphql/static_validation/validator.rb +96 -0
  387. data/lib/graphql/static_validation.rb +19 -0
  388. data/lib/graphql/string_encoding_error.rb +20 -0
  389. data/lib/graphql/string_type.rb +2 -0
  390. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +245 -0
  391. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  392. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  393. data/lib/graphql/subscriptions/event.rb +144 -0
  394. data/lib/graphql/subscriptions/instrumentation.rb +79 -0
  395. data/lib/graphql/subscriptions/serialize.rb +138 -0
  396. data/lib/graphql/subscriptions/subscription_root.rb +76 -0
  397. data/lib/graphql/subscriptions.rb +299 -0
  398. data/lib/graphql/tracing/active_support_notifications_tracing.rb +35 -0
  399. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  400. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  401. data/lib/graphql/tracing/data_dog_tracing.rb +76 -0
  402. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  403. data/lib/graphql/tracing/platform_tracing.rb +139 -0
  404. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  405. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  406. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  407. data/lib/graphql/tracing/skylight_tracing.rb +70 -0
  408. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  409. data/lib/graphql/tracing.rb +95 -0
  410. data/lib/graphql/type_kinds.rb +77 -0
  411. data/lib/graphql/types/big_int.rb +23 -0
  412. data/lib/graphql/types/boolean.rb +18 -0
  413. data/lib/graphql/types/float.rb +19 -0
  414. data/lib/graphql/types/id.rb +24 -0
  415. data/lib/graphql/types/int.rb +36 -0
  416. data/lib/graphql/types/iso_8601_date.rb +34 -0
  417. data/lib/graphql/types/iso_8601_date_time.rb +65 -0
  418. data/lib/graphql/types/json.rb +25 -0
  419. data/lib/graphql/types/relay/base_connection.rb +39 -0
  420. data/lib/graphql/types/relay/base_edge.rb +29 -0
  421. data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
  422. data/lib/graphql/types/relay/default_relay.rb +27 -0
  423. data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
  424. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  425. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  426. data/lib/graphql/types/relay/node.rb +15 -0
  427. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  428. data/lib/graphql/types/relay/node_field.rb +25 -0
  429. data/lib/graphql/types/relay/nodes_field.rb +27 -0
  430. data/lib/graphql/types/relay/page_info.rb +11 -0
  431. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  432. data/lib/graphql/types/relay.rb +41 -0
  433. data/lib/graphql/types/string.rb +29 -0
  434. data/lib/graphql/types.rb +11 -0
  435. data/lib/graphql/unauthorized_error.rb +29 -0
  436. data/lib/graphql/unauthorized_field_error.rb +23 -0
  437. data/lib/graphql/union_type.rb +115 -0
  438. data/lib/graphql/unresolved_type_error.rb +35 -0
  439. data/lib/graphql/upgrader/member.rb +937 -0
  440. data/lib/graphql/upgrader/schema.rb +38 -0
  441. data/lib/graphql/version.rb +4 -0
  442. data/lib/graphql.rb +168 -0
  443. data/readme.md +49 -0
  444. metadata +714 -0
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class EnumType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
7
+ accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
8
+ ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
9
+ attr_accessor :ast_node
10
+
11
+ def initialize
12
+ super
13
+ @values_by_name = {}
14
+ end
15
+
16
+ def initialize_copy(other)
17
+ super
18
+ self.values = other.values.values
19
+ end
20
+
21
+ # @param new_values [Array<EnumValue>] The set of values contained in this type
22
+ def values=(new_values)
23
+ @values_by_name = {}
24
+ new_values.each { |enum_value| add_value(enum_value) }
25
+ end
26
+
27
+ # @param enum_value [EnumValue] A value to add to this type's set of values
28
+ def add_value(enum_value)
29
+ if @values_by_name.key?(enum_value.name)
30
+ raise "Enum value names must be unique. Value `#{enum_value.name}` already exists on Enum `#{name}`."
31
+ end
32
+
33
+ @values_by_name[enum_value.name] = enum_value
34
+ end
35
+
36
+ # @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
37
+ def values(_context = nil)
38
+ @values_by_name
39
+ end
40
+
41
+ def enum_values(_context = nil)
42
+ values.values
43
+ end
44
+
45
+ def kind
46
+ GraphQL::TypeKinds::ENUM
47
+ end
48
+
49
+ def coerce_result(value, ctx = nil)
50
+ if ctx.nil?
51
+ warn_deprecated_coerce("coerce_isolated_result")
52
+ ctx = GraphQL::Query::NullContext
53
+ end
54
+
55
+ warden = ctx.warden
56
+ all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
57
+ enum_value = all_values.find { |val| val.value == value }
58
+ if enum_value
59
+ enum_value.name
60
+ else
61
+ raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
62
+ end
63
+ end
64
+
65
+ def to_s
66
+ name
67
+ end
68
+
69
+ # A value within an {EnumType}
70
+ #
71
+ # Created with the `value` helper
72
+ class EnumValue
73
+ include GraphQL::Define::InstanceDefinable
74
+ ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
75
+ accepts_definitions(*ATTRIBUTES)
76
+ attr_accessor(*ATTRIBUTES)
77
+ attr_accessor :ast_node
78
+ ensure_defined(*ATTRIBUTES)
79
+
80
+ undef name=
81
+ def name=(new_name)
82
+ # Validate that the name is correct
83
+ GraphQL::NameValidator.validate!(new_name)
84
+ @name = new_name
85
+ end
86
+
87
+ def graphql_name
88
+ name
89
+ end
90
+
91
+ def type_class
92
+ metadata[:type_class]
93
+ end
94
+ end
95
+
96
+ class UnresolvedValueError < GraphQL::Error
97
+ end
98
+
99
+ private
100
+
101
+ # Get the underlying value for this enum value
102
+ #
103
+ # @example get episode value from Enum
104
+ # episode = EpisodeEnum.coerce("NEWHOPE")
105
+ # episode # => 6
106
+ #
107
+ # @param value_name [String] the string representation of this enum value
108
+ # @return [Object] the underlying value for this enum value
109
+ def coerce_non_null_input(value_name, ctx)
110
+ if @values_by_name.key?(value_name)
111
+ @values_by_name.fetch(value_name).value
112
+ elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
113
+ # this is for matching default values, which are "inputs", but they're
114
+ # the Ruby value, not the GraphQL string.
115
+ match_by_value[1].value
116
+ else
117
+ nil
118
+ end
119
+ end
120
+
121
+ def validate_non_null_input(value_name, ctx)
122
+ result = GraphQL::Query::InputValidationResult.new
123
+ allowed_values = ctx.warden.enum_values(self)
124
+ matching_value = allowed_values.find { |v| v.name == value_name }
125
+
126
+ if matching_value.nil?
127
+ result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
128
+ end
129
+
130
+ result
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Execution
4
+ # Boolean checks for how an AST node's directives should
5
+ # influence its execution
6
+ # @api private
7
+ module DirectiveChecks
8
+ SKIP = "skip"
9
+ INCLUDE = "include"
10
+
11
+ module_function
12
+
13
+ # @return [Boolean] Should this node be included in the query?
14
+ def include?(directive_ast_nodes, query)
15
+ directive_ast_nodes.each do |directive_ast_node|
16
+ name = directive_ast_node.name
17
+ directive_defn = query.schema.directives[name]
18
+ case name
19
+ when SKIP
20
+ args = query.arguments_for(directive_ast_node, directive_defn)
21
+ if args[:if] == true
22
+ return false
23
+ end
24
+ when INCLUDE
25
+ args = query.arguments_for(directive_ast_node, directive_defn)
26
+ if args[:if] == false
27
+ return false
28
+ end
29
+ else
30
+ # Undefined directive, or one we don't care about
31
+ end
32
+ end
33
+ true
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Execution
5
+ # A plugin that wraps query execution with error handling.
6
+ # Supports class-based schemas and the new {Interpreter} runtime only.
7
+ #
8
+ # @example Handling ActiveRecord::NotFound
9
+ #
10
+ # class MySchema < GraphQL::Schema
11
+ # use GraphQL::Execution::Errors
12
+ #
13
+ # rescue_from(ActiveRecord::NotFound) do |err, obj, args, ctx, field|
14
+ # ErrorTracker.log("Not Found: #{err.message}")
15
+ # nil
16
+ # end
17
+ # end
18
+ #
19
+ class Errors
20
+ def self.use(schema)
21
+ definition_line = caller(2, 1).first
22
+ GraphQL::Deprecation.warn("GraphQL::Execution::Errors is now installed by default, remove `use GraphQL::Execution::Errors` from #{definition_line}")
23
+ end
24
+
25
+ NEW_HANDLER_HASH = ->(h, k) {
26
+ h[k] = {
27
+ class: k,
28
+ handler: nil,
29
+ subclass_handlers: Hash.new(&NEW_HANDLER_HASH),
30
+ }
31
+ }
32
+
33
+ def initialize(schema)
34
+ @schema = schema
35
+ @handlers = {
36
+ class: nil,
37
+ handler: nil,
38
+ subclass_handlers: Hash.new(&NEW_HANDLER_HASH),
39
+ }
40
+ end
41
+
42
+ # @api private
43
+ def each_rescue
44
+ handlers = @handlers.values
45
+ while (handler = handlers.shift) do
46
+ yield(handler[:class], handler[:handler])
47
+ handlers.concat(handler[:subclass_handlers].values)
48
+ end
49
+ end
50
+
51
+ # Register this handler, updating the
52
+ # internal handler index to maintain least-to-most specific.
53
+ #
54
+ # @param error_class [Class<Exception>]
55
+ # @param error_handler [Proc]
56
+ # @return [void]
57
+ def rescue_from(error_class, error_handler)
58
+ subclasses_handlers = {}
59
+ this_level_subclasses = []
60
+ # During this traversal, do two things:
61
+ # - Identify any already-registered subclasses of this error class
62
+ # and gather them up to be inserted _under_ this class
63
+ # - Find the point in the index where this handler should be inserted
64
+ # (That is, _under_ any superclasses, or at top-level, if there are no superclasses registered)
65
+ handlers = @handlers[:subclass_handlers]
66
+ while (handlers) do
67
+ this_level_subclasses.clear
68
+ # First, identify already-loaded handlers that belong
69
+ # _under_ this one. (That is, they're handlers
70
+ # for subclasses of `error_class`.)
71
+ handlers.each do |err_class, handler|
72
+ if err_class < error_class
73
+ subclasses_handlers[err_class] = handler
74
+ this_level_subclasses << err_class
75
+ end
76
+ end
77
+ # Any handlers that we'll be moving, delete them from this point in the index
78
+ this_level_subclasses.each do |err_class|
79
+ handlers.delete(err_class)
80
+ end
81
+
82
+ # See if any keys in this hash are superclasses of this new class:
83
+ next_index_point = handlers.find { |err_class, handler| error_class < err_class }
84
+ if next_index_point
85
+ handlers = next_index_point[1][:subclass_handlers]
86
+ else
87
+ # this new handler doesn't belong to any sub-handlers,
88
+ # so insert it in the current set of `handlers`
89
+ break
90
+ end
91
+ end
92
+ # Having found the point at which to insert this handler,
93
+ # register it and merge any subclass handlers back in at this point.
94
+ this_class_handlers = handlers[error_class]
95
+ this_class_handlers[:handler] = error_handler
96
+ this_class_handlers[:subclass_handlers].merge!(subclasses_handlers)
97
+ nil
98
+ end
99
+
100
+ # Call the given block with the schema's configured error handlers.
101
+ #
102
+ # If the block returns a lazy value, it's not wrapped with error handling. That area will have to be wrapped itself.
103
+ #
104
+ # @param ctx [GraphQL::Query::Context]
105
+ # @return [Object] Either the result of the given block, or some object to replace the result, in case of error handling.
106
+ def with_error_handling(ctx)
107
+ yield
108
+ rescue StandardError => err
109
+ handler = find_handler_for(err.class)
110
+ if handler
111
+ runtime_info = ctx.namespace(:interpreter) || {}
112
+ obj = runtime_info[:current_object]
113
+ args = runtime_info[:current_arguments]
114
+ args = args && args.keyword_arguments
115
+ field = runtime_info[:current_field]
116
+ if obj.is_a?(GraphQL::Schema::Object)
117
+ obj = obj.object
118
+ end
119
+ handler[:handler].call(err, obj, args, ctx, field)
120
+ else
121
+ raise err
122
+ end
123
+ end
124
+
125
+ # @return [Proc, nil] The handler for `error_class`, if one was registered on this schema or inherited
126
+ def find_handler_for(error_class)
127
+ handlers = @handlers[:subclass_handlers]
128
+ handler = nil
129
+ while (handlers) do
130
+ _err_class, next_handler = handlers.find { |err_class, handler| error_class <= err_class }
131
+ if next_handler
132
+ handlers = next_handler[:subclass_handlers]
133
+ handler = next_handler
134
+ else
135
+ # Don't reassign `handler` --
136
+ # let the previous assignment carry over outside this block.
137
+ break
138
+ end
139
+ end
140
+
141
+ # check for a handler from a parent class:
142
+ if @schema.superclass.respond_to?(:error_handler) && (parent_errors = @schema.superclass.error_handler)
143
+ parent_handler = parent_errors.find_handler_for(error_class)
144
+ end
145
+
146
+ # If the inherited handler is more specific than the one defined here,
147
+ # use it.
148
+ # If it's a tie (or there is no parent handler), use the one defined here.
149
+ # If there's an inherited one, but not one defined here, use the inherited one.
150
+ # Otherwise, there's no handler for this error, return `nil`.
151
+ if parent_handler && handler && parent_handler[:class] < handler[:class]
152
+ parent_handler
153
+ elsif handler
154
+ handler
155
+ elsif parent_handler
156
+ parent_handler
157
+ else
158
+ nil
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,333 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Execution
4
+ # A valid execution strategy
5
+ # @api private
6
+ class Execute
7
+
8
+ # @api private
9
+ class Skip < GraphQL::Error; end
10
+
11
+ # Just a singleton for implementing {Query::Context#skip}
12
+ # @api private
13
+ SKIP = Skip.new
14
+
15
+ # @api private
16
+ class PropagateNull
17
+ end
18
+ # @api private
19
+ PROPAGATE_NULL = PropagateNull.new
20
+
21
+ def self.use(schema_class)
22
+ schema_class.query_execution_strategy(self)
23
+ schema_class.mutation_execution_strategy(self)
24
+ schema_class.subscription_execution_strategy(self)
25
+ end
26
+
27
+ def execute(ast_operation, root_type, query)
28
+ GraphQL::Deprecation.warn "#{self.class} will be removed in GraphQL-Ruby 2.0, please upgrade to the Interpreter: https://graphql-ruby.org/queries/interpreter.html"
29
+ result = resolve_root_selection(query)
30
+ lazy_resolve_root_selection(result, **{query: query})
31
+ GraphQL::Execution::Flatten.call(query.context)
32
+ end
33
+
34
+ def self.begin_multiplex(_multiplex)
35
+ end
36
+
37
+ def self.begin_query(query, _multiplex)
38
+ ExecutionFunctions.resolve_root_selection(query)
39
+ end
40
+
41
+ def self.finish_multiplex(results, multiplex)
42
+ ExecutionFunctions.lazy_resolve_root_selection(results, multiplex: multiplex)
43
+ end
44
+
45
+ def self.finish_query(query, _multiplex)
46
+ {
47
+ "data" => Execution::Flatten.call(query.context)
48
+ }
49
+ end
50
+
51
+ # @api private
52
+ module ExecutionFunctions
53
+ module_function
54
+
55
+ def resolve_root_selection(query)
56
+ query.trace("execute_query", query: query) do
57
+ operation = query.selected_operation
58
+ op_type = operation.operation_type
59
+ root_type = query.root_type_for_operation(op_type)
60
+ if query.context[:__root_unauthorized]
61
+ # This was set by member/instrumentation.rb so that we wouldn't continue.
62
+ else
63
+ resolve_selection(
64
+ query.root_value,
65
+ root_type,
66
+ query.context,
67
+ mutation: query.mutation?
68
+ )
69
+ end
70
+ end
71
+ end
72
+
73
+ def lazy_resolve_root_selection(result, query: nil, multiplex: nil)
74
+ if query.nil? && multiplex.queries.length == 1
75
+ query = multiplex.queries[0]
76
+ end
77
+
78
+ tracer = (query || multiplex)
79
+ tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
80
+ GraphQL::Execution::Lazy.resolve(result)
81
+ end
82
+ end
83
+
84
+ def resolve_selection(object, current_type, current_ctx, mutation: false )
85
+ # Assign this _before_ resolving the children
86
+ # so that when a child propagates null, the selection result is
87
+ # ready for it.
88
+ current_ctx.value = {}
89
+
90
+ selections_on_type = current_ctx.irep_node.typed_children[current_type]
91
+
92
+ selections_on_type.each do |name, child_irep_node|
93
+ field_ctx = current_ctx.spawn_child(
94
+ key: name,
95
+ object: object,
96
+ irep_node: child_irep_node,
97
+ )
98
+
99
+ field_result = resolve_field(
100
+ object,
101
+ field_ctx
102
+ )
103
+
104
+ if field_result.is_a?(Skip)
105
+ next
106
+ end
107
+
108
+ if mutation
109
+ GraphQL::Execution::Lazy.resolve(field_ctx)
110
+ end
111
+
112
+
113
+ # If the last subselection caused a null to propagate to _this_ selection,
114
+ # then we may as well quit executing fields because they
115
+ # won't be in the response
116
+ if current_ctx.invalid_null?
117
+ break
118
+ else
119
+ current_ctx.value[name] = field_ctx
120
+ end
121
+ end
122
+
123
+ current_ctx.value
124
+ end
125
+
126
+ def resolve_field(object, field_ctx)
127
+ query = field_ctx.query
128
+ irep_node = field_ctx.irep_node
129
+ parent_type = irep_node.owner_type
130
+ field = field_ctx.field
131
+
132
+ raw_value = begin
133
+ begin
134
+ arguments = query.arguments_for(irep_node, field)
135
+ field_ctx.trace("execute_field", { context: field_ctx }) do
136
+ field_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
137
+ end
138
+ rescue GraphQL::UnauthorizedFieldError => err
139
+ err.field ||= field
140
+ field_ctx.schema.unauthorized_field(err)
141
+ rescue GraphQL::UnauthorizedError => err
142
+ field_ctx.schema.unauthorized_object(err)
143
+ end
144
+ rescue GraphQL::ExecutionError => err
145
+ err
146
+ end
147
+
148
+ if field_ctx.schema.lazy?(raw_value)
149
+ field_ctx.value = Execution::Lazy.new {
150
+ inner_value = field_ctx.trace("execute_field_lazy", {context: field_ctx}) {
151
+ begin
152
+ begin
153
+ field_ctx.field.lazy_resolve(raw_value, arguments, field_ctx)
154
+ rescue GraphQL::UnauthorizedError => err
155
+ field_ctx.schema.unauthorized_object(err)
156
+ end
157
+ rescue GraphQL::ExecutionError => err
158
+ err
159
+ end
160
+ }
161
+ continue_or_wait(inner_value, field_ctx.type, field_ctx)
162
+ }
163
+ else
164
+ continue_or_wait(raw_value, field_ctx.type, field_ctx)
165
+ end
166
+ end
167
+
168
+ # If the returned object is lazy (unfinished),
169
+ # assign the lazy object to `.value=` so we can resolve it later.
170
+ # When we resolve it later, reassign it to `.value=` so that
171
+ # the finished value replaces the unfinished one.
172
+ #
173
+ # If the returned object is finished, continue to coerce
174
+ # and resolve child fields
175
+ def continue_or_wait(raw_value, field_type, field_ctx)
176
+ if field_ctx.schema.lazy?(raw_value)
177
+ field_ctx.value = Execution::Lazy.new {
178
+ inner_value = begin
179
+ begin
180
+ field_ctx.schema.sync_lazy(raw_value)
181
+ rescue GraphQL::UnauthorizedError => err
182
+ field_ctx.schema.unauthorized_object(err)
183
+ end
184
+ rescue GraphQL::ExecutionError => err
185
+ err
186
+ end
187
+
188
+ field_ctx.value = continue_or_wait(inner_value, field_type, field_ctx)
189
+ }
190
+ else
191
+ field_ctx.value = continue_resolve_field(raw_value, field_type, field_ctx)
192
+ end
193
+ end
194
+
195
+ def continue_resolve_field(raw_value, field_type, field_ctx)
196
+ if field_ctx.parent.invalid_null?
197
+ return nil
198
+ end
199
+ query = field_ctx.query
200
+
201
+ case raw_value
202
+ when GraphQL::ExecutionError
203
+ raw_value.ast_node ||= field_ctx.ast_node
204
+ raw_value.path = field_ctx.path
205
+ query.context.errors.push(raw_value)
206
+ when Array
207
+ if field_type.non_null?
208
+ # List type errors are handled above, this is for the case of fields returning an array of errors
209
+ list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
210
+ if list_errors.any?
211
+ list_errors.each do |error, index|
212
+ error.ast_node = field_ctx.ast_node
213
+ error.path = field_ctx.path + (field_ctx.type.list? ? [index] : [])
214
+ query.context.errors.push(error)
215
+ end
216
+ end
217
+ end
218
+ end
219
+
220
+ resolve_value(
221
+ raw_value,
222
+ field_type,
223
+ field_ctx,
224
+ )
225
+ end
226
+
227
+ def resolve_value(value, field_type, field_ctx)
228
+ field_defn = field_ctx.field
229
+
230
+ if value.nil?
231
+ if field_type.kind.non_null?
232
+ parent_type = field_ctx.irep_node.owner_type
233
+ type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
234
+ field_ctx.schema.type_error(type_error, field_ctx)
235
+ PROPAGATE_NULL
236
+ else
237
+ nil
238
+ end
239
+ elsif value.is_a?(GraphQL::ExecutionError)
240
+ if field_type.kind.non_null?
241
+ PROPAGATE_NULL
242
+ else
243
+ nil
244
+ end
245
+ elsif value.is_a?(Array) && value.any? && value.all? {|v| v.is_a?(GraphQL::ExecutionError)}
246
+ if field_type.kind.non_null?
247
+ PROPAGATE_NULL
248
+ else
249
+ nil
250
+ end
251
+ elsif value.is_a?(Skip)
252
+ field_ctx.value = value
253
+ else
254
+ case field_type.kind
255
+ when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
256
+ field_type.coerce_result(value, field_ctx)
257
+ when GraphQL::TypeKinds::LIST
258
+ inner_type = field_type.of_type
259
+ i = 0
260
+ result = []
261
+ field_ctx.value = result
262
+
263
+ value.each do |inner_value|
264
+ inner_ctx = field_ctx.spawn_child(
265
+ key: i,
266
+ object: inner_value,
267
+ irep_node: field_ctx.irep_node,
268
+ )
269
+
270
+ inner_result = continue_or_wait(
271
+ inner_value,
272
+ inner_type,
273
+ inner_ctx,
274
+ )
275
+
276
+ return PROPAGATE_NULL if inner_result == PROPAGATE_NULL
277
+
278
+ result << inner_ctx
279
+ i += 1
280
+ end
281
+
282
+ result
283
+ when GraphQL::TypeKinds::NON_NULL
284
+ inner_type = field_type.of_type
285
+ resolve_value(
286
+ value,
287
+ inner_type,
288
+ field_ctx,
289
+ )
290
+ when GraphQL::TypeKinds::OBJECT
291
+ resolve_selection(
292
+ value,
293
+ field_type,
294
+ field_ctx
295
+ )
296
+ when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
297
+ query = field_ctx.query
298
+ resolved_type_or_lazy = field_type.resolve_type(value, field_ctx)
299
+ query.schema.after_lazy(resolved_type_or_lazy) do |resolved_type|
300
+ possible_types = query.possible_types(field_type)
301
+
302
+ if !possible_types.include?(resolved_type)
303
+ parent_type = field_ctx.irep_node.owner_type
304
+ type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
305
+ field_ctx.schema.type_error(type_error, field_ctx)
306
+ PROPAGATE_NULL
307
+ else
308
+ resolve_value(
309
+ value,
310
+ resolved_type,
311
+ field_ctx,
312
+ )
313
+ end
314
+ end
315
+ else
316
+ raise("Unknown type kind: #{field_type.kind}")
317
+ end
318
+ end
319
+ end
320
+ end
321
+
322
+ include ExecutionFunctions
323
+
324
+ # A `.call`-able suitable to be the last step in a middleware chain
325
+ module FieldResolveStep
326
+ # Execute the field's resolve method
327
+ def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
328
+ field_definition.resolve(parent_object, field_args, context)
329
+ end
330
+ end
331
+ end
332
+ end
333
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Execution
4
+ # Starting from a root context,
5
+ # create a hash out of the context tree.
6
+ # @api private
7
+ module Flatten
8
+ def self.call(ctx)
9
+ flatten(ctx)
10
+ end
11
+
12
+ class << self
13
+ private
14
+
15
+ def flatten(obj)
16
+ case obj
17
+ when Hash
18
+ flattened = {}
19
+ obj.each do |key, val|
20
+ flattened[key] = flatten(val)
21
+ end
22
+ flattened
23
+ when Array
24
+ obj.map { |v| flatten(v) }
25
+ when Query::Context::SharedMethods
26
+ if obj.invalid_null?
27
+ nil
28
+ elsif obj.skipped? && obj.value.empty?
29
+ nil
30
+ else
31
+ flatten(obj.value)
32
+ end
33
+ else
34
+ obj
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end