graphql 1.9.21 → 2.0.16

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 (403) 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 +17 -8
  53. data/lib/graphql/analysis/ast.rb +14 -14
  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/traced_error.rb +0 -1
  58. data/lib/graphql/backtrace/tracer.rb +39 -9
  59. data/lib/graphql/backtrace.rb +20 -17
  60. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  61. data/lib/graphql/dataloader/request.rb +19 -0
  62. data/lib/graphql/dataloader/request_all.rb +19 -0
  63. data/lib/graphql/dataloader/source.rb +164 -0
  64. data/lib/graphql/dataloader.rb +311 -0
  65. data/lib/graphql/date_encoding_error.rb +16 -0
  66. data/lib/graphql/deprecation.rb +9 -0
  67. data/lib/graphql/dig.rb +1 -1
  68. data/lib/graphql/execution/directive_checks.rb +2 -2
  69. data/lib/graphql/execution/errors.rb +77 -45
  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 +105 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +44 -25
  75. data/lib/graphql/execution/interpreter/runtime.rb +755 -395
  76. data/lib/graphql/execution/interpreter.rb +201 -74
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +5 -9
  79. data/lib/graphql/execution/lookahead.rb +65 -136
  80. data/lib/graphql/execution/multiplex.rb +5 -152
  81. data/lib/graphql/execution.rb +11 -4
  82. data/lib/graphql/filter.rb +1 -1
  83. data/lib/graphql/integer_decoding_error.rb +17 -0
  84. data/lib/graphql/integer_encoding_error.rb +18 -2
  85. data/lib/graphql/introspection/base_object.rb +2 -5
  86. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  87. data/lib/graphql/introspection/directive_type.rb +11 -5
  88. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  89. data/lib/graphql/introspection/entry_points.rb +5 -18
  90. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  91. data/lib/graphql/introspection/field_type.rb +9 -5
  92. data/lib/graphql/introspection/input_value_type.rb +41 -11
  93. data/lib/graphql/introspection/introspection_query.rb +6 -92
  94. data/lib/graphql/introspection/schema_type.rb +10 -10
  95. data/lib/graphql/introspection/type_type.rb +34 -17
  96. data/lib/graphql/introspection.rb +100 -0
  97. data/lib/graphql/invalid_null_error.rb +18 -0
  98. data/lib/graphql/language/block_string.rb +20 -5
  99. data/lib/graphql/language/cache.rb +37 -0
  100. data/lib/graphql/language/definition_slice.rb +21 -10
  101. data/lib/graphql/language/document_from_schema_definition.rb +104 -68
  102. data/lib/graphql/language/lexer.rb +83 -40
  103. data/lib/graphql/language/lexer.rl +31 -9
  104. data/lib/graphql/language/nodes.rb +64 -93
  105. data/lib/graphql/language/parser.rb +940 -896
  106. data/lib/graphql/language/parser.y +130 -103
  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 +2 -2
  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 +85 -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 +172 -198
  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 +21 -8
  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 +74 -38
  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 +286 -31
  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 +334 -220
  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 +117 -14
  154. data/lib/graphql/schema/enum.rb +113 -22
  155. data/lib/graphql/schema/enum_value.rb +16 -21
  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 +491 -329
  159. data/lib/graphql/schema/field_extension.rb +89 -2
  160. data/lib/graphql/schema/find_inherited_value.rb +17 -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 +28 -43
  164. data/lib/graphql/schema/introspection_system.rb +101 -38
  165. data/lib/graphql/schema/late_bound_type.rb +7 -2
  166. data/lib/graphql/schema/list.rb +61 -3
  167. data/lib/graphql/schema/loader.rb +144 -102
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
  169. data/lib/graphql/schema/member/build_type.rb +24 -15
  170. data/lib/graphql/schema/member/has_arguments.rb +261 -24
  171. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  173. data/lib/graphql/schema/member/has_directives.rb +113 -0
  174. data/lib/graphql/schema/member/has_fields.rb +99 -34
  175. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  177. data/lib/graphql/schema/member/has_validators.rb +31 -0
  178. data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
  179. data/lib/graphql/schema/member/type_system_helpers.rb +3 -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 +38 -60
  185. data/lib/graphql/schema/printer.rb +16 -35
  186. data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
  187. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -6
  188. data/lib/graphql/schema/resolver.rb +146 -93
  189. data/lib/graphql/schema/scalar.rb +40 -15
  190. data/lib/graphql/schema/subscription.rb +55 -26
  191. data/lib/graphql/schema/timeout.rb +29 -15
  192. data/lib/graphql/schema/type_expression.rb +21 -13
  193. data/lib/graphql/schema/type_membership.rb +22 -5
  194. data/lib/graphql/schema/union.rb +48 -14
  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 +187 -33
  206. data/lib/graphql/schema/wrapper.rb +0 -5
  207. data/lib/graphql/schema.rb +773 -892
  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 +55 -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 +5 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  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 +31 -19
  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 +85 -31
  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_tracing.rb +8 -17
  252. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  253. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  254. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  255. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  256. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  257. data/lib/graphql/tracing/platform_tracing.rb +67 -38
  258. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  259. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  260. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  261. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  262. data/lib/graphql/tracing.rb +15 -36
  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 -90
  268. data/lib/graphql/types/relay/base_edge.rb +2 -34
  269. data/lib/graphql/types/relay/connection_behaviors.rb +158 -0
  270. data/lib/graphql/types/relay/default_relay.rb +27 -0
  271. data/lib/graphql/types/relay/edge_behaviors.rb +65 -0
  272. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  273. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  274. data/lib/graphql/types/relay/node.rb +2 -4
  275. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  276. data/lib/graphql/types/relay/page_info.rb +2 -14
  277. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  278. data/lib/graphql/types/relay.rb +11 -5
  279. data/lib/graphql/types/string.rb +8 -2
  280. data/lib/graphql/unauthorized_error.rb +2 -2
  281. data/lib/graphql/unresolved_type_error.rb +2 -2
  282. data/lib/graphql/version.rb +1 -1
  283. data/lib/graphql.rb +41 -58
  284. data/readme.md +3 -6
  285. metadata +103 -237
  286. data/lib/graphql/analysis/analyze_query.rb +0 -91
  287. data/lib/graphql/analysis/field_usage.rb +0 -45
  288. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  289. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  290. data/lib/graphql/analysis/query_complexity.rb +0 -88
  291. data/lib/graphql/analysis/query_depth.rb +0 -43
  292. data/lib/graphql/analysis/reducer_state.rb +0 -48
  293. data/lib/graphql/argument.rb +0 -159
  294. data/lib/graphql/authorization.rb +0 -82
  295. data/lib/graphql/backwards_compatibility.rb +0 -60
  296. data/lib/graphql/base_type.rb +0 -226
  297. data/lib/graphql/boolean_type.rb +0 -2
  298. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  299. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  300. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  301. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  302. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  303. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  304. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  305. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  306. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  307. data/lib/graphql/compatibility.rb +0 -5
  308. data/lib/graphql/define/assign_argument.rb +0 -12
  309. data/lib/graphql/define/assign_connection.rb +0 -13
  310. data/lib/graphql/define/assign_enum_value.rb +0 -18
  311. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  312. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  313. data/lib/graphql/define/assign_object_field.rb +0 -42
  314. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  315. data/lib/graphql/define/instance_definable.rb +0 -311
  316. data/lib/graphql/define/no_definition_error.rb +0 -7
  317. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  318. data/lib/graphql/define/type_definer.rb +0 -31
  319. data/lib/graphql/define.rb +0 -31
  320. data/lib/graphql/deprecated_dsl.rb +0 -42
  321. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  322. data/lib/graphql/directive/include_directive.rb +0 -2
  323. data/lib/graphql/directive/skip_directive.rb +0 -2
  324. data/lib/graphql/directive.rb +0 -104
  325. data/lib/graphql/enum_type.rb +0 -193
  326. data/lib/graphql/execution/execute.rb +0 -326
  327. data/lib/graphql/execution/flatten.rb +0 -40
  328. data/lib/graphql/execution/instrumentation.rb +0 -92
  329. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  330. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  331. data/lib/graphql/execution/typecast.rb +0 -50
  332. data/lib/graphql/field/resolve.rb +0 -59
  333. data/lib/graphql/field.rb +0 -330
  334. data/lib/graphql/float_type.rb +0 -2
  335. data/lib/graphql/function.rb +0 -153
  336. data/lib/graphql/id_type.rb +0 -2
  337. data/lib/graphql/input_object_type.rb +0 -154
  338. data/lib/graphql/int_type.rb +0 -2
  339. data/lib/graphql/interface_type.rb +0 -86
  340. data/lib/graphql/internal_representation/document.rb +0 -27
  341. data/lib/graphql/internal_representation/node.rb +0 -206
  342. data/lib/graphql/internal_representation/print.rb +0 -51
  343. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  344. data/lib/graphql/internal_representation/scope.rb +0 -88
  345. data/lib/graphql/internal_representation/visit.rb +0 -36
  346. data/lib/graphql/internal_representation.rb +0 -7
  347. data/lib/graphql/list_type.rb +0 -80
  348. data/lib/graphql/literal_validation_error.rb +0 -6
  349. data/lib/graphql/non_null_type.rb +0 -81
  350. data/lib/graphql/object_type.rb +0 -141
  351. data/lib/graphql/query/arguments.rb +0 -187
  352. data/lib/graphql/query/arguments_cache.rb +0 -25
  353. data/lib/graphql/query/executor.rb +0 -53
  354. data/lib/graphql/query/literal_input.rb +0 -116
  355. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  356. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  357. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  358. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  359. data/lib/graphql/query/serial_execution.rb +0 -39
  360. data/lib/graphql/relay/array_connection.rb +0 -85
  361. data/lib/graphql/relay/base_connection.rb +0 -172
  362. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  363. data/lib/graphql/relay/connection_resolve.rb +0 -43
  364. data/lib/graphql/relay/connection_type.rb +0 -40
  365. data/lib/graphql/relay/edge.rb +0 -27
  366. data/lib/graphql/relay/edge_type.rb +0 -18
  367. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  368. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  369. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  370. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  371. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  372. data/lib/graphql/relay/mutation/result.rb +0 -38
  373. data/lib/graphql/relay/mutation.rb +0 -190
  374. data/lib/graphql/relay/node.rb +0 -36
  375. data/lib/graphql/relay/page_info.rb +0 -7
  376. data/lib/graphql/relay/relation_connection.rb +0 -190
  377. data/lib/graphql/relay/type_extensions.rb +0 -30
  378. data/lib/graphql/scalar_type.rb +0 -133
  379. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  380. data/lib/graphql/schema/default_parse_error.rb +0 -10
  381. data/lib/graphql/schema/default_type_error.rb +0 -15
  382. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  383. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  384. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  385. data/lib/graphql/schema/middleware_chain.rb +0 -82
  386. data/lib/graphql/schema/possible_types.rb +0 -39
  387. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  388. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  389. data/lib/graphql/schema/traversal.rb +0 -228
  390. data/lib/graphql/schema/validation.rb +0 -303
  391. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  392. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  393. data/lib/graphql/string_type.rb +0 -2
  394. data/lib/graphql/subscriptions/subscription_root.rb +0 -74
  395. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  396. data/lib/graphql/types/relay/base_field.rb +0 -22
  397. data/lib/graphql/types/relay/base_interface.rb +0 -29
  398. data/lib/graphql/types/relay/base_object.rb +0 -26
  399. data/lib/graphql/types/relay/node_field.rb +0 -43
  400. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  401. data/lib/graphql/union_type.rb +0 -135
  402. data/lib/graphql/upgrader/member.rb +0 -936
  403. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -12,21 +12,36 @@ module GraphQL
