graphql 2.0.32 → 2.5.22

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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/detailed_trace_generator.rb +77 -0
  3. data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
  4. data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
  5. data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
  6. data/lib/generators/graphql/install_generator.rb +49 -0
  7. data/lib/generators/graphql/orm_mutations_base.rb +1 -1
  8. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  9. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  10. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  11. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  12. data/lib/generators/graphql/templates/base_field.erb +2 -0
  13. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  14. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  15. data/lib/generators/graphql/templates/base_object.erb +2 -0
  16. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  17. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  18. data/lib/generators/graphql/templates/base_union.erb +2 -0
  19. data/lib/generators/graphql/templates/create_graphql_detailed_traces.erb +10 -0
  20. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  21. data/lib/generators/graphql/templates/loader.erb +2 -0
  22. data/lib/generators/graphql/templates/mutation.erb +2 -0
  23. data/lib/generators/graphql/templates/node_type.erb +2 -0
  24. data/lib/generators/graphql/templates/query_type.erb +2 -0
  25. data/lib/generators/graphql/templates/schema.erb +5 -0
  26. data/lib/generators/graphql/type_generator.rb +1 -1
  27. data/lib/graphql/analysis/analyzer.rb +90 -0
  28. data/lib/graphql/analysis/field_usage.rb +82 -0
  29. data/lib/graphql/analysis/max_query_complexity.rb +20 -0
  30. data/lib/graphql/analysis/max_query_depth.rb +20 -0
  31. data/lib/graphql/analysis/query_complexity.rb +263 -0
  32. data/lib/graphql/analysis/query_depth.rb +58 -0
  33. data/lib/graphql/analysis/visitor.rb +280 -0
  34. data/lib/graphql/analysis.rb +95 -1
  35. data/lib/graphql/autoload.rb +38 -0
  36. data/lib/graphql/backtrace/table.rb +118 -55
  37. data/lib/graphql/backtrace.rb +1 -19
  38. data/lib/graphql/coercion_error.rb +1 -9
  39. data/lib/graphql/current.rb +57 -0
  40. data/lib/graphql/dashboard/application_controller.rb +41 -0
  41. data/lib/graphql/dashboard/detailed_traces.rb +47 -0
  42. data/lib/graphql/dashboard/installable.rb +22 -0
  43. data/lib/graphql/dashboard/landings_controller.rb +9 -0
  44. data/lib/graphql/dashboard/limiters.rb +93 -0
  45. data/lib/graphql/dashboard/operation_store.rb +199 -0
  46. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
  47. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
  48. data/lib/graphql/dashboard/statics/charts.min.css +1 -0
  49. data/lib/graphql/dashboard/statics/dashboard.css +30 -0
  50. data/lib/graphql/dashboard/statics/dashboard.js +143 -0
  51. data/lib/graphql/dashboard/statics/header-icon.png +0 -0
  52. data/lib/graphql/dashboard/statics/icon.png +0 -0
  53. data/lib/graphql/dashboard/statics_controller.rb +31 -0
  54. data/lib/graphql/dashboard/subscriptions.rb +97 -0
  55. data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
  56. data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
  57. data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
  58. data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
  59. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +24 -0
  60. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
  61. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
  62. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
  63. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
  64. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
  65. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
  66. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
  67. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
  68. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
  69. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
  70. data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
  71. data/lib/graphql/dashboard.rb +96 -0
  72. data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
  73. data/lib/graphql/dataloader/active_record_source.rb +47 -0
  74. data/lib/graphql/dataloader/async_dataloader.rb +112 -0
  75. data/lib/graphql/dataloader/null_dataloader.rb +55 -10
  76. data/lib/graphql/dataloader/request.rb +5 -0
  77. data/lib/graphql/dataloader/source.rb +35 -12
  78. data/lib/graphql/dataloader.rb +224 -149
  79. data/lib/graphql/date_encoding_error.rb +1 -1
  80. data/lib/graphql/dig.rb +2 -1
  81. data/lib/graphql/duration_encoding_error.rb +16 -0
  82. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  83. data/lib/graphql/execution/interpreter/arguments_cache.rb +5 -10
  84. data/lib/graphql/execution/interpreter/resolve.rb +23 -25
  85. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +228 -0
  86. data/lib/graphql/execution/interpreter/runtime.rb +363 -434
  87. data/lib/graphql/execution/interpreter.rb +91 -164
  88. data/lib/graphql/execution/lookahead.rb +105 -31
  89. data/lib/graphql/execution/multiplex.rb +7 -6
  90. data/lib/graphql/execution/next/field_resolve_step.rb +711 -0
  91. data/lib/graphql/execution/next/load_argument_step.rb +60 -0
  92. data/lib/graphql/execution/next/prepare_object_step.rb +129 -0
  93. data/lib/graphql/execution/next/runner.rb +389 -0
  94. data/lib/graphql/execution/next/selections_step.rb +37 -0
  95. data/lib/graphql/execution/next.rb +70 -0
  96. data/lib/graphql/execution.rb +1 -0
  97. data/lib/graphql/execution_error.rb +13 -10
  98. data/lib/graphql/introspection/directive_location_enum.rb +1 -1
  99. data/lib/graphql/introspection/directive_type.rb +7 -3
  100. data/lib/graphql/introspection/dynamic_fields.rb +5 -1
  101. data/lib/graphql/introspection/entry_points.rb +20 -6
  102. data/lib/graphql/introspection/enum_value_type.rb +5 -5
  103. data/lib/graphql/introspection/field_type.rb +13 -5
  104. data/lib/graphql/introspection/input_value_type.rb +21 -13
  105. data/lib/graphql/introspection/schema_type.rb +8 -11
  106. data/lib/graphql/introspection/type_type.rb +64 -28
  107. data/lib/graphql/invalid_name_error.rb +1 -1
  108. data/lib/graphql/invalid_null_error.rb +26 -17
  109. data/lib/graphql/language/block_string.rb +34 -18
  110. data/lib/graphql/language/cache.rb +13 -0
  111. data/lib/graphql/language/comment.rb +18 -0
  112. data/lib/graphql/language/definition_slice.rb +1 -1
  113. data/lib/graphql/language/document_from_schema_definition.rb +90 -61
  114. data/lib/graphql/language/lexer.rb +319 -193
  115. data/lib/graphql/language/nodes.rb +136 -77
  116. data/lib/graphql/language/parser.rb +807 -1985
  117. data/lib/graphql/language/printer.rb +324 -151
  118. data/lib/graphql/language/sanitized_printer.rb +21 -23
  119. data/lib/graphql/language/static_visitor.rb +171 -0
  120. data/lib/graphql/language/visitor.rb +23 -83
  121. data/lib/graphql/language.rb +71 -1
  122. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  123. data/lib/graphql/pagination/array_connection.rb +6 -6
  124. data/lib/graphql/pagination/connection.rb +30 -1
  125. data/lib/graphql/pagination/connections.rb +32 -0
  126. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  127. data/lib/graphql/query/context/scoped_context.rb +101 -0
  128. data/lib/graphql/query/context.rb +82 -144
  129. data/lib/graphql/query/null_context.rb +15 -18
  130. data/lib/graphql/query/partial.rb +179 -0
  131. data/lib/graphql/query/validation_pipeline.rb +4 -4
  132. data/lib/graphql/query/variable_validation_error.rb +1 -1
  133. data/lib/graphql/query/variables.rb +3 -3
  134. data/lib/graphql/query.rb +126 -81
  135. data/lib/graphql/railtie.rb +16 -6
  136. data/lib/graphql/rake_task.rb +3 -12
  137. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
  138. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  139. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  140. data/lib/graphql/rubocop.rb +2 -0
  141. data/lib/graphql/schema/addition.rb +26 -13
  142. data/lib/graphql/schema/always_visible.rb +7 -2
  143. data/lib/graphql/schema/argument.rb +75 -9
  144. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  145. data/lib/graphql/schema/build_from_definition.rb +123 -60
  146. data/lib/graphql/schema/directive/flagged.rb +4 -2
  147. data/lib/graphql/schema/directive/one_of.rb +12 -0
  148. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  149. data/lib/graphql/schema/directive.rb +54 -2
  150. data/lib/graphql/schema/enum.rb +110 -27
  151. data/lib/graphql/schema/enum_value.rb +10 -2
  152. data/lib/graphql/schema/field/connection_extension.rb +15 -49
  153. data/lib/graphql/schema/field/scope_extension.rb +23 -7
  154. data/lib/graphql/schema/field.rb +245 -118
  155. data/lib/graphql/schema/field_extension.rb +34 -1
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +116 -60
  158. data/lib/graphql/schema/interface.rb +34 -16
  159. data/lib/graphql/schema/introspection_system.rb +8 -17
  160. data/lib/graphql/schema/late_bound_type.rb +4 -0
  161. data/lib/graphql/schema/list.rb +3 -3
  162. data/lib/graphql/schema/loader.rb +3 -4
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +18 -2
  164. data/lib/graphql/schema/member/has_arguments.rb +132 -100
  165. data/lib/graphql/schema/member/has_authorization.rb +35 -0
  166. data/lib/graphql/schema/member/has_dataloader.rb +99 -0
  167. data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -0
  168. data/lib/graphql/schema/member/has_directives.rb +4 -4
  169. data/lib/graphql/schema/member/has_fields.rb +115 -15
  170. data/lib/graphql/schema/member/has_interfaces.rb +26 -12
  171. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  172. data/lib/graphql/schema/member/has_validators.rb +1 -1
  173. data/lib/graphql/schema/member/relay_shortcuts.rb +1 -1
  174. data/lib/graphql/schema/member/scoped.rb +19 -0
  175. data/lib/graphql/schema/member/type_system_helpers.rb +17 -4
  176. data/lib/graphql/schema/member/validates_input.rb +3 -3
  177. data/lib/graphql/schema/member.rb +6 -0
  178. data/lib/graphql/schema/mutation.rb +7 -0
  179. data/lib/graphql/schema/object.rb +34 -8
  180. data/lib/graphql/schema/printer.rb +9 -7
  181. data/lib/graphql/schema/ractor_shareable.rb +79 -0
  182. data/lib/graphql/schema/relay_classic_mutation.rb +6 -129
  183. data/lib/graphql/schema/resolver.rb +90 -32
  184. data/lib/graphql/schema/scalar.rb +4 -9
  185. data/lib/graphql/schema/subscription.rb +63 -10
  186. data/lib/graphql/schema/timeout.rb +19 -2
  187. data/lib/graphql/schema/type_expression.rb +2 -2
  188. data/lib/graphql/schema/union.rb +2 -2
  189. data/lib/graphql/schema/unique_within_type.rb +1 -1
  190. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  191. data/lib/graphql/schema/validator/required_validator.rb +92 -11
  192. data/lib/graphql/schema/validator.rb +3 -1
  193. data/lib/graphql/schema/visibility/migration.rb +188 -0
  194. data/lib/graphql/schema/visibility/profile.rb +445 -0
  195. data/lib/graphql/schema/visibility/visit.rb +190 -0
  196. data/lib/graphql/schema/visibility.rb +311 -0
  197. data/lib/graphql/schema/warden.rb +275 -103
  198. data/lib/graphql/schema.rb +950 -210
  199. data/lib/graphql/static_validation/all_rules.rb +3 -3
  200. data/lib/graphql/static_validation/base_visitor.rb +7 -6
  201. data/lib/graphql/static_validation/literal_validator.rb +6 -7
  202. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  203. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  204. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -2
  205. data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -3
  206. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -0
  207. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  208. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +47 -13
  209. data/lib/graphql/static_validation/rules/fields_will_merge.rb +88 -25
  210. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
  211. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  212. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
  213. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  214. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  215. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  216. data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +25 -0
  217. data/lib/graphql/static_validation/rules/query_root_exists.rb +1 -1
  218. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -5
  219. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  220. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +26 -0
  221. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +7 -3
  222. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  223. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  224. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
  225. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  226. data/lib/graphql/static_validation/validation_context.rb +21 -5
  227. data/lib/graphql/static_validation/validator.rb +9 -1
  228. data/lib/graphql/static_validation.rb +0 -1
  229. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +8 -5
  230. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  231. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +12 -10
  232. data/lib/graphql/subscriptions/event.rb +21 -4
  233. data/lib/graphql/subscriptions/serialize.rb +3 -1
  234. data/lib/graphql/subscriptions.rb +21 -17
  235. data/lib/graphql/testing/helpers.rb +161 -0
  236. data/lib/graphql/testing/mock_action_cable.rb +111 -0
  237. data/lib/graphql/testing.rb +3 -0
  238. data/lib/graphql/tracing/active_support_notifications_trace.rb +14 -3
  239. data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
  240. data/lib/graphql/tracing/appoptics_trace.rb +7 -3
  241. data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
  242. data/lib/graphql/tracing/appsignal_trace.rb +32 -59
  243. data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
  244. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  245. data/lib/graphql/tracing/data_dog_trace.rb +46 -162
  246. data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
  247. data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +74 -0
  248. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
  249. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
  250. data/lib/graphql/tracing/detailed_trace.rb +156 -0
  251. data/lib/graphql/tracing/legacy_hooks_trace.rb +75 -0
  252. data/lib/graphql/tracing/legacy_trace.rb +4 -61
  253. data/lib/graphql/tracing/monitor_trace.rb +283 -0
  254. data/lib/graphql/tracing/new_relic_trace.rb +47 -54
  255. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  256. data/lib/graphql/tracing/notifications_trace.rb +183 -37
  257. data/lib/graphql/tracing/notifications_tracing.rb +2 -0
  258. data/lib/graphql/tracing/null_trace.rb +9 -0
  259. data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
  260. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
  261. data/lib/graphql/tracing/perfetto_trace.rb +864 -0
  262. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  263. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +5 -1
  264. data/lib/graphql/tracing/prometheus_trace.rb +73 -73
  265. data/lib/graphql/tracing/prometheus_tracing.rb +2 -0
  266. data/lib/graphql/tracing/scout_trace.rb +32 -58
  267. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  268. data/lib/graphql/tracing/sentry_trace.rb +82 -0
  269. data/lib/graphql/tracing/statsd_trace.rb +33 -45
  270. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  271. data/lib/graphql/tracing/trace.rb +112 -1
  272. data/lib/graphql/tracing.rb +31 -28
  273. data/lib/graphql/type_kinds.rb +2 -1
  274. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  275. data/lib/graphql/types/relay/connection_behaviors.rb +44 -2
  276. data/lib/graphql/types/relay/edge_behaviors.rb +18 -0
  277. data/lib/graphql/types/relay/has_node_field.rb +13 -8
  278. data/lib/graphql/types/relay/has_nodes_field.rb +13 -8
  279. data/lib/graphql/types/relay/node_behaviors.rb +13 -2
  280. data/lib/graphql/types/relay/page_info_behaviors.rb +4 -0
  281. data/lib/graphql/types.rb +18 -10
  282. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  283. data/lib/graphql/unauthorized_error.rb +5 -1
  284. data/lib/graphql/version.rb +1 -1
  285. data/lib/graphql.rb +71 -54
  286. data/readme.md +12 -2
  287. metadata +233 -37
  288. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  289. data/lib/graphql/analysis/ast/field_usage.rb +0 -57
  290. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -22
  291. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  292. data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
  293. data/lib/graphql/analysis/ast/query_depth.rb +0 -55
  294. data/lib/graphql/analysis/ast/visitor.rb +0 -276
  295. data/lib/graphql/analysis/ast.rb +0 -81
  296. data/lib/graphql/backtrace/inspect_result.rb +0 -50
  297. data/lib/graphql/backtrace/trace.rb +0 -96
  298. data/lib/graphql/backtrace/tracer.rb +0 -80
  299. data/lib/graphql/deprecation.rb +0 -9
  300. data/lib/graphql/filter.rb +0 -59
  301. data/lib/graphql/language/parser.y +0 -560
  302. data/lib/graphql/language/token.rb +0 -34
  303. data/lib/graphql/schema/base_64_bp.rb +0 -26
  304. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  305. data/lib/graphql/schema/null_mask.rb +0 -11
  306. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +0 -17
  307. data/lib/graphql/static_validation/type_stack.rb +0 -216
  308. data/lib/graphql/subscriptions/instrumentation.rb +0 -28
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ module Comment
5
+ def self.print(str, indent: '')
6
+ lines = str.split("\n").map do |line|
7
+ comment_str = "".dup
8
+ comment_str << indent
9
+ comment_str << "# "
10
+ comment_str << line
11
+ comment_str.rstrip
12
+ end
13
+
14
+ lines.join("\n") + "\n"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -15,7 +15,7 @@ module GraphQL
15
15
 
