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.
- checksums.yaml +7 -0
- data/.yardopts +5 -0
- data/MIT-LICENSE +20 -0
- data/lib/generators/graphql/core.rb +74 -0
- data/lib/generators/graphql/enum_generator.rb +33 -0
- data/lib/generators/graphql/install_generator.rb +190 -0
- data/lib/generators/graphql/interface_generator.rb +27 -0
- data/lib/generators/graphql/loader_generator.rb +21 -0
- data/lib/generators/graphql/mutation_generator.rb +55 -0
- data/lib/generators/graphql/object_generator.rb +79 -0
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +20 -0
- data/lib/generators/graphql/templates/base_argument.erb +6 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +6 -0
- data/lib/generators/graphql/templates/base_field.erb +7 -0
- data/lib/generators/graphql/templates/base_input_object.erb +7 -0
- data/lib/generators/graphql/templates/base_interface.erb +9 -0
- data/lib/generators/graphql/templates/base_mutation.erb +10 -0
- data/lib/generators/graphql/templates/base_object.erb +7 -0
- data/lib/generators/graphql/templates/base_scalar.erb +6 -0
- data/lib/generators/graphql/templates/base_union.erb +6 -0
- data/lib/generators/graphql/templates/enum.erb +7 -0
- data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
- data/lib/generators/graphql/templates/interface.erb +8 -0
- data/lib/generators/graphql/templates/loader.erb +19 -0
- data/lib/generators/graphql/templates/mutation.erb +16 -0
- data/lib/generators/graphql/templates/mutation_type.erb +12 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +8 -0
- data/lib/generators/graphql/templates/query_type.erb +15 -0
- data/lib/generators/graphql/templates/scalar.erb +15 -0
- data/lib/generators/graphql/templates/schema.erb +27 -0
- data/lib/generators/graphql/templates/union.erb +7 -0
- data/lib/generators/graphql/type_generator.rb +98 -0
- data/lib/generators/graphql/union_generator.rb +33 -0
- data/lib/graphql/analysis/analyze_query.rb +98 -0
- data/lib/graphql/analysis/ast/analyzer.rb +84 -0
- data/lib/graphql/analysis/ast/field_usage.rb +51 -0
- data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
- data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
- data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
- data/lib/graphql/analysis/ast/query_depth.rb +56 -0
- data/lib/graphql/analysis/ast/visitor.rb +268 -0
- data/lib/graphql/analysis/ast.rb +91 -0
- data/lib/graphql/analysis/field_usage.rb +45 -0
- data/lib/graphql/analysis/max_query_complexity.rb +26 -0
- data/lib/graphql/analysis/max_query_depth.rb +26 -0
- data/lib/graphql/analysis/query_complexity.rb +88 -0
- data/lib/graphql/analysis/query_depth.rb +43 -0
- data/lib/graphql/analysis/reducer_state.rb +48 -0
- data/lib/graphql/analysis.rb +9 -0
- data/lib/graphql/analysis_error.rb +5 -0
- data/lib/graphql/argument.rb +131 -0
- data/lib/graphql/authorization.rb +82 -0
- data/lib/graphql/backtrace/inspect_result.rb +50 -0
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +159 -0
- data/lib/graphql/backtrace/traced_error.rb +54 -0
- data/lib/graphql/backtrace/tracer.rb +81 -0
- data/lib/graphql/backtrace.rb +64 -0
- data/lib/graphql/backwards_compatibility.rb +61 -0
- data/lib/graphql/base_type.rb +230 -0
- data/lib/graphql/boolean_type.rb +2 -0
- data/lib/graphql/coercion_error.rb +13 -0
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +53 -0
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +200 -0
- data/lib/graphql/compatibility/execution_specification.rb +436 -0
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +111 -0
- data/lib/graphql/compatibility/lazy_execution_specification.rb +215 -0
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +87 -0
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +79 -0
- data/lib/graphql/compatibility/query_parser_specification.rb +266 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +682 -0
- data/lib/graphql/compatibility.rb +5 -0
- data/lib/graphql/dataloader/null_dataloader.rb +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/define/assign_argument.rb +12 -0
- data/lib/graphql/define/assign_connection.rb +13 -0
- data/lib/graphql/define/assign_enum_value.rb +18 -0
- data/lib/graphql/define/assign_global_id_field.rb +11 -0
- data/lib/graphql/define/assign_mutation_function.rb +34 -0
- data/lib/graphql/define/assign_object_field.rb +42 -0
- data/lib/graphql/define/defined_object_proxy.rb +53 -0
- data/lib/graphql/define/instance_definable.rb +240 -0
- data/lib/graphql/define/no_definition_error.rb +7 -0
- data/lib/graphql/define/non_null_with_bang.rb +16 -0
- data/lib/graphql/define/type_definer.rb +31 -0
- data/lib/graphql/define.rb +31 -0
- data/lib/graphql/deprecated_dsl.rb +55 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +19 -0
- data/lib/graphql/directive/deprecated_directive.rb +2 -0
- data/lib/graphql/directive/include_directive.rb +2 -0
- data/lib/graphql/directive/skip_directive.rb +2 -0
- data/lib/graphql/directive.rb +107 -0
- data/lib/graphql/enum_type.rb +133 -0
- data/lib/graphql/execution/directive_checks.rb +37 -0
- data/lib/graphql/execution/errors.rb +163 -0
- data/lib/graphql/execution/execute.rb +333 -0
- data/lib/graphql/execution/flatten.rb +40 -0
- data/lib/graphql/execution/instrumentation.rb +92 -0
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
- data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +70 -0
- data/lib/graphql/execution/interpreter/runtime.rb +949 -0
- data/lib/graphql/execution/interpreter.rb +122 -0
- data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
- data/lib/graphql/execution/lazy/resolve.rb +91 -0
- data/lib/graphql/execution/lazy.rb +83 -0
- data/lib/graphql/execution/lookahead.rb +307 -0
- data/lib/graphql/execution/multiplex.rb +214 -0
- data/lib/graphql/execution/typecast.rb +50 -0
- data/lib/graphql/execution.rb +11 -0
- data/lib/graphql/execution_error.rb +58 -0
- data/lib/graphql/field/resolve.rb +59 -0
- data/lib/graphql/field.rb +226 -0
- data/lib/graphql/filter.rb +53 -0
- data/lib/graphql/float_type.rb +2 -0
- data/lib/graphql/function.rb +128 -0
- data/lib/graphql/id_type.rb +2 -0
- data/lib/graphql/input_object_type.rb +138 -0
- data/lib/graphql/int_type.rb +2 -0
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +36 -0
- data/lib/graphql/interface_type.rb +72 -0
- data/lib/graphql/internal_representation/document.rb +27 -0
- data/lib/graphql/internal_representation/node.rb +206 -0
- data/lib/graphql/internal_representation/print.rb +51 -0
- data/lib/graphql/internal_representation/rewrite.rb +184 -0
- data/lib/graphql/internal_representation/scope.rb +88 -0
- data/lib/graphql/internal_representation/visit.rb +36 -0
- data/lib/graphql/internal_representation.rb +7 -0
- data/lib/graphql/introspection/base_object.rb +13 -0
- data/lib/graphql/introspection/directive_location_enum.rb +15 -0
- data/lib/graphql/introspection/directive_type.rb +29 -0
- data/lib/graphql/introspection/dynamic_fields.rb +17 -0
- data/lib/graphql/introspection/entry_points.rb +35 -0
- data/lib/graphql/introspection/enum_value_type.rb +23 -0
- data/lib/graphql/introspection/field_type.rb +28 -0
- data/lib/graphql/introspection/input_value_type.rb +67 -0
- data/lib/graphql/introspection/introspection_query.rb +7 -0
- data/lib/graphql/introspection/schema_type.rb +44 -0
- data/lib/graphql/introspection/type_kind_enum.rb +13 -0
- data/lib/graphql/introspection/type_type.rb +95 -0
- data/lib/graphql/introspection.rb +114 -0
- data/lib/graphql/invalid_name_error.rb +11 -0
- data/lib/graphql/invalid_null_error.rb +50 -0
- data/lib/graphql/language/block_string.rb +99 -0
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +41 -0
- data/lib/graphql/language/document_from_schema_definition.rb +347 -0
- data/lib/graphql/language/generation.rb +24 -0
- data/lib/graphql/language/lexer.rb +1467 -0
- data/lib/graphql/language/lexer.rl +258 -0
- data/lib/graphql/language/nodes.rb +707 -0
- data/lib/graphql/language/parser.rb +1974 -0
- data/lib/graphql/language/parser.y +544 -0
- data/lib/graphql/language/printer.rb +366 -0
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +34 -0
- data/lib/graphql/language/visitor.rb +242 -0
- data/lib/graphql/language.rb +36 -0
- data/lib/graphql/list_type.rb +80 -0
- data/lib/graphql/load_application_object_failed_error.rb +22 -0
- data/lib/graphql/name_validator.rb +11 -0
- data/lib/graphql/non_null_type.rb +71 -0
- data/lib/graphql/object_type.rb +130 -0
- data/lib/graphql/pagination/active_record_relation_connection.rb +48 -0
- data/lib/graphql/pagination/array_connection.rb +77 -0
- data/lib/graphql/pagination/connection.rb +226 -0
- data/lib/graphql/pagination/connections.rb +160 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +196 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +24 -0
- data/lib/graphql/query/arguments.rb +189 -0
- data/lib/graphql/query/arguments_cache.rb +24 -0
- data/lib/graphql/query/context.rb +371 -0
- data/lib/graphql/query/executor.rb +52 -0
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +43 -0
- data/lib/graphql/query/literal_input.rb +136 -0
- data/lib/graphql/query/null_context.rb +55 -0
- data/lib/graphql/query/result.rb +63 -0
- data/lib/graphql/query/serial_execution/field_resolution.rb +92 -0
- data/lib/graphql/query/serial_execution/operation_resolution.rb +19 -0
- data/lib/graphql/query/serial_execution/selection_resolution.rb +23 -0
- data/lib/graphql/query/serial_execution/value_resolution.rb +87 -0
- data/lib/graphql/query/serial_execution.rb +40 -0
- data/lib/graphql/query/validation_pipeline.rb +139 -0
- data/lib/graphql/query/variable_validation_error.rb +44 -0
- data/lib/graphql/query/variables.rb +78 -0
- data/lib/graphql/query.rb +454 -0
- data/lib/graphql/railtie.rb +117 -0
- data/lib/graphql/rake_task/validate.rb +63 -0
- data/lib/graphql/rake_task.rb +145 -0
- data/lib/graphql/relay/array_connection.rb +83 -0
- data/lib/graphql/relay/base_connection.rb +189 -0
- data/lib/graphql/relay/connection_instrumentation.rb +54 -0
- data/lib/graphql/relay/connection_resolve.rb +43 -0
- data/lib/graphql/relay/connection_type.rb +41 -0
- data/lib/graphql/relay/edge.rb +27 -0
- data/lib/graphql/relay/edge_type.rb +19 -0
- data/lib/graphql/relay/edges_instrumentation.rb +39 -0
- data/lib/graphql/relay/global_id_resolve.rb +18 -0
- data/lib/graphql/relay/mongo_relation_connection.rb +50 -0
- data/lib/graphql/relay/mutation/instrumentation.rb +23 -0
- data/lib/graphql/relay/mutation/resolve.rb +56 -0
- data/lib/graphql/relay/mutation/result.rb +38 -0
- data/lib/graphql/relay/mutation.rb +106 -0
- data/lib/graphql/relay/node.rb +39 -0
- data/lib/graphql/relay/page_info.rb +7 -0
- data/lib/graphql/relay/range_add.rb +59 -0
- data/lib/graphql/relay/relation_connection.rb +188 -0
- data/lib/graphql/relay/type_extensions.rb +32 -0
- data/lib/graphql/relay.rb +18 -0
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/runtime_type_error.rb +5 -0
- data/lib/graphql/scalar_type.rb +91 -0
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +383 -0
- data/lib/graphql/schema/base_64_bp.rb +26 -0
- data/lib/graphql/schema/base_64_encoder.rb +21 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
- data/lib/graphql/schema/build_from_definition.rb +477 -0
- data/lib/graphql/schema/built_in_types.rb +12 -0
- data/lib/graphql/schema/catchall_middleware.rb +35 -0
- data/lib/graphql/schema/default_parse_error.rb +10 -0
- data/lib/graphql/schema/default_type_error.rb +17 -0
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +66 -0
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +25 -0
- data/lib/graphql/schema/directive/skip.rb +25 -0
- data/lib/graphql/schema/directive/transform.rb +60 -0
- data/lib/graphql/schema/directive.rb +210 -0
- data/lib/graphql/schema/enum.rb +193 -0
- data/lib/graphql/schema/enum_value.rb +97 -0
- data/lib/graphql/schema/field/connection_extension.rb +76 -0
- data/lib/graphql/schema/field/scope_extension.rb +22 -0
- data/lib/graphql/schema/field.rb +880 -0
- data/lib/graphql/schema/field_extension.rb +69 -0
- data/lib/graphql/schema/find_inherited_value.rb +36 -0
- data/lib/graphql/schema/finder.rb +155 -0
- data/lib/graphql/schema/input_object.rb +253 -0
- data/lib/graphql/schema/interface.rb +136 -0
- data/lib/graphql/schema/introspection_system.rb +169 -0
- data/lib/graphql/schema/invalid_type_error.rb +7 -0
- data/lib/graphql/schema/late_bound_type.rb +33 -0
- data/lib/graphql/schema/list.rb +75 -0
- data/lib/graphql/schema/loader.rb +226 -0
- data/lib/graphql/schema/member/accepts_definition.rb +159 -0
- data/lib/graphql/schema/member/base_dsl_methods.rb +129 -0
- data/lib/graphql/schema/member/build_type.rb +180 -0
- data/lib/graphql/schema/member/cached_graphql_definition.rb +31 -0
- data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
- data/lib/graphql/schema/member/has_arguments.rb +332 -0
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +163 -0
- data/lib/graphql/schema/member/has_interfaces.rb +90 -0
- data/lib/graphql/schema/member/has_path.rb +25 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/instrumentation.rb +131 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
- data/lib/graphql/schema/member/scoped.rb +21 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +161 -0
- data/lib/graphql/schema/middleware_chain.rb +82 -0
- data/lib/graphql/schema/mutation.rb +94 -0
- data/lib/graphql/schema/non_null.rb +67 -0
- data/lib/graphql/schema/null_mask.rb +11 -0
- data/lib/graphql/schema/object.rb +150 -0
- data/lib/graphql/schema/possible_types.rb +44 -0
- data/lib/graphql/schema/printer.rb +100 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +160 -0
- data/lib/graphql/schema/rescue_middleware.rb +60 -0
- data/lib/graphql/schema/resolver/has_payload_type.rb +96 -0
- data/lib/graphql/schema/resolver.rb +397 -0
- data/lib/graphql/schema/scalar.rb +69 -0
- data/lib/graphql/schema/subscription.rb +155 -0
- data/lib/graphql/schema/timeout.rb +123 -0
- data/lib/graphql/schema/timeout_middleware.rb +88 -0
- data/lib/graphql/schema/traversal.rb +228 -0
- data/lib/graphql/schema/type_expression.rb +43 -0
- data/lib/graphql/schema/type_membership.rb +48 -0
- data/lib/graphql/schema/union.rb +95 -0
- data/lib/graphql/schema/unique_within_type.rb +34 -0
- data/lib/graphql/schema/validation.rb +313 -0
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +68 -0
- data/lib/graphql/schema/validator.rb +174 -0
- data/lib/graphql/schema/warden.rb +409 -0
- data/lib/graphql/schema/wrapper.rb +29 -0
- data/lib/graphql/schema.rb +1945 -0
- data/lib/graphql/static_validation/all_rules.rb +40 -0
- data/lib/graphql/static_validation/base_visitor.rb +217 -0
- data/lib/graphql/static_validation/default_visitor.rb +15 -0
- data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
- data/lib/graphql/static_validation/error.rb +46 -0
- data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
- data/lib/graphql/static_validation/literal_validator.rb +139 -0
- data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +66 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +71 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +23 -0
- data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +65 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +30 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +73 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +418 -0
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
- data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +73 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +39 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +21 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
- data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +37 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +32 -0
- data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +37 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +50 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +46 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +153 -0
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +39 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +155 -0
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
- data/lib/graphql/static_validation/type_stack.rb +216 -0
- data/lib/graphql/static_validation/validation_context.rb +49 -0
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +96 -0
- data/lib/graphql/static_validation.rb +19 -0
- data/lib/graphql/string_encoding_error.rb +20 -0
- data/lib/graphql/string_type.rb +2 -0
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +245 -0
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
- data/lib/graphql/subscriptions/event.rb +144 -0
- data/lib/graphql/subscriptions/instrumentation.rb +79 -0
- data/lib/graphql/subscriptions/serialize.rb +138 -0
- data/lib/graphql/subscriptions/subscription_root.rb +76 -0
- data/lib/graphql/subscriptions.rb +299 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +35 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +76 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
- data/lib/graphql/tracing/platform_tracing.rb +139 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
- data/lib/graphql/tracing/scout_tracing.rb +54 -0
- data/lib/graphql/tracing/skylight_tracing.rb +70 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +95 -0
- data/lib/graphql/type_kinds.rb +77 -0
- data/lib/graphql/types/big_int.rb +23 -0
- data/lib/graphql/types/boolean.rb +18 -0
- data/lib/graphql/types/float.rb +19 -0
- data/lib/graphql/types/id.rb +24 -0
- data/lib/graphql/types/int.rb +36 -0
- data/lib/graphql/types/iso_8601_date.rb +34 -0
- data/lib/graphql/types/iso_8601_date_time.rb +65 -0
- data/lib/graphql/types/json.rb +25 -0
- data/lib/graphql/types/relay/base_connection.rb +39 -0
- data/lib/graphql/types/relay/base_edge.rb +29 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
- data/lib/graphql/types/relay/default_relay.rb +27 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +15 -0
- data/lib/graphql/types/relay/node_behaviors.rb +15 -0
- data/lib/graphql/types/relay/node_field.rb +25 -0
- data/lib/graphql/types/relay/nodes_field.rb +27 -0
- data/lib/graphql/types/relay/page_info.rb +11 -0
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +41 -0
- data/lib/graphql/types/string.rb +29 -0
- data/lib/graphql/types.rb +11 -0
- data/lib/graphql/unauthorized_error.rb +29 -0
- data/lib/graphql/unauthorized_field_error.rb +23 -0
- data/lib/graphql/union_type.rb +115 -0
- data/lib/graphql/unresolved_type_error.rb +35 -0
- data/lib/graphql/upgrader/member.rb +937 -0
- data/lib/graphql/upgrader/schema.rb +38 -0
- data/lib/graphql/version.rb +4 -0
- data/lib/graphql.rb +168 -0
- data/readme.md +49 -0
- 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
|