12
12
  "possible at runtime. List and NonNull types compose other types."
13
13
 
14
14
  field :kind, GraphQL::Schema::LateBoundType.new("__TypeKind"), null: false
15
- field :name, String, null: true
16
- field :description, String, null: true
17
- field :fields, [GraphQL::Schema::LateBoundType.new("__Field")], null: true do
15
+ field :name, String, method: :graphql_name
16
+ field :description, String
17
+ field :fields, [GraphQL::Schema::LateBoundType.new("__Field")] do
18
18
  argument :include_deprecated, Boolean, required: false, default_value: false
19
19
  end
20
- field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")], null: true
21
- field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")], null: true
22
- field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")], null: true do
20
+ field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")]
21
+ field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")]
22
+ field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")] do
23
23
  argument :include_deprecated, Boolean, required: false, default_value: false
24
24
  end
25
- field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: true
26
- field :of_type, GraphQL::Schema::LateBoundType.new("__Type"), null: true
25
+ field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")] do
26
+ argument :include_deprecated, Boolean, required: false, default_value: false
27
+ end
28
+ field :of_type, GraphQL::Schema::LateBoundType.new("__Type")
29
+
30
+ field :specifiedByURL, String, resolver_method: :specified_by_url
27
31
 
28
- def name
29
- object.graphql_name
32
+ field :is_one_of, Boolean, null: false
33
+
34
+ def is_one_of
35
+ object.kind.input_object? &&
36
+ object.directives.any? { |d| d.graphql_name == "oneOf" }
37
+ end
38
+
39
+ def specified_by_url
40
+ if object.kind.scalar?
41
+ object.specified_by_url
42
+ else
43
+ nil
44
+ end
30
45
  end
