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,145 @@
1
+ # frozen_string_literal: true
2
+ require "fileutils"
3
+ require "graphql/rake_task/validate"
4
+
5
+ module GraphQL
6
+ # A rake task for dumping a schema as IDL or JSON.
7
+ #
8
+ # By default, schemas are looked up by name as constants using `schema_name:`.
9
+ # You can provide a `load_schema` function to return your schema another way.
10
+ #
11
+ # `load_context:`, `only:` and `except:` are supported so that
12
+ # you can keep an eye on how filters affect your schema.
13
+ #
14
+ # @example Dump a Schema to .graphql + .json files
15
+ # require "graphql/rake_task"
16
+ # GraphQL::RakeTask.new(schema_name: "MySchema")
17
+ #
18
+ # # $ rake graphql:schema:dump
19
+ # # Schema IDL dumped to ./schema.graphql
20
+ # # Schema JSON dumped to ./schema.json
21
+ #
22
+ # @example Invoking the task from Ruby
23
+ # require "rake"
24
+ # Rake::Task["graphql:schema:dump"].invoke
25
+ class RakeTask
26
+ include Rake::DSL
27
+
28
+ DEFAULT_OPTIONS = {
29
+ namespace: "graphql",
30
+ dependencies: nil,
31
+ schema_name: nil,
32
+ load_schema: ->(task) { Object.const_get(task.schema_name) },
33
+ load_context: ->(task) { {} },
34
+ only: nil,
35
+ except: nil,
36
+ directory: ".",
37
+ idl_outfile: "schema.graphql",
38
+ json_outfile: "schema.json",
39
+ }
40
+
41
+ # @return [String] Namespace for generated tasks
42
+ attr_writer :namespace
43
+
44
+ def rake_namespace
45
+ @namespace
46
+ end
47
+
48
+ # @return [Array<String>]
49
+ attr_accessor :dependencies
50
+
51
+ # @return [String] By default, used to find the schema as a constant.
52
+ # @see {#load_schema} for loading a schema another way
53
+ attr_accessor :schema_name
54
+
55
+ # @return [<#call(task)>] A proc for loading the target GraphQL schema
56
+ attr_accessor :load_schema
57
+
58
+ # @return [<#call(task)>] A callable for loading the query context
59
+ attr_accessor :load_context
60
+
61
+ # @return [<#call(member, ctx)>, nil] A filter for this task
62
+ attr_accessor :only
63
+
64
+ # @return [<#call(member, ctx)>, nil] A filter for this task
65
+ attr_accessor :except
66
+
67
+ # @return [String] target for IDL task
68
+ attr_accessor :idl_outfile
69
+
70
+ # @return [String] target for JSON task
71
+ attr_accessor :json_outfile
72
+
73
+ # @return [String] directory for IDL & JSON files
74
+ attr_accessor :directory
75
+
76
+ # Set the parameters of this task by passing keyword arguments
77
+ # or assigning attributes inside the block
78
+ def initialize(options = {})
79
+ all_options = DEFAULT_OPTIONS.merge(options)
80
+ all_options.each do |k, v|
81
+ self.public_send("#{k}=", v)
82
+ end
83
+
84
+ if block_given?
85
+ yield(self)
86
+ end
87
+
88
+ define_task
89
+ end
90
+
91
+ private
92
+
93
+ # Use the provided `method_name` to generate a string from the specified schema
94
+ # then write it to `file`.
95
+ def write_outfile(method_name, file)
96
+ schema = @load_schema.call(self)
97
+ context = @load_context.call(self)
98
+ result = schema.public_send(method_name, only: @only, except: @except, context: context)
99
+ dir = File.dirname(file)
100
+ FileUtils.mkdir_p(dir)
101
+ if !result.end_with?("\n")
102
+ result += "\n"
103
+ end
104
+ File.write(file, result)
105
+ end
106
+
107
+ def idl_path
108
+ File.join(@directory, @idl_outfile)
109
+ end
110
+
111
+ def json_path
112
+ File.join(@directory, @json_outfile)
113
+ end
114
+
115
+ def load_rails_environment_if_defined
116
+ if Rake::Task.task_defined?('environment')
117
+ Rake::Task['environment'].invoke
118
+ end
119
+ end
120
+
121
+ # Use the Rake DSL to add tasks
122
+ def define_task
123
+ namespace(@namespace) do
124
+ namespace("schema") do
125
+ desc("Dump the schema to IDL in #{idl_path}")
126
+ task :idl => @dependencies do
127
+ load_rails_environment_if_defined
128
+ write_outfile(:to_definition, idl_path)
129
+ puts "Schema IDL dumped into #{idl_path}"
130
+ end
131
+
132
+ desc("Dump the schema to JSON in #{json_path}")
133
+ task :json => @dependencies do
134
+ load_rails_environment_if_defined
135
+ write_outfile(:to_json, json_path)
136
+ puts "Schema JSON dumped into #{json_path}"
137
+ end
138
+
139
+ desc("Dump the schema to JSON and IDL")
140
+ task :dump => [:idl, :json]
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ class ArrayConnection < BaseConnection
5
+ def cursor_from_node(item)
6
+ idx = (after ? index_from_cursor(after) : 0) + sliced_nodes.find_index(item) + 1
7
+ encode(idx.to_s)
8
+ end
9
+
10
+ def has_next_page
11
+ if first
12
+ # There are more items after these items
13
+ sliced_nodes.count > first
14
+ elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && before
15
+ # The original array is longer than the `before` index
16
+ index_from_cursor(before) < nodes.length + 1
17
+ else
18
+ false
19
+ end
20
+ end
21
+
22
+ def has_previous_page
23
+ if last
24
+ # There are items preceding the ones in this result
25
+ sliced_nodes.count > last
26
+ elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
27
+ # We've paginated into the Array a bit, there are some behind us
28
+ index_from_cursor(after) > 0
29
+ else
30
+ false
31
+ end
32
+ end
33
+
34
+ def first
35
+ @first ||= begin
36
+ capped = limit_pagination_argument(arguments[:first], max_page_size)
37
+ if capped.nil? && last.nil?
38
+ capped = max_page_size
39
+ end
40
+ capped
41
+ end
42
+ end
43
+
44
+ def last
45
+ @last ||= limit_pagination_argument(arguments[:last], max_page_size)
46
+ end
47
+
48
+ private
49
+
50
+ # apply first / last limit results
51
+ def paged_nodes
52
+ @paged_nodes ||= begin
53
+ items = sliced_nodes
54
+
55
+ items = items.first(first) if first
56
+ items = items.last(last) if last
57
+ items = items.first(max_page_size) if max_page_size && !first && !last
58
+
59
+ items
60
+ end
61
+ end
62
+
63
+ # Apply cursors to edges
64
+ def sliced_nodes
65
+ @sliced_nodes ||= if before && after
66
+ nodes[index_from_cursor(after)..index_from_cursor(before)-1] || []
67
+ elsif before
68
+ nodes[0..index_from_cursor(before)-2] || []
69
+ elsif after
70
+ nodes[index_from_cursor(after)..-1] || []
71
+ else
72
+ nodes
73
+ end
74
+ end
75
+
76
+ def index_from_cursor(cursor)
77
+ decode(cursor).to_i
78
+ end
79
+ end
80
+
81
+ BaseConnection.register_connection_implementation(Array, ArrayConnection)
82
+ end
83
+ end
@@ -0,0 +1,189 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # Subclasses must implement:
5
+ # - {#cursor_from_node}, which returns an opaque cursor for the given item
6
+ # - {#sliced_nodes}, which slices by `before` & `after`
7
+ # - {#paged_nodes}, which applies `first` & `last` limits
8
+ #
9
+ # In a subclass, you have access to
10
+ # - {#nodes}, the collection which the connection will wrap
11
+ # - {#first}, {#after}, {#last}, {#before} (arguments passed to the field)
12
+ # - {#max_page_size} (the specified maximum page size that can be returned from a connection)
13
+ #
14
+ class BaseConnection
15
+ # Just to encode data in the cursor, use something that won't conflict
16
+ CURSOR_SEPARATOR = "---"
17
+
18
+ # Map of collection class names -> connection_classes
19
+ # eg `{"Array" => ArrayConnection}`
20
+ CONNECTION_IMPLEMENTATIONS = {}
21
+
22
+ class << self
23
+ # Find a connection implementation suitable for exposing `nodes`
24
+ #
25
+ # @param nodes [Object] A collection of nodes (eg, Array, AR::Relation)
26
+ # @return [subclass of BaseConnection] a connection Class for wrapping `nodes`
27
+ def connection_for_nodes(nodes)
28
+ # If it's a new-style connection object, it's already ready to go
29
+ if nodes.is_a?(GraphQL::Pagination::Connection)
30
+ return nodes
31
+ end
32
+ # Check for class _names_ because classes can be redefined in Rails development
33
+ nodes.class.ancestors.each do |ancestor|
34
+ conn_impl = CONNECTION_IMPLEMENTATIONS[ancestor.name]
35
+ if conn_impl
36
+ return conn_impl
37
+ end
38
+ end
39
+ # Should have found a connection during the loop:
40
+ raise("No connection implementation to wrap #{nodes.class} (#{nodes})")
41
+ end
42
+
43
+ # Add `connection_class` as the connection wrapper for `nodes_class`
44
+ # eg, `RelationConnection` is the implementation for `AR::Relation`
45
+ # @param nodes_class [Class] A class representing a collection (eg, Array, AR::Relation)
46
+ # @param connection_class [Class] A class implementing Connection methods
47
+ def register_connection_implementation(nodes_class, connection_class)
48
+ CONNECTION_IMPLEMENTATIONS[nodes_class.name] = connection_class
49
+ end
50
+ end
51
+
52
+ attr_reader :nodes, :arguments, :max_page_size, :parent, :field, :context
53
+
54
+ # Make a connection, wrapping `nodes`
55
+ # @param nodes [Object] The collection of nodes
56
+ # @param arguments [GraphQL::Query::Arguments] Query arguments
57
+ # @param field [GraphQL::Field] The underlying field
58
+ # @param max_page_size [Int] The maximum number of results to return
59
+ # @param parent [Object] The object which this collection belongs to
60
+ # @param context [GraphQL::Query::Context] The context from the field being resolved
61
+ def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil)
62
+ GraphQL::Deprecation.warn "GraphQL::Relay::BaseConnection (used for #{self.class}) will be removed from GraphQL-Ruby 2.0, use GraphQL::Pagination::Connections instead: https://graphql-ruby.org/pagination/overview.html"
63
+
64
+ deprecated_caller = caller(0, 10).find { |c| !c.include?("lib/graphql") }
65
+ if deprecated_caller
66
+ GraphQL::Deprecation.warn " -> called from #{deprecated_caller}"
67
+ end
68
+
69
+ @context = context
70
+ @nodes = nodes
71
+ @arguments = arguments
72
+ @field = field
73
+ @parent = parent
74
+ @encoder = context ? @context.schema.cursor_encoder : GraphQL::Schema::Base64Encoder
75
+ @max_page_size = max_page_size.nil? && context ? @context.schema.default_max_page_size : max_page_size
76
+ end
77
+
78
+ def encode(data)
79
+ @encoder.encode(data, nonce: true)
80
+ end
81
+
82
+ def decode(data)
83
+ @encoder.decode(data, nonce: true)
84
+ end
85
+
86
+ # The value passed as `first:`, if there was one. Negative numbers become `0`.
87
+ # @return [Integer, nil]
88
+ def first
89
+ @first ||= begin
90
+ capped = limit_pagination_argument(arguments[:first], max_page_size)
91
+ if capped.nil? && last.nil?
92
+ capped = max_page_size
93
+ end
94
+ capped
95
+ end
96
+ end
97
+
98
+ # The value passed as `after:`, if there was one
99
+ # @return [String, nil]
100
+ def after
101
+ arguments[:after]
102
+ end
103
+
104
+ # The value passed as `last:`, if there was one. Negative numbers become `0`.
105
+ # @return [Integer, nil]
106
+ def last
107
+ @last ||= limit_pagination_argument(arguments[:last], max_page_size)
108
+ end
109
+
110
+ # The value passed as `before:`, if there was one
111
+ # @return [String, nil]
112
+ def before
113
+ arguments[:before]
114
+ end
115
+
116
+ # These are the nodes to render for this connection,
117
+ # probably wrapped by {GraphQL::Relay::Edge}
118
+ def edge_nodes
119
+ @edge_nodes ||= paged_nodes
120
+ end
121
+
122
+ # Support the `pageInfo` field
123
+ def page_info
124
+ self
125
+ end
126
+
127
+ # Used by `pageInfo`
128
+ def has_next_page
129
+ !!(first && sliced_nodes.count > first)
130
+ end
131
+
132
+ # Used by `pageInfo`
133
+ def has_previous_page
134
+ !!(last && sliced_nodes.count > last)
135
+ end
136
+
137
+ # Used by `pageInfo`
138
+ def start_cursor
139
+ if start_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).first
140
+ return cursor_from_node(start_node)
141
+ else
142
+ return nil
143
+ end
144
+ end
145
+
146
+ # Used by `pageInfo`
147
+ def end_cursor
148
+ if end_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).last
149
+ return cursor_from_node(end_node)
150
+ else
151
+ return nil
152
+ end
153
+ end
154
+
155
+ # An opaque operation which returns a connection-specific cursor.
156
+ def cursor_from_node(object)
157
+ raise GraphQL::RequiredImplementationMissingError, "must return a cursor for this object/connection pair"
158
+ end
159
+
160
+ def inspect
161
+ "#<GraphQL::Relay::Connection @parent=#{@parent.inspect} @arguments=#{@arguments.to_h.inspect}>"
162
+ end
163
+
164
+ private
165
+
166
+ # @param argument [nil, Integer] `first` or `last`, as provided by the client
167
+ # @param max_page_size [nil, Integer]
168
+ # @return [nil, Integer] `nil` if the input was `nil`, otherwise a value between `0` and `max_page_size`
169
+ def limit_pagination_argument(argument, max_page_size)
170
+ if argument
171
+ if argument < 0
172
+ argument = 0
173
+ elsif max_page_size && argument > max_page_size
174
+ argument = max_page_size
175
+ end
176
+ end
177
+ argument
178
+ end
179
+
180
+ def paged_nodes
181
+ raise GraphQL::RequiredImplementationMissingError, "must return nodes for this connection after paging"
182
+ end
183
+
184
+ def sliced_nodes
185
+ raise GraphQL::RequiredImplementationMissingError, "must return all nodes for this connection after chopping off first and last"
186
+ end
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # Provided a GraphQL field which returns a collection of nodes,
5
+ # wrap that field to expose those nodes as a connection.
6
+ #
7
+ # The original resolve proc is used to fetch nodes,
8
+ # then a connection implementation is fetched with {BaseConnection.connection_for_nodes}.
9
+ module ConnectionInstrumentation
10
+ def self.default_arguments
11
+ @default_arguments ||= begin
12
+ argument_definitions = [
13
+ ["first", GraphQL::DEPRECATED_INT_TYPE, "Returns the first _n_ elements from the list."],
14
+ ["after", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
15
+ ["last", GraphQL::DEPRECATED_INT_TYPE, "Returns the last _n_ elements from the list."],
16
+ ["before", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come before the specified cursor."],
17
+ ]
18
+
19
+ argument_definitions.reduce({}) do |memo, arg_defn|
20
+ argument = GraphQL::Argument.new
21
+ name, type, description = arg_defn
22
+ argument.name = name
23
+ argument.type = type
24
+ argument.description = description
25
+ memo[argument.name.to_s] = argument
26
+ memo
27
+ end
28
+ end
29
+ end
30
+
31
+ # Build a connection field from a {GraphQL::Field} by:
32
+ # - Merging in the default arguments
33
+ # - Transforming its resolve function to return a connection object
34
+ def self.instrument(type, field)
35
+ # Don't apply the wrapper to class-based fields, since they
36
+ # use Schema::Field::ConnectionFilter
37
+ if field.connection? && !field.metadata[:type_class]
38
+ connection_arguments = default_arguments.merge(field.arguments)
39
+ original_resolve = field.resolve_proc
40
+ original_lazy_resolve = field.lazy_resolve_proc
41
+ connection_resolve = GraphQL::Relay::ConnectionResolve.new(field, original_resolve)
42
+ connection_lazy_resolve = GraphQL::Relay::ConnectionResolve.new(field, original_lazy_resolve)
43
+ field.redefine(
44
+ resolve: connection_resolve,
45
+ lazy_resolve: connection_lazy_resolve,
46
+ arguments: connection_arguments,
47
+ )
48
+ else
49
+ field
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ class ConnectionResolve
5
+ def initialize(field, underlying_resolve)
6
+ @field = field
7
+ @underlying_resolve = underlying_resolve
8
+ @max_page_size = field.connection_max_page_size
9
+ end
10
+
11
+ def call(obj, args, ctx)
12
+ # in a lazy resolve hook, obj is the promise,
13
+ # get the object that the promise was
14
+ # originally derived from
15
+ parent = ctx.object
16
+
17
+ nodes = @underlying_resolve.call(obj, args, ctx)
18
+
19
+ if nodes.nil? || ctx.schema.lazy?(nodes) || nodes.is_a?(GraphQL::Execution::Execute::Skip) || ctx.wrapped_connection
20
+ nodes
21
+ else
22
+ ctx.wrapped_connection = true
23
+ build_connection(nodes, args, parent, ctx)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def build_connection(nodes, args, parent, ctx)
30
+ if nodes.is_a? GraphQL::ExecutionError
31
+ ctx.add_error(nodes)
32
+ nil
33
+ else
34
+ if parent.is_a?(GraphQL::Schema::Object)
35
+ parent = parent.object
36
+ end
37
+ connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(nodes)
38
+ connection_class.new(nodes, args, field: @field, max_page_size: @max_page_size, parent: parent, context: ctx)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # @api deprecated
5
+ module ConnectionType
6
+ class << self
7
+ # @return [Boolean] If true, connection types get a `nodes` shortcut field
8
+ attr_accessor :default_nodes_field
9
+ # @return [Boolean] If true, connections check for reverse-direction `has*Page` values
10
+ attr_accessor :bidirectional_pagination
11
+ end
12
+
13
+ self.default_nodes_field = false
14
+ self.bidirectional_pagination = false
15
+
16
+ # @api deprecated
17
+ def self.create_type(wrapped_type, edge_type: nil, edge_class: GraphQL::Relay::Edge, nodes_field: ConnectionType.default_nodes_field, &block)
18
+ custom_edge_class = edge_class
19
+
20
+ # Any call that would trigger `wrapped_type.ensure_defined`
21
+ # must be inside this lazy block, otherwise we get weird
22
+ # cyclical dependency errors :S
23
+ ObjectType.deprecated_define do
24
+ type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
25
+ edge_type ||= wrapped_type.edge_type
26
+ name("#{type_name}Connection")
27
+ description("The connection type for #{type_name}.")
28
+ field :edges, types[edge_type], "A list of edges.", edge_class: custom_edge_class, property: :edge_nodes
29
+
30
+ if nodes_field
31
+ field :nodes, types[wrapped_type], "A list of nodes.", property: :edge_nodes
32
+ end
33
+
34
+ field :pageInfo, !PageInfo, "Information to aid in pagination.", property: :page_info
35
+ relay_node_type(wrapped_type)
36
+ block && instance_eval(&block)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # Mostly an internal concern.
5
+ #
6
+ # Wraps an object as a `node`, and exposes a connection-specific `cursor`.
7
+ class Edge
8
+ attr_reader :node, :connection
9
+ def initialize(node, connection)
10
+ @node = node
11
+ @connection = connection
12
+ end
13
+
14
+ def cursor
15
+ @cursor ||= connection.cursor_from_node(node)
16
+ end
17
+
18
+ def parent
19
+ @parent ||= connection.parent
20
+ end
21
+
22
+ def inspect
23
+ "#<GraphQL::Relay::Edge (#{parent.inspect} => #{node.inspect})>"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ module EdgeType
5
+ # @api deprecated
6
+ def self.create_type(wrapped_type, name: nil, &block)
7
+ GraphQL::ObjectType.define do
8
+ type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
9
+ name("#{type_name}Edge")
10
+ description "An edge in a connection."
11
+ field :node, wrapped_type, "The item at the end of the edge."
12
+ field :cursor, !types.String, "A cursor for use in pagination."
13
+ relay_node_type(wrapped_type)
14
+ block && instance_eval(&block)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ module EdgesInstrumentation
5
+ def self.instrument(type, field)
6
+ if field.edges?
7
+ edges_resolve = EdgesResolve.new(edge_class: field.edge_class, resolve: field.resolve_proc)
8
+ edges_lazy_resolve = EdgesResolve.new(edge_class: field.edge_class, resolve: field.lazy_resolve_proc)
9
+
10
+ field.redefine(
11
+ resolve: edges_resolve,
12
+ lazy_resolve: edges_lazy_resolve,
13
+ )
14
+ else
15
+ field
16
+ end
17
+ end
18
+
19
+ class EdgesResolve
20
+ def initialize(edge_class:, resolve:)
21
+ @edge_class = edge_class
22
+ @resolve_proc = resolve
23
+ end
24
+
25
+ # A user's custom Connection may return a lazy object,
26
+ # if so, handle it later.
27
+ def call(obj, args, ctx)
28
+ parent = ctx.object
29
+ nodes = @resolve_proc.call(obj, args, ctx)
30
+ if ctx.schema.lazy?(nodes)
31
+ nodes
32
+ else
33
+ nodes.map { |item| item.is_a?(GraphQL::Pagination::Connection::Edge) ? item : @edge_class.new(item, parent) }
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ class GlobalIdResolve
5
+ def initialize(type:)
6
+ @type = type
7
+ end
8
+
9
+ def call(obj, args, ctx)
10
+ if obj.is_a?(GraphQL::Schema::Object)
11
+ obj = obj.object
12
+ end
13
+ type = @type.respond_to?(:graphql_definition) ? @type.graphql_definition : @type
14
+ ctx.query.schema.id_from_object(obj, type, ctx)
15
+ end
16
+ end
17
+ end
18
+ end