graphql 1.10.2 → 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 (402) 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 +24 -33
  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 +30 -1
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +125 -117
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +52 -36
  53. data/lib/graphql/analysis/ast.rb +7 -8
  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 +31 -18
  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/errors.rb +77 -44
  70. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  71. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  72. data/lib/graphql/execution/interpreter/arguments_cache.rb +104 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  75. data/lib/graphql/execution/interpreter/runtime.rb +826 -464
  76. data/lib/graphql/execution/interpreter.rb +206 -68
  77. data/lib/graphql/execution/lazy.rb +11 -21
  78. data/lib/graphql/execution/lookahead.rb +55 -136
  79. data/lib/graphql/execution/multiplex.rb +6 -162
  80. data/lib/graphql/execution.rb +11 -4
  81. data/lib/graphql/filter.rb +7 -2
  82. data/lib/graphql/integer_decoding_error.rb +17 -0
  83. data/lib/graphql/integer_encoding_error.rb +18 -2
  84. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  85. data/lib/graphql/introspection/directive_type.rb +11 -5
  86. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  87. data/lib/graphql/introspection/entry_points.rb +4 -17
  88. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  89. data/lib/graphql/introspection/field_type.rb +9 -5
  90. data/lib/graphql/introspection/input_value_type.rb +15 -3
  91. data/lib/graphql/introspection/introspection_query.rb +6 -92
  92. data/lib/graphql/introspection/schema_type.rb +11 -6
  93. data/lib/graphql/introspection/type_type.rb +31 -14
  94. data/lib/graphql/introspection.rb +100 -0
  95. data/lib/graphql/invalid_null_error.rb +18 -0
  96. data/lib/graphql/language/block_string.rb +20 -5
  97. data/lib/graphql/language/cache.rb +37 -0
  98. data/lib/graphql/language/document_from_schema_definition.rb +96 -44
  99. data/lib/graphql/language/lexer.rb +216 -1462
  100. data/lib/graphql/language/nodes.rb +126 -129
  101. data/lib/graphql/language/parser.rb +997 -933
  102. data/lib/graphql/language/parser.y +148 -118
  103. data/lib/graphql/language/printer.rb +48 -23
  104. data/lib/graphql/language/sanitized_printer.rb +222 -0
  105. data/lib/graphql/language/token.rb +0 -4
  106. data/lib/graphql/language/visitor.rb +192 -84
  107. data/lib/graphql/language.rb +2 -0
  108. data/lib/graphql/name_validator.rb +2 -7
  109. data/lib/graphql/pagination/active_record_relation_connection.rb +45 -3
  110. data/lib/graphql/pagination/array_connection.rb +6 -4
  111. data/lib/graphql/pagination/connection.rb +105 -23
  112. data/lib/graphql/pagination/connections.rb +62 -35
  113. data/lib/graphql/pagination/relation_connection.rb +88 -36
  114. data/lib/graphql/parse_error.rb +0 -1
  115. data/lib/graphql/query/context.rb +203 -198
  116. data/lib/graphql/query/fingerprint.rb +26 -0
  117. data/lib/graphql/query/input_validation_result.rb +33 -7
  118. data/lib/graphql/query/null_context.rb +22 -9
  119. data/lib/graphql/query/validation_pipeline.rb +16 -38
  120. data/lib/graphql/query/variable_validation_error.rb +3 -3
  121. data/lib/graphql/query/variables.rb +36 -12
  122. data/lib/graphql/query.rb +92 -44
  123. data/lib/graphql/railtie.rb +6 -102
  124. data/lib/graphql/rake_task/validate.rb +1 -1
  125. data/lib/graphql/rake_task.rb +41 -10
  126. data/lib/graphql/relay/range_add.rb +17 -10
  127. data/lib/graphql/relay.rb +0 -15
  128. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  129. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  130. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  131. data/lib/graphql/rubocop.rb +4 -0
  132. data/lib/graphql/schema/addition.rb +245 -0
  133. data/lib/graphql/schema/argument.rb +250 -46
  134. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  135. data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
  136. data/lib/graphql/schema/build_from_definition.rb +243 -89
  137. data/lib/graphql/schema/directive/deprecated.rb +1 -1
  138. data/lib/graphql/schema/directive/feature.rb +1 -1
  139. data/lib/graphql/schema/directive/flagged.rb +57 -0
  140. data/lib/graphql/schema/directive/include.rb +1 -1
  141. data/lib/graphql/schema/directive/one_of.rb +12 -0
  142. data/lib/graphql/schema/directive/skip.rb +1 -1
  143. data/lib/graphql/schema/directive/transform.rb +14 -2
  144. data/lib/graphql/schema/directive.rb +108 -20
  145. data/lib/graphql/schema/enum.rb +105 -44
  146. data/lib/graphql/schema/enum_value.rb +15 -25
  147. data/lib/graphql/schema/field/connection_extension.rb +50 -30
  148. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  149. data/lib/graphql/schema/field.rb +476 -331
  150. data/lib/graphql/schema/field_extension.rb +86 -2
  151. data/lib/graphql/schema/find_inherited_value.rb +6 -8
  152. data/lib/graphql/schema/finder.rb +5 -5
  153. data/lib/graphql/schema/input_object.rb +133 -121
  154. data/lib/graphql/schema/interface.rb +17 -45
  155. data/lib/graphql/schema/introspection_system.rb +3 -8
  156. data/lib/graphql/schema/late_bound_type.rb +8 -2
  157. data/lib/graphql/schema/list.rb +25 -8
  158. data/lib/graphql/schema/loader.rb +139 -103
  159. data/lib/graphql/schema/member/base_dsl_methods.rb +29 -35
  160. data/lib/graphql/schema/member/build_type.rb +19 -14
  161. data/lib/graphql/schema/member/has_arguments.rb +310 -26
  162. data/lib/graphql/schema/member/has_ast_node.rb +16 -1
  163. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  164. data/lib/graphql/schema/member/has_directives.rb +118 -0
  165. data/lib/graphql/schema/member/has_fields.rb +164 -42
  166. data/lib/graphql/schema/member/has_interfaces.rb +129 -0
  167. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  168. data/lib/graphql/schema/member/has_validators.rb +57 -0
  169. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  170. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  171. data/lib/graphql/schema/member/validates_input.rb +3 -3
  172. data/lib/graphql/schema/member.rb +6 -6
  173. data/lib/graphql/schema/mutation.rb +4 -9
  174. data/lib/graphql/schema/non_null.rb +12 -7
  175. data/lib/graphql/schema/object.rb +35 -69
  176. data/lib/graphql/schema/printer.rb +16 -34
  177. data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
  178. data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
  179. data/lib/graphql/schema/resolver.rb +144 -79
  180. data/lib/graphql/schema/scalar.rb +27 -18
  181. data/lib/graphql/schema/subscription.rb +55 -26
  182. data/lib/graphql/schema/timeout.rb +45 -35
  183. data/lib/graphql/schema/type_expression.rb +1 -1
  184. data/lib/graphql/schema/type_membership.rb +21 -4
  185. data/lib/graphql/schema/union.rb +48 -13
  186. data/lib/graphql/schema/unique_within_type.rb +1 -2
  187. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  188. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  189. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  190. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  191. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  192. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  193. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  194. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  195. data/lib/graphql/schema/validator.rb +171 -0
  196. data/lib/graphql/schema/warden.rb +185 -32
  197. data/lib/graphql/schema/wrapper.rb +0 -5
  198. data/lib/graphql/schema.rb +471 -1116
  199. data/lib/graphql/static_validation/all_rules.rb +3 -0
  200. data/lib/graphql/static_validation/base_visitor.rb +13 -27
  201. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  202. data/lib/graphql/static_validation/error.rb +3 -1
  203. data/lib/graphql/static_validation/literal_validator.rb +69 -26
  204. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +44 -87
  205. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  206. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
  207. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  208. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  209. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
  210. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
  211. data/lib/graphql/static_validation/rules/fields_will_merge.rb +92 -49
  212. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  213. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  214. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  215. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  216. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  217. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  218. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  219. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  220. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  221. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +6 -7
  222. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  223. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +9 -10
  224. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
  225. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -2
  226. data/lib/graphql/static_validation/validation_context.rb +13 -3
  227. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  228. data/lib/graphql/static_validation/validator.rb +32 -20
  229. data/lib/graphql/static_validation.rb +1 -2
  230. data/lib/graphql/string_encoding_error.rb +13 -3
  231. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +126 -19
  232. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  233. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  234. data/lib/graphql/subscriptions/event.rb +81 -35
  235. data/lib/graphql/subscriptions/instrumentation.rb +0 -52
  236. data/lib/graphql/subscriptions/serialize.rb +53 -6
  237. data/lib/graphql/subscriptions.rb +113 -58
  238. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  239. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -21
  240. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  241. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  242. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  243. data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
  244. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  245. data/lib/graphql/tracing/data_dog_tracing.rb +26 -2
  246. data/lib/graphql/tracing/legacy_trace.rb +65 -0
  247. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  248. data/lib/graphql/tracing/new_relic_tracing.rb +1 -12
  249. data/lib/graphql/tracing/notifications_trace.rb +42 -0
  250. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  251. data/lib/graphql/tracing/platform_trace.rb +109 -0
  252. data/lib/graphql/tracing/platform_tracing.rb +64 -43
  253. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  254. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
  255. data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
  256. data/lib/graphql/tracing/scout_trace.rb +72 -0
  257. data/lib/graphql/tracing/scout_tracing.rb +11 -0
  258. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  259. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  260. data/lib/graphql/tracing/trace.rb +75 -0
  261. data/lib/graphql/tracing.rb +23 -71
  262. data/lib/graphql/type_kinds.rb +6 -3
  263. data/lib/graphql/types/big_int.rb +5 -1
  264. data/lib/graphql/types/int.rb +10 -3
  265. data/lib/graphql/types/iso_8601_date.rb +20 -9
  266. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  267. data/lib/graphql/types/relay/base_connection.rb +18 -92
  268. data/lib/graphql/types/relay/base_edge.rb +2 -34
  269. data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
  270. data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
  271. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  272. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  273. data/lib/graphql/types/relay/node.rb +2 -4
  274. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  275. data/lib/graphql/types/relay/page_info.rb +2 -14
  276. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  277. data/lib/graphql/types/relay.rb +10 -5
  278. data/lib/graphql/types/string.rb +8 -2
  279. data/lib/graphql/unauthorized_error.rb +2 -2
  280. data/lib/graphql/version.rb +1 -1
  281. data/lib/graphql.rb +54 -65
  282. data/readme.md +3 -6
  283. metadata +116 -236
  284. data/lib/graphql/analysis/analyze_query.rb +0 -91
  285. data/lib/graphql/analysis/field_usage.rb +0 -45
  286. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  287. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  288. data/lib/graphql/analysis/query_complexity.rb +0 -88
  289. data/lib/graphql/analysis/query_depth.rb +0 -43
  290. data/lib/graphql/analysis/reducer_state.rb +0 -48
  291. data/lib/graphql/argument.rb +0 -131
  292. data/lib/graphql/authorization.rb +0 -82
  293. data/lib/graphql/backwards_compatibility.rb +0 -60
  294. data/lib/graphql/base_type.rb +0 -230
  295. data/lib/graphql/boolean_type.rb +0 -2
  296. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  297. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  298. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  299. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  300. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  301. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  302. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  303. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  304. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  305. data/lib/graphql/compatibility.rb +0 -5
  306. data/lib/graphql/define/assign_argument.rb +0 -12
  307. data/lib/graphql/define/assign_connection.rb +0 -13
  308. data/lib/graphql/define/assign_enum_value.rb +0 -18
  309. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  310. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  311. data/lib/graphql/define/assign_object_field.rb +0 -42
  312. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  313. data/lib/graphql/define/instance_definable.rb +0 -210
  314. data/lib/graphql/define/no_definition_error.rb +0 -7
  315. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  316. data/lib/graphql/define/type_definer.rb +0 -31
  317. data/lib/graphql/define.rb +0 -31
  318. data/lib/graphql/deprecated_dsl.rb +0 -42
  319. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  320. data/lib/graphql/directive/include_directive.rb +0 -2
  321. data/lib/graphql/directive/skip_directive.rb +0 -2
  322. data/lib/graphql/directive.rb +0 -107
  323. data/lib/graphql/enum_type.rb +0 -127
  324. data/lib/graphql/execution/execute.rb +0 -326
  325. data/lib/graphql/execution/flatten.rb +0 -40
  326. data/lib/graphql/execution/instrumentation.rb +0 -92
  327. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  328. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  329. data/lib/graphql/execution/typecast.rb +0 -50
  330. data/lib/graphql/field/resolve.rb +0 -59
  331. data/lib/graphql/field.rb +0 -222
  332. data/lib/graphql/float_type.rb +0 -2
  333. data/lib/graphql/function.rb +0 -124
  334. data/lib/graphql/id_type.rb +0 -2
  335. data/lib/graphql/input_object_type.rb +0 -132
  336. data/lib/graphql/int_type.rb +0 -2
  337. data/lib/graphql/interface_type.rb +0 -65
  338. data/lib/graphql/internal_representation/document.rb +0 -27
  339. data/lib/graphql/internal_representation/node.rb +0 -206
  340. data/lib/graphql/internal_representation/print.rb +0 -51
  341. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  342. data/lib/graphql/internal_representation/scope.rb +0 -88
  343. data/lib/graphql/internal_representation/visit.rb +0 -36
  344. data/lib/graphql/internal_representation.rb +0 -7
  345. data/lib/graphql/language/lexer.rl +0 -258
  346. data/lib/graphql/list_type.rb +0 -80
  347. data/lib/graphql/literal_validation_error.rb +0 -6
  348. data/lib/graphql/non_null_type.rb +0 -71
  349. data/lib/graphql/object_type.rb +0 -121
  350. data/lib/graphql/query/arguments.rb +0 -188
  351. data/lib/graphql/query/arguments_cache.rb +0 -25
  352. data/lib/graphql/query/executor.rb +0 -53
  353. data/lib/graphql/query/literal_input.rb +0 -136
  354. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  355. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  356. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  357. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  358. data/lib/graphql/query/serial_execution.rb +0 -39
  359. data/lib/graphql/relay/array_connection.rb +0 -85
  360. data/lib/graphql/relay/base_connection.rb +0 -176
  361. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  362. data/lib/graphql/relay/connection_resolve.rb +0 -43
  363. data/lib/graphql/relay/connection_type.rb +0 -41
  364. data/lib/graphql/relay/edge.rb +0 -27
  365. data/lib/graphql/relay/edge_type.rb +0 -19
  366. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  367. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  368. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  369. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  370. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  371. data/lib/graphql/relay/mutation/result.rb +0 -38
  372. data/lib/graphql/relay/mutation.rb +0 -105
  373. data/lib/graphql/relay/node.rb +0 -36
  374. data/lib/graphql/relay/page_info.rb +0 -7
  375. data/lib/graphql/relay/relation_connection.rb +0 -190
  376. data/lib/graphql/relay/type_extensions.rb +0 -30
  377. data/lib/graphql/scalar_type.rb +0 -76
  378. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  379. data/lib/graphql/schema/default_parse_error.rb +0 -10
  380. data/lib/graphql/schema/default_type_error.rb +0 -15
  381. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  382. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  383. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  384. data/lib/graphql/schema/middleware_chain.rb +0 -82
  385. data/lib/graphql/schema/possible_types.rb +0 -39
  386. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  387. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  388. data/lib/graphql/schema/traversal.rb +0 -228
  389. data/lib/graphql/schema/validation.rb +0 -303
  390. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  391. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  392. data/lib/graphql/string_type.rb +0 -2
  393. data/lib/graphql/subscriptions/subscription_root.rb +0 -65
  394. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  395. data/lib/graphql/types/relay/base_field.rb +0 -22
  396. data/lib/graphql/types/relay/base_interface.rb +0 -29
  397. data/lib/graphql/types/relay/base_object.rb +0 -26
  398. data/lib/graphql/types/relay/node_field.rb +0 -43
  399. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  400. data/lib/graphql/union_type.rb +0 -113
  401. data/lib/graphql/upgrader/member.rb +0 -936
  402. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ class Schema