31
46
 
32
47
  def kind
@@ -37,7 +52,7 @@ module GraphQL
37
52
  if !@object.kind.enum?
38
53
  nil
39
54
  else
40
- enum_values = @context.warden.enum_values(@object.graphql_definition)
55
+ enum_values = @context.warden.enum_values(@object)
41
56
 
42
57
  if !include_deprecated
43
58
  enum_values = enum_values.select {|f| !f.deprecation_reason }
@@ -48,16 +63,18 @@ module GraphQL
48
63
  end
49
64
 
50
65
  def interfaces
51
- if @object.kind == GraphQL::TypeKinds::OBJECT
52
- @context.warden.interfaces(@object.graphql_definition)
66
+ if @object.kind.object? || @object.kind.interface?
67
+ @context.warden.interfaces(@object).sort_by(&:graphql_name)
53
68
  else
54
69
  nil
55
70
  end
56
71
  end
57
72
 
58
- def input_fields
73
+ def input_fields(include_deprecated:)
59
74
  if @object.kind.input_object?
60
- @context.warden.arguments(@object.graphql_definition)
75
+ args = @context.warden.arguments(@object)
76
+ args = args.reject(&:deprecation_reason) unless include_deprecated
77
+ args
61
78
  else
62
79
  nil
63
80
  end
