graphql 1.9.17 → 2.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (416) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +21 -10
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +45 -8
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +49 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +2 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  28. data/lib/generators/graphql/templates/base_object.erb +2 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +25 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/field_usage.rb +31 -2
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +54 -38
  53. data/lib/graphql/analysis/ast.rb +16 -16
  54. data/lib/graphql/analysis.rb +0 -7
  55. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  56. data/lib/graphql/backtrace/table.rb +37 -16
  57. data/lib/graphql/backtrace/trace.rb +96 -0
  58. data/lib/graphql/backtrace/traced_error.rb +0 -1
  59. data/lib/graphql/backtrace/tracer.rb +39 -9
  60. data/lib/graphql/backtrace.rb +26 -18
  61. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  62. data/lib/graphql/dataloader/request.rb +19 -0
  63. data/lib/graphql/dataloader/request_all.rb +19 -0
  64. data/lib/graphql/dataloader/source.rb +164 -0
  65. data/lib/graphql/dataloader.rb +311 -0
  66. data/lib/graphql/date_encoding_error.rb +16 -0
  67. data/lib/graphql/deprecation.rb +9 -0
  68. data/lib/graphql/dig.rb +1 -1
  69. data/lib/graphql/execution/directive_checks.rb +2 -2
  70. data/lib/graphql/execution/errors.rb +77 -45
  71. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  72. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  73. data/lib/graphql/execution/interpreter/arguments_cache.rb +104 -0
  74. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  75. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  76. data/lib/graphql/execution/interpreter/runtime.rb +830 -417
  77. data/lib/graphql/execution/interpreter.rb +206 -74
  78. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  79. data/lib/graphql/execution/lazy.rb +11 -21
  80. data/lib/graphql/execution/lookahead.rb +65 -136
  81. data/lib/graphql/execution/multiplex.rb +6 -152
  82. data/lib/graphql/execution.rb +11 -4
  83. data/lib/graphql/filter.rb +8 -3
  84. data/lib/graphql/integer_decoding_error.rb +17 -0
  85. data/lib/graphql/integer_encoding_error.rb +18 -2
  86. data/lib/graphql/introspection/base_object.rb +2 -5
  87. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  88. data/lib/graphql/introspection/directive_type.rb +12 -6
  89. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  90. data/lib/graphql/introspection/entry_points.rb +5 -18
  91. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  92. data/lib/graphql/introspection/field_type.rb +9 -5
  93. data/lib/graphql/introspection/input_value_type.rb +41 -11
  94. data/lib/graphql/introspection/introspection_query.rb +6 -92
  95. data/lib/graphql/introspection/schema_type.rb +12 -12
  96. data/lib/graphql/introspection/type_type.rb +34 -17
  97. data/lib/graphql/introspection.rb +100 -0
  98. data/lib/graphql/invalid_null_error.rb +18 -0
  99. data/lib/graphql/language/block_string.rb +20 -5
  100. data/lib/graphql/language/cache.rb +37 -0
  101. data/lib/graphql/language/definition_slice.rb +21 -10
  102. data/lib/graphql/language/document_from_schema_definition.rb +136 -78
  103. data/lib/graphql/language/lexer.rb +216 -1462
  104. data/lib/graphql/language/nodes.rb +129 -132
  105. data/lib/graphql/language/parser.rb +994 -932
  106. data/lib/graphql/language/parser.y +152 -120
  107. data/lib/graphql/language/printer.rb +48 -23
  108. data/lib/graphql/language/sanitized_printer.rb +222 -0
  109. data/lib/graphql/language/token.rb +0 -4
  110. data/lib/graphql/language/visitor.rb +192 -84
  111. data/lib/graphql/language.rb +3 -1
  112. data/lib/graphql/name_validator.rb +2 -7
  113. data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
  114. data/lib/graphql/pagination/array_connection.rb +79 -0
  115. data/lib/graphql/pagination/connection.rb +253 -0
  116. data/lib/graphql/pagination/connections.rb +135 -0
  117. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  118. data/lib/graphql/pagination/relation_connection.rb +228 -0
  119. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  120. data/lib/graphql/pagination.rb +6 -0
  121. data/lib/graphql/parse_error.rb +0 -1
  122. data/lib/graphql/query/context.rb +205 -203
  123. data/lib/graphql/query/fingerprint.rb +26 -0
  124. data/lib/graphql/query/input_validation_result.rb +33 -7
  125. data/lib/graphql/query/null_context.rb +22 -9
  126. data/lib/graphql/query/validation_pipeline.rb +16 -38
  127. data/lib/graphql/query/variable_validation_error.rb +3 -3
  128. data/lib/graphql/query/variables.rb +39 -12
  129. data/lib/graphql/query.rb +95 -43
  130. data/lib/graphql/railtie.rb +6 -102
  131. data/lib/graphql/rake_task/validate.rb +4 -1
  132. data/lib/graphql/rake_task.rb +41 -10
  133. data/lib/graphql/relay/range_add.rb +17 -10
  134. data/lib/graphql/relay.rb +0 -15
  135. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  136. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  137. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  138. data/lib/graphql/rubocop.rb +4 -0
  139. data/lib/graphql/schema/addition.rb +245 -0
  140. data/lib/graphql/schema/argument.rb +285 -36
  141. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  142. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  143. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  144. data/lib/graphql/schema/build_from_definition.rb +348 -205
  145. data/lib/graphql/schema/built_in_types.rb +5 -5
  146. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  147. data/lib/graphql/schema/directive/feature.rb +1 -1
  148. data/lib/graphql/schema/directive/flagged.rb +57 -0
  149. data/lib/graphql/schema/directive/include.rb +2 -2
  150. data/lib/graphql/schema/directive/one_of.rb +12 -0
  151. data/lib/graphql/schema/directive/skip.rb +2 -2
  152. data/lib/graphql/schema/directive/transform.rb +14 -2
  153. data/lib/graphql/schema/directive.rb +134 -15
  154. data/lib/graphql/schema/enum.rb +137 -39
  155. data/lib/graphql/schema/enum_value.rb +17 -23
  156. data/lib/graphql/schema/field/connection_extension.rb +50 -20
  157. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  158. data/lib/graphql/schema/field.rb +504 -331
  159. data/lib/graphql/schema/field_extension.rb +86 -2
  160. data/lib/graphql/schema/find_inherited_value.rb +12 -1
  161. data/lib/graphql/schema/finder.rb +16 -14
  162. data/lib/graphql/schema/input_object.rb +182 -60
  163. data/lib/graphql/schema/interface.rb +24 -49
  164. data/lib/graphql/schema/introspection_system.rb +103 -37
  165. data/lib/graphql/schema/late_bound_type.rb +9 -2
  166. data/lib/graphql/schema/list.rb +61 -3
  167. data/lib/graphql/schema/loader.rb +144 -96
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
  169. data/lib/graphql/schema/member/build_type.rb +24 -15
  170. data/lib/graphql/schema/member/has_arguments.rb +310 -26
  171. data/lib/graphql/schema/member/has_ast_node.rb +32 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  173. data/lib/graphql/schema/member/has_directives.rb +118 -0
  174. data/lib/graphql/schema/member/has_fields.rb +166 -44
  175. data/lib/graphql/schema/member/has_interfaces.rb +129 -0
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  177. data/lib/graphql/schema/member/has_validators.rb +57 -0
  178. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  179. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  180. data/lib/graphql/schema/member/validates_input.rb +33 -0
  181. data/lib/graphql/schema/member.rb +11 -6
  182. data/lib/graphql/schema/mutation.rb +4 -9
  183. data/lib/graphql/schema/non_null.rb +34 -4
  184. data/lib/graphql/schema/object.rb +36 -60
  185. data/lib/graphql/schema/printer.rb +16 -35
  186. data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
  187. data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
  188. data/lib/graphql/schema/resolver.rb +147 -94
  189. data/lib/graphql/schema/scalar.rb +40 -15
  190. data/lib/graphql/schema/subscription.rb +60 -31
  191. data/lib/graphql/schema/timeout.rb +45 -35
  192. data/lib/graphql/schema/type_expression.rb +21 -13
  193. data/lib/graphql/schema/type_membership.rb +23 -6
  194. data/lib/graphql/schema/union.rb +49 -15
  195. data/lib/graphql/schema/unique_within_type.rb +1 -2
  196. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  197. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  198. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  199. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  200. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  201. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  202. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  203. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  204. data/lib/graphql/schema/validator.rb +171 -0
  205. data/lib/graphql/schema/warden.rb +213 -35
  206. data/lib/graphql/schema/wrapper.rb +0 -5
  207. data/lib/graphql/schema.rb +857 -884
  208. data/lib/graphql/static_validation/all_rules.rb +3 -0
  209. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  210. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  211. data/lib/graphql/static_validation/error.rb +3 -1
  212. data/lib/graphql/static_validation/literal_validator.rb +69 -26
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  215. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  216. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
  222. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  223. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  224. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  226. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  227. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  228. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  229. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  230. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  231. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  232. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  233. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  234. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  235. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  236. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  237. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  238. data/lib/graphql/static_validation/type_stack.rb +2 -2
  239. data/lib/graphql/static_validation/validation_context.rb +13 -3
  240. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  241. data/lib/graphql/static_validation/validator.rb +32 -20
  242. data/lib/graphql/static_validation.rb +1 -2
  243. data/lib/graphql/string_encoding_error.rb +13 -3
  244. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
  245. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  246. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  247. data/lib/graphql/subscriptions/event.rb +84 -35
  248. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  249. data/lib/graphql/subscriptions/serialize.rb +53 -6
  250. data/lib/graphql/subscriptions.rb +137 -57
  251. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  252. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  253. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  254. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  255. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  256. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  257. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  258. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  259. data/lib/graphql/tracing/legacy_trace.rb +65 -0
  260. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  261. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  262. data/lib/graphql/tracing/notifications_trace.rb +42 -0
  263. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  264. data/lib/graphql/tracing/platform_trace.rb +109 -0
  265. data/lib/graphql/tracing/platform_tracing.rb +76 -35
  266. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  267. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
  268. data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
  269. data/lib/graphql/tracing/scout_trace.rb +72 -0
  270. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  271. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  272. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  273. data/lib/graphql/tracing/trace.rb +75 -0
  274. data/lib/graphql/tracing.rb +23 -67
  275. data/lib/graphql/type_kinds.rb +6 -3
  276. data/lib/graphql/types/big_int.rb +5 -1
  277. data/lib/graphql/types/int.rb +10 -3
  278. data/lib/graphql/types/iso_8601_date.rb +20 -9
  279. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  280. data/lib/graphql/types/relay/base_connection.rb +18 -90
  281. data/lib/graphql/types/relay/base_edge.rb +2 -34
  282. data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
  283. data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
  284. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  285. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  286. data/lib/graphql/types/relay/node.rb +2 -4
  287. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  288. data/lib/graphql/types/relay/page_info.rb +2 -14
  289. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  290. data/lib/graphql/types/relay.rb +10 -5
  291. data/lib/graphql/types/string.rb +8 -2
  292. data/lib/graphql/unauthorized_error.rb +2 -2
  293. data/lib/graphql/unresolved_type_error.rb +2 -2
  294. data/lib/graphql/version.rb +1 -1
  295. data/lib/graphql.rb +63 -65
  296. data/readme.md +3 -6
  297. metadata +127 -236
  298. data/lib/graphql/analysis/analyze_query.rb +0 -91
  299. data/lib/graphql/analysis/field_usage.rb +0 -45
  300. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  301. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  302. data/lib/graphql/analysis/query_complexity.rb +0 -88
  303. data/lib/graphql/analysis/query_depth.rb +0 -43
  304. data/lib/graphql/analysis/reducer_state.rb +0 -48
  305. data/lib/graphql/argument.rb +0 -159
  306. data/lib/graphql/authorization.rb +0 -82
  307. data/lib/graphql/backwards_compatibility.rb +0 -60
  308. data/lib/graphql/base_type.rb +0 -226
  309. data/lib/graphql/boolean_type.rb +0 -2
  310. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  311. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  312. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  313. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  314. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  315. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  316. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  317. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  318. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  319. data/lib/graphql/compatibility.rb +0 -5
  320. data/lib/graphql/define/assign_argument.rb +0 -12
  321. data/lib/graphql/define/assign_connection.rb +0 -13
  322. data/lib/graphql/define/assign_enum_value.rb +0 -18
  323. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  324. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  325. data/lib/graphql/define/assign_object_field.rb +0 -42
  326. data/lib/graphql/define/defined_object_proxy.rb +0 -50
  327. data/lib/graphql/define/instance_definable.rb +0 -300
  328. data/lib/graphql/define/no_definition_error.rb +0 -7
  329. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  330. data/lib/graphql/define/type_definer.rb +0 -31
  331. data/lib/graphql/define.rb +0 -31
  332. data/lib/graphql/deprecated_dsl.rb +0 -42
  333. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  334. data/lib/graphql/directive/include_directive.rb +0 -2
  335. data/lib/graphql/directive/skip_directive.rb +0 -2
  336. data/lib/graphql/directive.rb +0 -104
  337. data/lib/graphql/enum_type.rb +0 -193
  338. data/lib/graphql/execution/execute.rb +0 -326
  339. data/lib/graphql/execution/flatten.rb +0 -40
  340. data/lib/graphql/execution/instrumentation.rb +0 -92
  341. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  342. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  343. data/lib/graphql/execution/typecast.rb +0 -50
  344. data/lib/graphql/field/resolve.rb +0 -59
  345. data/lib/graphql/field.rb +0 -330
  346. data/lib/graphql/float_type.rb +0 -2
  347. data/lib/graphql/function.rb +0 -153
  348. data/lib/graphql/id_type.rb +0 -2
  349. data/lib/graphql/input_object_type.rb +0 -154
  350. data/lib/graphql/int_type.rb +0 -2
  351. data/lib/graphql/interface_type.rb +0 -86
  352. data/lib/graphql/internal_representation/document.rb +0 -27
  353. data/lib/graphql/internal_representation/node.rb +0 -206
  354. data/lib/graphql/internal_representation/print.rb +0 -51
  355. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  356. data/lib/graphql/internal_representation/scope.rb +0 -88
  357. data/lib/graphql/internal_representation/visit.rb +0 -36
  358. data/lib/graphql/internal_representation.rb +0 -7
  359. data/lib/graphql/language/lexer.rl +0 -258
  360. data/lib/graphql/list_type.rb +0 -80
  361. data/lib/graphql/literal_validation_error.rb +0 -6
  362. data/lib/graphql/non_null_type.rb +0 -81
  363. data/lib/graphql/object_type.rb +0 -141
  364. data/lib/graphql/query/arguments.rb +0 -187
  365. data/lib/graphql/query/arguments_cache.rb +0 -25
  366. data/lib/graphql/query/executor.rb +0 -53
  367. data/lib/graphql/query/literal_input.rb +0 -116
  368. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  369. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  370. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  371. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  372. data/lib/graphql/query/serial_execution.rb +0 -39
  373. data/lib/graphql/relay/array_connection.rb +0 -85
  374. data/lib/graphql/relay/base_connection.rb +0 -172
  375. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  376. data/lib/graphql/relay/connection_resolve.rb +0 -43
  377. data/lib/graphql/relay/connection_type.rb +0 -40
  378. data/lib/graphql/relay/edge.rb +0 -27
  379. data/lib/graphql/relay/edge_type.rb +0 -18
  380. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  381. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  382. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  383. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  384. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  385. data/lib/graphql/relay/mutation/result.rb +0 -38
  386. data/lib/graphql/relay/mutation.rb +0 -190
  387. data/lib/graphql/relay/node.rb +0 -36
  388. data/lib/graphql/relay/page_info.rb +0 -7
  389. data/lib/graphql/relay/relation_connection.rb +0 -190
  390. data/lib/graphql/relay/type_extensions.rb +0 -30
  391. data/lib/graphql/scalar_type.rb +0 -133
  392. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  393. data/lib/graphql/schema/default_parse_error.rb +0 -10
  394. data/lib/graphql/schema/default_type_error.rb +0 -15
  395. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  396. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  397. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  398. data/lib/graphql/schema/middleware_chain.rb +0 -82
  399. data/lib/graphql/schema/possible_types.rb +0 -39
  400. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  401. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  402. data/lib/graphql/schema/traversal.rb +0 -228
  403. data/lib/graphql/schema/validation.rb +0 -303
  404. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  405. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  406. data/lib/graphql/string_type.rb +0 -2
  407. data/lib/graphql/subscriptions/subscription_root.rb +0 -66
  408. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  409. data/lib/graphql/types/relay/base_field.rb +0 -22
  410. data/lib/graphql/types/relay/base_interface.rb +0 -29
  411. data/lib/graphql/types/relay/base_object.rb +0 -26
  412. data/lib/graphql/types/relay/node_field.rb +0 -43
  413. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  414. data/lib/graphql/union_type.rb +0 -128
  415. data/lib/graphql/upgrader/member.rb +0 -936
  416. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  require "graphql/language/block_string"
