graphql_cody 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/lib/generators/graphql/core.rb +74 -0
  5. data/lib/generators/graphql/enum_generator.rb +33 -0
  6. data/lib/generators/graphql/install_generator.rb +190 -0
  7. data/lib/generators/graphql/interface_generator.rb +27 -0
  8. data/lib/generators/graphql/loader_generator.rb +21 -0
  9. data/lib/generators/graphql/mutation_generator.rb +55 -0
  10. data/lib/generators/graphql/object_generator.rb +79 -0
  11. data/lib/generators/graphql/relay.rb +63 -0
  12. data/lib/generators/graphql/relay_generator.rb +21 -0
  13. data/lib/generators/graphql/scalar_generator.rb +20 -0
  14. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  15. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  16. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  17. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  18. data/lib/generators/graphql/templates/base_field.erb +7 -0
  19. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  20. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  21. data/lib/generators/graphql/templates/base_mutation.erb +10 -0
  22. data/lib/generators/graphql/templates/base_object.erb +7 -0
  23. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  24. data/lib/generators/graphql/templates/base_union.erb +6 -0
  25. data/lib/generators/graphql/templates/enum.erb +7 -0
  26. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  27. data/lib/generators/graphql/templates/interface.erb +8 -0
  28. data/lib/generators/graphql/templates/loader.erb +19 -0
  29. data/lib/generators/graphql/templates/mutation.erb +16 -0
  30. data/lib/generators/graphql/templates/mutation_type.erb +12 -0
  31. data/lib/generators/graphql/templates/node_type.erb +9 -0
  32. data/lib/generators/graphql/templates/object.erb +8 -0
  33. data/lib/generators/graphql/templates/query_type.erb +15 -0
  34. data/lib/generators/graphql/templates/scalar.erb +15 -0
  35. data/lib/generators/graphql/templates/schema.erb +27 -0
  36. data/lib/generators/graphql/templates/union.erb +7 -0
  37. data/lib/generators/graphql/type_generator.rb +98 -0
  38. data/lib/generators/graphql/union_generator.rb +33 -0
  39. data/lib/graphql/analysis/analyze_query.rb +98 -0
  40. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  41. data/lib/graphql/analysis/ast/field_usage.rb +51 -0
  42. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  43. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  44. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  45. data/lib/graphql/analysis/ast/query_depth.rb +56 -0
  46. data/lib/graphql/analysis/ast/visitor.rb +268 -0
  47. data/lib/graphql/analysis/ast.rb +91 -0
  48. data/lib/graphql/analysis/field_usage.rb +45 -0
  49. data/lib/graphql/analysis/max_query_complexity.rb +26 -0
  50. data/lib/graphql/analysis/max_query_depth.rb +26 -0
  51. data/lib/graphql/analysis/query_complexity.rb +88 -0
  52. data/lib/graphql/analysis/query_depth.rb +43 -0
  53. data/lib/graphql/analysis/reducer_state.rb +48 -0
  54. data/lib/graphql/analysis.rb +9 -0
  55. data/lib/graphql/analysis_error.rb +5 -0
  56. data/lib/graphql/argument.rb +131 -0
  57. data/lib/graphql/authorization.rb +82 -0
  58. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  59. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  60. data/lib/graphql/backtrace/table.rb +159 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +81 -0
  63. data/lib/graphql/backtrace.rb +64 -0
  64. data/lib/graphql/backwards_compatibility.rb +61 -0
  65. data/lib/graphql/base_type.rb +230 -0
  66. data/lib/graphql/boolean_type.rb +2 -0
  67. data/lib/graphql/coercion_error.rb +13 -0
  68. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +53 -0
  69. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +200 -0
  70. data/lib/graphql/compatibility/execution_specification.rb +436 -0
  71. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +111 -0
  72. data/lib/graphql/compatibility/lazy_execution_specification.rb +215 -0
  73. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +87 -0
  74. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +79 -0
  75. data/lib/graphql/compatibility/query_parser_specification.rb +266 -0
  76. data/lib/graphql/compatibility/schema_parser_specification.rb +682 -0
  77. data/lib/graphql/compatibility.rb +5 -0
  78. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  79. data/lib/graphql/dataloader/request.rb +19 -0
  80. data/lib/graphql/dataloader/request_all.rb +19 -0
  81. data/lib/graphql/dataloader/source.rb +155 -0
  82. data/lib/graphql/dataloader.rb +308 -0
  83. data/lib/graphql/define/assign_argument.rb +12 -0
  84. data/lib/graphql/define/assign_connection.rb +13 -0
  85. data/lib/graphql/define/assign_enum_value.rb +18 -0
  86. data/lib/graphql/define/assign_global_id_field.rb +11 -0
  87. data/lib/graphql/define/assign_mutation_function.rb +34 -0
  88. data/lib/graphql/define/assign_object_field.rb +42 -0
  89. data/lib/graphql/define/defined_object_proxy.rb +53 -0
  90. data/lib/graphql/define/instance_definable.rb +240 -0
  91. data/lib/graphql/define/no_definition_error.rb +7 -0
  92. data/lib/graphql/define/non_null_with_bang.rb +16 -0
  93. data/lib/graphql/define/type_definer.rb +31 -0
  94. data/lib/graphql/define.rb +31 -0
  95. data/lib/graphql/deprecated_dsl.rb +55 -0
  96. data/lib/graphql/deprecation.rb +9 -0
  97. data/lib/graphql/dig.rb +19 -0
  98. data/lib/graphql/directive/deprecated_directive.rb +2 -0
  99. data/lib/graphql/directive/include_directive.rb +2 -0
  100. data/lib/graphql/directive/skip_directive.rb +2 -0
  101. data/lib/graphql/directive.rb +107 -0
  102. data/lib/graphql/enum_type.rb +133 -0
  103. data/lib/graphql/execution/directive_checks.rb +37 -0
  104. data/lib/graphql/execution/errors.rb +163 -0
  105. data/lib/graphql/execution/execute.rb +333 -0
  106. data/lib/graphql/execution/flatten.rb +40 -0
  107. data/lib/graphql/execution/instrumentation.rb +92 -0
  108. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  109. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  110. data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
  111. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  112. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  113. data/lib/graphql/execution/interpreter/resolve.rb +70 -0
  114. data/lib/graphql/execution/interpreter/runtime.rb +949 -0
  115. data/lib/graphql/execution/interpreter.rb +122 -0
  116. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  117. data/lib/graphql/execution/lazy/resolve.rb +91 -0
  118. data/lib/graphql/execution/lazy.rb +83 -0
  119. data/lib/graphql/execution/lookahead.rb +307 -0
  120. data/lib/graphql/execution/multiplex.rb +214 -0
  121. data/lib/graphql/execution/typecast.rb +50 -0
  122. data/lib/graphql/execution.rb +11 -0
  123. data/lib/graphql/execution_error.rb +58 -0
  124. data/lib/graphql/field/resolve.rb +59 -0
  125. data/lib/graphql/field.rb +226 -0
  126. data/lib/graphql/filter.rb +53 -0
  127. data/lib/graphql/float_type.rb +2 -0
  128. data/lib/graphql/function.rb +128 -0
  129. data/lib/graphql/id_type.rb +2 -0
  130. data/lib/graphql/input_object_type.rb +138 -0
  131. data/lib/graphql/int_type.rb +2 -0
  132. data/lib/graphql/integer_decoding_error.rb +17 -0
  133. data/lib/graphql/integer_encoding_error.rb +36 -0
  134. data/lib/graphql/interface_type.rb +72 -0
  135. data/lib/graphql/internal_representation/document.rb +27 -0
  136. data/lib/graphql/internal_representation/node.rb +206 -0
  137. data/lib/graphql/internal_representation/print.rb +51 -0
  138. data/lib/graphql/internal_representation/rewrite.rb +184 -0
  139. data/lib/graphql/internal_representation/scope.rb +88 -0
  140. data/lib/graphql/internal_representation/visit.rb +36 -0
  141. data/lib/graphql/internal_representation.rb +7 -0
  142. data/lib/graphql/introspection/base_object.rb +13 -0
  143. data/lib/graphql/introspection/directive_location_enum.rb +15 -0
  144. data/lib/graphql/introspection/directive_type.rb +29 -0
  145. data/lib/graphql/introspection/dynamic_fields.rb +17 -0
  146. data/lib/graphql/introspection/entry_points.rb +35 -0
  147. data/lib/graphql/introspection/enum_value_type.rb +23 -0
  148. data/lib/graphql/introspection/field_type.rb +28 -0
  149. data/lib/graphql/introspection/input_value_type.rb +67 -0
  150. data/lib/graphql/introspection/introspection_query.rb +7 -0
  151. data/lib/graphql/introspection/schema_type.rb +44 -0
  152. data/lib/graphql/introspection/type_kind_enum.rb +13 -0
  153. data/lib/graphql/introspection/type_type.rb +95 -0
  154. data/lib/graphql/introspection.rb +114 -0
  155. data/lib/graphql/invalid_name_error.rb +11 -0
  156. data/lib/graphql/invalid_null_error.rb +50 -0
  157. data/lib/graphql/language/block_string.rb +99 -0
  158. data/lib/graphql/language/cache.rb +37 -0
  159. data/lib/graphql/language/definition_slice.rb +41 -0
  160. data/lib/graphql/language/document_from_schema_definition.rb +347 -0
  161. data/lib/graphql/language/generation.rb +24 -0
  162. data/lib/graphql/language/lexer.rb +1467 -0
  163. data/lib/graphql/language/lexer.rl +258 -0
  164. data/lib/graphql/language/nodes.rb +707 -0
  165. data/lib/graphql/language/parser.rb +1974 -0
  166. data/lib/graphql/language/parser.y +544 -0
  167. data/lib/graphql/language/printer.rb +366 -0
  168. data/lib/graphql/language/sanitized_printer.rb +222 -0
  169. data/lib/graphql/language/token.rb +34 -0
  170. data/lib/graphql/language/visitor.rb +242 -0
  171. data/lib/graphql/language.rb +36 -0
  172. data/lib/graphql/list_type.rb +80 -0
  173. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  174. data/lib/graphql/name_validator.rb +11 -0
  175. data/lib/graphql/non_null_type.rb +71 -0
  176. data/lib/graphql/object_type.rb +130 -0
  177. data/lib/graphql/pagination/active_record_relation_connection.rb +48 -0
  178. data/lib/graphql/pagination/array_connection.rb +77 -0
  179. data/lib/graphql/pagination/connection.rb +226 -0
  180. data/lib/graphql/pagination/connections.rb +160 -0
  181. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  182. data/lib/graphql/pagination/relation_connection.rb +196 -0
  183. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  184. data/lib/graphql/pagination.rb +6 -0
  185. data/lib/graphql/parse_error.rb +24 -0
  186. data/lib/graphql/query/arguments.rb +189 -0
  187. data/lib/graphql/query/arguments_cache.rb +24 -0
  188. data/lib/graphql/query/context.rb +371 -0
  189. data/lib/graphql/query/executor.rb +52 -0
  190. data/lib/graphql/query/fingerprint.rb +26 -0
  191. data/lib/graphql/query/input_validation_result.rb +43 -0
  192. data/lib/graphql/query/literal_input.rb +136 -0
  193. data/lib/graphql/query/null_context.rb +55 -0
  194. data/lib/graphql/query/result.rb +63 -0
  195. data/lib/graphql/query/serial_execution/field_resolution.rb +92 -0
  196. data/lib/graphql/query/serial_execution/operation_resolution.rb +19 -0
  197. data/lib/graphql/query/serial_execution/selection_resolution.rb +23 -0
  198. data/lib/graphql/query/serial_execution/value_resolution.rb +87 -0
  199. data/lib/graphql/query/serial_execution.rb +40 -0
  200. data/lib/graphql/query/validation_pipeline.rb +139 -0
  201. data/lib/graphql/query/variable_validation_error.rb +44 -0
  202. data/lib/graphql/query/variables.rb +78 -0
  203. data/lib/graphql/query.rb +454 -0
  204. data/lib/graphql/railtie.rb +117 -0
  205. data/lib/graphql/rake_task/validate.rb +63 -0
  206. data/lib/graphql/rake_task.rb +145 -0
  207. data/lib/graphql/relay/array_connection.rb +83 -0
  208. data/lib/graphql/relay/base_connection.rb +189 -0
  209. data/lib/graphql/relay/connection_instrumentation.rb +54 -0
  210. data/lib/graphql/relay/connection_resolve.rb +43 -0
  211. data/lib/graphql/relay/connection_type.rb +41 -0
  212. data/lib/graphql/relay/edge.rb +27 -0
  213. data/lib/graphql/relay/edge_type.rb +19 -0
  214. data/lib/graphql/relay/edges_instrumentation.rb +39 -0
  215. data/lib/graphql/relay/global_id_resolve.rb +18 -0
  216. data/lib/graphql/relay/mongo_relation_connection.rb +50 -0
  217. data/lib/graphql/relay/mutation/instrumentation.rb +23 -0
  218. data/lib/graphql/relay/mutation/resolve.rb +56 -0
  219. data/lib/graphql/relay/mutation/result.rb +38 -0
  220. data/lib/graphql/relay/mutation.rb +106 -0
  221. data/lib/graphql/relay/node.rb +39 -0
  222. data/lib/graphql/relay/page_info.rb +7 -0
  223. data/lib/graphql/relay/range_add.rb +59 -0
  224. data/lib/graphql/relay/relation_connection.rb +188 -0
  225. data/lib/graphql/relay/type_extensions.rb +32 -0
  226. data/lib/graphql/relay.rb +18 -0
  227. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  228. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  229. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  230. data/lib/graphql/rubocop.rb +4 -0
  231. data/lib/graphql/runtime_type_error.rb +5 -0
  232. data/lib/graphql/scalar_type.rb +91 -0
  233. data/lib/graphql/schema/addition.rb +247 -0
  234. data/lib/graphql/schema/argument.rb +383 -0
  235. data/lib/graphql/schema/base_64_bp.rb +26 -0
  236. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  237. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  238. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  239. data/lib/graphql/schema/build_from_definition.rb +477 -0
  240. data/lib/graphql/schema/built_in_types.rb +12 -0
  241. data/lib/graphql/schema/catchall_middleware.rb +35 -0
  242. data/lib/graphql/schema/default_parse_error.rb +10 -0
  243. data/lib/graphql/schema/default_type_error.rb +17 -0
  244. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  245. data/lib/graphql/schema/directive/feature.rb +66 -0
  246. data/lib/graphql/schema/directive/flagged.rb +57 -0
  247. data/lib/graphql/schema/directive/include.rb +25 -0
  248. data/lib/graphql/schema/directive/skip.rb +25 -0
  249. data/lib/graphql/schema/directive/transform.rb +60 -0
  250. data/lib/graphql/schema/directive.rb +210 -0
  251. data/lib/graphql/schema/enum.rb +193 -0
  252. data/lib/graphql/schema/enum_value.rb +97 -0
  253. data/lib/graphql/schema/field/connection_extension.rb +76 -0
  254. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  255. data/lib/graphql/schema/field.rb +880 -0
  256. data/lib/graphql/schema/field_extension.rb +69 -0
  257. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  258. data/lib/graphql/schema/finder.rb +155 -0
  259. data/lib/graphql/schema/input_object.rb +253 -0
  260. data/lib/graphql/schema/interface.rb +136 -0
  261. data/lib/graphql/schema/introspection_system.rb +169 -0
  262. data/lib/graphql/schema/invalid_type_error.rb +7 -0
  263. data/lib/graphql/schema/late_bound_type.rb +33 -0
  264. data/lib/graphql/schema/list.rb +75 -0
  265. data/lib/graphql/schema/loader.rb +226 -0
  266. data/lib/graphql/schema/member/accepts_definition.rb +159 -0
  267. data/lib/graphql/schema/member/base_dsl_methods.rb +129 -0
  268. data/lib/graphql/schema/member/build_type.rb +180 -0
  269. data/lib/graphql/schema/member/cached_graphql_definition.rb +31 -0
  270. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  271. data/lib/graphql/schema/member/has_arguments.rb +332 -0
  272. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  273. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  274. data/lib/graphql/schema/member/has_directives.rb +98 -0
  275. data/lib/graphql/schema/member/has_fields.rb +163 -0
  276. data/lib/graphql/schema/member/has_interfaces.rb +90 -0
  277. data/lib/graphql/schema/member/has_path.rb +25 -0
  278. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  279. data/lib/graphql/schema/member/has_validators.rb +31 -0
  280. data/lib/graphql/schema/member/instrumentation.rb +131 -0
  281. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
  282. data/lib/graphql/schema/member/scoped.rb +21 -0
  283. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  284. data/lib/graphql/schema/member/validates_input.rb +33 -0
  285. data/lib/graphql/schema/member.rb +161 -0
  286. data/lib/graphql/schema/middleware_chain.rb +82 -0
  287. data/lib/graphql/schema/mutation.rb +94 -0
  288. data/lib/graphql/schema/non_null.rb +67 -0
  289. data/lib/graphql/schema/null_mask.rb +11 -0
  290. data/lib/graphql/schema/object.rb +150 -0
  291. data/lib/graphql/schema/possible_types.rb +44 -0
  292. data/lib/graphql/schema/printer.rb +100 -0
  293. data/lib/graphql/schema/relay_classic_mutation.rb +160 -0
  294. data/lib/graphql/schema/rescue_middleware.rb +60 -0
  295. data/lib/graphql/schema/resolver/has_payload_type.rb +96 -0
  296. data/lib/graphql/schema/resolver.rb +397 -0
  297. data/lib/graphql/schema/scalar.rb +69 -0
  298. data/lib/graphql/schema/subscription.rb +155 -0
  299. data/lib/graphql/schema/timeout.rb +123 -0
  300. data/lib/graphql/schema/timeout_middleware.rb +88 -0
  301. data/lib/graphql/schema/traversal.rb +228 -0
  302. data/lib/graphql/schema/type_expression.rb +43 -0
  303. data/lib/graphql/schema/type_membership.rb +48 -0
  304. data/lib/graphql/schema/union.rb +95 -0
  305. data/lib/graphql/schema/unique_within_type.rb +34 -0
  306. data/lib/graphql/schema/validation.rb +313 -0
  307. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  308. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  309. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  310. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  311. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  312. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  313. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  314. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  315. data/lib/graphql/schema/validator.rb +174 -0
  316. data/lib/graphql/schema/warden.rb +409 -0
  317. data/lib/graphql/schema/wrapper.rb +29 -0
  318. data/lib/graphql/schema.rb +1945 -0
  319. data/lib/graphql/static_validation/all_rules.rb +40 -0
  320. data/lib/graphql/static_validation/base_visitor.rb +217 -0
  321. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  322. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  323. data/lib/graphql/static_validation/error.rb +46 -0
  324. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  325. data/lib/graphql/static_validation/literal_validator.rb +139 -0
  326. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  327. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +66 -0
  328. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  329. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  330. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  331. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +71 -0
  332. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  333. data/lib/graphql/static_validation/rules/directives_are_defined.rb +23 -0
  334. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  335. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +65 -0
  336. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  337. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +30 -0
  338. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  339. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +73 -0
  340. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  341. data/lib/graphql/static_validation/rules/fields_will_merge.rb +418 -0
  342. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  343. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  344. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  345. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +73 -0
  346. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  347. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +39 -0
  348. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  349. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +21 -0
  350. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  351. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  352. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  353. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +37 -0
  354. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  355. data/lib/graphql/static_validation/rules/fragments_are_used.rb +32 -0
  356. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  357. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  358. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  359. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  360. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  361. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  362. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  363. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  364. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  365. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +37 -0
  366. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  367. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  368. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  369. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  370. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  371. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +50 -0
  372. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  373. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +46 -0
  374. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  375. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  376. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  377. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +153 -0
  378. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  379. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +39 -0
  380. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  381. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +155 -0
  382. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  383. data/lib/graphql/static_validation/type_stack.rb +216 -0
  384. data/lib/graphql/static_validation/validation_context.rb +49 -0
  385. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  386. data/lib/graphql/static_validation/validator.rb +96 -0
  387. data/lib/graphql/static_validation.rb +19 -0
  388. data/lib/graphql/string_encoding_error.rb +20 -0
  389. data/lib/graphql/string_type.rb +2 -0
  390. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +245 -0
  391. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  392. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  393. data/lib/graphql/subscriptions/event.rb +144 -0
  394. data/lib/graphql/subscriptions/instrumentation.rb +79 -0
  395. data/lib/graphql/subscriptions/serialize.rb +138 -0
  396. data/lib/graphql/subscriptions/subscription_root.rb +76 -0
  397. data/lib/graphql/subscriptions.rb +299 -0
  398. data/lib/graphql/tracing/active_support_notifications_tracing.rb +35 -0
  399. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  400. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  401. data/lib/graphql/tracing/data_dog_tracing.rb +76 -0
  402. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  403. data/lib/graphql/tracing/platform_tracing.rb +139 -0
  404. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  405. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  406. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  407. data/lib/graphql/tracing/skylight_tracing.rb +70 -0
  408. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  409. data/lib/graphql/tracing.rb +95 -0
  410. data/lib/graphql/type_kinds.rb +77 -0
  411. data/lib/graphql/types/big_int.rb +23 -0
  412. data/lib/graphql/types/boolean.rb +18 -0
  413. data/lib/graphql/types/float.rb +19 -0
  414. data/lib/graphql/types/id.rb +24 -0
  415. data/lib/graphql/types/int.rb +36 -0
  416. data/lib/graphql/types/iso_8601_date.rb +34 -0
  417. data/lib/graphql/types/iso_8601_date_time.rb +65 -0
  418. data/lib/graphql/types/json.rb +25 -0
  419. data/lib/graphql/types/relay/base_connection.rb +39 -0
  420. data/lib/graphql/types/relay/base_edge.rb +29 -0
  421. data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
  422. data/lib/graphql/types/relay/default_relay.rb +27 -0
  423. data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
  424. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  425. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  426. data/lib/graphql/types/relay/node.rb +15 -0
  427. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  428. data/lib/graphql/types/relay/node_field.rb +25 -0
  429. data/lib/graphql/types/relay/nodes_field.rb +27 -0
  430. data/lib/graphql/types/relay/page_info.rb +11 -0
  431. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  432. data/lib/graphql/types/relay.rb +41 -0
  433. data/lib/graphql/types/string.rb +29 -0
  434. data/lib/graphql/types.rb +11 -0
  435. data/lib/graphql/unauthorized_error.rb +29 -0
  436. data/lib/graphql/unauthorized_field_error.rb +23 -0
  437. data/lib/graphql/union_type.rb +115 -0
  438. data/lib/graphql/unresolved_type_error.rb +35 -0
  439. data/lib/graphql/upgrader/member.rb +937 -0
  440. data/lib/graphql/upgrader/schema.rb +38 -0
  441. data/lib/graphql/version.rb +4 -0
  442. data/lib/graphql.rb +168 -0
  443. data/readme.md +49 -0
  444. metadata +714 -0
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ # While visiting an AST, build a normalized, flattened tree of {InternalRepresentation::Node}s.
5
+ #
6
+ # No unions or interfaces are present in this tree, only object types.
7
+ #
8
+ # Selections from the AST are attached to the object types they apply to.
9
+ #
10
+ # Inline fragments and fragment spreads are preserved in {InternalRepresentation::Node#ast_spreads},
11
+ # where they can be used to check for the presence of directives. This might not be sufficient
12
+ # for future directives, since the selections' grouping is lost.
13
+ #
14
+ # The rewritten query tree serves as the basis for the `FieldsWillMerge` validation.
15
+ #
16
+ module Rewrite
17
+ include GraphQL::Language
18
+
19
+ NO_DIRECTIVES = [].freeze
20
+
21
+ # @return InternalRepresentation::Document
22
+ attr_reader :rewrite_document
23
+
24
+ def initialize(*)
25
+ super
26
+ @query = context.query
27
+ @rewrite_document = InternalRepresentation::Document.new
28
+ # Hash<Nodes::FragmentSpread => Set<InternalRepresentation::Node>>
29
+ # A record of fragment spreads and the irep nodes that used them
30
+ @rewrite_spread_parents = Hash.new { |h, k| h[k] = Set.new }
31
+ # Hash<Nodes::FragmentSpread => Scope>
32
+ @rewrite_spread_scopes = {}
33
+ # Array<Set<InternalRepresentation::Node>>
34
+ # The current point of the irep_tree during visitation
35
+ @rewrite_nodes_stack = []
36
+ # Array<Scope>
37
+ @rewrite_scopes_stack = []
38
+ @rewrite_skip_nodes = Set.new
39
+
40
+ # Resolve fragment spreads.
41
+ # Fragment definitions got their own irep trees during visitation.
42
+ # Those nodes are spliced in verbatim (not copied), but this is OK
43
+ # because fragments are resolved from the "bottom up", each fragment
44
+ # can be shared between its usages.
45
+ context.on_dependency_resolve do |defn_ast_node, spread_ast_nodes, frag_ast_node|
46
+ frag_name = frag_ast_node.name
47
+ fragment_node = @rewrite_document.fragment_definitions[frag_name]
48
+
49
+ if fragment_node
50
+ spread_ast_nodes.each do |spread_ast_node|
51
+ parent_nodes = @rewrite_spread_parents[spread_ast_node]
52
+ parent_scope = @rewrite_spread_scopes[spread_ast_node]
53
+ parent_nodes.each do |parent_node|
54
+ parent_node.deep_merge_node(fragment_node, scope: parent_scope, merge_self: false)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ # @return [Hash<String, Node>] Roots of this query
62
+ def operations
63
+ GraphQL::Deprecation.warn "#{self.class}#operations is deprecated; use `document.operation_definitions` instead"
64
+ @document.operation_definitions
65
+ end
66
+
67
+ def on_operation_definition(ast_node, parent)
68
+ push_root_node(ast_node, @rewrite_document.operation_definitions) { super }
69
+ end
70
+
71
+ def on_fragment_definition(ast_node, parent)
72
+ push_root_node(ast_node, @rewrite_document.fragment_definitions) { super }
73
+ end
74
+
75
+ def push_root_node(ast_node, definitions)
76
+ # Either QueryType or the fragment type condition
77
+ owner_type = context.type_definition
78
+ defn_name = ast_node.name
79
+
80
+ node = Node.new(
81
+ parent: nil,
82
+ name: defn_name,
83
+ owner_type: owner_type,
84
+ query: @query,
85
+ ast_nodes: [ast_node],
86
+ return_type: owner_type,
87
+ )
88
+
89
+ definitions[defn_name] = node
90
+ @rewrite_scopes_stack.push(Scope.new(@query, owner_type))
91
+ @rewrite_nodes_stack.push([node])
92
+ yield
93
+ @rewrite_nodes_stack.pop
94
+ @rewrite_scopes_stack.pop
95
+ end
96
+
97
+ def on_inline_fragment(node, parent)
98
+ # Inline fragments provide two things to the rewritten tree:
99
+ # - They _may_ narrow the scope by their type condition
100
+ # - They _may_ apply their directives to their children
101
+ if skip?(node)
102
+ @rewrite_skip_nodes.add(node)
103
+ end
104
+
105
+ if @rewrite_skip_nodes.empty?
106
+ @rewrite_scopes_stack.push(@rewrite_scopes_stack.last.enter(context.type_definition))
107
+ end
108
+
109
+ super
110
+
111
+ if @rewrite_skip_nodes.empty?
112
+ @rewrite_scopes_stack.pop
113
+ end
114
+
115
+ if @rewrite_skip_nodes.include?(node)
116
+ @rewrite_skip_nodes.delete(node)
117
+ end
118
+ end
119
+
120
+ def on_field(ast_node, ast_parent)
121
+ if skip?(ast_node)
122
+ @rewrite_skip_nodes.add(ast_node)
123
+ end
124
+
125
+ if @rewrite_skip_nodes.empty?
126
+ node_name = ast_node.alias || ast_node.name
127
+ parent_nodes = @rewrite_nodes_stack.last
128
+ next_nodes = []
129
+
130
+ field_defn = context.field_definition
131
+ if field_defn.nil?
132
+ # It's a non-existent field
133
+ new_scope = nil
134
+ else
135
+ field_return_type = field_defn.type
136
+ @rewrite_scopes_stack.last.each do |scope_type|
137
+ parent_nodes.each do |parent_node|
138
+ node = parent_node.scoped_children[scope_type][node_name] ||= Node.new(
139
+ parent: parent_node,
140
+ name: node_name,
141
+ owner_type: scope_type,
142
+ query: @query,
143
+ return_type: field_return_type,
144
+ )
145
+ node.ast_nodes << ast_node
146
+ node.definitions << field_defn
147
+ next_nodes << node
148
+ end
149
+ end
150
+ new_scope = Scope.new(@query, field_return_type.unwrap)
151
+ end
152
+
153
+ @rewrite_nodes_stack.push(next_nodes)
154
+ @rewrite_scopes_stack.push(new_scope)
155
+ end
156
+
157
+ super
158
+
159
+ if @rewrite_skip_nodes.empty?
160
+ @rewrite_nodes_stack.pop
161
+ @rewrite_scopes_stack.pop
162
+ end
163
+
164
+ if @rewrite_skip_nodes.include?(ast_node)
165
+ @rewrite_skip_nodes.delete(ast_node)
166
+ end
167
+ end
168
+
169
+ def on_fragment_spread(ast_node, ast_parent)
170
+ if @rewrite_skip_nodes.empty? && !skip?(ast_node)
171
+ # Register the irep nodes that depend on this AST node:
172
+ @rewrite_spread_parents[ast_node].merge(@rewrite_nodes_stack.last)
173
+ @rewrite_spread_scopes[ast_node] = @rewrite_scopes_stack.last
174
+ end
175
+ super
176
+ end
177
+
178
+ def skip?(ast_node)
179
+ dir = ast_node.directives
180
+ dir.any? && !GraphQL::Execution::DirectiveChecks.include?(dir, @query)
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ # At a point in the AST, selections may apply to one or more types.
5
+ # {Scope} represents those types which selections may apply to.
6
+ #
7
+ # Scopes can be defined by:
8
+ #
9
+ # - A single concrete or abstract type
10
+ # - An array of types
11
+ # - `nil`
12
+ #
13
+ # The AST may be scoped to an array of types when two abstractly-typed
14
+ # fragments occur in inside one another.
15
+ class Scope
16
+ NO_TYPES = [].freeze
17
+
18
+ # @param query [GraphQL::Query]
19
+ # @param type_defn [GraphQL::BaseType, Array<GraphQL::BaseType>, nil]
20
+ def initialize(query, type_defn)
21
+ @query = query
22
+ @type = type_defn
23
+ @abstract_type = false
24
+ @types = case type_defn
25
+ when Array
26
+ type_defn
27
+ when GraphQL::BaseType
28
+ @abstract_type = true
29
+ nil
30
+ when nil
31
+ NO_TYPES
32
+ else
33
+ raise "Unexpected scope type: #{type_defn}"
34
+ end
35
+ end
36
+
37
+ # From a starting point of `self`, create a new scope by condition `other_type_defn`.
38
+ # @param other_type_defn [GraphQL::BaseType, nil]
39
+ # @return [Scope]
40
+ def enter(other_type_defn)
41
+ case other_type_defn
42
+ when nil
43
+ # The type wasn't found, who cares
44
+ Scope.new(@query, nil)
45
+ when @type
46
+ # The condition is the same as current, so reuse self
47
+ self
48
+ when GraphQL::UnionType, GraphQL::InterfaceType
49
+ # Make a new scope of the intersection between the previous & next conditions
50
+ new_types = @query.possible_types(other_type_defn) & concrete_types
51
+ Scope.new(@query, new_types)
52
+ when GraphQL::BaseType
53
+ # If this type is valid within the current scope,
54
+ # return a new scope of _exactly_ this type.
55
+ # Otherwise, this type is out-of-scope so the scope is null.
56
+ if concrete_types.include?(other_type_defn)
57
+ Scope.new(@query, other_type_defn)
58
+ else
59
+ Scope.new(@query, nil)
60
+ end
61
+ else
62
+ raise "Unexpected scope: #{other_type_defn.inspect}"
63
+ end
64
+ end
65
+
66
+ # Call the block for each type in `self`.
67
+ # This uses the simplest possible expression of `self`,
68
+ # so if this scope is defined by an abstract type, it gets yielded.
69
+ def each(&block)
70
+ if @abstract_type
71
+ yield(@type)
72
+ else
73
+ @types.each(&block)
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def concrete_types
80
+ @concrete_types ||= if @abstract_type
81
+ @query.possible_types(@type)
82
+ else
83
+ @types
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ # Traverse a re-written query tree, calling handlers for each node
5
+ module Visit
6
+ module_function
7
+ def visit_each_node(operations, handlers)
8
+ return if handlers.empty?
9
+ # Post-validation: make some assertions about the rewritten query tree
10
+ operations.each do |op_name, op_node|
11
+ # Yield each node to listeners which were attached by validators
12
+ op_node.typed_children.each do |obj_type, children|
13
+ children.each do |name, op_child_node|
14
+ each_node(op_child_node) do |node|
15
+ for h in handlers
16
+ h.call(node)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ # Traverse a node in a rewritten query tree,
25
+ # visiting the node itself and each of its typed children.
26
+ def each_node(node, &block)
27
+ yield(node)
28
+ node.typed_children.each do |obj_type, children|
29
+ children.each do |name, node|
30
+ each_node(node, &block)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/internal_representation/document"
3
+ require "graphql/internal_representation/node"
4
+ require "graphql/internal_representation/print"
5
+ require "graphql/internal_representation/rewrite"
6
+ require "graphql/internal_representation/scope"
7
+ require "graphql/internal_representation/visit"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class BaseObject < GraphQL::Schema::Object
5
+ introspection(true)
6
+
7
+ def self.field(*args, **kwargs, &block)
8
+ kwargs[:introspection] = true
9
+ super(*args, **kwargs, &block)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class DirectiveLocationEnum < GraphQL::Schema::Enum
5
+ graphql_name "__DirectiveLocation"
6
+ description "A Directive can be adjacent to many parts of the GraphQL language, "\
7
+ "a __DirectiveLocation describes one such possible adjacencies."
8
+
9
+ GraphQL::Directive::LOCATIONS.each do |location|
10
+ value(location.to_s, GraphQL::Directive::LOCATION_DESCRIPTIONS[location], value: location)
11
+ end
12
+ introspection true
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class DirectiveType < Introspection::BaseObject
5
+ graphql_name "__Directive"
6
+ description "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document."\
7
+ "\n\n"\
8
+ "In some cases, you need to provide options to alter GraphQL's execution behavior "\
9
+ "in ways field arguments will not suffice, such as conditionally including or "\
10
+ "skipping a field. Directives provide this by describing additional information "\
11
+ "to the executor."
12
+ field :name, String, null: false, method: :graphql_name
13
+ field :description, String
14
+ field :locations, [GraphQL::Schema::LateBoundType.new("__DirectiveLocation")], null: false
15
+ field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false do
16
+ argument :include_deprecated, Boolean, required: false, default_value: false
17
+ end
18
+ field :on_operation, Boolean, null: false, deprecation_reason: "Use `locations`.", method: :on_operation?
19
+ field :on_fragment, Boolean, null: false, deprecation_reason: "Use `locations`.", method: :on_fragment?
20
+ field :on_field, Boolean, null: false, deprecation_reason: "Use `locations`.", method: :on_field?
21
+
22
+ def args(include_deprecated:)
23
+ args = @context.warden.arguments(@object)
24
+ args = args.reject(&:deprecation_reason) unless include_deprecated
25
+ args
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class DynamicFields < Introspection::BaseObject
5
+ field :__typename, String, "The name of this type", null: false, extras: [:irep_node]
6
+
7
+ # `irep_node:` will be nil for the interpreter, since there is no such thing
8
+ def __typename(irep_node: nil)
9
+ if context.interpreter?
10
+ object.class.graphql_name
11
+ else
12
+ irep_node.owner_type.name
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class EntryPoints < Introspection::BaseObject
5
+ field :__schema, GraphQL::Schema::LateBoundType.new("__Schema"), "This GraphQL schema", null: false
6
+ field :__type, GraphQL::Schema::LateBoundType.new("__Type"), "A type in the GraphQL system" do
7
+ argument :name, String
8
+ end
9
+
10
+ def __schema
11
+ # Apply wrapping manually since this field isn't wrapped by instrumentation
12
+ schema = @context.query.schema
13
+ schema_type = schema.introspection_system.types["__Schema"]
14
+ schema_type.type_class.authorized_new(schema, @context)
15
+ end
16
+
17
+ def __type(name:)
18
+ return unless context.warden.reachable_type?(name)
19
+ type = context.warden.get_type(name)
20
+
21
+ if type && context.interpreter? && !type.is_a?(Module)
22
+ type = type.type_class || raise("Invariant: interpreter requires class-based type for #{name}")
23
+ end
24
+
25
+ # The interpreter provides this wrapping, other execution doesnt, so support both.
26
+ if type && !context.interpreter?
27
+ # Apply wrapping manually since this field isn't wrapped by instrumentation
28
+ type_type = context.schema.introspection_system.types["__Type"]
29
+ type = type_type.type_class.authorized_new(type, context)
30
+ end
31
+ type
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class EnumValueType < Introspection::BaseObject
5
+ graphql_name "__EnumValue"
6
+ description "One possible value for a given Enum. Enum values are unique values, not a "\
7
+ "placeholder for a string or numeric value. However an Enum value is returned in "\
8
+ "a JSON response as a string."
9
+ field :name, String, null: false
10
+ field :description, String
11
+ field :is_deprecated, Boolean, null: false
12
+ field :deprecation_reason, String
13
+
14
+ def name
15
+ object.graphql_name
16
+ end
17
+
18
+ def is_deprecated
19
+ !!@object.deprecation_reason
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class FieldType < Introspection::BaseObject
5
+ graphql_name "__Field"
6
+ description "Object and Interface types are described by a list of Fields, each of which has "\
7
+ "a name, potentially a list of arguments, and a return type."
8
+ field :name, String, null: false
9
+ field :description, String
10
+ field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false do
11
+ argument :include_deprecated, Boolean, required: false, default_value: false
12
+ end
13
+ field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
14
+ field :is_deprecated, Boolean, null: false
15
+ field :deprecation_reason, String
16
+
17
+ def is_deprecated
18
+ !!@object.deprecation_reason
19
+ end
20
+
21
+ def args(include_deprecated:)
22
+ args = @context.warden.arguments(@object)
23
+ args = args.reject(&:deprecation_reason) unless include_deprecated
24
+ args
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class InputValueType < Introspection::BaseObject
5
+ graphql_name "__InputValue"
6
+ description "Arguments provided to Fields or Directives and the input fields of an "\
7
+ "InputObject are represented as Input Values which describe their type and "\
8
+ "optionally a default value."
9
+ field :name, String, null: false
10
+ field :description, String
11
+ field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
12
+ field :default_value, String, "A GraphQL-formatted string representing the default value for this input value."
13
+ field :is_deprecated, Boolean, null: false
14
+ field :deprecation_reason, String
15
+
16
+ def is_deprecated
17
+ !!@object.deprecation_reason
18
+ end
19
+
20
+ def default_value
21
+ if @object.default_value?
22
+ value = @object.default_value
23
+ if value.nil?
24
+ 'null'
25
+ else
26
+ if (@object.type.kind.list? || (@object.type.kind.non_null? && @object.type.of_type.kind.list?)) && !value.respond_to?(:map)
27
+ # This is a bit odd -- we expect the default value to be an application-style value, so we use coerce result below.
28
+ # But coerce_result doesn't wrap single-item lists, which are valid inputs to list types.
29
+ # So, apply that wrapper here if needed.
30
+ value = [value]
31
+ end
32
+ coerced_default_value = @object.type.coerce_result(value, @context)
33
+ serialize_default_value(coerced_default_value, @object.type)
34
+ end
35
+ else
36
+ nil
37
+ end
38
+ end
39
+
40
+
41
+ private
42
+
43
+ # Recursively serialize, taking care not to add quotes to enum values
44
+ def serialize_default_value(value, type)
45
+ if value.nil?
46
+ 'null'
47
+ elsif type.kind.list?
48
+ inner_type = type.of_type
49
+ "[" + value.map { |v| serialize_default_value(v, inner_type) }.join(", ") + "]"
50
+ elsif type.kind.non_null?
51
+ serialize_default_value(value, type.of_type)
52
+ elsif type.kind.enum?
53
+ value
54
+ elsif type.kind.input_object?
55
+ "{" +
56
+ value.map do |k, v|
57
+ arg_defn = type.get_argument(k, context)
58
+ "#{k}: #{serialize_default_value(v, arg_defn.type)}"
59
+ end.join(", ") +
60
+ "}"
61
+ else
62
+ GraphQL::Language.serialize(value)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This query is used by graphql-client so don't add the includeDeprecated
4
+ # argument for inputFields since the server may not support it. Two stage
5
+ # introspection queries will be required to handle this in clients.
6
+ GraphQL::Introspection::INTROSPECTION_QUERY = GraphQL::Introspection.query
7
+
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Introspection
5
+ class SchemaType < Introspection::BaseObject
6
+ graphql_name "__Schema"
7
+ description "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all "\
8
+ "available types and directives on the server, as well as the entry points for "\
9
+ "query, mutation, and subscription operations."
10
+
11
+ field :types, [GraphQL::Schema::LateBoundType.new("__Type")], "A list of all types supported by this server.", null: false
12
+ field :query_type, GraphQL::Schema::LateBoundType.new("__Type"), "The type that query operations will be rooted at.", null: false
13
+ field :mutation_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server supports mutation, the type that mutation operations will be rooted at."
14
+ field :subscription_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server support subscription, the type that subscription operations will be rooted at."
15
+ field :directives, [GraphQL::Schema::LateBoundType.new("__Directive")], "A list of all directives supported by this server.", null: false
16
+
17
+ def types
18
+ @context.warden.reachable_types.sort_by(&:graphql_name)
19
+ end
20
+
21
+ def query_type
22
+ permitted_root_type("query")
23
+ end
24
+
25
+ def mutation_type
26
+ permitted_root_type("mutation")
27
+ end
28
+
29
+ def subscription_type
30
+ permitted_root_type("subscription")
31
+ end
32
+
33
+ def directives
34
+ @context.warden.directives
35
+ end
36
+
37
+ private
38
+
39
+ def permitted_root_type(op_type)
40
+ @context.warden.root_type_for_operation(op_type)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Introspection
4
+ class TypeKindEnum < GraphQL::Schema::Enum
5
+ graphql_name "__TypeKind"
6
+ description "An enum describing what kind of type a given `__Type` is."
7
+ GraphQL::TypeKinds::TYPE_KINDS.each do |type_kind|
8
+ value(type_kind.name, type_kind.description)
9
+ end
10
+ introspection true
11
+ end
12
+ end
13
+ end