5
+ class Validator
6
+ # The thing being validated
7
+ # @return [GraphQL::Schema::Argument, GraphQL::Schema::Field, GraphQL::Schema::Resolver, Class<GraphQL::Schema::InputObject>]
8
+ attr_reader :validated
9
+
10
+ # @param validated [GraphQL::Schema::Argument, GraphQL::Schema::Field, GraphQL::Schema::Resolver, Class<GraphQL::Schema::InputObject>] The argument or argument owner this validator is attached to
11
+ # @param allow_blank [Boolean] if `true`, then objects that respond to `.blank?` and return true for `.blank?` will skip this validation
12
+ # @param allow_null [Boolean] if `true`, then incoming `null`s will skip this validation
13
+ def initialize(validated:, allow_blank: false, allow_null: false)
14
+ @validated = validated
15
+ @allow_blank = allow_blank
16
+ @allow_null = allow_null
17
+ end
18
+
19
+ # @param object [Object] The application object that this argument's field is being resolved for
20
+ # @param context [GraphQL::Query::Context]
21
+ # @param value [Object] The client-provided value for this argument (after parsing and coercing by the input type)
22
+ # @return [nil, Array<String>, String] Error message or messages to add
23
+ def validate(object, context, value)
24
+ raise GraphQL::RequiredImplementationMissingError, "Validator classes should implement #validate"
25
+ end
26
+
27
+ # This is like `String#%`, but it supports the case that only some of `string`'s
28
+ # values are present in `substitutions`
29
+ def partial_format(string, substitutions)
30
+ substitutions.each do |key, value|
31
+ sub_v = value.is_a?(String) ? value : value.to_s
32
+ string = string.gsub("%{#{key}}", sub_v)
33
+ end
34
+ string
35
+ end
36
+
37
+ # @return [Boolean] `true` if `value` is `nil` and this validator has `allow_null: true` or if value is `.blank?` and this validator has `allow_blank: true`
38
+ def permitted_empty_value?(value)
39
+ (value.nil? && @allow_null) ||
40
+ (@allow_blank && value.respond_to?(:blank?) && value.blank?)
41
+ end
42
+
43
+ # @param schema_member [GraphQL::Schema::Field, GraphQL::Schema::Argument, Class<GraphQL::Schema::InputObject>]
44
+ # @param validates_hash [Hash{Symbol => Hash}, Hash{Class => Hash} nil] A configuration passed as `validates:`
45
+ # @return [Array<Validator>]
46
+ def self.from_config(schema_member, validates_hash)
47
+ if validates_hash.nil? || validates_hash.empty?
48
+ EMPTY_ARRAY
49
+ else
50
+ validates_hash = validates_hash.dup
51
+
52
+ default_options = {}
53
+ if validates_hash[:allow_null]
54
+ default_options[:allow_null] = validates_hash.delete(:allow_null)
55
+ end
56
+ if validates_hash[:allow_blank]
57
+ default_options[:allow_blank] = validates_hash.delete(:allow_blank)
58
+ end
59
+
60
+ # allow_nil or allow_blank are the _only_ validations:
61
+ if validates_hash.empty?
62
+ validates_hash = default_options
63
+ end
64
+
65
+ validates_hash.map do |validator_name, options|
66
+ validator_class = case validator_name
67
+ when Class
68
+ validator_name
69
+ else
70
+ all_validators[validator_name] || raise(ArgumentError, "unknown validation: #{validator_name.inspect}")
71
+ end
72
+ if options.is_a?(Hash)
73
+ validator_class.new(validated: schema_member, **(default_options.merge(options)))
74
+ else
75
+ validator_class.new(options, validated: schema_member, **default_options)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ # Add `validator_class` to be initialized when `validates:` is given `name`.
82
+ # (It's initialized with whatever options are given by the key `name`).
83
+ # @param name [Symbol]
84
+ # @param validator_class [Class]
85
+ # @return [void]
86
+ def self.install(name, validator_class)
87
+ all_validators[name] = validator_class
88
+ nil
89
+ end
90
+
91
+ # Remove whatever validator class is {.install}ed at `name`, if there is one
92
+ # @param name [Symbol]
93
+ # @return [void]
94
+ def self.uninstall(name)
95
+ all_validators.delete(name)
96
+ nil
97
+ end
98
+
99
+ class << self
100
+ attr_accessor :all_validators
101
+ end
102
+
103
+ self.all_validators = {}
104
+
105
+ include GraphQL::EmptyObjects
106
+
107
+ class ValidationFailedError < GraphQL::ExecutionError
108
+ attr_reader :errors
109
+
110
+ def initialize(errors:)
111
+ @errors = errors
112
+ super(errors.join(", "))
113
+ end
114
+ end
115
+
116
+ # @param validators [Array<Validator>]
117
+ # @param object [Object]
118
+ # @param context [Query::Context]
119
+ # @param value [Object]
120
+ # @return [void]
121
+ # @raises [ValidationFailedError]
122
+ def self.validate!(validators, object, context, value, as: nil)
123
+ # Assuming the default case is no errors, reduce allocations in that case.
124
+ # This will be replaced with a mutable array if we actually get any errors.
125
+ all_errors = EMPTY_ARRAY
126
+
127
+ validators.each do |validator|
128
+ validated = as || validator.validated
129
+ errors = validator.validate(object, context, value)
130
+ if errors &&
131
+ (errors.is_a?(Array) && errors != EMPTY_ARRAY) ||
132
+ (errors.is_a?(String))
133
+ if all_errors.frozen? # It's empty
134
+ all_errors = []
135
+ end
136
+ interpolation_vars = { validated: validated.graphql_name }
137
+ if errors.is_a?(String)
138
+ all_errors << (errors % interpolation_vars)
139
+ else
140
+ errors = errors.map { |e| e % interpolation_vars }
141
+ all_errors.concat(errors)
142
+ end
143
+ end
144
+ end
145
+
146
+ if all_errors.any?
147
+ raise ValidationFailedError.new(errors: all_errors)
148
+ end
149
+ nil
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+
156
+ require "graphql/schema/validator/length_validator"
157
+ GraphQL::Schema::Validator.install(:length, GraphQL::Schema::Validator::LengthValidator)
158
+ require "graphql/schema/validator/numericality_validator"
159
+ GraphQL::Schema::Validator.install(:numericality, GraphQL::Schema::Validator::NumericalityValidator)
160
+ require "graphql/schema/validator/format_validator"
161
+ GraphQL::Schema::Validator.install(:format, GraphQL::Schema::Validator::FormatValidator)
162
+ require "graphql/schema/validator/inclusion_validator"
163
+ GraphQL::Schema::Validator.install(:inclusion, GraphQL::Schema::Validator::InclusionValidator)
164
+ require "graphql/schema/validator/exclusion_validator"
165
+ GraphQL::Schema::Validator.install(:exclusion, GraphQL::Schema::Validator::ExclusionValidator)
166
+ require "graphql/schema/validator/required_validator"
167
+ GraphQL::Schema::Validator.install(:required, GraphQL::Schema::Validator::RequiredValidator)
168
+ require "graphql/schema/validator/allow_null_validator"
169
+ GraphQL::Schema::Validator.install(:allow_null, GraphQL::Schema::Validator::AllowNullValidator)
170
+ require "graphql/schema/validator/allow_blank_validator"
171
+ GraphQL::Schema::Validator.install(:allow_blank, GraphQL::Schema::Validator::AllowBlankValidator)
@@ -10,7 +10,7 @@ module GraphQL
10
10
  # should go through a warden. If you access the schema directly,