@@ -65,7 +82,7 @@ module GraphQL
65
82
 
66
83
  def possible_types
67
84
  if @object.kind.abstract?
68
- @context.warden.possible_types(@object.graphql_definition)
85
+ @context.warden.possible_types(@object).sort_by(&:graphql_name)
69
86
  else
70
87
  nil
71
88
  end
@@ -75,7 +92,7 @@ module GraphQL
75
92
  if !@object.kind.fields?
76
93
  nil
77
94
  else
78
- fields = @context.warden.fields(@object.graphql_definition)
95
+ fields = @context.warden.fields(@object)
79
96
  if !include_deprecated
80
97
  fields = fields.select {|f| !f.deprecation_reason }
81
98
  end
@@ -1,6 +1,106 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
3
  module Introspection
4
+ def self.query(include_deprecated_args: false, include_schema_description: false, include_is_repeatable: false, include_specified_by_url: false, include_is_one_of: false)
5
+ # The introspection query to end all introspection queries, copied from
6
+ # https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js
7
+ <<-QUERY.gsub(/\n{2,}/, "\n")
8
+ query IntrospectionQuery {
9
+ __schema {
10
+ #{include_schema_description ? "description" : ""}
11
+ queryType { name }
12
+ mutationType { name }
13
+ subscriptionType { name }
14
+ types {
15
+ ...FullType
16
+ }
17
+ directives {
18
+ name
19
+ description
20
+ locations
21
+ #{include_is_repeatable ? "isRepeatable" : ""}
22
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
23
+ ...InputValue
24
+ }
25
+ }
26
+ }
27
+ }
28
+ fragment FullType on __Type {
29
+ kind
30
+ name
31
+ description
32
+ #{include_specified_by_url ? "specifiedByURL" : ""}
33
+ #{include_is_one_of ? "isOneOf" : ""}
34
+ fields(includeDeprecated: true) {
35
+ name
36
+ description
37
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
38
+ ...InputValue
39
+ }
40
+ type {
41
+ ...TypeRef
42
+ }
43
+ isDeprecated
44
+ deprecationReason
45
+ }
46
+ inputFields#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
47
+ ...InputValue
48
+ }
49
+ interfaces {
50
+ ...TypeRef
51
+ }
52
+ enumValues(includeDeprecated: true) {
53
+ name
54
+ description
55
+ isDeprecated
56
+ deprecationReason
57
+ }
58
+ possibleTypes {
59
+ ...TypeRef
60
+ }
61
+ }
62
+ fragment InputValue on __InputValue {
63
+ name
64
+ description
65
+ type { ...TypeRef }
66
+ defaultValue
67
+ #{include_deprecated_args ? 'isDeprecated' : ''}
68
+ #{include_deprecated_args ? 'deprecationReason' : ''}
69
+ }
70
+ fragment TypeRef on __Type {
71
+ kind
72
+ name
73
+ ofType {
74
+ kind
75
+ name
76
+ ofType {
77
+ kind
78
+ name
79
+ ofType {
80
+ kind
81
+ name
82
+ ofType {
83
+ kind
84
+ name
85
+ ofType {
86
+ kind
87
+ name
88
+ ofType {
89
+ kind
90
+ name
91
+ ofType {
92
+ kind
93
+ name
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+ QUERY
103
+ end
4
104
  end
5
105
  end
6
106
 
@@ -28,5 +28,23 @@ module GraphQL
28
28
  def parent_error?
29
29
  false
30
30
  end
31
+
32
+ class << self
33
+ attr_accessor :parent_class
34
+
35
+ def subclass_for(parent_class)
36
+ subclass = Class.new(self)
37
+ subclass.parent_class = parent_class
38
+ subclass
39
+ end
40
+
41
+ def inspect
42
+ if (name.nil? || parent_class.name.nil?) && parent_class.respond_to?(:mutation) && (mutation = parent_class.mutation)
43
+ "#{mutation.inspect}::#{parent_class.graphql_name}::InvalidNullError"
44
+ else
45
+ super
46
+ end
47
+ end
48
+ end
31
49
  end
32
50
  end
@@ -5,7 +5,14 @@ module GraphQL
5
5
  # Remove leading and trailing whitespace from a block string.
6
6
  # See "Block Strings" in https://github.com/facebook/graphql/blob/master/spec/Section%202%20--%20Language.md
7
7
  def self.trim_whitespace(str)
8
- lines = str.split("\n")
8
+ # Early return for the most common cases:
9
+ if str == ""
10
+ return "".dup
11
+ elsif !(has_newline = str.include?("\n")) && !(str.start_with?(" "))
12
+ return str
13
+ end
14
+
15
+ lines = has_newline ? str.split("\n") : [str]
9
16
  common_indent = nil
10
17
 
11
18
  # find the common whitespace
@@ -14,19 +21,27 @@ module GraphQL
14
21
  next
15
22
  end
16
23
  line_length = line.size
17
- line_indent = line[/\A */].size
24
+ line_indent = if line.match?(/\A [^ ]/)
25
+ 2
26
+ elsif line.match?(/\A [^ ]/)
27
+ 4
28
+ elsif line.match?(/\A[^ ]/)
29
+ 0
30
+ else
31
+ line[/\A */].size
32
+ end
18
33
  if line_indent < line_length && (common_indent.nil? || line_indent < common_indent)
19
34
  common_indent = line_indent
20
35
  end
21
36
  end
22
37
 
23
38
  # Remove the common whitespace
24
- if common_indent
39
+ if common_indent && common_indent > 0
25
40
  lines.each_with_index do |line, idx|
26
41
  if idx == 0
27
42
  next
28
43
  else
29
- line[0, common_indent] = ""
44
+ line.slice!(0, common_indent)
30
45
  end
31
46
  end
32
47
  end
@@ -40,7 +55,7 @@ module GraphQL
40
55
  end
41
56
 
42
57
  # Rebuild the string
43
- lines.join("\n")
58
+ lines.size > 1 ? lines.join("\n") : (lines.first || "".dup)
44
59
  end
45
60
 
46
61
  def self.print(str, indent: '')
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql/version'
4
+ require 'digest/sha2'
5
+
6
+ module GraphQL
7
+ module Language
8
+ class Cache
9
+ def initialize(path)
10
+ @path = path
11
+ end
12
+
13
+ DIGEST = Digest::SHA256.new << GraphQL::VERSION
14
+ def fetch(filename)
15
+ hash = DIGEST.dup << filename
16
+ begin
17
+ hash << File.mtime(filename).to_i.to_s
18
+ rescue SystemCallError
19
+ return yield
20
+ end
21
+ cache_path = @path.join(hash.to_s)
22
+
23
+ if cache_path.exist?
24
+ Marshal.load(cache_path.read)
25
+ else
26
+ payload = yield
27
+ tmp_path = "#{cache_path}.#{rand}"
28
+
29
+ @path.mkpath
30
+ File.binwrite(tmp_path, Marshal.dump(payload))
31
+ File.rename(tmp_path, cache_path.to_s)
32
+ payload
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -7,23 +7,34 @@ module GraphQL
7
7
  def slice(document, name)
8
8
  definitions = {}
9
9
  document.definitions.each { |d| definitions[d.name] = d }
10
- names = find_definition_dependencies(definitions, name)
10
+ names = Set.new
11
+ DependencyVisitor.find_definition_dependencies(definitions, name, names)
11
12
  definitions = document.definitions.select { |d| names.include?(d.name) }
12
13
  Nodes::Document.new(definitions: definitions)
13
14
  end
14
15
 
15
16
  private
16
17
 
17
- def find_definition_dependencies(definitions, name)
18
- names = Set.new([name])
19
- visitor = Visitor.new(definitions[name])
20
- visitor[Nodes::FragmentSpread] << ->(node, parent) {
21
- if fragment = definitions[node.name]
22
- names.merge(find_definition_dependencies(definitions, fragment.name))
18
+ class DependencyVisitor < GraphQL::Language::Visitor
19
+ def initialize(doc, definitions, names)
20
+ @names = names
21
+ @definitions = definitions
22
+ super(doc)
23
+ end
24
+
25
+ def on_fragment_spread(node, parent)
26
+ if fragment = @definitions[node.name]
27
+ self.class.find_definition_dependencies(@definitions, fragment.name, @names)
23
28
  end
24
- }
25
- visitor.visit
26
- names
29
+ super
30
+ end
31
+
32
+ def self.find_definition_dependencies(definitions, name, names)
33
+ names.add(name)
34
+ visitor = self.new(definitions[name], definitions, names)
35
+ visitor.visit
36
+ nil
37
+ end
27
38
  end
28
39
  end
29
40
  end
@@ -34,6 +34,7 @@ module GraphQL
34
34
  schema: @schema,
35
35
  context: schema_context,
36
36
  )
37
+ schema_context.warden = @warden
37
38
  end
38
39
 
39
40
  def document
@@ -43,89 +44,83 @@ module GraphQL
43
44
  end
44
45
 
45
46
  def build_schema_node
46
- GraphQL::Language::Nodes::SchemaDefinition.new(
47
- query: warden.root_type_for_operation("query"),
48
- mutation: warden.root_type_for_operation("mutation"),
49
- subscription: warden.root_type_for_operation("subscription"),
50
- # This only supports directives from parsing,
51
- # use a custom printer to add to this list.
52
- directives: @schema.ast_node ? @schema.ast_node.directives : [],
53
- )
47
+ schema_options = {
48
+ # `@schema.directives` is covered by `build_definition_nodes`
49
+ directives: definition_directives(@schema, :schema_directives),
50
+ }
51
+ if !schema_respects_root_name_conventions?(@schema)
52
+ schema_options.merge!({
53
+ query: (q = warden.root_type_for_operation("query")) && q.graphql_name,
54
+ mutation: (m = warden.root_type_for_operation("mutation")) && m.graphql_name,
55
+ subscription: (s = warden.root_type_for_operation("subscription")) && s.graphql_name,
56
+ })
57
+ end
58
+ GraphQL::Language::Nodes::SchemaDefinition.new(schema_options)
54
59
  end
55
60
 
56
61
  def build_object_type_node(object_type)
57
62
  GraphQL::Language::Nodes::ObjectTypeDefinition.new(
58
- name: object_type.name,
59
- interfaces: warden.interfaces(object_type).sort_by(&:name).map { |iface| build_type_name_node(iface) },
63
+ name: object_type.graphql_name,
64
+ interfaces: warden.interfaces(object_type).sort_by(&:graphql_name).map { |iface| build_type_name_node(iface) },
60
65
  fields: build_field_nodes(warden.fields(object_type)),
61
66
  description: object_type.description,
67
+ directives: directives(object_type),
62
68
  )
63
69
  end
64
70
 
65
71
  def build_field_node(field)
66
- field_node = GraphQL::Language::Nodes::FieldDefinition.new(
67
- name: field.name,
72
+ GraphQL::Language::Nodes::FieldDefinition.new(
73
+ name: field.graphql_name,
68
74
  arguments: build_argument_nodes(warden.arguments(field)),
69
75
  type: build_type_name_node(field.type),
70
76
  description: field.description,
77
+ directives: directives(field),
71
78
  )
72
-
73
- if field.deprecation_reason
74
- field_node = field_node.merge_directive(
75
- name: GraphQL::Directive::DeprecatedDirective.name,
76
- arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: field.deprecation_reason)]
77
- )
78
- end
79
-
80
- field_node
81
79
  end
82
80
 
83
81
  def build_union_type_node(union_type)
84
82
  GraphQL::Language::Nodes::UnionTypeDefinition.new(
85
- name: union_type.name,
83
+ name: union_type.graphql_name,
86
84
  description: union_type.description,
87
- types: warden.possible_types(union_type).sort_by(&:name).map { |type| build_type_name_node(type) }
85
+ types: warden.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
86
+ directives: directives(union_type),
88
87
  )
89
88
  end
90
89
 
91
90
  def build_interface_type_node(interface_type)
92
91
  GraphQL::Language::Nodes::InterfaceTypeDefinition.new(
93
- name: interface_type.name,
92
+ name: interface_type.graphql_name,
93
+ interfaces: warden.interfaces(interface_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
94
94
  description: interface_type.description,
95
- fields: build_field_nodes(warden.fields(interface_type))
95
+ fields: build_field_nodes(warden.fields(interface_type)),
96
+ directives: directives(interface_type),
96
97
  )
97
98
  end
98
99
 
99
100
  def build_enum_type_node(enum_type)
100
101
  GraphQL::Language::Nodes::EnumTypeDefinition.new(
101
- name: enum_type.name,
102
- values: warden.enum_values(enum_type).sort_by(&:name).map do |enum_value|
102
+ name: enum_type.graphql_name,
103
+ values: warden.enum_values(enum_type).sort_by(&:graphql_name).map do |enum_value|
103
104
  build_enum_value_node(enum_value)
104
105
  end,
105
106
  description: enum_type.description,
107
+ directives: directives(enum_type),
106
108
  )
107
109
  end
108
110
 
109
111
  def build_enum_value_node(enum_value)
110
- enum_value_node = GraphQL::Language::Nodes::EnumValueDefinition.new(
111
- name: enum_value.name,
112
+ GraphQL::Language::Nodes::EnumValueDefinition.new(
113
+ name: enum_value.graphql_name,
112
114
  description: enum_value.description,
115
+ directives: directives(enum_value),
113
116
  )
114
-
115
- if enum_value.deprecation_reason
116
- enum_value_node = enum_value_node.merge_directive(
117
- name: GraphQL::Directive::DeprecatedDirective.name,
118
- arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: enum_value.deprecation_reason)]
119
- )
120
- end
121
-
122
- enum_value_node
123
117
  end
124
118
 
125
119
  def build_scalar_type_node(scalar_type)
126
120
  GraphQL::Language::Nodes::ScalarTypeDefinition.new(
127
- name: scalar_type.name,
121
+ name: scalar_type.graphql_name,
128
122
  description: scalar_type.description,
123
+ directives: directives(scalar_type),
129
124
  )
130
125
  end
131
126
 
@@ -137,10 +132,11 @@ module GraphQL
137
132
  end
138
133
 
139
134
  argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
140
- name: argument.name,
135
+ name: argument.graphql_name,
141
136
  description: argument.description,
142
137
  type: build_type_name_node(argument.type),
143
138
  default_value: default_value,
139
+ directives: directives(argument),
144
140
  )
145
141
 
146
142
  argument_node
@@ -148,15 +144,17 @@ module GraphQL
148
144
 
149
145
  def build_input_object_node(input_object)
150
146
  GraphQL::Language::Nodes::InputObjectTypeDefinition.new(
151
- name: input_object.name,
147
+ name: input_object.graphql_name,
152
148
  fields: build_argument_nodes(warden.arguments(input_object)),
153
149
  description: input_object.description,
150
+ directives: directives(input_object),
154
151
  )
155
152
  end
156
153
 
157
154
  def build_directive_node(directive)
158
155
  GraphQL::Language::Nodes::DirectiveDefinition.new(
159
- name: directive.name,
156
+ name: directive.graphql_name,
157
+ repeatable: directive.repeatable?,
160
158
  arguments: build_argument_nodes(warden.arguments(directive)),
161
159
  locations: build_directive_location_nodes(directive.locations),
162
160
  description: directive.description,
@@ -164,7 +162,7 @@ module GraphQL
164
162
  end
165
163
 
166
164
  def build_directive_location_nodes(locations)
167
- locations.map { |location| build_directive_location_node(location) }
165
+ locations.sort.map { |location| build_directive_location_node(location) }
168
166
  end
169
167
 
170
168
  def build_directive_location_node(location)
@@ -174,17 +172,17 @@ module GraphQL
174
172
  end
175
173
 
176
174
  def build_type_name_node(type)
177
- case type
178
- when GraphQL::ListType
175
+ case type.kind.name
176
+ when "LIST"
179
177
  GraphQL::Language::Nodes::ListType.new(
180
178
  of_type: build_type_name_node(type.of_type)
181
179
  )
182
- when GraphQL::NonNullType
180
+ when "NON_NULL"
183
181
  GraphQL::Language::Nodes::NonNullType.new(
184
182
  of_type: build_type_name_node(type.of_type)
185
183
  )
186
184
  else
187
- GraphQL::Language::Nodes::TypeName.new(name: type.name)
185
+ GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
188
186
  end
189
187
  end
190
188
 
@@ -193,24 +191,28 @@ module GraphQL
193
191
  return GraphQL::Language::Nodes::NullValue.new(name: "null")
194
192
  end
195
193
 
196
- case type
197
- when GraphQL::ScalarType
194
+ case type.kind.name
195
+ when "SCALAR"
198
196
  type.coerce_isolated_result(default_value)
199
- when EnumType
197
+ when "ENUM"
200
198
  GraphQL::Language::Nodes::Enum.new(name: type.coerce_isolated_result(default_value))
201
- when InputObjectType
199
+ when "INPUT_OBJECT"
202
200
  GraphQL::Language::Nodes::InputObject.new(
203
201
  arguments: default_value.to_h.map do |arg_name, arg_value|
204
- arg_type = type.input_fields.fetch(arg_name.to_s).type
202
+ args = @warden.arguments(type)
203
+ arg = args.find { |a| a.keyword.to_s == arg_name.to_s }
204
+ if arg.nil?
205
+ raise ArgumentError, "No argument definition on #{type.graphql_name} for argument: #{arg_name.inspect} (expected one of: #{args.map(&:keyword)})"
206
+ end
205
207
  GraphQL::Language::Nodes::Argument.new(
206
- name: arg_name,
207
- value: build_default_value(arg_value, arg_type)
208
+ name: arg.graphql_name.to_s,
209
+ value: build_default_value(arg_value, arg.type)
208
210
  )
209
211
  end
210
212
  )
211
- when NonNullType
213
+ when "NON_NULL"
212
214
  build_default_value(default_value, type.of_type)
213
- when ListType
215
+ when "LIST"
214
216
  default_value.to_a.map { |v| build_default_value(v, type.of_type) }
215
217
  else
216
218
  raise GraphQL::RequiredImplementationMissingError, "Unexpected default value type #{type.inspect}"
@@ -218,18 +220,18 @@ module GraphQL
218
220
  end
219
221
 
220
222
  def build_type_definition_node(type)
221
- case type
222
- when GraphQL::ObjectType
223
+ case type.kind.name
224
+ when "OBJECT"
223
225
  build_object_type_node(type)
224
- when GraphQL::UnionType
226
+ when "UNION"
225
227
  build_union_type_node(type)
226
- when GraphQL::InterfaceType
228
+ when "INTERFACE"
227
229
  build_interface_type_node(type)
228
- when GraphQL::ScalarType
230
+ when "SCALAR"
229
231
  build_scalar_type_node(type)
230
- when GraphQL::EnumType
232
+ when "ENUM"
231
233
  build_enum_type_node(type)
232
- when GraphQL::InputObjectType
234
+ when "INPUT_OBJECT"
233
235
  build_input_object_node(type)
234
236
  else
235
237
  raise TypeError
@@ -266,7 +268,7 @@ module GraphQL
266
268
  end
267
269
 
268
270
  if !include_built_in_scalars
269
- types = types.reject { |type| type.default_scalar? }
271
+ types = types.reject { |type| type.kind.scalar? && type.default_scalar? }
270
272
  end
271
273
 
272
274
  types
@@ -283,13 +285,47 @@ module GraphQL
283
285
  private
284
286
 
285
287
  def include_schema_node?
286
- always_include_schema || !schema_respects_root_name_conventions?(schema)
288
+ always_include_schema ||
289
+ !schema_respects_root_name_conventions?(schema) ||
290
+ !schema.schema_directives.empty?
287
291
  end
288
292
 
289
293
  def schema_respects_root_name_conventions?(schema)
290
- (schema.query.nil? || schema.query.name == 'Query') &&
291
- (schema.mutation.nil? || schema.mutation.name == 'Mutation') &&
292
- (schema.subscription.nil? || schema.subscription.name == 'Subscription')
294
+ (schema.query.nil? || schema.query.graphql_name == 'Query') &&
295
+ (schema.mutation.nil? || schema.mutation.graphql_name == 'Mutation') &&
296
+ (schema.subscription.nil? || schema.subscription.graphql_name == 'Subscription')
297
+ end
298
+
299
+ def directives(member)
300
+ definition_directives(member, :directives)
301
+ end
302
+
303
+ def definition_directives(member, directives_method)
304
+ dirs = if !member.respond_to?(directives_method) || member.directives.empty?
305
+ []
306
+ else
307
+ member.public_send(directives_method).map do |dir|
308
+ args = []
309
+ dir.arguments.argument_values.each_value do |arg_value| # rubocop:disable Development/ContextIsPassedCop -- directive instance method
310
+ arg_defn = arg_value.definition
311
+ if arg_defn.default_value? && arg_value.value == arg_defn.default_value
312
+ next
313
+ else
314
+ value_node = build_default_value(arg_value.value, arg_value.definition.type)
315
+ args << GraphQL::Language::Nodes::Argument.new(
316
+ name: arg_value.definition.name,
317
+ value: value_node,
318
+ )
319
+ end
320
+ end
321
+ GraphQL::Language::Nodes::Directive.new(
322
+ name: dir.class.graphql_name,
323
+ arguments: args
324
+ )
325
+ end
326
+ end
327
+
328
+ dirs
293
329
  end
294
330
 
295
331
  attr_reader :schema, :warden, :always_include_schema,