graphql 1.10.2 → 2.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +45 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +49 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -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 +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +24 -33
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +30 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +125 -117
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +52 -36
- data/lib/graphql/analysis/ast.rb +7 -8
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +31 -18
- data/lib/graphql/backtrace/trace.rb +96 -0
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +26 -18
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +77 -44
- 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 +104 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +62 -24
- data/lib/graphql/execution/interpreter/runtime.rb +826 -464
- data/lib/graphql/execution/interpreter.rb +206 -68
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +55 -136
- data/lib/graphql/execution/multiplex.rb +6 -162
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +7 -2
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +11 -5
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +4 -17
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +15 -3
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +11 -6
- data/lib/graphql/introspection/type_type.rb +31 -14
- data/lib/graphql/introspection.rb +100 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/document_from_schema_definition.rb +96 -44
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +126 -129
- data/lib/graphql/language/parser.rb +997 -933
- data/lib/graphql/language/parser.y +148 -118
- data/lib/graphql/language/printer.rb +48 -23
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +192 -84
- data/lib/graphql/language.rb +2 -0
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +45 -3
- data/lib/graphql/pagination/array_connection.rb +6 -4
- data/lib/graphql/pagination/connection.rb +105 -23
- data/lib/graphql/pagination/connections.rb +62 -35
- data/lib/graphql/pagination/relation_connection.rb +88 -36
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +203 -198
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +22 -9
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +36 -12
- data/lib/graphql/query.rb +92 -44
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +41 -10
- data/lib/graphql/relay/range_add.rb +17 -10
- data/lib/graphql/relay.rb +0 -15
- 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/schema/addition.rb +245 -0
- data/lib/graphql/schema/argument.rb +250 -46
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
- data/lib/graphql/schema/build_from_definition.rb +243 -89
- data/lib/graphql/schema/directive/deprecated.rb +1 -1
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +108 -20
- data/lib/graphql/schema/enum.rb +105 -44
- data/lib/graphql/schema/enum_value.rb +15 -25
- data/lib/graphql/schema/field/connection_extension.rb +50 -30
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +476 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +6 -8
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/input_object.rb +133 -121
- data/lib/graphql/schema/interface.rb +17 -45
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +25 -8
- data/lib/graphql/schema/loader.rb +139 -103
- data/lib/graphql/schema/member/base_dsl_methods.rb +29 -35
- data/lib/graphql/schema/member/build_type.rb +19 -14
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +16 -1
- data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
- data/lib/graphql/schema/member/has_directives.rb +118 -0
- data/lib/graphql/schema/member/has_fields.rb +164 -42
- data/lib/graphql/schema/member/has_interfaces.rb +129 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +57 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
- data/lib/graphql/schema/member/validates_input.rb +3 -3
- data/lib/graphql/schema/member.rb +6 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +12 -7
- data/lib/graphql/schema/object.rb +35 -69
- data/lib/graphql/schema/printer.rb +16 -34
- data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +144 -79
- data/lib/graphql/schema/scalar.rb +27 -18
- data/lib/graphql/schema/subscription.rb +55 -26
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +48 -13
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- 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 +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +185 -32
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +471 -1116
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +13 -27
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +69 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +44 -87
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +92 -49
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- 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/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +6 -7
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +9 -10
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +32 -20
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +126 -19
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +81 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -52
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +113 -58
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -21
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +26 -2
- data/lib/graphql/tracing/legacy_trace.rb +65 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +1 -12
- data/lib/graphql/tracing/notifications_trace.rb +42 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +109 -0
- data/lib/graphql/tracing/platform_tracing.rb +64 -43
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +11 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing/trace.rb +75 -0
- data/lib/graphql/tracing.rb +23 -71
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -92
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +75 -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 +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +25 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
- data/lib/graphql/types/relay.rb +10 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +54 -65
- data/readme.md +3 -6
- metadata +116 -236
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -230
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -210
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -107
- data/lib/graphql/enum_type.rb +0 -127
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -222
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -124
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -132
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -65
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/language/lexer.rl +0 -258
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -121
- data/lib/graphql/query/arguments.rb +0 -188
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/literal_input.rb +0 -136
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -176
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -105
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -76
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -65
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
- data/lib/graphql/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -113
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -0,0 +1,171 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
class Schema
|
5
|
+
class Validator
|
6
|
+
# The thing being validated
|
7
|
+
# @return [GraphQL::Schema::Argument, GraphQL::Schema::Field, GraphQL::Schema::Resolver, Class<GraphQL::Schema::InputObject>]
|
8
|
+
attr_reader :validated
|
9
|
+
|
10
|
+
# @param validated [GraphQL::Schema::Argument, GraphQL::Schema::Field, GraphQL::Schema::Resolver, Class<GraphQL::Schema::InputObject>] The argument or argument owner this validator is attached to
|
11
|
+
# @param allow_blank [Boolean] if `true`, then objects that respond to `.blank?` and return true for `.blank?` will skip this validation
|
12
|
+
# @param allow_null [Boolean] if `true`, then incoming `null`s will skip this validation
|
13
|
+
def initialize(validated:, allow_blank: false, allow_null: false)
|
14
|
+
@validated = validated
|
15
|
+
@allow_blank = allow_blank
|
16
|
+
@allow_null = allow_null
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param object [Object] The application object that this argument's field is being resolved for
|
20
|
+
# @param context [GraphQL::Query::Context]
|
21
|
+
# @param value [Object] The client-provided value for this argument (after parsing and coercing by the input type)
|
22
|
+
# @return [nil, Array<String>, String] Error message or messages to add
|
23
|
+
def validate(object, context, value)
|
24
|
+
raise GraphQL::RequiredImplementationMissingError, "Validator classes should implement #validate"
|
25
|
+
end
|
26
|
+
|
27
|
+
# This is like `String#%`, but it supports the case that only some of `string`'s
|
28
|
+
# values are present in `substitutions`
|
29
|
+
def partial_format(string, substitutions)
|
30
|
+
substitutions.each do |key, value|
|
31
|
+
sub_v = value.is_a?(String) ? value : value.to_s
|
32
|
+
string = string.gsub("%{#{key}}", sub_v)
|
33
|
+
end
|
34
|
+
string
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [Boolean] `true` if `value` is `nil` and this validator has `allow_null: true` or if value is `.blank?` and this validator has `allow_blank: true`
|
38
|
+
def permitted_empty_value?(value)
|
39
|
+
(value.nil? && @allow_null) ||
|
40
|
+
(@allow_blank && value.respond_to?(:blank?) && value.blank?)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param schema_member [GraphQL::Schema::Field, GraphQL::Schema::Argument, Class<GraphQL::Schema::InputObject>]
|
44
|
+
# @param validates_hash [Hash{Symbol => Hash}, Hash{Class => Hash} nil] A configuration passed as `validates:`
|
45
|
+
# @return [Array<Validator>]
|
46
|
+
def self.from_config(schema_member, validates_hash)
|
47
|
+
if validates_hash.nil? || validates_hash.empty?
|
48
|
+
EMPTY_ARRAY
|
49
|
+
else
|
50
|
+
validates_hash = validates_hash.dup
|
51
|
+
|
52
|
+
default_options = {}
|
53
|
+
if validates_hash[:allow_null]
|
54
|
+
default_options[:allow_null] = validates_hash.delete(:allow_null)
|
55
|
+
end
|
56
|
+
if validates_hash[:allow_blank]
|
57
|
+
default_options[:allow_blank] = validates_hash.delete(:allow_blank)
|
58
|
+
end
|
59
|
+
|
60
|
+
# allow_nil or allow_blank are the _only_ validations:
|
61
|
+
if validates_hash.empty?
|
62
|
+
validates_hash = default_options
|
63
|
+
end
|
64
|
+
|
65
|
+
validates_hash.map do |validator_name, options|
|
66
|
+
validator_class = case validator_name
|
67
|
+
when Class
|
68
|
+
validator_name
|
69
|
+
else
|
70
|
+
all_validators[validator_name] || raise(ArgumentError, "unknown validation: #{validator_name.inspect}")
|
71
|
+
end
|
72
|
+
if options.is_a?(Hash)
|
73
|
+
validator_class.new(validated: schema_member, **(default_options.merge(options)))
|
74
|
+
else
|
75
|
+
validator_class.new(options, validated: schema_member, **default_options)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Add `validator_class` to be initialized when `validates:` is given `name`.
|
82
|
+
# (It's initialized with whatever options are given by the key `name`).
|
83
|
+
# @param name [Symbol]
|
84
|
+
# @param validator_class [Class]
|
85
|
+
# @return [void]
|
86
|
+
def self.install(name, validator_class)
|
87
|
+
all_validators[name] = validator_class
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
|
91
|
+
# Remove whatever validator class is {.install}ed at `name`, if there is one
|
92
|
+
# @param name [Symbol]
|
93
|
+
# @return [void]
|
94
|
+
def self.uninstall(name)
|
95
|
+
all_validators.delete(name)
|
96
|
+
nil
|
97
|
+
end
|
98
|
+
|
99
|
+
class << self
|
100
|
+
attr_accessor :all_validators
|
101
|
+
end
|
102
|
+
|
103
|
+
self.all_validators = {}
|
104
|
+
|
105
|
+
include GraphQL::EmptyObjects
|
106
|
+
|
107
|
+
class ValidationFailedError < GraphQL::ExecutionError
|
108
|
+
attr_reader :errors
|
109
|
+
|
110
|
+
def initialize(errors:)
|
111
|
+
@errors = errors
|
112
|
+
super(errors.join(", "))
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# @param validators [Array<Validator>]
|
117
|
+
# @param object [Object]
|
118
|
+
# @param context [Query::Context]
|
119
|
+
# @param value [Object]
|
120
|
+
# @return [void]
|
121
|
+
# @raises [ValidationFailedError]
|
122
|
+
def self.validate!(validators, object, context, value, as: nil)
|
123
|
+
# Assuming the default case is no errors, reduce allocations in that case.
|
124
|
+
# This will be replaced with a mutable array if we actually get any errors.
|
125
|
+
all_errors = EMPTY_ARRAY
|
126
|
+
|
127
|
+
validators.each do |validator|
|
128
|
+
validated = as || validator.validated
|
129
|
+
errors = validator.validate(object, context, value)
|
130
|
+
if errors &&
|
131
|
+
(errors.is_a?(Array) && errors != EMPTY_ARRAY) ||
|
132
|
+
(errors.is_a?(String))
|
133
|
+
if all_errors.frozen? # It's empty
|
134
|
+
all_errors = []
|
135
|
+
end
|
136
|
+
interpolation_vars = { validated: validated.graphql_name }
|
137
|
+
if errors.is_a?(String)
|
138
|
+
all_errors << (errors % interpolation_vars)
|
139
|
+
else
|
140
|
+
errors = errors.map { |e| e % interpolation_vars }
|
141
|
+
all_errors.concat(errors)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
if all_errors.any?
|
147
|
+
raise ValidationFailedError.new(errors: all_errors)
|
148
|
+
end
|
149
|
+
nil
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
require "graphql/schema/validator/length_validator"
|
157
|
+
GraphQL::Schema::Validator.install(:length, GraphQL::Schema::Validator::LengthValidator)
|
158
|
+
require "graphql/schema/validator/numericality_validator"
|
159
|
+
GraphQL::Schema::Validator.install(:numericality, GraphQL::Schema::Validator::NumericalityValidator)
|
160
|
+
require "graphql/schema/validator/format_validator"
|
161
|
+
GraphQL::Schema::Validator.install(:format, GraphQL::Schema::Validator::FormatValidator)
|
162
|
+
require "graphql/schema/validator/inclusion_validator"
|
163
|
+
GraphQL::Schema::Validator.install(:inclusion, GraphQL::Schema::Validator::InclusionValidator)
|
164
|
+
require "graphql/schema/validator/exclusion_validator"
|
165
|
+
GraphQL::Schema::Validator.install(:exclusion, GraphQL::Schema::Validator::ExclusionValidator)
|
166
|
+
require "graphql/schema/validator/required_validator"
|
167
|
+
GraphQL::Schema::Validator.install(:required, GraphQL::Schema::Validator::RequiredValidator)
|
168
|
+
require "graphql/schema/validator/allow_null_validator"
|
169
|
+
GraphQL::Schema::Validator.install(:allow_null, GraphQL::Schema::Validator::AllowNullValidator)
|
170
|
+
require "graphql/schema/validator/allow_blank_validator"
|
171
|
+
GraphQL::Schema::Validator.install(:allow_blank, GraphQL::Schema::Validator::AllowBlankValidator)
|
@@ -10,7 +10,7 @@ module GraphQL
|
|
10
10
|
# should go through a warden. If you access the schema directly,
|
11
11
|
# you may show a client something that it shouldn't be allowed to see.
|
12
12
|
#
|
13
|
-
# @example
|
13
|
+
# @example Hiding private fields
|
14
14
|
# private_members = -> (member, ctx) { member.metadata[:private] }
|
15
15
|
# result = Schema.execute(query_string, except: private_members)
|
16
16
|
#
|
@@ -37,26 +37,82 @@ module GraphQL
|
|
37
37
|
#
|
38
38
|
# @api private
|
39
39
|
class Warden
|
40
|
+
def self.from_context(context)
|
41
|
+
context.warden # this might be a hash which won't respond to this
|
42
|
+
rescue
|
43
|
+
PassThruWarden
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param visibility_method [Symbol] a Warden method to call for this entry
|
47
|
+
# @param entry [Object, Array<Object>] One or more definitions for a given name in a GraphQL Schema
|
48
|
+
# @param context [GraphQL::Query::Context]
|
49
|
+
# @param warden [Warden]
|
50
|
+
# @return [Object] `entry` or one of `entry`'s items if exactly one of them is visible for this context
|
51
|
+
# @return [nil] If neither `entry` nor any of `entry`'s items are visible for this context
|
52
|
+
def self.visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context))
|
53
|
+
if entry.is_a?(Array)
|
54
|
+
visible_item = nil
|
55
|
+
entry.each do |item|
|
56
|
+
if warden.public_send(visibility_method, item, context)
|
57
|
+
if visible_item.nil?
|
58
|
+
visible_item = item
|
59
|
+
else
|
60
|
+
raise DuplicateNamesError.new(
|
61
|
+
duplicated_name: item.path, duplicated_definition_1: visible_item.inspect, duplicated_definition_2: item.inspect
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
visible_item
|
67
|
+
elsif warden.public_send(visibility_method, entry, context)
|
68
|
+
entry
|
69
|
+
else
|
70
|
+
nil
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# This is used when a caller provides a Hash for context.
|
75
|
+
# We want to call the schema's hooks, but we don't have a full-blown warden.
|
76
|
+
# The `context` arguments to these methods exist purely to simplify the code that
|
77
|
+
# calls methods on this object, so it will have everything it needs.
|
78
|
+
class PassThruWarden
|
79
|
+
class << self
|
80
|
+
def visible_field?(field, ctx); field.visible?(ctx); end
|
81
|
+
def visible_argument?(arg, ctx); arg.visible?(ctx); end
|
82
|
+
def visible_type?(type, ctx); type.visible?(ctx); end
|
83
|
+
def visible_enum_value?(ev, ctx); ev.visible?(ctx); end
|
84
|
+
def visible_type_membership?(tm, ctx); tm.visible?(ctx); end
|
85
|
+
def interface_type_memberships(obj_t, ctx); obj_t.interface_type_memberships; end
|
86
|
+
def arguments(owner, ctx); owner.arguments(ctx); end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
40
90
|
# @param filter [<#call(member)>] Objects are hidden when `.call(member, ctx)` returns true
|
41
91
|
# @param context [GraphQL::Query::Context]
|
42
92
|
# @param schema [GraphQL::Schema]
|
43
|
-
# @param deep_check [Boolean]
|
44
93
|
def initialize(filter, context:, schema:)
|
45
|
-
@schema = schema
|
94
|
+
@schema = schema
|
46
95
|
# Cache these to avoid repeated hits to the inheritance chain when one isn't present
|
47
96
|
@query = @schema.query
|
48
97
|
@mutation = @schema.mutation
|
49
98
|
@subscription = @schema.subscription
|
50
99
|
@context = context
|
51
100
|
@visibility_cache = read_through { |m| filter.call(m, context) }
|
101
|
+
# Initialize all ivars to improve object shape consistency:
|
102
|
+
@types = @visible_types = @reachable_types = @visible_parent_fields =
|
103
|
+
@visible_possible_types = @visible_fields = @visible_arguments = @visible_enum_arrays =
|
104
|
+
@visible_enum_values = @visible_interfaces = @type_visibility = @type_memberships =
|
105
|
+
@visible_and_reachable_type = @unions = @unfiltered_interfaces = @references_to =
|
106
|
+
@reachable_type_set =
|
107
|
+
nil
|
52
108
|
end
|
53
109
|
|
54
|
-
# @return [
|
110
|
+
# @return [Hash<String, GraphQL::BaseType>] Visible types in the schema
|
55
111
|
def types
|
56
112
|
@types ||= begin
|
57
113
|
vis_types = {}
|
58
|
-
@schema.types.each do |n, t|
|
59
|
-
if
|
114
|
+
@schema.types(@context).each do |n, t|
|
115
|
+
if visible_and_reachable_type?(t)
|
60
116
|
vis_types[n] = t
|
61
117
|
end
|
62
118
|
end
|
@@ -67,8 +123,8 @@ module GraphQL
|
|
67
123
|
# @return [GraphQL::BaseType, nil] The type named `type_name`, if it exists (else `nil`)
|
68
124
|
def get_type(type_name)
|
69
125
|
@visible_types ||= read_through do |name|
|
70
|
-
type_defn = @schema.get_type(name)
|
71
|
-
if type_defn &&
|
126
|
+
type_defn = @schema.get_type(name, @context)
|
127
|
+
if type_defn && visible_and_reachable_type?(type_defn)
|
72
128
|
type_defn
|
73
129
|
else
|
74
130
|
nil
|
@@ -85,17 +141,16 @@ module GraphQL
|
|
85
141
|
|
86
142
|
# @return Boolean True if the type is visible and reachable in the schema
|
87
143
|
def reachable_type?(type_name)
|
88
|
-
type = get_type(type_name)
|
144
|
+
type = get_type(type_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
89
145
|
type && reachable_type_set.include?(type)
|
90
146
|
end
|
91
147
|
|
92
148
|
# @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`, if it exists
|
93
149
|
def get_field(parent_type, field_name)
|
94
|
-
|
95
150
|
@visible_parent_fields ||= read_through do |type|
|
96
151
|
read_through do |f_name|
|
97
|
-
field_defn = @schema.get_field(type, f_name)
|
98
|
-
if field_defn && visible_field?(field_defn)
|
152
|
+
field_defn = @schema.get_field(type, f_name, @context)
|
153
|
+
if field_defn && visible_field?(field_defn, nil, type)
|
99
154
|
field_defn
|
100
155
|
else
|
101
156
|
nil
|
@@ -106,10 +161,17 @@ module GraphQL
|
|
106
161
|
@visible_parent_fields[parent_type][field_name]
|
107
162
|
end
|
108
163
|
|
164
|
+
# @return [GraphQL::Argument, nil] The argument named `argument_name` on `parent_type`, if it exists and is visible
|
165
|
+
def get_argument(parent_type, argument_name)
|
166
|
+
argument = parent_type.get_argument(argument_name, @context)
|
167
|
+
return argument if argument && visible_argument?(argument, @context)
|
168
|
+
end
|
169
|
+
|
109
170
|
# @return [Array<GraphQL::BaseType>] The types which may be member of `type_defn`
|
110
171
|
def possible_types(type_defn)
|
111
172
|
@visible_possible_types ||= read_through { |type_defn|
|
112
|
-
@schema.possible_types(type_defn, @context)
|
173
|
+
pt = @schema.possible_types(type_defn, @context)
|
174
|
+
pt.select { |t| visible_and_reachable_type?(t) }
|
113
175
|
}
|
114
176
|
@visible_possible_types[type_defn]
|
115
177
|
end
|
@@ -117,26 +179,37 @@ module GraphQL
|
|
117
179
|
# @param type_defn [GraphQL::ObjectType, GraphQL::InterfaceType]
|
118
180
|
# @return [Array<GraphQL::Field>] Fields on `type_defn`
|
119
181
|
def fields(type_defn)
|
120
|
-
@visible_fields ||= read_through { |t| @schema.get_fields(t).
|
182
|
+
@visible_fields ||= read_through { |t| @schema.get_fields(t, @context).values }
|
121
183
|
@visible_fields[type_defn]
|
122
184
|
end
|
123
185
|
|
124
186
|
# @param argument_owner [GraphQL::Field, GraphQL::InputObjectType]
|
125
187
|
# @return [Array<GraphQL::Argument>] Visible arguments on `argument_owner`
|
126
|
-
def arguments(argument_owner)
|
127
|
-
@visible_arguments ||= read_through { |o| o.arguments.each_value.select { |a|
|
188
|
+
def arguments(argument_owner, ctx = nil)
|
189
|
+
@visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a, @context) } }
|
128
190
|
@visible_arguments[argument_owner]
|
129
191
|
end
|
130
192
|
|
131
193
|
# @return [Array<GraphQL::EnumType::EnumValue>] Visible members of `enum_defn`
|
132
194
|
def enum_values(enum_defn)
|
133
|
-
@
|
134
|
-
|
195
|
+
@visible_enum_arrays ||= read_through { |e|
|
196
|
+
values = e.enum_values(@context)
|
197
|
+
if values.size == 0
|
198
|
+
raise GraphQL::Schema::Enum::MissingValuesError.new(e)
|
199
|
+
end
|
200
|
+
values
|
201
|
+
}
|
202
|
+
@visible_enum_arrays[enum_defn]
|
203
|
+
end
|
204
|
+
|
205
|
+
def visible_enum_value?(enum_value, _ctx = nil)
|
206
|
+
@visible_enum_values ||= read_through { |ev| visible?(ev) }
|
207
|
+
@visible_enum_values[enum_value]
|
135
208
|
end
|
136
209
|
|
137
210
|
# @return [Array<GraphQL::InterfaceType>] Visible interfaces implemented by `obj_type`
|
138
211
|
def interfaces(obj_type)
|
139
|
-
@visible_interfaces ||= read_through { |t| t.interfaces.select { |i|
|
212
|
+
@visible_interfaces ||= read_through { |t| t.interfaces(@context).select { |i| visible_type?(i) } }
|
140
213
|
@visible_interfaces[obj_type]
|
141
214
|
end
|
142
215
|
|
@@ -153,20 +226,42 @@ module GraphQL
|
|
153
226
|
end
|
154
227
|
end
|
155
228
|
|
156
|
-
|
229
|
+
# @param owner [Class, Module] If provided, confirm that field has the given owner.
|
230
|
+
def visible_field?(field_defn, _ctx = nil, owner = field_defn.owner)
|
231
|
+
# This field is visible in its own right
|
232
|
+
visible?(field_defn) &&
|
233
|
+
# This field's return type is visible
|
234
|
+
visible_and_reachable_type?(field_defn.type.unwrap) &&
|
235
|
+
# This field is either defined on this object type,
|
236
|
+
# or the interface it's inherited from is also visible
|
237
|
+
((field_defn.respond_to?(:owner) && field_defn.owner == owner) || field_on_visible_interface?(field_defn, owner))
|
238
|
+
end
|
157
239
|
|
158
|
-
def
|
159
|
-
|
160
|
-
|
240
|
+
def visible_argument?(arg_defn, _ctx = nil)
|
241
|
+
visible?(arg_defn) && visible_and_reachable_type?(arg_defn.type.unwrap)
|
242
|
+
end
|
243
|
+
|
244
|
+
def visible_type?(type_defn, _ctx = nil)
|
245
|
+
@type_visibility ||= read_through { |type_defn| visible?(type_defn) }
|
246
|
+
@type_visibility[type_defn]
|
161
247
|
end
|
162
248
|
|
163
|
-
def
|
164
|
-
visible?(
|
249
|
+
def visible_type_membership?(type_membership, _ctx = nil)
|
250
|
+
visible?(type_membership)
|
165
251
|
end
|
166
252
|
|
167
|
-
def
|
168
|
-
@
|
169
|
-
|
253
|
+
def interface_type_memberships(obj_type, _ctx = nil)
|
254
|
+
@type_memberships ||= read_through do |obj_t|
|
255
|
+
obj_t.interface_type_memberships
|
256
|
+
end
|
257
|
+
@type_memberships[obj_type]
|
258
|
+
end
|
259
|
+
|
260
|
+
private
|
261
|
+
|
262
|
+
def visible_and_reachable_type?(type_defn)
|
263
|
+
@visible_and_reachable_type ||= read_through do |type_defn|
|
264
|
+
next false unless visible_type?(type_defn)
|
170
265
|
next true if root_type?(type_defn) || type_defn.introspection?
|
171
266
|
|
172
267
|
if type_defn.kind.union?
|
@@ -178,7 +273,48 @@ module GraphQL
|
|
178
273
|
end
|
179
274
|
end
|
180
275
|
|
181
|
-
@
|
276
|
+
@visible_and_reachable_type[type_defn]
|
277
|
+
end
|
278
|
+
|
279
|
+
def union_memberships(obj_type)
|
280
|
+
@unions ||= read_through { |obj_type| @schema.union_memberships(obj_type).select { |u| visible?(u) } }
|
281
|
+
@unions[obj_type]
|
282
|
+
end
|
283
|
+
|
284
|
+
# We need this to tell whether a field was inherited by an interface
|
285
|
+
# even when that interface is hidden from `#interfaces`
|
286
|
+
def unfiltered_interfaces(type_defn)
|
287
|
+
@unfiltered_interfaces ||= read_through(&:interfaces)
|
288
|
+
@unfiltered_interfaces[type_defn]
|
289
|
+
end
|
290
|
+
|
291
|
+
# If this field was inherited from an interface, and the field on that interface is _hidden_,
|
292
|
+
# then treat this inherited field as hidden.
|
293
|
+
# (If it _wasn't_ inherited, then don't hide it for this reason.)
|
294
|
+
def field_on_visible_interface?(field_defn, type_defn)
|
295
|
+
if type_defn.kind.object?
|
296
|
+
any_interface_has_field = false
|
297
|
+
any_interface_has_visible_field = false
|
298
|
+
ints = unfiltered_interfaces(type_defn)
|
299
|
+
ints.each do |interface_type|
|
300
|
+
if (iface_field_defn = interface_type.get_field(field_defn.graphql_name, @context))
|
301
|
+
any_interface_has_field = true
|
302
|
+
|
303
|
+
if interfaces(type_defn).include?(interface_type) && visible_field?(iface_field_defn, nil, interface_type)
|
304
|
+
any_interface_has_visible_field = true
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
if any_interface_has_field
|
310
|
+
any_interface_has_visible_field
|
311
|
+
else
|
312
|
+
# it's the object's own field
|
313
|
+
true
|
314
|
+
end
|
315
|
+
else
|
316
|
+
true
|
317
|
+
end
|
182
318
|
end
|
183
319
|
|
184
320
|
def root_type?(type_defn)
|
@@ -208,7 +344,7 @@ module GraphQL
|
|
208
344
|
end
|
209
345
|
|
210
346
|
def visible_possible_types?(type_defn)
|
211
|
-
possible_types(type_defn).any? { |t|
|
347
|
+
possible_types(type_defn).any? { |t| visible_and_reachable_type?(t) }
|
212
348
|
end
|
213
349
|
|
214
350
|
def visible?(member)
|
@@ -220,9 +356,10 @@ module GraphQL
|
|
220
356
|
end
|
221
357
|
|
222
358
|
def reachable_type_set
|
223
|
-
return @reachable_type_set if
|
359
|
+
return @reachable_type_set if @reachable_type_set
|
224
360
|
|
225
361
|
@reachable_type_set = Set.new
|
362
|
+
rt_hash = {}
|
226
363
|
|
227
364
|
unvisited_types = []
|
228
365
|
['query', 'mutation', 'subscription'].each do |op_name|
|
@@ -230,8 +367,18 @@ module GraphQL
|
|
230
367
|
unvisited_types << root_type if root_type
|
231
368
|
end
|
232
369
|
unvisited_types.concat(@schema.introspection_system.types.values)
|
370
|
+
|
371
|
+
directives.each do |dir_class|
|
372
|
+
arguments(dir_class).each do |arg_defn|
|
373
|
+
arg_t = arg_defn.type.unwrap
|
374
|
+
if get_type(arg_t.graphql_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
375
|
+
unvisited_types << arg_t
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
233
380
|
@schema.orphan_types.each do |orphan_type|
|
234
|
-
if get_type(orphan_type.graphql_name)
|
381
|
+
if get_type(orphan_type.graphql_name) == orphan_type # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
235
382
|
unvisited_types << orphan_type
|
236
383
|
end
|
237
384
|
end
|
@@ -239,6 +386,12 @@ module GraphQL
|
|
239
386
|
until unvisited_types.empty?
|
240
387
|
type = unvisited_types.pop
|
241
388
|
if @reachable_type_set.add?(type)
|
389
|
+
type_by_name = rt_hash[type.graphql_name] ||= type
|
390
|
+
if type_by_name != type
|
391
|
+
raise DuplicateNamesError.new(
|
392
|
+
duplicated_name: type.graphql_name, duplicated_definition_1: type.inspect, duplicated_definition_2: type_by_name.inspect
|
393
|
+
)
|
394
|
+
end
|
242
395
|
if type.kind.input_object?
|
243
396
|
# recurse into visible arguments
|
244
397
|
arguments(type).each do |argument|
|
@@ -3,7 +3,6 @@
|
|
3
3
|
module GraphQL
|
4
4
|
class Schema
|
5
5
|
class Wrapper
|
6
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
7
6
|
include GraphQL::Schema::Member::TypeSystemHelpers
|
8
7
|
|
9
8
|
# @return [Class, Module] The inner type of this wrapping type, the type of which one or more objects may be present.
|
@@ -13,10 +12,6 @@ module GraphQL
|
|
13
12
|
@of_type = of_type
|
14
13
|
end
|
15
14
|
|
16
|
-
def to_graphql
|
17
|
-
raise GraphQL::RequiredImplementationMissingError
|
18
|
-
end
|
19
|
-
|
20
15
|
def unwrap
|
21
16
|
@of_type.unwrap
|
22
17
|
end
|