11
11
  # you may show a client something that it shouldn't be allowed to see.
12
12
  #
13
- # @example Hidding private fields
13
+ # @example Hiding private fields
14
14
  # private_members = -> (member, ctx) { member.metadata[:private] }
15
15
  # result = Schema.execute(query_string, except: private_members)
16
16
  #
@@ -37,26 +37,82 @@ module GraphQL
37
37
  #
38
38
  # @api private
39
39
  class Warden
40
+ def self.from_context(context)
41
+ context.warden # this might be a hash which won't respond to this
42
+ rescue
43
+ PassThruWarden
44
+ end
45
+
46
+ # @param visibility_method [Symbol] a Warden method to call for this entry
47
+ # @param entry [Object, Array<Object>] One or more definitions for a given name in a GraphQL Schema
48
+ # @param context [GraphQL::Query::Context]
49
+ # @param warden [Warden]
50
+ # @return [Object] `entry` or one of `entry`'s items if exactly one of them is visible for this context
51
+ # @return [nil] If neither `entry` nor any of `entry`'s items are visible for this context
52
+ def self.visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context))
53
+ if entry.is_a?(Array)
54
+ visible_item = nil
55
+ entry.each do |item|
56
+ if warden.public_send(visibility_method, item, context)
57
+ if visible_item.nil?
58
+ visible_item = item
59
+ else
60
+ raise DuplicateNamesError.new(
61
+ duplicated_name: item.path, duplicated_definition_1: visible_item.inspect, duplicated_definition_2: item.inspect
62
+ )
63
+ end
64
+ end
65
+ end
66
+ visible_item
67
+ elsif warden.public_send(visibility_method, entry, context)
68
+ entry
69
+ else
70
+ nil
71
+ end
72
+ end
73
+
74
+ # This is used when a caller provides a Hash for context.
75
+ # We want to call the schema's hooks, but we don't have a full-blown warden.
76
+ # The `context` arguments to these methods exist purely to simplify the code that
77
+ # calls methods on this object, so it will have everything it needs.
78
+ class PassThruWarden
79
+ class << self
80
+ def visible_field?(field, ctx); field.visible?(ctx); end
81
+ def visible_argument?(arg, ctx); arg.visible?(ctx); end
82
+ def visible_type?(type, ctx); type.visible?(ctx); end
83
+ def visible_enum_value?(ev, ctx); ev.visible?(ctx); end
84
+ def visible_type_membership?(tm, ctx); tm.visible?(ctx); end
85
+ def interface_type_memberships(obj_t, ctx); obj_t.interface_type_memberships; end
86
+ def arguments(owner, ctx); owner.arguments(ctx); end
87
+ end
88
+ end
89
+
40
90
  # @param filter [<#call(member)>] Objects are hidden when `.call(member, ctx)` returns true