16
16
  private
17
17
 
18
- class DependencyVisitor < GraphQL::Language::Visitor
18
+ class DependencyVisitor < GraphQL::Language::StaticVisitor
19
19
  def initialize(doc, definitions, names)
20
20
  @names = names
21
21
  @definitions = definitions
@@ -14,35 +14,19 @@ module GraphQL
14
14
  # @param include_built_in_directives [Boolean] Whether or not to include built in directives in the AST
15
15
  class DocumentFromSchemaDefinition
16
16
  def initialize(
17
- schema, context: nil, only: nil, except: nil, include_introspection_types: false,
17
+ schema, context: nil, include_introspection_types: false,
18
18
  include_built_in_directives: false, include_built_in_scalars: false, always_include_schema: false
19
19
  )
20
20
  @schema = schema
21
+ @context = context
21
22
  @always_include_schema = always_include_schema
22
23
  @include_introspection_types = include_introspection_types
23
24
  @include_built_in_scalars = include_built_in_scalars
24
25
  @include_built_in_directives = include_built_in_directives
25
26
  @include_one_of = false
26
27
 
27
- schema_context = schema.context_class.new(query: nil, object: nil, schema: schema, values: context)
28
-
29
- @warden = if only || except
30
- filter = GraphQL::Filter
31
- .new(only: only, except: except)
32
- .merge(only: @schema.method(:visible?))
33
- GraphQL::Schema::Warden.new(
34
- filter,
35
- schema: @schema,
36
- context: schema_context,
37
- )
38
- else
39
- @schema.warden_class.new(
40
- schema: @schema,
41
- context: schema_context,
42
- )
43
- end
44
-
45
- schema_context.warden = @warden
28
+ dummy_query = @schema.query_class.new(@schema, "{ __typename }", validate: false, context: context)
29
+ @types = dummy_query.types # rubocop:disable Development/ContextIsPassedCop
46
30
  end
