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,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
# @api deprecated
|
4
|
+
class Function
|
5
|
+
def self.inherited(subclass)
|
6
|
+
GraphQL::Deprecation.warn "GraphQL::Function (used for #{subclass}) will be removed from GraphQL-Ruby 2.0, please upgrade to resolvers: https://graphql-ruby.org/fields/resolvers.html"
|
7
|
+
end
|
8
|
+
|
9
|
+
# @return [Hash<String => GraphQL::Argument>] Arguments, keyed by name
|
10
|
+
def arguments
|
11
|
+
self.class.arguments
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [GraphQL::BaseType] Return type
|
15
|
+
def type
|
16
|
+
self.class.type
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Object] This function's resolver
|
20
|
+
def call(obj, args, ctx)
|
21
|
+
raise GraphQL::RequiredImplementationMissingError
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [String, nil]
|
25
|
+
def description
|
26
|
+
self.class.description
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [String, nil]
|
30
|
+
def deprecation_reason
|
31
|
+
self.class.deprecation_reason
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Integer, Proc]
|
35
|
+
def complexity
|
36
|
+
self.class.complexity || 1
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
# Define an argument for this function & its subclasses
|
41
|
+
# @see {GraphQL::Field} same arguments as the `argument` definition helper
|
42
|
+
# @return [void]
|
43
|
+
def argument(*args, **kwargs, &block)
|
44
|
+
argument = GraphQL::Argument.from_dsl(*args, **kwargs, &block)
|
45
|
+
own_arguments[argument.name] = argument
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Hash<String => GraphQL::Argument>] Arguments for this function class, including inherited arguments
|
50
|
+
def arguments
|
51
|
+
if parent_function?
|
52
|
+
own_arguments.merge(superclass.arguments)
|
53
|
+
else
|
54
|
+
own_arguments.dup
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Provides shorthand access to GraphQL's built-in types
|
59
|
+
def types
|
60
|
+
GraphQL::Define::TypeDefiner.instance
|
61
|
+
end
|
62
|
+
|
63
|
+
# Get or set the return type for this function class & descendants
|
64
|
+
# @return [GraphQL::BaseType]
|
65
|
+
def type(premade_type = nil, &block)
|
66
|
+
if block_given?
|
67
|
+
@type = GraphQL::ObjectType.define(&block)
|
68
|
+
elsif premade_type
|
69
|
+
@type = premade_type
|
70
|
+
elsif parent_function?
|
71
|
+
@type || superclass.type
|
72
|
+
else
|
73
|
+
@type
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def build_field(function)
|
78
|
+
GraphQL::Field.define(
|
79
|
+
arguments: function.arguments,
|
80
|
+
complexity: function.complexity,
|
81
|
+
type: function.type,
|
82
|
+
resolve: function,
|
83
|
+
description: function.description,
|
84
|
+
function: function,
|
85
|
+
deprecation_reason: function.deprecation_reason,
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Class-level reader/writer which is inherited
|
90
|
+
# @api private
|
91
|
+
def self.inherited_value(name)
|
92
|
+
self.class_eval <<-RUBY
|
93
|
+
def #{name}(new_value = nil)
|
94
|
+
if new_value
|
95
|
+
@#{name} = new_value
|
96
|
+
elsif parent_function?
|
97
|
+
@#{name} || superclass.#{name}
|
98
|
+
else
|
99
|
+
@#{name}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
RUBY
|
103
|
+
end
|
104
|
+
|
105
|
+
# @!method description(new_value = nil)
|
106
|
+
# Get or set this class's description
|
107
|
+
inherited_value(:description)
|
108
|
+
# @!method deprecation_reason(new_value = nil)
|
109
|
+
# Get or set this class's deprecation_reason
|
110
|
+
inherited_value(:deprecation_reason)
|
111
|
+
# @!method complexity(new_value = nil)
|
112
|
+
# Get or set this class's complexity
|
113
|
+
inherited_value(:complexity)
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
# Does this function inherit from another function?
|
118
|
+
def parent_function?
|
119
|
+
superclass <= GraphQL::Function
|
120
|
+
end
|
121
|
+
|
122
|
+
# Arguments defined on this class (not superclasses)
|
123
|
+
def own_arguments
|
124
|
+
@own_arguments ||= {}
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
# @api deprecated
|
4
|
+
class InputObjectType < GraphQL::BaseType
|
5
|
+
extend Define::InstanceDefinable::DeprecatedDefine
|
6
|
+
|
7
|
+
accepts_definitions(
|
8
|
+
:arguments, :mutation,
|
9
|
+
input_field: GraphQL::Define::AssignArgument,
|
10
|
+
argument: GraphQL::Define::AssignArgument
|
11
|
+
)
|
12
|
+
|
13
|
+
attr_accessor :mutation, :arguments, :arguments_class
|
14
|
+
ensure_defined(:mutation, :arguments, :input_fields)
|
15
|
+
alias :input_fields :arguments
|
16
|
+
|
17
|
+
# @!attribute mutation
|
18
|
+
# @return [GraphQL::Relay::Mutation, nil] The mutation this field was derived from, if it was derived from a mutation
|
19
|
+
|
20
|
+
# @!attribute arguments
|
21
|
+
# @return [Hash<String => GraphQL::Argument>] Map String argument names to their {GraphQL::Argument} implementations
|
22
|
+
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
super
|
26
|
+
@arguments = {}
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize_copy(other)
|
30
|
+
super
|
31
|
+
@arguments = other.arguments.dup
|
32
|
+
end
|
33
|
+
|
34
|
+
def kind
|
35
|
+
GraphQL::TypeKinds::INPUT_OBJECT
|
36
|
+
end
|
37
|
+
|
38
|
+
def coerce_result(value, ctx = nil)
|
39
|
+
if ctx.nil?
|
40
|
+
warn_deprecated_coerce("coerce_isolated_result")
|
41
|
+
ctx = GraphQL::Query::NullContext
|
42
|
+
end
|
43
|
+
|
44
|
+
# Allow the application to provide values as :symbols, and convert them to the strings
|
45
|
+
value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
|
46
|
+
|
47
|
+
result = {}
|
48
|
+
|
49
|
+
arguments.each do |input_key, input_field_defn|
|
50
|
+
input_value = value[input_key]
|
51
|
+
if value.key?(input_key)
|
52
|
+
result[input_key] = if input_value.nil?
|
53
|
+
nil
|
54
|
+
else
|
55
|
+
input_field_defn.type.coerce_result(input_value, ctx)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
result
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_argument(argument_name)
|
64
|
+
arguments[argument_name]
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def coerce_non_null_input(value, ctx)
|
70
|
+
input_values = {}
|
71
|
+
defaults_used = Set.new
|
72
|
+
|
73
|
+
arguments.each do |input_key, input_field_defn|
|
74
|
+
field_value = value[input_key]
|
75
|
+
|
76
|
+
if value.key?(input_key)
|
77
|
+
coerced_value = input_field_defn.type.coerce_input(field_value, ctx)
|
78
|
+
input_values[input_key] = input_field_defn.prepare(coerced_value, ctx)
|
79
|
+
elsif input_field_defn.default_value?
|
80
|
+
coerced_value = input_field_defn.type.coerce_input(input_field_defn.default_value, ctx)
|
81
|
+
input_values[input_key] = coerced_value
|
82
|
+
defaults_used << input_key
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
result = arguments_class.new(input_values, context: ctx, defaults_used: defaults_used)
|
87
|
+
result.prepare
|
88
|
+
end
|
89
|
+
|
90
|
+
# @api private
|
91
|
+
INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key, value object responding to `to_h` or `to_unsafe_h`."
|
92
|
+
|
93
|
+
def validate_non_null_input(input, ctx)
|
94
|
+
warden = ctx.warden
|
95
|
+
result = GraphQL::Query::InputValidationResult.new
|
96
|
+
|
97
|
+
if input.is_a?(Array)
|
98
|
+
result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
99
|
+
return result
|
100
|
+
end
|
101
|
+
|
102
|
+
# We're not actually _using_ the coerced result, we're just
|
103
|
+
# using these methods to make sure that the object will
|
104
|
+
# behave like a hash below, when we call `each` on it.
|
105
|
+
begin
|
106
|
+
input.to_h
|
107
|
+
rescue
|
108
|
+
begin
|
109
|
+
# Handle ActionController::Parameters:
|
110
|
+
input.to_unsafe_h
|
111
|
+
rescue
|
112
|
+
# We're not sure it'll act like a hash, so reject it:
|
113
|
+
result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
114
|
+
return result
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
visible_arguments_map = warden.arguments(self).reduce({}) { |m, f| m[f.name] = f; m}
|
119
|
+
|
120
|
+
# Items in the input that are unexpected
|
121
|
+
input.each do |name, value|
|
122
|
+
if visible_arguments_map[name].nil?
|
123
|
+
result.add_problem("Field is not defined on #{self.graphql_name}", [name])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Items in the input that are expected, but have invalid values
|
128
|
+
visible_arguments_map.map do |name, field|
|
129
|
+
field_result = field.type.validate_input(input[name], ctx)
|
130
|
+
if !field_result.valid?
|
131
|
+
result.merge_result!(name, field_result)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
result
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
# This error is raised when `Types::Int` is given an input value outside of 32-bit integer range.
|
4
|
+
#
|
5
|
+
# For really big integer values, consider `GraphQL::Types::BigInt`
|
6
|
+
#
|
7
|
+
# @see GraphQL::Types::Int which raises this error
|
8
|
+
class IntegerDecodingError < GraphQL::RuntimeTypeError
|
9
|
+
# The value which couldn't be decoded
|
10
|
+
attr_reader :integer_value
|
11
|
+
|
12
|
+
def initialize(value)
|
13
|
+
@integer_value = value
|
14
|
+
super("Integer out of bounds: #{value}. \nConsider using GraphQL::Types::BigInt instead.")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
# This error is raised when `Types::Int` is asked to return a value outside of 32-bit integer range.
|
4
|
+
#
|
5
|
+
# For values outside that range, consider:
|
6
|
+
#
|
7
|
+
# - `ID` for database primary keys or other identifiers
|
8
|
+
# - `GraphQL::Types::BigInt` for really big integer values
|
9
|
+
#
|
10
|
+
# @see GraphQL::Types::Int which raises this error
|
11
|
+
class IntegerEncodingError < GraphQL::RuntimeTypeError
|
12
|
+
# The value which couldn't be encoded
|
13
|
+
attr_reader :integer_value
|
14
|
+
|
15
|
+
# @return [GraphQL::Schema::Field] The field that returned a too-big integer
|
16
|
+
attr_reader :field
|
17
|
+
|
18
|
+
# @return [Array<String, Integer>] Where the field appeared in the GraphQL response
|
19
|
+
attr_reader :path
|
20
|
+
|
21
|
+
def initialize(value, context:)
|
22
|
+
@integer_value = value
|
23
|
+
@field = context[:current_field]
|
24
|
+
@path = context[:current_path]
|
25
|
+
message = "Integer out of bounds: #{value}".dup
|
26
|
+
if @path
|
27
|
+
message << " @ #{@path.join(".")}"
|
28
|
+
end
|
29
|
+
if @field
|
30
|
+
message << " (#{@field.path})"
|
31
|
+
end
|
32
|
+
message << ". Consider using ID or GraphQL::Types::BigInt instead."
|
33
|
+
super(message)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
# @api deprecated
|
4
|
+
class InterfaceType < GraphQL::BaseType
|
5
|
+
extend Define::InstanceDefinable::DeprecatedDefine
|
6
|
+
|
7
|
+
accepts_definitions :fields, :orphan_types, :resolve_type, field: GraphQL::Define::AssignObjectField
|
8
|
+
|
9
|
+
attr_accessor :fields, :orphan_types, :resolve_type_proc
|
10
|
+
attr_writer :type_membership_class
|
11
|
+
ensure_defined :fields, :orphan_types, :resolve_type_proc, :resolve_type
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
super
|
15
|
+
@fields = {}
|
16
|
+
@orphan_types = []
|
17
|
+
@resolve_type_proc = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize_copy(other)
|
21
|
+
super
|
22
|
+
@fields = other.fields.dup
|
23
|
+
@orphan_types = other.orphan_types.dup
|
24
|
+
end
|
25
|
+
|
26
|
+
def kind
|
27
|
+
GraphQL::TypeKinds::INTERFACE
|
28
|
+
end
|
29
|
+
|
30
|
+
def resolve_type(value, ctx)
|
31
|
+
ctx.query.resolve_type(self, value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def resolve_type=(resolve_type_callable)
|
35
|
+
@resolve_type_proc = resolve_type_callable
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [GraphQL::Field] The defined field for `field_name`
|
39
|
+
def get_field(field_name)
|
40
|
+
fields[field_name]
|
41
|
+
end
|
42
|
+
|
43
|
+
# These fields don't have instrumenation applied
|
44
|
+
# @see [Schema#get_fields] Get fields with instrumentation
|
45
|
+
# @return [Array<GraphQL::Field>] All fields on this type
|
46
|
+
def all_fields
|
47
|
+
fields.values
|
48
|
+
end
|
49
|
+
|
50
|
+
# Get a possible type of this {InterfaceType} by type name
|
51
|
+
# @param type_name [String]
|
52
|
+
# @param ctx [GraphQL::Query::Context] The context for the current query
|
53
|
+
# @return [GraphQL::ObjectType, nil] The type named `type_name` if it exists and implements this {InterfaceType}, (else `nil`)
|
54
|
+
def get_possible_type(type_name, ctx)
|
55
|
+
type = ctx.query.get_type(type_name)
|
56
|
+
type if type && ctx.query.warden.possible_types(self).include?(type)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Check if a type is a possible type of this {InterfaceType}
|
60
|
+
# @param type [String, GraphQL::BaseType] Name of the type or a type definition
|
61
|
+
# @param ctx [GraphQL::Query::Context] The context for the current query
|
62
|
+
# @return [Boolean] True if the `type` exists and is a member of this {InterfaceType}, (else `nil`)
|
63
|
+
def possible_type?(type, ctx)
|
64
|
+
type_name = type.is_a?(String) ? type : type.graphql_name
|
65
|
+
!get_possible_type(type_name, ctx).nil?
|
66
|
+
end
|
67
|
+
|
68
|
+
def type_membership_class
|
69
|
+
@type_membership_class || GraphQL::Schema::TypeMembership
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module InternalRepresentation
|
4
|
+
class Document
|
5
|
+
# @return [Hash<String, Node>] Operation Nodes of this query
|
6
|
+
attr_reader :operation_definitions
|
7
|
+
|
8
|
+
# @return [Hash<String, Node>] Fragment definition Nodes of this query
|
9
|
+
attr_reader :fragment_definitions
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@operation_definitions = {}
|
13
|
+
@fragment_definitions = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def [](key)
|
17
|
+
GraphQL::Deprecation.warn "#{self.class}#[] is deprecated; use `operation_definitions[]` instead"
|
18
|
+
operation_definitions[key]
|
19
|
+
end
|
20
|
+
|
21
|
+
def each(&block)
|
22
|
+
GraphQL::Deprecation.warn "#{self.class}#each is deprecated; use `operation_definitions.each` instead"
|
23
|
+
operation_definitions.each(&block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module InternalRepresentation
|
4
|
+
class Node
|
5
|
+
# @api private
|
6
|
+
DEFAULT_TYPED_CHILDREN = Proc.new { |h, k| h[k] = {} }
|
7
|
+
|
8
|
+
# A specialized, reusable object for leaf nodes.
|
9
|
+
NO_TYPED_CHILDREN = Hash.new({}.freeze)
|
10
|
+
def NO_TYPED_CHILDREN.dup; self; end;
|
11
|
+
NO_TYPED_CHILDREN.freeze
|
12
|
+
|
13
|
+
# @return [String] the name this node has in the response
|
14
|
+
attr_reader :name
|
15
|
+
|
16
|
+
# @return [GraphQL::ObjectType]
|
17
|
+
attr_reader :owner_type
|
18
|
+
|
19
|
+
# Each key is a {GraphQL::ObjectType} which this selection _may_ be made on.
|
20
|
+
# The values for that key are selections which apply to that type.
|
21
|
+
#
|
22
|
+
# This value is derived from {#scoped_children} after the rewrite is finished.
|
23
|
+
# @return [Hash<GraphQL::ObjectType, Hash<String => Node>>]
|
24
|
+
def typed_children
|
25
|
+
@typed_children ||= begin
|
26
|
+
if @scoped_children.any?
|
27
|
+
new_tc = Hash.new(&DEFAULT_TYPED_CHILDREN)
|
28
|
+
all_object_types = Set.new
|
29
|
+
scoped_children.each_key { |t| all_object_types.merge(@query.possible_types(t)) }
|
30
|
+
# Remove any scoped children which don't follow this return type
|
31
|
+
# (This can happen with fragment merging where lexical scope is lost)
|
32
|
+
all_object_types &= @query.possible_types(@return_type.unwrap)
|
33
|
+
all_object_types.each do |t|
|
34
|
+
new_tc[t] = get_typed_children(t)
|
35
|
+
end
|
36
|
+
new_tc
|
37
|
+
else
|
38
|
+
NO_TYPED_CHILDREN
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# These children correspond closely to scopes in the AST.
|
45
|
+
# Keys _may_ be abstract types. They're assumed to be read-only after rewrite is finished
|
46
|
+
# because {#typed_children} is derived from them.
|
47
|
+
#
|
48
|
+
# Using {#scoped_children} during the rewrite step reduces the overhead of reifying
|
49
|
+
# abstract types because they're only reified _after_ the rewrite.
|
50
|
+
# @return [Hash<GraphQL::BaseType, Hash<String => Node>>]
|
51
|
+
attr_reader :scoped_children
|
52
|
+
|
53
|
+
# @return [Array<Language::Nodes::AbstractNode>] AST nodes which are represented by this node
|
54
|
+
attr_reader :ast_nodes
|
55
|
+
|
56
|
+
# @return [Array<GraphQL::Field>] Field definitions for this node (there should only be one!)
|
57
|
+
attr_reader :definitions
|
58
|
+
|
59
|
+
# @return [GraphQL::BaseType] The expected wrapped type this node must return.
|
60
|
+
attr_reader :return_type
|
61
|
+
|
62
|
+
# @return [InternalRepresentation::Node, nil]
|
63
|
+
attr_reader :parent
|
64
|
+
|
65
|
+
def initialize(
|
66
|
+
name:, owner_type:, query:, return_type:, parent:,
|
67
|
+
ast_nodes: [],
|
68
|
+
definitions: []
|
69
|
+
)
|
70
|
+
@name = name
|
71
|
+
@query = query
|
72
|
+
@owner_type = owner_type
|
73
|
+
@parent = parent
|
74
|
+
@typed_children = nil
|
75
|
+
@scoped_children = Hash.new { |h1, k1| h1[k1] = {} }
|
76
|
+
@ast_nodes = ast_nodes
|
77
|
+
@definitions = definitions
|
78
|
+
@return_type = return_type
|
79
|
+
end
|
80
|
+
|
81
|
+
def initialize_copy(other_node)
|
82
|
+
super
|
83
|
+
# Bust some caches:
|
84
|
+
@typed_children = nil
|
85
|
+
@definition = nil
|
86
|
+
@definition_name = nil
|
87
|
+
@ast_node = nil
|
88
|
+
# Shallow-copy some state:
|
89
|
+
@scoped_children = other_node.scoped_children.dup
|
90
|
+
@ast_nodes = other_node.ast_nodes.dup
|
91
|
+
@definitions = other_node.definitions.dup
|
92
|
+
end
|
93
|
+
|
94
|
+
def ==(other)
|
95
|
+
other.is_a?(self.class) &&
|
96
|
+
other.name == name &&
|
97
|
+
other.parent == parent &&
|
98
|
+
other.return_type == return_type &&
|
99
|
+
other.owner_type == owner_type &&
|
100
|
+
other.scoped_children == scoped_children &&
|
101
|
+
other.definitions == definitions &&
|
102
|
+
other.ast_nodes == ast_nodes
|
103
|
+
end
|
104
|
+
|
105
|
+
def definition_name
|
106
|
+
definition && definition.name
|
107
|
+
end
|
108
|
+
|
109
|
+
def arguments
|
110
|
+
@query.arguments_for(self, definition)
|
111
|
+
end
|
112
|
+
|
113
|
+
def definition
|
114
|
+
@definition ||= begin
|
115
|
+
first_def = @definitions.first
|
116
|
+
first_def && @query.get_field(@owner_type, first_def.name)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def ast_node
|
121
|
+
@ast_node ||= ast_nodes.first
|
122
|
+
end
|
123
|
+
|
124
|
+
def inspect
|
125
|
+
all_children_names = scoped_children.values.map(&:keys).flatten.uniq.join(", ")
|
126
|
+
all_locations = ast_nodes.map {|n| "#{n.line}:#{n.col}" }.join(", ")
|
127
|
+
"#<Node #{@owner_type}.#{@name} -> #{@return_type} {#{all_children_names}} @ [#{all_locations}] #{object_id}>"
|
128
|
+
end
|
129
|
+
|
130
|
+
# Merge selections from `new_parent` into `self`.
|
131
|
+
# Selections are merged in place, not copied.
|
132
|
+
def deep_merge_node(new_parent, scope: nil, merge_self: true)
|
133
|
+
if merge_self
|
134
|
+
@ast_nodes |= new_parent.ast_nodes
|
135
|
+
@definitions |= new_parent.definitions
|
136
|
+
end
|
137
|
+
new_sc = new_parent.scoped_children
|
138
|
+
if new_sc.any?
|
139
|
+
scope ||= Scope.new(@query, @return_type.unwrap)
|
140
|
+
new_sc.each do |obj_type, new_fields|
|
141
|
+
inner_scope = scope.enter(obj_type)
|
142
|
+
inner_scope.each do |scoped_type|
|
143
|
+
prev_fields = @scoped_children[scoped_type]
|
144
|
+
new_fields.each do |name, new_node|
|
145
|
+
prev_node = prev_fields[name]
|
146
|
+
if prev_node
|
147
|
+
prev_node.deep_merge_node(new_node)
|
148
|
+
else
|
149
|
+
prev_fields[name] = new_node
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# @return [GraphQL::Query]
|
158
|
+
attr_reader :query
|
159
|
+
|
160
|
+
def subscription_topic
|
161
|
+
@subscription_topic ||= begin
|
162
|
+
scope = if definition.subscription_scope
|
163
|
+
@query.context[definition.subscription_scope]
|
164
|
+
else
|
165
|
+
nil
|
166
|
+
end
|
167
|
+
Subscriptions::Event.serialize(
|
168
|
+
definition_name,
|
169
|
+
@query.arguments_for(self, definition),
|
170
|
+
definition,
|
171
|
+
scope: scope
|
172
|
+
)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
protected
|
177
|
+
|
178
|
+
attr_writer :owner_type, :parent
|
179
|
+
|
180
|
+
private
|
181
|
+
|
182
|
+
# Get applicable children from {#scoped_children}
|
183
|
+
# @param obj_type [GraphQL::ObjectType]
|
184
|
+
# @return [Hash<String => Node>]
|
185
|
+
def get_typed_children(obj_type)
|
186
|
+
new_tc = {}
|
187
|
+
@scoped_children.each do |scope_type, scope_nodes|
|
188
|
+
if GraphQL::Execution::Typecast.subtype?(scope_type, obj_type)
|
189
|
+
scope_nodes.each do |name, new_node|
|
190
|
+
prev_node = new_tc[name]
|
191
|
+
if prev_node
|
192
|
+
prev_node.deep_merge_node(new_node)
|
193
|
+
else
|
194
|
+
copied_node = new_node.dup
|
195
|
+
copied_node.owner_type = obj_type
|
196
|
+
copied_node.parent = self
|
197
|
+
new_tc[name] = copied_node
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
new_tc
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module InternalRepresentation
|
4
|
+
module Print
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def print(schema, query_string)
|
8
|
+
query = GraphQL::Query.new(schema, query_string)
|
9
|
+
print_node(query.irep_selection)
|
10
|
+
end
|
11
|
+
|
12
|
+
def print_node(node, indent: 0)
|
13
|
+
padding = " " * indent
|
14
|
+
typed_children_padding = " " * (indent + 2)
|
15
|
+
query_str = "".dup
|
16
|
+
|
17
|
+
if !node.definition
|
18
|
+
op_node = node.ast_node
|
19
|
+
name = op_node.name ? " " + op_node.name : ""
|
20
|
+
op_type = op_node.operation_type
|
21
|
+
query_str << "#{op_type}#{name}"
|
22
|
+
else
|
23
|
+
if node.name == node.definition_name
|
24
|
+
query_str << "#{padding}#{node.name}"
|
25
|
+
else
|
26
|
+
query_str << "#{padding}#{node.name}: #{node.definition_name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
args = node.ast_nodes.map { |n| n.arguments.map(&:to_query_string).join(",") }.uniq
|
30
|
+
query_str << args.map { |a| "(#{a})"}.join("|")
|
31
|
+
end
|
32
|
+
|
33
|
+
if node.typed_children.any?
|
34
|
+
query_str << " {\n"
|
35
|
+
node.typed_children.each do |type, children|
|
36
|
+
query_str << "#{typed_children_padding}... on #{type.name} {\n"
|
37
|
+
children.each do |name, child|
|
38
|
+
query_str << print_node(child, indent: indent + 4)
|
39
|
+
end
|
40
|
+
query_str << "#{typed_children_padding}}\n"
|
41
|
+
end
|
42
|
+
query_str << "#{padding}}\n"
|
43
|
+
else
|
44
|
+
query_str << "\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
query_str
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|