41
91
  # @param context [GraphQL::Query::Context]
42
92
  # @param schema [GraphQL::Schema]
43
- # @param deep_check [Boolean]
44
93
  def initialize(filter, context:, schema:)
45
- @schema = schema.interpreter? ? schema : schema.graphql_definition
94
+ @schema = schema
46
95
  # Cache these to avoid repeated hits to the inheritance chain when one isn't present
47
96
  @query = @schema.query
48
97
  @mutation = @schema.mutation
49
98
  @subscription = @schema.subscription
50
99
  @context = context
51
100
  @visibility_cache = read_through { |m| filter.call(m, context) }
101
+ # Initialize all ivars to improve object shape consistency:
102
+ @types = @visible_types = @reachable_types = @visible_parent_fields =
103
+ @visible_possible_types = @visible_fields = @visible_arguments = @visible_enum_arrays =
104
+ @visible_enum_values = @visible_interfaces = @type_visibility = @type_memberships =
105
+ @visible_and_reachable_type = @unions = @unfiltered_interfaces = @references_to =
106
+ @reachable_type_set =
107
+ nil
52
108
  end
53
109
 
54
- # @return [Array<GraphQL::BaseType>] Visible types in the schema
110
+ # @return [Hash<String, GraphQL::BaseType>] Visible types in the schema
55
111
  def types