47
31
 
48
32
  def document
@@ -52,25 +36,33 @@ module GraphQL
52
36
  end
53
37
 
54
38
  def build_schema_node
55
- schema_options = {
56
- # `@schema.directives` is covered by `build_definition_nodes`
57
- directives: definition_directives(@schema, :schema_directives),
58
- }
59
39
  if !schema_respects_root_name_conventions?(@schema)
60
- schema_options.merge!({
61
- query: (q = warden.root_type_for_operation("query")) && q.graphql_name,
62
- mutation: (m = warden.root_type_for_operation("mutation")) && m.graphql_name,
63
- subscription: (s = warden.root_type_for_operation("subscription")) && s.graphql_name,
64
- })
40
+ GraphQL::Language::Nodes::SchemaDefinition.new(
41
+ query: @types.query_root&.graphql_name,
42
+ mutation: @types.mutation_root&.graphql_name,
43
+ subscription: @types.subscription_root&.graphql_name,
44
+ directives: definition_directives(@schema, :schema_directives)
45
+ )
46
+ else
47
+ # A plain `schema ...` _must_ include root type definitions.
48
+ # If the only difference is directives, then you have to use `extend schema`
49
+ GraphQL::Language::Nodes::SchemaExtension.new(directives: definition_directives(@schema, :schema_directives))
65
50
  end