3
3
  require "graphql/language/printer"
4
- require "graphql/language/definition_slice"
4
+ require "graphql/language/sanitized_printer"
5
5
  require "graphql/language/document_from_schema_definition"
6
6
  require "graphql/language/generation"
7
7
  require "graphql/language/lexer"
8
8
  require "graphql/language/nodes"
9
+ require "graphql/language/cache"
9
10
  require "graphql/language/parser"
10
11
  require "graphql/language/token"
11
12
  require "graphql/language/visitor"
13
+ require "graphql/language/definition_slice"
12
14
 
13
15
  module GraphQL
14
16
  module Language
@@ -4,13 +4,8 @@ module GraphQL
4
4
  VALID_NAME_REGEX = /^[_a-zA-Z][_a-zA-Z0-9]*$/
5
5
 
6
6
  def self.validate!(name)
7
- raise GraphQL::InvalidNameError.new(name, VALID_NAME_REGEX) unless valid?(name)
8
- end
9
-
10
- private
11
-
12
- def self.valid?(name)
13
- name =~ VALID_NAME_REGEX
7
+ name = name.is_a?(String) ? name : name.to_s
8
+ raise GraphQL::InvalidNameError.new(name, VALID_NAME_REGEX) unless name.match?(VALID_NAME_REGEX)
14
9
  end