56
112
  @types ||= begin
57
113
  vis_types = {}
58
- @schema.types.each do |n, t|
59
- if visible_type?(t)
114
+ @schema.types(@context).each do |n, t|
115
+ if visible_and_reachable_type?(t)
60
116
  vis_types[n] = t
61
117
  end
62
118
  end
@@ -67,8 +123,8 @@ module GraphQL
67
123
  # @return [GraphQL::BaseType, nil] The type named `type_name`, if it exists (else `nil`)
68
124
  def get_type(type_name)
69
125
  @visible_types ||= read_through do |name|
70
- type_defn = @schema.get_type(name)
71
- if type_defn && visible_type?(type_defn)
126
+ type_defn = @schema.get_type(name, @context)
127
+ if type_defn && visible_and_reachable_type?(type_defn)
72
128
  type_defn
73
129
  else
74
130
  nil
@@ -85,17 +141,16 @@ module GraphQL
85
141
 
86
142
  # @return Boolean True if the type is visible and reachable in the schema
87
143
  def reachable_type?(type_name)
88
- type = get_type(type_name)
144
+ type = get_type(type_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
89
145
  type && reachable_type_set.include?(type)
90
146
  end
91
147
 
92
148
  # @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`, if it exists
93
149
  def get_field(parent_type, field_name)
94
-
95
150
  @visible_parent_fields ||= read_through do |type|
96
151
  read_through do |f_name|
97
- field_defn = @schema.get_field(type, f_name)
98
- if field_defn && visible_field?(field_defn)
152
+ field_defn = @schema.get_field(type, f_name, @context)
153
+ if field_defn && visible_field?(field_defn, nil, type)
99
154
  field_defn
100
155
  else
101
156
  nil
@@ -106,10 +161,17 @@ module GraphQL
106
161
  @visible_parent_fields[parent_type][field_name]
107
162
  end
108
163
 
164
+ # @return [GraphQL::Argument, nil] The argument named `argument_name` on `parent_type`, if it exists and is visible
165
+ def get_argument(parent_type, argument_name)
166
+ argument = parent_type.get_argument(argument_name, @context)
167
+ return argument if argument && visible_argument?(argument, @context)
168
+ end
169
+
109
170
  # @return [Array<GraphQL::BaseType>] The types which may be member of `type_defn`
110
171
  def possible_types(type_defn)
111
172
  @visible_possible_types ||= read_through { |type_defn|
112
- @schema.possible_types(type_defn, @context).select { |t| visible_type?(t) }
173
+ pt = @schema.possible_types(type_defn, @context)
174
+ pt.select { |t| visible_and_reachable_type?(t) }
113
175
  }
114
176
  @visible_possible_types[type_defn]
115
177
  end
@@ -117,26 +179,37 @@ module GraphQL
117
179
  # @param type_defn [GraphQL::ObjectType, GraphQL::InterfaceType]
118
180
  # @return [Array<GraphQL::Field>] Fields on `type_defn`
119
181
  def fields(type_defn)
120
- @visible_fields ||= read_through { |t| @schema.get_fields(t).each_value.select { |f| visible_field?(f) } }
182
+ @visible_fields ||= read_through { |t| @schema.get_fields(t, @context).values }
121
183
  @visible_fields[type_defn]
122
184
  end
123
185
 
124
186
  # @param argument_owner [GraphQL::Field, GraphQL::InputObjectType]
125
187
  # @return [Array<GraphQL::Argument>] Visible arguments on `argument_owner`
126
- def arguments(argument_owner)
127
- @visible_arguments ||= read_through { |o| o.arguments.each_value.select { |a| visible_field?(a) } }
188
+ def arguments(argument_owner, ctx = nil)
189
+ @visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a, @context) } }
128
190
  @visible_arguments[argument_owner]
