graphql_cody 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
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,128 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class Function
5
+ def self.inherited(subclass)
6
+ GraphQL::Deprecation.warn "GraphQL::Function (used for #{subclass}) will be removed from GraphQL-Ruby 2.0, please upgrade to resolvers: https://graphql-ruby.org/fields/resolvers.html"
7
+ end
8
+
9
+ # @return [Hash<String => GraphQL::Argument>] Arguments, keyed by name
10
+ def arguments
11
+ self.class.arguments
12
+ end
13
+
14
+ # @return [GraphQL::BaseType] Return type
15
+ def type
16
+ self.class.type
17
+ end
18
+
19
+ # @return [Object] This function's resolver
20
+ def call(obj, args, ctx)
21
+ raise GraphQL::RequiredImplementationMissingError
22
+ end
23
+
24
+ # @return [String, nil]
25
+ def description
26
+ self.class.description
27
+ end
28
+
29
+ # @return [String, nil]
30
+ def deprecation_reason
31
+ self.class.deprecation_reason
32
+ end
33
+
34
+ # @return [Integer, Proc]
35
+ def complexity
36
+ self.class.complexity || 1
37
+ end
38
+
39
+ class << self
40
+ # Define an argument for this function & its subclasses
41
+ # @see {GraphQL::Field} same arguments as the `argument` definition helper
42
+ # @return [void]
43
+ def argument(*args, **kwargs, &block)
44
+ argument = GraphQL::Argument.from_dsl(*args, **kwargs, &block)
45
+ own_arguments[argument.name] = argument
46
+ nil
47
+ end
48
+
49
+ # @return [Hash<String => GraphQL::Argument>] Arguments for this function class, including inherited arguments
50
+ def arguments
51
+ if parent_function?
52
+ own_arguments.merge(superclass.arguments)
53
+ else
54
+ own_arguments.dup
55
+ end
56
+ end
57
+
58
+ # Provides shorthand access to GraphQL's built-in types
59
+ def types
60
+ GraphQL::Define::TypeDefiner.instance
61
+ end
62
+
63
+ # Get or set the return type for this function class & descendants
64
+ # @return [GraphQL::BaseType]
65
+ def type(premade_type = nil, &block)
66
+ if block_given?
67
+ @type = GraphQL::ObjectType.define(&block)
68
+ elsif premade_type
69
+ @type = premade_type
70
+ elsif parent_function?
71
+ @type || superclass.type
72
+ else
73
+ @type
74
+ end
75
+ end
76
+
77
+ def build_field(function)
78
+ GraphQL::Field.define(
79
+ arguments: function.arguments,
80
+ complexity: function.complexity,
81
+ type: function.type,
82
+ resolve: function,
83
+ description: function.description,
84
+ function: function,
85
+ deprecation_reason: function.deprecation_reason,
86
+ )
87
+ end
88
+
89
+ # Class-level reader/writer which is inherited
90
+ # @api private
91
+ def self.inherited_value(name)
92
+ self.class_eval <<-RUBY
93
+ def #{name}(new_value = nil)
94
+ if new_value
95
+ @#{name} = new_value
96
+ elsif parent_function?
97
+ @#{name} || superclass.#{name}
98
+ else
99
+ @#{name}
100
+ end
101
+ end
102
+ RUBY
103
+ end
104
+
105
+ # @!method description(new_value = nil)
106
+ # Get or set this class's description
107
+ inherited_value(:description)
108
+ # @!method deprecation_reason(new_value = nil)
109
+ # Get or set this class's deprecation_reason
110
+ inherited_value(:deprecation_reason)
111
+ # @!method complexity(new_value = nil)
112
+ # Get or set this class's complexity
113
+ inherited_value(:complexity)
114
+
115
+ private
116
+
117
+ # Does this function inherit from another function?
118
+ def parent_function?
119
+ superclass <= GraphQL::Function
120
+ end
121
+
122
+ # Arguments defined on this class (not superclasses)
123
+ def own_arguments
124
+ @own_arguments ||= {}
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ GraphQL::ID_TYPE = GraphQL::Types::ID.graphql_definition
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class InputObjectType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
7
+ accepts_definitions(
8
+ :arguments, :mutation,
9
+ input_field: GraphQL::Define::AssignArgument,
10
+ argument: GraphQL::Define::AssignArgument
11
+ )
12
+
13
+ attr_accessor :mutation, :arguments, :arguments_class
14
+ ensure_defined(:mutation, :arguments, :input_fields)
15
+ alias :input_fields :arguments
16
+
17
+ # @!attribute mutation
18
+ # @return [GraphQL::Relay::Mutation, nil] The mutation this field was derived from, if it was derived from a mutation
19
+
20
+ # @!attribute arguments
21
+ # @return [Hash<String => GraphQL::Argument>] Map String argument names to their {GraphQL::Argument} implementations
22
+
23
+
24
+ def initialize
25
+ super
26
+ @arguments = {}
27
+ end
28
+
29
+ def initialize_copy(other)
30
+ super
31
+ @arguments = other.arguments.dup
32
+ end
33
+
34
+ def kind
35
+ GraphQL::TypeKinds::INPUT_OBJECT
36
+ end
37
+
38
+ def coerce_result(value, ctx = nil)
39
+ if ctx.nil?
40
+ warn_deprecated_coerce("coerce_isolated_result")
41
+ ctx = GraphQL::Query::NullContext
42
+ end
43
+
44
+ # Allow the application to provide values as :symbols, and convert them to the strings
45
+ value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
46
+
47
+ result = {}
48
+
49
+ arguments.each do |input_key, input_field_defn|
50
+ input_value = value[input_key]
51
+ if value.key?(input_key)
52
+ result[input_key] = if input_value.nil?
53
+ nil
54
+ else
55
+ input_field_defn.type.coerce_result(input_value, ctx)
56
+ end
57
+ end
58
+ end
59
+
60
+ result
61
+ end
62
+
63
+ def get_argument(argument_name)
64
+ arguments[argument_name]
65
+ end
66
+
67
+ private
68
+
69
+ def coerce_non_null_input(value, ctx)
70
+ input_values = {}
71
+ defaults_used = Set.new
72
+
73
+ arguments.each do |input_key, input_field_defn|
74
+ field_value = value[input_key]
75
+
76
+ if value.key?(input_key)
77
+ coerced_value = input_field_defn.type.coerce_input(field_value, ctx)
78
+ input_values[input_key] = input_field_defn.prepare(coerced_value, ctx)
79
+ elsif input_field_defn.default_value?
80
+ coerced_value = input_field_defn.type.coerce_input(input_field_defn.default_value, ctx)
81
+ input_values[input_key] = coerced_value
82
+ defaults_used << input_key
83
+ end
84
+ end
85
+
86
+ result = arguments_class.new(input_values, context: ctx, defaults_used: defaults_used)
87
+ result.prepare
88
+ end
89
+
90
+ # @api private
91
+ INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key, value object responding to `to_h` or `to_unsafe_h`."
92
+
93
+ def validate_non_null_input(input, ctx)
94
+ warden = ctx.warden
95
+ result = GraphQL::Query::InputValidationResult.new
96
+
97
+ if input.is_a?(Array)
98
+ result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
99
+ return result
100
+ end
101
+
102
+ # We're not actually _using_ the coerced result, we're just
103
+ # using these methods to make sure that the object will
104
+ # behave like a hash below, when we call `each` on it.
105
+ begin
106
+ input.to_h
107
+ rescue
108
+ begin
109
+ # Handle ActionController::Parameters:
110
+ input.to_unsafe_h
111
+ rescue
112
+ # We're not sure it'll act like a hash, so reject it:
113
+ result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
114
+ return result
115
+ end
116
+ end
117
+
118
+ visible_arguments_map = warden.arguments(self).reduce({}) { |m, f| m[f.name] = f; m}
119
+
120
+ # Items in the input that are unexpected
121
+ input.each do |name, value|
122
+ if visible_arguments_map[name].nil?
123
+ result.add_problem("Field is not defined on #{self.graphql_name}", [name])
124
+ end
125
+ end
126
+
127
+ # Items in the input that are expected, but have invalid values
128
+ visible_arguments_map.map do |name, field|
129
+ field_result = field.type.validate_input(input[name], ctx)
130
+ if !field_result.valid?
131
+ result.merge_result!(name, field_result)
132
+ end
133
+ end
134
+
135
+ result
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ GraphQL::INT_TYPE = GraphQL::Types::Int.graphql_definition
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # This error is raised when `Types::Int` is given an input value outside of 32-bit integer range.
4
+ #
5
+ # For really big integer values, consider `GraphQL::Types::BigInt`
6
+ #
7
+ # @see GraphQL::Types::Int which raises this error
8
+ class IntegerDecodingError < GraphQL::RuntimeTypeError
9
+ # The value which couldn't be decoded
10
+ attr_reader :integer_value
11
+
12
+ def initialize(value)
13
+ @integer_value = value
14
+ super("Integer out of bounds: #{value}. \nConsider using GraphQL::Types::BigInt instead.")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # This error is raised when `Types::Int` is asked to return a value outside of 32-bit integer range.
4
+ #
5
+ # For values outside that range, consider:
6
+ #
7
+ # - `ID` for database primary keys or other identifiers
8
+ # - `GraphQL::Types::BigInt` for really big integer values
9
+ #
10
+ # @see GraphQL::Types::Int which raises this error
11
+ class IntegerEncodingError < GraphQL::RuntimeTypeError
12
+ # The value which couldn't be encoded
13
+ attr_reader :integer_value
14
+
15
+ # @return [GraphQL::Schema::Field] The field that returned a too-big integer
16
+ attr_reader :field
17
+
18
+ # @return [Array<String, Integer>] Where the field appeared in the GraphQL response
19
+ attr_reader :path
20
+
21
+ def initialize(value, context:)
22
+ @integer_value = value
23
+ @field = context[:current_field]
24
+ @path = context[:current_path]
25
+ message = "Integer out of bounds: #{value}".dup
26
+ if @path
27
+ message << " @ #{@path.join(".")}"
28
+ end
29
+ if @field
30
+ message << " (#{@field.path})"
31
+ end
32
+ message << ". Consider using ID or GraphQL::Types::BigInt instead."
33
+ super(message)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class InterfaceType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
7
+ accepts_definitions :fields, :orphan_types, :resolve_type, field: GraphQL::Define::AssignObjectField
8
+
9
+ attr_accessor :fields, :orphan_types, :resolve_type_proc
10
+ attr_writer :type_membership_class
11
+ ensure_defined :fields, :orphan_types, :resolve_type_proc, :resolve_type
12
+
13
+ def initialize
14
+ super
15
+ @fields = {}
16
+ @orphan_types = []
17
+ @resolve_type_proc = nil
18
+ end
19
+
20
+ def initialize_copy(other)
21
+ super
22
+ @fields = other.fields.dup
23
+ @orphan_types = other.orphan_types.dup
24
+ end
25
+
26
+ def kind
27
+ GraphQL::TypeKinds::INTERFACE
28
+ end
29
+
30
+ def resolve_type(value, ctx)
31
+ ctx.query.resolve_type(self, value)
32
+ end
33
+
34
+ def resolve_type=(resolve_type_callable)
35
+ @resolve_type_proc = resolve_type_callable
36
+ end
37
+
38
+ # @return [GraphQL::Field] The defined field for `field_name`
39
+ def get_field(field_name)
40
+ fields[field_name]
41
+ end
42
+
43
+ # These fields don't have instrumenation applied
44
+ # @see [Schema#get_fields] Get fields with instrumentation
45
+ # @return [Array<GraphQL::Field>] All fields on this type
46
+ def all_fields
47
+ fields.values
48
+ end
49
+
50
+ # Get a possible type of this {InterfaceType} by type name
51
+ # @param type_name [String]
52
+ # @param ctx [GraphQL::Query::Context] The context for the current query
53
+ # @return [GraphQL::ObjectType, nil] The type named `type_name` if it exists and implements this {InterfaceType}, (else `nil`)
54
+ def get_possible_type(type_name, ctx)
55
+ type = ctx.query.get_type(type_name)
56
+ type if type && ctx.query.warden.possible_types(self).include?(type)
57
+ end
58
+
59
+ # Check if a type is a possible type of this {InterfaceType}
60
+ # @param type [String, GraphQL::BaseType] Name of the type or a type definition
61
+ # @param ctx [GraphQL::Query::Context] The context for the current query
62
+ # @return [Boolean] True if the `type` exists and is a member of this {InterfaceType}, (else `nil`)
63
+ def possible_type?(type, ctx)
64
+ type_name = type.is_a?(String) ? type : type.graphql_name
65
+ !get_possible_type(type_name, ctx).nil?
66
+ end
67
+
68
+ def type_membership_class
69
+ @type_membership_class || GraphQL::Schema::TypeMembership
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ class Document
5
+ # @return [Hash<String, Node>] Operation Nodes of this query
6
+ attr_reader :operation_definitions
7
+
8
+ # @return [Hash<String, Node>] Fragment definition Nodes of this query
9
+ attr_reader :fragment_definitions
10
+
11
+ def initialize
12
+ @operation_definitions = {}
13
+ @fragment_definitions = {}
14
+ end
15
+
16
+ def [](key)
17
+ GraphQL::Deprecation.warn "#{self.class}#[] is deprecated; use `operation_definitions[]` instead"
18
+ operation_definitions[key]
19
+ end
20
+
21
+ def each(&block)
22
+ GraphQL::Deprecation.warn "#{self.class}#each is deprecated; use `operation_definitions.each` instead"
23
+ operation_definitions.each(&block)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,206 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ class Node
5
+ # @api private
6
+ DEFAULT_TYPED_CHILDREN = Proc.new { |h, k| h[k] = {} }
7
+
8
+ # A specialized, reusable object for leaf nodes.
9
+ NO_TYPED_CHILDREN = Hash.new({}.freeze)
10
+ def NO_TYPED_CHILDREN.dup; self; end;
11
+ NO_TYPED_CHILDREN.freeze
12
+
13
+ # @return [String] the name this node has in the response
14
+ attr_reader :name
15
+
16
+ # @return [GraphQL::ObjectType]
17
+ attr_reader :owner_type
18
+
19
+ # Each key is a {GraphQL::ObjectType} which this selection _may_ be made on.
20
+ # The values for that key are selections which apply to that type.
21
+ #
22
+ # This value is derived from {#scoped_children} after the rewrite is finished.
23
+ # @return [Hash<GraphQL::ObjectType, Hash<String => Node>>]
24
+ def typed_children
25
+ @typed_children ||= begin
26
+ if @scoped_children.any?
27
+ new_tc = Hash.new(&DEFAULT_TYPED_CHILDREN)
28
+ all_object_types = Set.new
29
+ scoped_children.each_key { |t| all_object_types.merge(@query.possible_types(t)) }
30
+ # Remove any scoped children which don't follow this return type
31
+ # (This can happen with fragment merging where lexical scope is lost)
32
+ all_object_types &= @query.possible_types(@return_type.unwrap)
33
+ all_object_types.each do |t|
34
+ new_tc[t] = get_typed_children(t)
35
+ end
36
+ new_tc
37
+ else
38
+ NO_TYPED_CHILDREN
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ # These children correspond closely to scopes in the AST.
45
+ # Keys _may_ be abstract types. They're assumed to be read-only after rewrite is finished
46
+ # because {#typed_children} is derived from them.
47
+ #
48
+ # Using {#scoped_children} during the rewrite step reduces the overhead of reifying
49
+ # abstract types because they're only reified _after_ the rewrite.
50
+ # @return [Hash<GraphQL::BaseType, Hash<String => Node>>]
51
+ attr_reader :scoped_children
52
+
53
+ # @return [Array<Language::Nodes::AbstractNode>] AST nodes which are represented by this node
54
+ attr_reader :ast_nodes
55
+
56
+ # @return [Array<GraphQL::Field>] Field definitions for this node (there should only be one!)
57
+ attr_reader :definitions
58
+
59
+ # @return [GraphQL::BaseType] The expected wrapped type this node must return.
60
+ attr_reader :return_type
61
+
62
+ # @return [InternalRepresentation::Node, nil]
63
+ attr_reader :parent
64
+
65
+ def initialize(
66
+ name:, owner_type:, query:, return_type:, parent:,
67
+ ast_nodes: [],
68
+ definitions: []
69
+ )
70
+ @name = name
71
+ @query = query
72
+ @owner_type = owner_type
73
+ @parent = parent
74
+ @typed_children = nil
75
+ @scoped_children = Hash.new { |h1, k1| h1[k1] = {} }
76
+ @ast_nodes = ast_nodes
77
+ @definitions = definitions
78
+ @return_type = return_type
79
+ end
80
+
81
+ def initialize_copy(other_node)
82
+ super
83
+ # Bust some caches:
84
+ @typed_children = nil
85
+ @definition = nil
86
+ @definition_name = nil
87
+ @ast_node = nil
88
+ # Shallow-copy some state:
89
+ @scoped_children = other_node.scoped_children.dup
90
+ @ast_nodes = other_node.ast_nodes.dup
91
+ @definitions = other_node.definitions.dup
92
+ end
93
+
94
+ def ==(other)
95
+ other.is_a?(self.class) &&
96
+ other.name == name &&
97
+ other.parent == parent &&
98
+ other.return_type == return_type &&
99
+ other.owner_type == owner_type &&
100
+ other.scoped_children == scoped_children &&
101
+ other.definitions == definitions &&
102
+ other.ast_nodes == ast_nodes
103
+ end
104
+
105
+ def definition_name
106
+ definition && definition.name
107
+ end
108
+
109
+ def arguments
110
+ @query.arguments_for(self, definition)
111
+ end
112
+
113
+ def definition
114
+ @definition ||= begin
115
+ first_def = @definitions.first
116
+ first_def && @query.get_field(@owner_type, first_def.name)
117
+ end
118
+ end
119
+
120
+ def ast_node
121
+ @ast_node ||= ast_nodes.first
122
+ end
123
+
124
+ def inspect
125
+ all_children_names = scoped_children.values.map(&:keys).flatten.uniq.join(", ")
126
+ all_locations = ast_nodes.map {|n| "#{n.line}:#{n.col}" }.join(", ")
127
+ "#<Node #{@owner_type}.#{@name} -> #{@return_type} {#{all_children_names}} @ [#{all_locations}] #{object_id}>"
128
+ end
129
+
130
+ # Merge selections from `new_parent` into `self`.
131
+ # Selections are merged in place, not copied.
132
+ def deep_merge_node(new_parent, scope: nil, merge_self: true)
133
+ if merge_self
134
+ @ast_nodes |= new_parent.ast_nodes
135
+ @definitions |= new_parent.definitions
136
+ end
137
+ new_sc = new_parent.scoped_children
138
+ if new_sc.any?
139
+ scope ||= Scope.new(@query, @return_type.unwrap)
140
+ new_sc.each do |obj_type, new_fields|
141
+ inner_scope = scope.enter(obj_type)
142
+ inner_scope.each do |scoped_type|
143
+ prev_fields = @scoped_children[scoped_type]
144
+ new_fields.each do |name, new_node|
145
+ prev_node = prev_fields[name]
146
+ if prev_node
147
+ prev_node.deep_merge_node(new_node)
148
+ else
149
+ prev_fields[name] = new_node
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ # @return [GraphQL::Query]
158
+ attr_reader :query
159
+
160
+ def subscription_topic
161
+ @subscription_topic ||= begin
162
+ scope = if definition.subscription_scope
163
+ @query.context[definition.subscription_scope]
164
+ else
165
+ nil
166
+ end
167
+ Subscriptions::Event.serialize(
168
+ definition_name,
169
+ @query.arguments_for(self, definition),
170
+ definition,
171
+ scope: scope
172
+ )
173
+ end
174
+ end
175
+
176
+ protected
177
+
178
+ attr_writer :owner_type, :parent
179
+
180
+ private
181
+
182
+ # Get applicable children from {#scoped_children}
183
+ # @param obj_type [GraphQL::ObjectType]
184
+ # @return [Hash<String => Node>]
185
+ def get_typed_children(obj_type)
186
+ new_tc = {}
187
+ @scoped_children.each do |scope_type, scope_nodes|
188
+ if GraphQL::Execution::Typecast.subtype?(scope_type, obj_type)
189
+ scope_nodes.each do |name, new_node|
190
+ prev_node = new_tc[name]
191
+ if prev_node
192
+ prev_node.deep_merge_node(new_node)
193
+ else
194
+ copied_node = new_node.dup
195
+ copied_node.owner_type = obj_type
196
+ copied_node.parent = self
197
+ new_tc[name] = copied_node
198
+ end
199
+ end
200
+ end
201
+ end
202
+ new_tc
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ module Print
5
+ module_function
6
+
7
+ def print(schema, query_string)
8
+ query = GraphQL::Query.new(schema, query_string)
9
+ print_node(query.irep_selection)
10
+ end
11
+
12
+ def print_node(node, indent: 0)
13
+ padding = " " * indent
14
+ typed_children_padding = " " * (indent + 2)
15
+ query_str = "".dup
16
+
17
+ if !node.definition
18
+ op_node = node.ast_node
19
+ name = op_node.name ? " " + op_node.name : ""
20
+ op_type = op_node.operation_type
21
+ query_str << "#{op_type}#{name}"
22
+ else
23
+ if node.name == node.definition_name
24
+ query_str << "#{padding}#{node.name}"
25
+ else
26
+ query_str << "#{padding}#{node.name}: #{node.definition_name}"
27
+ end
28
+
29
+ args = node.ast_nodes.map { |n| n.arguments.map(&:to_query_string).join(",") }.uniq
30
+ query_str << args.map { |a| "(#{a})"}.join("|")
31
+ end
32
+
33
+ if node.typed_children.any?
34
+ query_str << " {\n"
35
+ node.typed_children.each do |type, children|
36
+ query_str << "#{typed_children_padding}... on #{type.name} {\n"
37
+ children.each do |name, child|
38
+ query_str << print_node(child, indent: indent + 4)
39
+ end
40
+ query_str << "#{typed_children_padding}}\n"
41
+ end
42
+ query_str << "#{padding}}\n"
43
+ else
44
+ query_str << "\n"
45
+ end
46
+
47
+ query_str
48
+ end
49
+ end
50
+ end
51
+ end