15
10
  end
16
11
  end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/pagination/relation_connection"
3
+
4
+ module GraphQL
5
+ module Pagination
6
+ # Customizes `RelationConnection` to work with `ActiveRecord::Relation`s.
7
+ class ActiveRecordRelationConnection < Pagination::RelationConnection
8
+ private
9
+
10
+ def relation_count(relation)
11
+ int_or_hash = if already_loaded?(relation)
12
+ relation.size
13
+ elsif relation.respond_to?(:unscope)
14
+ relation.unscope(:order).count(:all)
15
+ else
16
+ # Rails 3
17
+ relation.count
18
+ end
19
+ if int_or_hash.is_a?(Integer)
20
+ int_or_hash
21
+ else
22
+ # Grouped relations return count-by-group hashes
23
+ int_or_hash.length
24
+ end
25
+ end
26
+
27
+ def relation_limit(relation)
28
+ if relation.is_a?(Array)
29
+ nil
30
+ else
31
+ relation.limit_value
32
+ end
33
+ end
34
+
35
+ def relation_offset(relation)
36
+ if relation.is_a?(Array)
37
+ nil
38
+ else
39
+ relation.offset_value
40
+ end
41
+ end
42
+
43
+ def null_relation(relation)
44
+ if relation.respond_to?(:none)
45
+ relation.none
46
+ else
47
+ # Rails 3
48
+ relation.where("1=2")
49
+ end
50
+ end
51
+
52
+ def set_limit(nodes, limit)
53
+ if already_loaded?(nodes)
54
+ nodes.take(limit)
55
+ else
56
+ super
57
+ end
58
+ end
59
+
60
+ def set_offset(nodes, offset)
61
+ if already_loaded?(nodes)
62
+ # If the client sent a bogus cursor beyond the size of the relation,
63
+ # it might get `nil` from `#[...]`, so return an empty array in that case
64
+ nodes[offset..-1] || []
65
+ else
66
+ super
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def already_loaded?(relation)
73
+ relation.is_a?(Array) || relation.loaded?
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/pagination/connection"
3
+
4
+ module GraphQL
5
+ module Pagination
6
+ class ArrayConnection < Pagination::Connection
7
+ def nodes
8
+ load_nodes
9
+ @nodes
10
+ end
11
+
12
+ def has_previous_page
13
+ load_nodes
14
+ @has_previous_page
15
+ end
16
+
17
+ def has_next_page
18
+ load_nodes
19
+ @has_next_page
20
+ end
21
+
22
+ def cursor_for(item)
23
+ idx = items.find_index(item) + 1
24
+ encode(idx.to_s)
25
+ end
26
+
27
+ private
28
+
29
+ def index_from_cursor(cursor)
30
+ decode(cursor).to_i
31
+ end
32
+
33
+ # Populate all the pagination info _once_,
34
+ # It doesn't do anything on subsequent calls.
35
+ def load_nodes
36
+ @nodes ||= begin
37
+ sliced_nodes = if before && after
38
+ end_idx = index_from_cursor(before)-1
39
+ end_idx < 0 ? [] : items[index_from_cursor(after)..end_idx] || []
40
+ elsif before
41
+ end_idx = index_from_cursor(before)-2
42
+ end_idx < 0 ? [] : items[0..end_idx] || []
43
+ elsif after
44
+ items[index_from_cursor(after)..-1] || []
45
+ else
46
+ items
47
+ end
48
+
49
+ @has_previous_page = if last
50
+ # There are items preceding the ones in this result
51
+ sliced_nodes.count > last
52
+ elsif after
53
+ # We've paginated into the Array a bit, there are some behind us
54
+ index_from_cursor(after) > 0
55
+ else
56
+ false
57
+ end
58
+
59
+ @has_next_page = if first
60
+ # There are more items after these items
61
+ sliced_nodes.count > first
62
+ elsif before
63
+ # The original array is longer than the `before` index
64
+ index_from_cursor(before) < items.length + 1
65
+ else
66
+ false
67
+ end
68
+
69
+ limited_nodes = sliced_nodes
70
+
71
+ limited_nodes = limited_nodes.first(first) if first
72
+ limited_nodes = limited_nodes.last(last) if last
73
+
74
+ limited_nodes
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,253 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Pagination
5
+ # A Connection wraps a list of items and provides cursor-based pagination over it.
6
+ #
7
+ # Connections were introduced by Facebook's `Relay` front-end framework, but
8
+ # proved to be generally useful for GraphQL APIs. When in doubt, use connections
9
+ # to serve lists (like Arrays, ActiveRecord::Relations) via GraphQL.
10
+ #
11
+ # Unlike the previous connection implementation, these default to bidirectional pagination.
12
+ #
13
+ # Pagination arguments and context may be provided at initialization or assigned later (see {Schema::Field::ConnectionExtension}).
14
+ class Connection
15
+ class PaginationImplementationMissingError < GraphQL::Error
16
+ end
17
+
18
+ # @return [Object] A list object, from the application. This is the unpaginated value passed into the connection.
19
+ attr_reader :items
20
+
21
+ # @return [GraphQL::Query::Context]
22
+ attr_accessor :context
23
+
24
+ # @return [Object] the object this collection belongs to
25
+ attr_accessor :parent
26
+
27
+ # Raw access to client-provided values. (`max_page_size` not applied to first or last.)
28
+ attr_accessor :before_value, :after_value, :first_value, :last_value
29
+
30
+ # @return [String, nil] the client-provided cursor. `""` is treated as `nil`.
31
+ def before
32
+ if defined?(@before)
33
+ @before
34
+ else
35
+ @before = @before_value == "" ? nil : @before_value
36
+ end
37
+ end
38
+
39
+ # @return [String, nil] the client-provided cursor. `""` is treated as `nil`.
40
+ def after
41
+ if defined?(@after)
42
+ @after
43
+ else
44
+ @after = @after_value == "" ? nil : @after_value
45
+ end
46
+ end
47
+
48
+ # @return [Hash<Symbol => Object>] The field arguments from the field that returned this connection
49
+ attr_accessor :arguments
50
+
51
+ # @param items [Object] some unpaginated collection item, like an `Array` or `ActiveRecord::Relation`
52
+ # @param context [Query::Context]
53
+ # @param parent [Object] The object this collection belongs to
54
+ # @param first [Integer, nil] The limit parameter from the client, if it provided one
55
+ # @param after [String, nil] A cursor for pagination, if the client provided one
56
+ # @param last [Integer, nil] Limit parameter from the client, if provided
57
+ # @param before [String, nil] A cursor for pagination, if the client provided one.
58
+ # @param arguments [Hash] The arguments to the field that returned the collection wrapped by this connection
59
+ # @param max_page_size [Integer, nil] A configured value to cap the result size. Applied as `first` if neither first or last are given and no `default_page_size` is set.
60
+ # @param default_page_size [Integer, nil] A configured value to determine the result size when neither first or last are given.
61
+ def initialize(items, parent: nil, field: nil, context: nil, first: nil, after: nil, max_page_size: NOT_CONFIGURED, default_page_size: NOT_CONFIGURED, last: nil, before: nil, edge_class: nil, arguments: nil)
62
+ @items = items
63
+ @parent = parent
64
+ @context = context
65
+ @field = field
66
+ @first_value = first
67
+ @after_value = after
68
+ @last_value = last
69
+ @before_value = before
70
+ @arguments = arguments
71
+ @edge_class = edge_class || self.class::Edge
72
+ # This is only true if the object was _initialized_ with an override
73
+ # or if one is assigned later.
74
+ @has_max_page_size_override = max_page_size != NOT_CONFIGURED
75
+ @max_page_size = if max_page_size == NOT_CONFIGURED
76
+ nil
77
+ else
78
+ max_page_size
79
+ end
80
+ @has_default_page_size_override = default_page_size != NOT_CONFIGURED
81
+ @default_page_size = if default_page_size == NOT_CONFIGURED
82
+ nil
83
+ else
84
+ default_page_size
85
+ end
86
+ end
87
+
88
+ def max_page_size=(new_value)
89
+ @has_max_page_size_override = true
90
+ @max_page_size = new_value
91
+ end
92
+
93
+ def max_page_size
94
+ if @has_max_page_size_override
95
+ @max_page_size
96
+ else
97
+ context.schema.default_max_page_size
98
+ end
99
+ end
100
+
101
+ def has_max_page_size_override?
102
+ @has_max_page_size_override
103
+ end
104
+
105
+ def default_page_size=(new_value)
106
+ @has_default_page_size_override = true
107
+ @default_page_size = new_value
108
+ end
109
+
110
+ def default_page_size
111
+ if @has_default_page_size_override
112
+ @default_page_size
113
+ else
114
+ context.schema.default_page_size
115
+ end
116
+ end
117
+
118
+ def has_default_page_size_override?
119
+ @has_default_page_size_override
120
+ end
121
+
122
+ attr_writer :first
123
+ # @return [Integer, nil]
124
+ # A clamped `first` value.
125
+ # (The underlying instance variable doesn't have limits on it.)
126
+ # If neither `first` nor `last` is given, but `default_page_size` is
127
+ # present, default_page_size is used for first. If `default_page_size`
128
+ # is greater than `max_page_size``, it'll be clamped down to
129
+ # `max_page_size`. If `default_page_size` is nil, use `max_page_size`.
130
+ def first
131
+ @first ||= begin
132
+ capped = limit_pagination_argument(@first_value, max_page_size)
133
+ if capped.nil? && last.nil?
134
+ capped = limit_pagination_argument(default_page_size, max_page_size) || max_page_size
135
+ end
136
+ capped
137
+ end
138
+ end
139
+
140
+ # This is called by `Relay::RangeAdd` -- it can be overridden
141
+ # when `item` needs some modifications based on this connection's state.
142
+ #
143
+ # @param item [Object] An item newly added to `items`
144
+ # @return [Edge]
145
+ def range_add_edge(item)
146
+ edge_class.new(item, self)
147
+ end
148
+
149
+ attr_writer :last
150
+ # @return [Integer, nil] A clamped `last` value. (The underlying instance variable doesn't have limits on it)
151
+ def last
152
+ @last ||= limit_pagination_argument(@last_value, max_page_size)
153
+ end
154
+
155
+ # @return [Array<Edge>] {nodes}, but wrapped with Edge instances
156
+ def edges
157
+ @edges ||= nodes.map { |n| @edge_class.new(n, self) }
158
+ end
159
+
160
+ # @return [Class] A wrapper class for edges of this connection
161
+ attr_accessor :edge_class
162
+
163
+ # @return [GraphQL::Schema::Field] The field this connection was returned by
164
+ attr_accessor :field
165
+
166
+ # @return [Array<Object>] A slice of {items}, constrained by {@first_value}/{@after_value}/{@last_value}/{@before_value}
167
+ def nodes
168
+ raise PaginationImplementationMissingError, "Implement #{self.class}#nodes to paginate `@items`"
169
+ end
170
+
171
+ # A dynamic alias for compatibility with {Relay::BaseConnection}.
172
+ # @deprecated use {#nodes} instead
173
+ def edge_nodes
174
+ nodes
175
+ end
176
+
177
+ # The connection object itself implements `PageInfo` fields
178
+ def page_info
179
+ self
180
+ end
181
+
182
+ # @return [Boolean] True if there are more items after this page
183
+ def has_next_page
184
+ raise PaginationImplementationMissingError, "Implement #{self.class}#has_next_page to return the next-page check"
185
+ end
186
+
187
+ # @return [Boolean] True if there were items before these items
188
+ def has_previous_page
189
+ raise PaginationImplementationMissingError, "Implement #{self.class}#has_previous_page to return the previous-page check"
190
+ end
191
+
192
+ # @return [String] The cursor of the first item in {nodes}
193
+ def start_cursor
194
+ nodes.first && cursor_for(nodes.first)
195
+ end
196
+
197
+ # @return [String] The cursor of the last item in {nodes}
198
+ def end_cursor
199
+ nodes.last && cursor_for(nodes.last)
200
+ end
201
+
202
+ # Return a cursor for this item.
203
+ # @param item [Object] one of the passed in {items}, taken from {nodes}
204
+ # @return [String]
205
+ def cursor_for(item)
206
+ raise PaginationImplementationMissingError, "Implement #{self.class}#cursor_for(item) to return the cursor for #{item.inspect}"
207
+ end
208
+
209
+ private
210
+
211
+ # @param argument [nil, Integer] `first` or `last`, as provided by the client
212
+ # @param max_page_size [nil, Integer]
213
+ # @return [nil, Integer] `nil` if the input was `nil`, otherwise a value between `0` and `max_page_size`
214
+ def limit_pagination_argument(argument, max_page_size)
215
+ if argument
216
+ if argument < 0
217
+ argument = 0
218
+ elsif max_page_size && argument > max_page_size
219
+ argument = max_page_size
220
+ end
221
+ end
222
+ argument
223
+ end
224
+
225
+ def decode(cursor)
226
+ context.schema.cursor_encoder.decode(cursor, nonce: true)
227
+ end
228
+
229
+ def encode(cursor)
230
+ context.schema.cursor_encoder.encode(cursor, nonce: true)
231
+ end
232
+
233
+ # A wrapper around paginated items. It includes a {cursor} for pagination
234
+ # and could be extended with custom relationship-level data.
235
+ class Edge
236
+ attr_reader :node
237
+
238
+ def initialize(node, connection)
239
+ @connection = connection
240
+ @node = node
241
+ end
242
+
243
+ def parent
244
+ @connection.parent
245
+ end
246
+
247
+ def cursor
248
+ @cursor ||= @connection.cursor_for(@node)
249
+ end
250
+ end
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Pagination
5
+ # A schema-level connection wrapper manager.
6
+ #
7
+ # Attach as a plugin.
8
+ #
9
+ # @example Adding a custom wrapper
10
+ # class MySchema < GraphQL::Schema
11
+ # connections.add(MyApp::SearchResults, MyApp::SearchResultsConnection)
12
+ # end
13
+ #
14
+ # @example Removing default connection support for arrays (they can still be manually wrapped)
15
+ # class MySchema < GraphQL::Schema
16
+ # connections.delete(Array)
17
+ # end
18
+ #
19
+ # @see {Schema.connections}
20
+ class Connections
21
+ class ImplementationMissingError < GraphQL::Error
22
+ end
23
+
24
+ def initialize(schema:)
25
+ @schema = schema
26
+ @wrappers = {}
27
+ add_default
28
+ end
29
+
30
+ def add(nodes_class, implementation)
31
+ @wrappers[nodes_class] = implementation
32
+ end
33
+
34
+ def delete(nodes_class)
35
+ @wrappers.delete(nodes_class)
36
+ end
37
+
38
+ def all_wrappers
39
+ all_wrappers = {}
40
+ @schema.ancestors.reverse_each do |schema_class|
41
+ if schema_class.respond_to?(:connections) && (c = schema_class.connections)
42
+ all_wrappers.merge!(c.wrappers)
43
+ end
44
+ end
45
+ all_wrappers
46
+ end
47
+
48
+ def wrapper_for(items, wrappers: all_wrappers)
49
+ impl = nil
50
+
51
+ items.class.ancestors.each { |cls|
52
+ impl = wrappers[cls]
53
+ break if impl
54
+ }
55
+
56
+ impl
57
+ end
58
+
59
+ # Used by the runtime to wrap values in connection wrappers.
60
+ # @api Private
61
+ def wrap(field, parent, items, arguments, context)
62
+ return items if GraphQL::Execution::Interpreter::RawValue === items
63
+ wrappers = context ? context.namespace(:connections)[:all_wrappers] : all_wrappers
64
+ impl = wrapper_for(items, wrappers: wrappers)
65
+
66
+ if impl
67
+ impl.new(
68
+ items,
69
+ context: context,
70
+ parent: parent,
71
+ field: field,
72
+ max_page_size: field.has_max_page_size? ? field.max_page_size : context.schema.default_max_page_size,
73
+ default_page_size: field.has_default_page_size? ? field.default_page_size : context.schema.default_page_size,
74
+ first: arguments[:first],
75
+ after: arguments[:after],
76
+ last: arguments[:last],
77
+ before: arguments[:before],
78
+ arguments: arguments,
79
+ edge_class: edge_class_for_field(field),
80
+ )
81
+ else
82
+ raise ImplementationMissingError, "Couldn't find a connection wrapper for #{items.class} during #{field.path} (#{items.inspect})"
83
+ end
84
+ end
85
+
86
+ # use an override if there is one
87
+ # @api private
88
+ def edge_class_for_field(field)
89
+ conn_type = field.type.unwrap
90
+ conn_type_edge_type = conn_type.respond_to?(:edge_class) && conn_type.edge_class
91
+ if conn_type_edge_type && conn_type_edge_type != Pagination::Connection::Edge
92
+ conn_type_edge_type
93
+ else
94
+ nil
95
+ end
96
+ end
97
+ protected
98
+
99
+ attr_reader :wrappers
100
+
101
+ private
102
+
103
+ def add_default
104
+ add(Array, Pagination::ArrayConnection)
105
+
106
+ if defined?(ActiveRecord::Relation)
107
+ add(ActiveRecord::Relation, Pagination::ActiveRecordRelationConnection)
108
+ end
109
+
110
+ if defined?(Sequel::Dataset)
111
+ add(Sequel::Dataset, Pagination::SequelDatasetConnection)
112
+ end
113
+
114
+ if defined?(Mongoid::Criteria)
115
+ add(Mongoid::Criteria, Pagination::MongoidRelationConnection)
116
+ end
117
+
118
+ # Mongoid 5 and 6
119
+ if defined?(Mongoid::Relations::Targets::Enumerable)
120
+ add(Mongoid::Relations::Targets::Enumerable, Pagination::MongoidRelationConnection)
121
+ end
122
+
123
+ # Mongoid 7
124
+ if defined?(Mongoid::Association::Referenced::HasMany::Targets::Enumerable)
125
+ add(Mongoid::Association::Referenced::HasMany::Targets::Enumerable, Pagination::MongoidRelationConnection)
126
+ end
127
+
128
+ # Mongoid 7.3+
129
+ if defined?(Mongoid::Association::Referenced::HasMany::Enumerable)
130
+ add(Mongoid::Association::Referenced::HasMany::Enumerable, Pagination::MongoidRelationConnection)
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/pagination/relation_connection"
3
+
4
+ module GraphQL
5
+ module Pagination
6
+ class MongoidRelationConnection < Pagination::RelationConnection
7
+ def relation_offset(relation)
8
+ relation.options.skip
9
+ end
10
+
11
+ def relation_limit(relation)
12
+ relation.options.limit
13
+ end
14
+
15
+ def relation_count(relation)
16
+ # Mongo's `.count` doesn't apply limit or skip, which we need. So we have to load _everything_!
17
+ relation.to_a.count
18
+ end
19
+
20
+ def null_relation(relation)
21
+ relation.without_options.none
22
+ end
23
+ end
24
+ end
25
+ end