129
191
  end
130
192
 
131
193
  # @return [Array<GraphQL::EnumType::EnumValue>] Visible members of `enum_defn`
132
194
  def enum_values(enum_defn)
133
- @visible_enum_values ||= read_through { |e| e.values.each_value.select { |enum_value_defn| visible?(enum_value_defn) } }
134
- @visible_enum_values[enum_defn]
195
+ @visible_enum_arrays ||= read_through { |e|
196
+ values = e.enum_values(@context)
197
+ if values.size == 0
198
+ raise GraphQL::Schema::Enum::MissingValuesError.new(e)
199
+ end
200
+ values
201
+ }
202
+ @visible_enum_arrays[enum_defn]
203
+ end
204
+
205
+ def visible_enum_value?(enum_value, _ctx = nil)
206
+ @visible_enum_values ||= read_through { |ev| visible?(ev) }
207
+ @visible_enum_values[enum_value]
135
208
  end
136
209
 
137
210
  # @return [Array<GraphQL::InterfaceType>] Visible interfaces implemented by `obj_type`
138
211
  def interfaces(obj_type)
139
- @visible_interfaces ||= read_through { |t| t.interfaces.select { |i| visible?(i) } }
212
+ @visible_interfaces ||= read_through { |t| t.interfaces(@context).select { |i| visible_type?(i) } }
140
213
  @visible_interfaces[obj_type]