66
- GraphQL::Language::Nodes::SchemaDefinition.new(schema_options)
67
51
  end
68
52
 
69
53
  def build_object_type_node(object_type)
54
+ ints = @types.interfaces(object_type)
55
+
56
+ if !ints.empty?
57
+ ints = ints.sort_by(&:graphql_name)
58
+ ints.map! { |iface| build_type_name_node(iface) }
59
+ end
60
+
70
61
  GraphQL::Language::Nodes::ObjectTypeDefinition.new(
71
62
  name: object_type.graphql_name,
72
- interfaces: warden.interfaces(object_type).sort_by(&:graphql_name).map { |iface| build_type_name_node(iface) },
73
- fields: build_field_nodes(warden.fields(object_type)),
63
+ comment: object_type.comment,
64
+ interfaces: ints,
65
+ fields: build_field_nodes(@types.fields(object_type)),
74
66
  description: object_type.description,
75
67
  directives: directives(object_type),
76
68
  )
@@ -79,7 +71,8 @@ module GraphQL
79
71
  def build_field_node(field)
80
72
  GraphQL::Language::Nodes::FieldDefinition.new(
81
73
  name: field.graphql_name,
82
- arguments: build_argument_nodes(warden.arguments(field)),
74
+ comment: field.comment,
75
+ arguments: build_argument_nodes(@types.arguments(field)),
83
76
  type: build_type_name_node(field.type),
84
77
  description: field.description,
85
78
  directives: directives(field),
@@ -89,8 +82,9 @@ module GraphQL
89
82
  def build_union_type_node(union_type)
90
83
  GraphQL::Language::Nodes::UnionTypeDefinition.new(
91
84
  name: union_type.graphql_name,
85
+ comment: union_type.comment,
92
86
  description: union_type.description,
93
- types: warden.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
87
+ types: @types.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
94
88
  directives: directives(union_type),
95
89
  )
96
90
  end
@@ -98,9 +92,10 @@ module GraphQL
98
92
  def build_interface_type_node(interface_type)
99
93
  GraphQL::Language::Nodes::InterfaceTypeDefinition.new(
100
94
  name: interface_type.graphql_name,
101
- interfaces: warden.interfaces(interface_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
95
+ comment: interface_type.comment,
96
+ interfaces: @types.interfaces(interface_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
102
97
  description: interface_type.description,
103
- fields: build_field_nodes(warden.fields(interface_type)),
98
+ fields: build_field_nodes(@types.fields(interface_type)),
104
99
  directives: directives(interface_type),
105
100
  )
106
101
  end
@@ -108,7 +103,8 @@ module GraphQL
108
103
  def build_enum_type_node(enum_type)
109
104
  GraphQL::Language::Nodes::EnumTypeDefinition.new(
110
105
  name: enum_type.graphql_name,
111
- values: warden.enum_values(enum_type).sort_by(&:graphql_name).map do |enum_value|
106
+ comment: enum_type.comment,
107
+ values: @types.enum_values(enum_type).sort_by(&:graphql_name).map do |enum_value|
112
108
  build_enum_value_node(enum_value)
113
109
  end,
114
110
  description: enum_type.description,
@@ -119,6 +115,7 @@ module GraphQL
119
115
  def build_enum_value_node(enum_value)
120
116
  GraphQL::Language::Nodes::EnumValueDefinition.new(
121
117
  name: enum_value.graphql_name,
118
+ comment: enum_value.comment,
122
119
  description: enum_value.description,
123
120
  directives: directives(enum_value),
124
121
  )
@@ -127,6 +124,7 @@ module GraphQL
127
124
  def build_scalar_type_node(scalar_type)
128
125
  GraphQL::Language::Nodes::ScalarTypeDefinition.new(
129
126
  name: scalar_type.graphql_name,
127
+ comment: scalar_type.comment,
130
128
  description: scalar_type.description,
131
129
  directives: directives(scalar_type),
132
130
  )
@@ -141,6 +139,7 @@ module GraphQL
141
139
 
142
140
  argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
143
141
  name: argument.graphql_name,
142
+ comment: argument.comment,
144
143
  description: argument.description,
145
144
  type: build_type_name_node(argument.type),
146
145
  default_value: default_value,
@@ -153,7 +152,8 @@ module GraphQL
153
152
  def build_input_object_node(input_object)
154
153
  GraphQL::Language::Nodes::InputObjectTypeDefinition.new(
155
154
  name: input_object.graphql_name,
156
- fields: build_argument_nodes(warden.arguments(input_object)),
155
+ comment: input_object.comment,
156
+ fields: build_argument_nodes(@types.arguments(input_object)),
157
157
  description: input_object.description,
158
158
  directives: directives(input_object),
159
159
  )
@@ -163,7 +163,7 @@ module GraphQL
163
163
  GraphQL::Language::Nodes::DirectiveDefinition.new(
164
164
  name: directive.graphql_name,
165
165
  repeatable: directive.repeatable?,
166
- arguments: build_argument_nodes(warden.arguments(directive)),
166
+ arguments: build_argument_nodes(@types.arguments(directive)),
167
167
  locations: build_directive_location_nodes(directive.locations),
168
168
  description: directive.description,
169
169
  )
@@ -190,7 +190,8 @@ module GraphQL
190
190
  of_type: build_type_name_node(type.of_type)
191
191
  )
192
192
  else
193
- GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
193
+ @cached_type_name_nodes ||= {}
194
+ @cached_type_name_nodes[type.graphql_name] ||= GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
194
195
  end
195
196
  end
196
197
 
@@ -207,7 +208,7 @@ module GraphQL
207
208
  when "INPUT_OBJECT"
208
209
  GraphQL::Language::Nodes::InputObject.new(
209
210
  arguments: default_value.to_h.map do |arg_name, arg_value|
210
- args = @warden.arguments(type)
211
+ args = @types.arguments(type)
211
212
  arg = args.find { |a| a.keyword.to_s == arg_name.to_s }
212
213
  if arg.nil?
213
214
  raise ArgumentError, "No argument definition on #{type.graphql_name} for argument: #{arg_name.inspect} (expected one of: #{args.map(&:keyword)})"
@@ -247,9 +248,13 @@ module GraphQL
247
248
  end
248
249
 
249
250
  def build_argument_nodes(arguments)
250
- arguments
251
- .map { |arg| build_argument_node(arg) }
252
- .sort_by(&:name)
251
+ if !arguments.empty?
252
+ nodes = arguments.map { |arg| build_argument_node(arg) }
253
+ nodes.sort_by!(&:name)
254
+ nodes
255
+ else
256
+ arguments
257
+ end
253
258
  end
254
259
 
255
260
  def build_directive_nodes(directives)
@@ -259,20 +264,45 @@ module GraphQL
259
264
  end
260
265
 
261
266
  def build_definition_nodes
262
- dirs_to_build = warden.directives
267
+ dirs_to_build = @types.directives
263
268
  if !include_built_in_directives
264
269
  dirs_to_build = dirs_to_build.reject { |directive| directive.default_directive? }
265
270
  end
266
- dir_nodes = build_directive_nodes(dirs_to_build)
271
+ definitions = build_directive_nodes(dirs_to_build)
272
+ all_types = @types.all_types
273
+ type_nodes = build_type_definition_nodes(all_types)
274
+
275
+ if !(ex_t = schema.extra_types).empty?
276
+ dummy_query = Class.new(GraphQL::Schema::Object) do
277
+ graphql_name "DummyQuery"
278
+ (all_types + ex_t).each_with_index do |type, idx|
279
+ if !type.kind.input_object? && !type.introspection?
280
+ field "f#{idx}", type
281
+ end
282
+ end
283
+ end
284
+
285
+ extra_types_schema = Class.new(GraphQL::Schema) do
286
+ query(dummy_query)
287
+ end
288
+
289
+ extra_types_types = GraphQL::Query.new(extra_types_schema, "{ __typename }", context: @context).types # rubocop:disable Development/ContextIsPassedCop
290
+ # Temporarily replace `@types` with something from this example schema.
291
+ # It'd be much nicer to pass this in, but that would be a big refactor :S
292
+ prev_types = @types
293
+ @types = extra_types_types
294
+ type_nodes += build_type_definition_nodes(ex_t)
295
+ @types = prev_types
296
+ end
267
297
 
268
- type_nodes = build_type_definition_nodes(warden.reachable_types)
298
+ type_nodes.sort_by!(&:name)
269
299
 
270
300
  if @include_one_of
271
301
  # This may have been set to true when iterating over all types
272
- dir_nodes.concat(build_directive_nodes([GraphQL::Schema::Directive::OneOf]))
302
+ definitions.concat(build_directive_nodes([GraphQL::Schema::Directive::OneOf]))
273
303
  end
274
304
 
275
- definitions = [*dir_nodes, *type_nodes]
305
+ definitions.concat(type_nodes)
276
306
  if include_schema_node?
277
307
  definitions.unshift(build_schema_node)
278
308
  end
@@ -289,15 +319,13 @@ module GraphQL
289
319
  types = types.reject { |type| type.kind.scalar? && type.default_scalar? }
290
320
  end
291
321
 
292
- types
293
- .map { |type| build_type_definition_node(type) }
294
- .sort_by(&:name)
322
+ types.map { |type| build_type_definition_node(type) }
295
323
  end
296
324
 
297
325
  def build_field_nodes(fields)
298
- fields
299
- .map { |field| build_field_node(field) }
300
- .sort_by(&:name)
326
+ f_nodes = fields.map { |field| build_field_node(field) }
327
+ f_nodes.sort_by!(&:name)
328
+ f_nodes
301
329
  end
302
330
 
303
331
  private
@@ -319,10 +347,11 @@ module GraphQL
319
347
  end
320
348
 
321
349
  def definition_directives(member, directives_method)
322
- dirs = if !member.respond_to?(directives_method) || member.directives.empty?
323
- []
350
+ if !member.respond_to?(directives_method) || member.directives.empty?
351
+ EmptyObjects::EMPTY_ARRAY
324
352
  else
325
- member.public_send(directives_method).map do |dir|
353
+ visible_directives = member.public_send(directives_method).select { |dir| @types.directive_exists?(dir.graphql_name) }
354
+ visible_directives.map! do |dir|
326
355
  args = []
327
356
  dir.arguments.argument_values.each_value do |arg_value| # rubocop:disable Development/ContextIsPassedCop -- directive instance method
328
357
  arg_defn = arg_value.definition
@@ -346,12 +375,12 @@ module GraphQL
346
375
  arguments: args
347
376
  )
348
377
  end
349
- end
350
378
 
351
- dirs
379
+ visible_directives
380
+ end
352
381
  end
353
382
 
354
- attr_reader :schema, :warden, :always_include_schema,
383
+ attr_reader :schema, :always_include_schema,
355
384
  :include_introspection_types, :include_built_in_directives, :include_built_in_scalars
356
385
  end
357
386
  end