141
214
  end
142
215
 
@@ -153,20 +226,42 @@ module GraphQL
153
226
  end
154
227
  end
155
228
 
156
- private
229
+ # @param owner [Class, Module] If provided, confirm that field has the given owner.
230
+ def visible_field?(field_defn, _ctx = nil, owner = field_defn.owner)
231
+ # This field is visible in its own right
232
+ visible?(field_defn) &&
233
+ # This field's return type is visible
234
+ visible_and_reachable_type?(field_defn.type.unwrap) &&
235
+ # This field is either defined on this object type,
236
+ # or the interface it's inherited from is also visible
237
+ ((field_defn.respond_to?(:owner) && field_defn.owner == owner) || field_on_visible_interface?(field_defn, owner))
238
+ end
157
239
 
158
- def union_memberships(obj_type)
159
- @unions ||= read_through { |obj_type| @schema.union_memberships(obj_type).select { |u| visible?(u) } }
160
- @unions[obj_type]
240
+ def visible_argument?(arg_defn, _ctx = nil)
241
+ visible?(arg_defn) && visible_and_reachable_type?(arg_defn.type.unwrap)
242
+ end
243
+
244
+ def visible_type?(type_defn, _ctx = nil)
245
+ @type_visibility ||= read_through { |type_defn| visible?(type_defn) }
246
+ @type_visibility[type_defn]
161
247
  end
162
248
 
163
- def visible_field?(field_defn)
164
- visible?(field_defn) && visible_type?(field_defn.type.unwrap)
249
+ def visible_type_membership?(type_membership, _ctx = nil)
250
+ visible?(type_membership)
165
251
  end
166
252
 
167
- def visible_type?(type_defn)
168
- @type_visibility ||= read_through do |type_defn|
169
- next false unless visible?(type_defn)
253
+ def interface_type_memberships(obj_type, _ctx = nil)
254
+ @type_memberships ||= read_through do |obj_t|
255
+ obj_t.interface_type_memberships
256
+ end
257
+ @type_memberships[obj_type]
258
+ end
259
+
260
+ private
261
+
262
+ def visible_and_reachable_type?(type_defn)
263
+ @visible_and_reachable_type ||= read_through do |type_defn|
264
+ next false unless visible_type?(type_defn)
170
265
  next true if root_type?(type_defn) || type_defn.introspection?
171
266
 
172
267
  if type_defn.kind.union?
@@ -178,7 +273,48 @@ module GraphQL
178
273
  end
179
274
  end
180
275
 
181
- @type_visibility[type_defn]
276
+ @visible_and_reachable_type[type_defn]
277
+ end
278
+
279
+ def union_memberships(obj_type)
280
+ @unions ||= read_through { |obj_type| @schema.union_memberships(obj_type).select { |u| visible?(u) } }
281
+ @unions[obj_type]
282
+ end
283
+
284
+ # We need this to tell whether a field was inherited by an interface
285
+ # even when that interface is hidden from `#interfaces`
286
+ def unfiltered_interfaces(type_defn)
287
+ @unfiltered_interfaces ||= read_through(&:interfaces)
288
+ @unfiltered_interfaces[type_defn]
289
+ end
290
+
291
+ # If this field was inherited from an interface, and the field on that interface is _hidden_,
292
+ # then treat this inherited field as hidden.
293
+ # (If it _wasn't_ inherited, then don't hide it for this reason.)
294
+ def field_on_visible_interface?(field_defn, type_defn)
295
+ if type_defn.kind.object?
296
+ any_interface_has_field = false
297
+ any_interface_has_visible_field = false
298
+ ints = unfiltered_interfaces(type_defn)
299
+ ints.each do |interface_type|
300
+ if (iface_field_defn = interface_type.get_field(field_defn.graphql_name, @context))
301
+ any_interface_has_field = true
302
+
303
+ if interfaces(type_defn).include?(interface_type) && visible_field?(iface_field_defn, nil, interface_type)
304
+ any_interface_has_visible_field = true
305
+ end
306
+ end
307
+ end
308
+
309
+ if any_interface_has_field
310
+ any_interface_has_visible_field
311
+ else
312
+ # it's the object's own field
313
+ true
314
+ end
315
+ else
316
+ true
317
+ end
182
318
  end
183
319
 
184
320
  def root_type?(type_defn)
@@ -208,7 +344,7 @@ module GraphQL
208
344
  end
209
345
 
210
346
  def visible_possible_types?(type_defn)
211
- possible_types(type_defn).any? { |t| visible_type?(t) }
347
+ possible_types(type_defn).any? { |t| visible_and_reachable_type?(t) }
212
348
  end
213
349
 
214
350
  def visible?(member)
@@ -220,9 +356,10 @@ module GraphQL
220
356
  end
221
357
 
222
358
  def reachable_type_set
223
- return @reachable_type_set if defined?(@reachable_type_set)
359
+ return @reachable_type_set if @reachable_type_set
224
360
 
225
361
  @reachable_type_set = Set.new
362
+ rt_hash = {}
226
363
 
227
364
  unvisited_types = []
228
365
  ['query', 'mutation', 'subscription'].each do |op_name|
@@ -230,8 +367,18 @@ module GraphQL
230
367
  unvisited_types << root_type if root_type
231
368
  end
232
369
  unvisited_types.concat(@schema.introspection_system.types.values)
370
+
371
+ directives.each do |dir_class|
372
+ arguments(dir_class).each do |arg_defn|
373
+ arg_t = arg_defn.type.unwrap
374
+ if get_type(arg_t.graphql_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
375
+ unvisited_types << arg_t
376
+ end
377
+ end
378
+ end
379
+
233
380
  @schema.orphan_types.each do |orphan_type|
234
- if get_type(orphan_type.graphql_name)
381
+ if get_type(orphan_type.graphql_name) == orphan_type # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
235
382
  unvisited_types << orphan_type
236
383
  end
237
384
  end
@@ -239,6 +386,12 @@ module GraphQL
239
386
  until unvisited_types.empty?
240
387
  type = unvisited_types.pop
241
388
  if @reachable_type_set.add?(type)
389
+ type_by_name = rt_hash[type.graphql_name] ||= type
390
+ if type_by_name != type
391
+ raise DuplicateNamesError.new(
392
+ duplicated_name: type.graphql_name, duplicated_definition_1: type.inspect, duplicated_definition_2: type_by_name.inspect
393
+ )
394
+ end
242
395
  if type.kind.input_object?
243
396
  # recurse into visible arguments
244
397
  arguments(type).each do |argument|
@@ -3,7 +3,6 @@
3
3
  module GraphQL
4
4
  class Schema
5
5
  class Wrapper
6
- include GraphQL::Schema::Member::CachedGraphQLDefinition
7
6
  include GraphQL::Schema::Member::TypeSystemHelpers
8
7
 
9
8
  # @return [Class, Module] The inner type of this wrapping type, the type of which one or more objects may be present.
@@ -13,10 +12,6 @@ module GraphQL
13
12
  @of_type = of_type
14
13
  end
15
14
 
16
- def to_graphql
17
- raise GraphQL::RequiredImplementationMissingError
18
- end
19
-
20
15
  def unwrap
21
16
  @of_type.unwrap
22
17
  end