graphql 1.9.18 → 1.13.24
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 +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 +44 -7
- 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 +63 -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 +22 -27
- 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/analyze_query.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +29 -2
- data/lib/graphql/analysis/ast/query_complexity.rb +174 -67
- data/lib/graphql/analysis/ast/visitor.rb +16 -7
- data/lib/graphql/analysis/ast.rb +21 -11
- data/lib/graphql/argument.rb +8 -36
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +44 -5
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +40 -9
- data/lib/graphql/backtrace.rb +28 -19
- data/lib/graphql/backwards_compatibility.rb +2 -1
- data/lib/graphql/base_type.rb +10 -4
- data/lib/graphql/boolean_type.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
- data/lib/graphql/compatibility/execution_specification.rb +1 -0
- data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
- data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +2 -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/date_encoding_error.rb +16 -0
- data/lib/graphql/define/assign_enum_value.rb +1 -1
- data/lib/graphql/define/assign_global_id_field.rb +2 -2
- data/lib/graphql/define/assign_object_field.rb +1 -1
- data/lib/graphql/define/defined_object_proxy.rb +5 -8
- data/lib/graphql/define/instance_definable.rb +60 -110
- data/lib/graphql/define/type_definer.rb +5 -5
- data/lib/graphql/deprecated_dsl.rb +18 -5
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/directive/deprecated_directive.rb +1 -12
- data/lib/graphql/directive/include_directive.rb +1 -1
- data/lib/graphql/directive/skip_directive.rb +1 -1
- data/lib/graphql/directive.rb +9 -6
- data/lib/graphql/enum_type.rb +14 -74
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +110 -8
- data/lib/graphql/execution/execute.rb +8 -1
- data/lib/graphql/execution/instrumentation.rb +1 -1
- 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 +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +721 -386
- data/lib/graphql/execution/interpreter.rb +42 -19
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +39 -114
- data/lib/graphql/execution/multiplex.rb +50 -25
- data/lib/graphql/field.rb +15 -119
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/float_type.rb +1 -1
- data/lib/graphql/function.rb +5 -30
- data/lib/graphql/id_type.rb +1 -1
- data/lib/graphql/input_object_type.rb +9 -25
- data/lib/graphql/int_type.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/interface_type.rb +10 -24
- data/lib/graphql/internal_representation/document.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +1 -1
- data/lib/graphql/internal_representation/scope.rb +2 -2
- data/lib/graphql/internal_representation/visit.rb +2 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/entry_points.rb +9 -9
- 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 +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +27 -17
- data/lib/graphql/introspection.rb +99 -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/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +116 -63
- data/lib/graphql/language/lexer.rb +53 -27
- data/lib/graphql/language/lexer.rl +5 -3
- data/lib/graphql/language/nodes.rb +67 -93
- data/lib/graphql/language/parser.rb +929 -896
- data/lib/graphql/language/parser.y +125 -102
- data/lib/graphql/language/printer.rb +11 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/non_null_type.rb +0 -10
- data/lib/graphql/object_type.rb +47 -58
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -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 +226 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/arguments.rb +6 -4
- data/lib/graphql/query/arguments_cache.rb +1 -2
- data/lib/graphql/query/context.rb +52 -7
- data/lib/graphql/query/executor.rb +0 -1
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +32 -6
- data/lib/graphql/query/literal_input.rb +31 -11
- data/lib/graphql/query/null_context.rb +24 -8
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/serial_execution.rb +1 -0
- data/lib/graphql/query/validation_pipeline.rb +6 -4
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +50 -10
- data/lib/graphql/query.rb +77 -18
- data/lib/graphql/railtie.rb +9 -1
- data/lib/graphql/rake_task/validate.rb +3 -0
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/array_connection.rb +10 -12
- data/lib/graphql/relay/base_connection.rb +30 -13
- data/lib/graphql/relay/connection_instrumentation.rb +4 -4
- data/lib/graphql/relay/connection_type.rb +18 -4
- data/lib/graphql/relay/edge_type.rb +1 -0
- data/lib/graphql/relay/edges_instrumentation.rb +1 -2
- data/lib/graphql/relay/global_id_resolve.rb +1 -2
- data/lib/graphql/relay/mutation.rb +3 -87
- data/lib/graphql/relay/node.rb +3 -0
- data/lib/graphql/relay/page_info.rb +1 -1
- data/lib/graphql/relay/range_add.rb +27 -9
- data/lib/graphql/relay/relation_connection.rb +8 -10
- data/lib/graphql/relay/type_extensions.rb +2 -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/scalar_type.rb +18 -60
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +274 -18
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +320 -219
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/default_type_error.rb +2 -0
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- 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 +2 -2
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +130 -6
- data/lib/graphql/schema/enum.rb +121 -12
- data/lib/graphql/schema/enum_value.rb +24 -7
- data/lib/graphql/schema/field/connection_extension.rb +46 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +465 -181
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +172 -37
- data/lib/graphql/schema/interface.rb +39 -25
- data/lib/graphql/schema/introspection_system.rb +106 -38
- data/lib/graphql/schema/late_bound_type.rb +3 -2
- data/lib/graphql/schema/list.rb +65 -1
- data/lib/graphql/schema/loader.rb +145 -102
- data/lib/graphql/schema/member/accepts_definition.rb +15 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +34 -28
- data/lib/graphql/schema/member/build_type.rb +19 -8
- data/lib/graphql/schema/member/cached_graphql_definition.rb +34 -2
- data/lib/graphql/schema/member/has_arguments.rb +206 -13
- 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 +97 -32
- data/lib/graphql/schema/member/has_interfaces.rb +100 -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 +0 -1
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -0
- data/lib/graphql/schema/middleware_chain.rb +1 -1
- data/lib/graphql/schema/mutation.rb +4 -0
- data/lib/graphql/schema/non_null.rb +37 -1
- data/lib/graphql/schema/object.rb +51 -38
- data/lib/graphql/schema/possible_types.rb +9 -4
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +40 -4
- data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
- data/lib/graphql/schema/resolver.rb +133 -79
- data/lib/graphql/schema/scalar.rb +43 -3
- data/lib/graphql/schema/subscription.rb +57 -21
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/timeout_middleware.rb +3 -1
- data/lib/graphql/schema/traversal.rb +2 -2
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +19 -5
- data/lib/graphql/schema/union.rb +44 -3
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validation.rb +14 -4
- 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 +193 -34
- data/lib/graphql/schema.rb +882 -247
- data/lib/graphql/static_validation/all_rules.rb +2 -0
- data/lib/graphql/static_validation/base_visitor.rb +17 -10
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +51 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -2
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- 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/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 +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -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 +43 -9
- data/lib/graphql/static_validation.rb +1 -0
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/string_type.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
- 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 +84 -30
- data/lib/graphql/subscriptions/instrumentation.rb +10 -6
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions/subscription_root.rb +15 -5
- data/lib/graphql/subscriptions.rb +117 -49
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +32 -15
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +66 -10
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/skylight_tracing.rb +9 -1
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -35
- 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 +16 -8
- data/lib/graphql/types/iso_8601_date_time.rb +32 -10
- data/lib/graphql/types/relay/base_connection.rb +6 -88
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +174 -0
- data/lib/graphql/types/relay/default_relay.rb +31 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +64 -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 +15 -0
- data/lib/graphql/types/relay/node_field.rb +3 -22
- data/lib/graphql/types/relay/nodes_field.rb +16 -18
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -3
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/union_type.rb +5 -25
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/upgrader/member.rb +1 -0
- data/lib/graphql/upgrader/schema.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +87 -31
- data/readme.md +3 -6
- metadata +126 -124
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/literal_validation_error.rb +0 -6
- 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
|
@@ -37,26 +37,83 @@ module GraphQL
|
|
|
37
37
|
#
|
|
38
38
|
# @api private
|
|
39
39
|
class Warden
|
|
40
|
+
def self.from_context(context)
|
|
41
|
+
(context.respond_to?(:warden) && context.warden) || PassThruWarden
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @param visibility_method [Symbol] a Warden method to call for this entry
|
|
45
|
+
# @param entry [Object, Array<Object>] One or more definitions for a given name in a GraphQL Schema
|
|
46
|
+
# @param context [GraphQL::Query::Context]
|
|
47
|
+
# @param warden [Warden]
|
|
48
|
+
# @return [Object] `entry` or one of `entry`'s items if exactly one of them is visible for this context
|
|
49
|
+
# @return [nil] If neither `entry` nor any of `entry`'s items are visible for this context
|
|
50
|
+
def self.visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context))
|
|
51
|
+
if entry.is_a?(Array)
|
|
52
|
+
visible_item = nil
|
|
53
|
+
entry.each do |item|
|
|
54
|
+
if warden.public_send(visibility_method, item, context)
|
|
55
|
+
if visible_item.nil?
|
|
56
|
+
visible_item = item
|
|
57
|
+
else
|
|
58
|
+
raise Schema::DuplicateNamesError, "Found two visible definitions for `#{item.path}`: #{visible_item.inspect}, #{item.inspect}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
visible_item
|
|
63
|
+
elsif warden.public_send(visibility_method, entry, context)
|
|
64
|
+
entry
|
|
65
|
+
else
|
|
66
|
+
nil
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# This is used when a caller provides a Hash for context.
|
|
71
|
+
# We want to call the schema's hooks, but we don't have a full-blown warden.
|
|
72
|
+
# The `context` arguments to these methods exist purely to simplify the code that
|
|
73
|
+
# calls methods on this object, so it will have everything it needs.
|
|
74
|
+
class PassThruWarden
|
|
75
|
+
class << self
|
|
76
|
+
def visible_field?(field, ctx); field.visible?(ctx); end
|
|
77
|
+
def visible_argument?(arg, ctx); arg.visible?(ctx); end
|
|
78
|
+
def visible_type?(type, ctx); type.visible?(ctx); end
|
|
79
|
+
def visible_enum_value?(ev, ctx); ev.visible?(ctx); end
|
|
80
|
+
def visible_type_membership?(tm, ctx); tm.visible?(ctx); end
|
|
81
|
+
def interface_type_memberships(obj_t, ctx); obj_t.interface_type_memberships; end
|
|
82
|
+
def arguments(owner, ctx); owner.arguments(ctx); end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
40
86
|
# @param filter [<#call(member)>] Objects are hidden when `.call(member, ctx)` returns true
|
|
41
87
|
# @param context [GraphQL::Query::Context]
|
|
42
88
|
# @param schema [GraphQL::Schema]
|
|
43
|
-
# @param deep_check [Boolean]
|
|
44
89
|
def initialize(filter, context:, schema:)
|
|
45
|
-
@schema = schema
|
|
90
|
+
@schema = schema.interpreter? ? schema : schema.graphql_definition
|
|
91
|
+
# Cache these to avoid repeated hits to the inheritance chain when one isn't present
|
|
92
|
+
@query = @schema.query
|
|
93
|
+
@mutation = @schema.mutation
|
|
94
|
+
@subscription = @schema.subscription
|
|
46
95
|
@context = context
|
|
47
|
-
@visibility_cache = read_through { |m| filter.call(m,
|
|
96
|
+
@visibility_cache = read_through { |m| filter.call(m, context) }
|
|
48
97
|
end
|
|
49
98
|
|
|
50
|
-
# @return [
|
|
99
|
+
# @return [Hash<String, GraphQL::BaseType>] Visible types in the schema
|
|
51
100
|
def types
|
|
52
|
-
@types ||=
|
|
101
|
+
@types ||= begin
|
|
102
|
+
vis_types = {}
|
|
103
|
+
@schema.types(@context).each do |n, t|
|
|
104
|
+
if visible_and_reachable_type?(t)
|
|
105
|
+
vis_types[n] = t
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
vis_types
|
|
109
|
+
end
|
|
53
110
|
end
|
|
54
111
|
|
|
55
112
|
# @return [GraphQL::BaseType, nil] The type named `type_name`, if it exists (else `nil`)
|
|
56
113
|
def get_type(type_name)
|
|
57
114
|
@visible_types ||= read_through do |name|
|
|
58
|
-
type_defn = @schema.
|
|
59
|
-
if type_defn &&
|
|
115
|
+
type_defn = @schema.get_type(name, @context)
|
|
116
|
+
if type_defn && visible_and_reachable_type?(type_defn)
|
|
60
117
|
type_defn
|
|
61
118
|
else
|
|
62
119
|
nil
|
|
@@ -73,17 +130,16 @@ module GraphQL
|
|
|
73
130
|
|
|
74
131
|
# @return Boolean True if the type is visible and reachable in the schema
|
|
75
132
|
def reachable_type?(type_name)
|
|
76
|
-
type = get_type(type_name)
|
|
133
|
+
type = get_type(type_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
|
77
134
|
type && reachable_type_set.include?(type)
|
|
78
135
|
end
|
|
79
136
|
|
|
80
137
|
# @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`, if it exists
|
|
81
138
|
def get_field(parent_type, field_name)
|
|
82
|
-
|
|
83
139
|
@visible_parent_fields ||= read_through do |type|
|
|
84
140
|
read_through do |f_name|
|
|
85
|
-
field_defn = @schema.get_field(type, f_name)
|
|
86
|
-
if field_defn && visible_field?(field_defn)
|
|
141
|
+
field_defn = @schema.get_field(type, f_name, @context)
|
|
142
|
+
if field_defn && visible_field?(field_defn, nil, type)
|
|
87
143
|
field_defn
|
|
88
144
|
else
|
|
89
145
|
nil
|
|
@@ -94,35 +150,49 @@ module GraphQL
|
|
|
94
150
|
@visible_parent_fields[parent_type][field_name]
|
|
95
151
|
end
|
|
96
152
|
|
|
153
|
+
# @return [GraphQL::Argument, nil] The argument named `argument_name` on `parent_type`, if it exists and is visible
|
|
154
|
+
def get_argument(parent_type, argument_name)
|
|
155
|
+
argument = parent_type.get_argument(argument_name, @context)
|
|
156
|
+
return argument if argument && visible_argument?(argument, @context)
|
|
157
|
+
end
|
|
158
|
+
|
|
97
159
|
# @return [Array<GraphQL::BaseType>] The types which may be member of `type_defn`
|
|
98
160
|
def possible_types(type_defn)
|
|
99
|
-
@visible_possible_types ||= read_through { |type_defn|
|
|
161
|
+
@visible_possible_types ||= read_through { |type_defn|
|
|
162
|
+
pt = @schema.possible_types(type_defn, @context)
|
|
163
|
+
pt.select { |t| visible_and_reachable_type?(t) }
|
|
164
|
+
}
|
|
100
165
|
@visible_possible_types[type_defn]
|
|
101
166
|
end
|
|
102
167
|
|
|
103
168
|
# @param type_defn [GraphQL::ObjectType, GraphQL::InterfaceType]
|
|
104
169
|
# @return [Array<GraphQL::Field>] Fields on `type_defn`
|
|
105
170
|
def fields(type_defn)
|
|
106
|
-
@visible_fields ||= read_through { |t| @schema.get_fields(t).
|
|
171
|
+
@visible_fields ||= read_through { |t| @schema.get_fields(t, @context).values }
|
|
107
172
|
@visible_fields[type_defn]
|
|
108
173
|
end
|
|
109
174
|
|
|
110
175
|
# @param argument_owner [GraphQL::Field, GraphQL::InputObjectType]
|
|
111
176
|
# @return [Array<GraphQL::Argument>] Visible arguments on `argument_owner`
|
|
112
|
-
def arguments(argument_owner)
|
|
113
|
-
@visible_arguments ||= read_through { |o| o.arguments.each_value.select { |a|
|
|
177
|
+
def arguments(argument_owner, ctx = nil)
|
|
178
|
+
@visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a, @context) } }
|
|
114
179
|
@visible_arguments[argument_owner]
|
|
115
180
|
end
|
|
116
181
|
|
|
117
182
|
# @return [Array<GraphQL::EnumType::EnumValue>] Visible members of `enum_defn`
|
|
118
183
|
def enum_values(enum_defn)
|
|
119
|
-
@
|
|
120
|
-
@
|
|
184
|
+
@visible_enum_arrays ||= read_through { |e| e.enum_values(@context) }
|
|
185
|
+
@visible_enum_arrays[enum_defn]
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def visible_enum_value?(enum_value, _ctx = nil)
|
|
189
|
+
@visible_enum_values ||= read_through { |ev| visible?(ev) }
|
|
190
|
+
@visible_enum_values[enum_value]
|
|
121
191
|
end
|
|
122
192
|
|
|
123
193
|
# @return [Array<GraphQL::InterfaceType>] Visible interfaces implemented by `obj_type`
|
|
124
194
|
def interfaces(obj_type)
|
|
125
|
-
@visible_interfaces ||= read_through { |t| t.interfaces.select { |i|
|
|
195
|
+
@visible_interfaces ||= read_through { |t| t.interfaces(@context).select { |i| visible_type?(i) } }
|
|
126
196
|
@visible_interfaces[obj_type]
|
|
127
197
|
end
|
|
128
198
|
|
|
@@ -139,40 +209,112 @@ module GraphQL
|
|
|
139
209
|
end
|
|
140
210
|
end
|
|
141
211
|
|
|
212
|
+
# @param owner [Class, Module] If provided, confirm that field has the given owner.
|
|
213
|
+
def visible_field?(field_defn, _ctx = nil, owner = field_defn.owner)
|
|
214
|
+
# This field is visible in its own right
|
|
215
|
+
visible?(field_defn) &&
|
|
216
|
+
# This field's return type is visible
|
|
217
|
+
visible_and_reachable_type?(field_defn.type.unwrap) &&
|
|
218
|
+
# This field is either defined on this object type,
|
|
219
|
+
# or the interface it's inherited from is also visible
|
|
220
|
+
((field_defn.respond_to?(:owner) && field_defn.owner == owner) || field_on_visible_interface?(field_defn, owner))
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def visible_argument?(arg_defn, _ctx = nil)
|
|
224
|
+
visible?(arg_defn) && visible_and_reachable_type?(arg_defn.type.unwrap)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def visible_type?(type_defn, _ctx = nil)
|
|
228
|
+
@type_visibility ||= read_through { |type_defn| visible?(type_defn) }
|
|
229
|
+
@type_visibility[type_defn]
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def visible_type_membership?(type_membership, _ctx = nil)
|
|
233
|
+
visible?(type_membership)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def interface_type_memberships(obj_type, _ctx = nil)
|
|
237
|
+
@type_memberships ||= read_through do |obj_t|
|
|
238
|
+
obj_t.interface_type_memberships
|
|
239
|
+
end
|
|
240
|
+
@type_memberships[obj_type]
|
|
241
|
+
end
|
|
242
|
+
|
|
142
243
|
private
|
|
143
244
|
|
|
245
|
+
def visible_and_reachable_type?(type_defn)
|
|
246
|
+
@visible_and_reachable_type ||= read_through do |type_defn|
|
|
247
|
+
next false unless visible_type?(type_defn)
|
|
248
|
+
next true if root_type?(type_defn) || type_defn.introspection?
|
|
249
|
+
|
|
250
|
+
if type_defn.kind.union?
|
|
251
|
+
visible_possible_types?(type_defn) && (referenced?(type_defn) || orphan_type?(type_defn))
|
|
252
|
+
elsif type_defn.kind.interface?
|
|
253
|
+
visible_possible_types?(type_defn)
|
|
254
|
+
else
|
|
255
|
+
referenced?(type_defn) || visible_abstract_type?(type_defn)
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
@visible_and_reachable_type[type_defn]
|
|
260
|
+
end
|
|
261
|
+
|
|
144
262
|
def union_memberships(obj_type)
|
|
145
263
|
@unions ||= read_through { |obj_type| @schema.union_memberships(obj_type).select { |u| visible?(u) } }
|
|
146
264
|
@unions[obj_type]
|
|
147
265
|
end
|
|
148
266
|
|
|
149
|
-
|
|
150
|
-
|
|
267
|
+
# We need this to tell whether a field was inherited by an interface
|
|
268
|
+
# even when that interface is hidden from `#interfaces`
|
|
269
|
+
def unfiltered_interfaces(type_defn)
|
|
270
|
+
@unfiltered_interfaces ||= read_through(&:interfaces)
|
|
271
|
+
@unfiltered_interfaces[type_defn]
|
|
151
272
|
end
|
|
152
273
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
274
|
+
# If this field was inherited from an interface, and the field on that interface is _hidden_,
|
|
275
|
+
# then treat this inherited field as hidden.
|
|
276
|
+
# (If it _wasn't_ inherited, then don't hide it for this reason.)
|
|
277
|
+
def field_on_visible_interface?(field_defn, type_defn)
|
|
278
|
+
if type_defn.kind.object?
|
|
279
|
+
any_interface_has_field = false
|
|
280
|
+
any_interface_has_visible_field = false
|
|
281
|
+
ints = unfiltered_interfaces(type_defn)
|
|
282
|
+
ints.each do |interface_type|
|
|
283
|
+
if (iface_field_defn = interface_type.get_field(field_defn.graphql_name, @context))
|
|
284
|
+
any_interface_has_field = true
|
|
285
|
+
|
|
286
|
+
if interfaces(type_defn).include?(interface_type) && visible_field?(iface_field_defn, nil, interface_type)
|
|
287
|
+
any_interface_has_visible_field = true
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
157
291
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
292
|
+
if any_interface_has_field
|
|
293
|
+
any_interface_has_visible_field
|
|
294
|
+
else
|
|
295
|
+
# it's the object's own field
|
|
296
|
+
true
|
|
297
|
+
end
|
|
162
298
|
else
|
|
163
|
-
|
|
299
|
+
true
|
|
164
300
|
end
|
|
165
301
|
end
|
|
166
302
|
|
|
167
303
|
def root_type?(type_defn)
|
|
168
|
-
@
|
|
304
|
+
@query == type_defn ||
|
|
305
|
+
@mutation == type_defn ||
|
|
306
|
+
@subscription == type_defn
|
|
169
307
|
end
|
|
170
308
|
|
|
171
309
|
def referenced?(type_defn)
|
|
172
|
-
|
|
310
|
+
@references_to ||= @schema.references_to
|
|
311
|
+
graphql_name = type_defn.unwrap.graphql_name
|
|
312
|
+
members = @references_to[graphql_name] || NO_REFERENCES
|
|
173
313
|
members.any? { |m| visible?(m) }
|
|
174
314
|
end
|
|
175
315
|
|
|
316
|
+
NO_REFERENCES = [].freeze
|
|
317
|
+
|
|
176
318
|
def orphan_type?(type_defn)
|
|
177
319
|
@schema.orphan_types.include?(type_defn)
|
|
178
320
|
end
|
|
@@ -185,7 +327,7 @@ module GraphQL
|
|
|
185
327
|
end
|
|
186
328
|
|
|
187
329
|
def visible_possible_types?(type_defn)
|
|
188
|
-
|
|
330
|
+
possible_types(type_defn).any? { |t| visible_and_reachable_type?(t) }
|
|
189
331
|
end
|
|
190
332
|
|
|
191
333
|
def visible?(member)
|
|
@@ -200,20 +342,37 @@ module GraphQL
|
|
|
200
342
|
return @reachable_type_set if defined?(@reachable_type_set)
|
|
201
343
|
|
|
202
344
|
@reachable_type_set = Set.new
|
|
345
|
+
rt_hash = {}
|
|
203
346
|
|
|
204
347
|
unvisited_types = []
|
|
205
348
|
['query', 'mutation', 'subscription'].each do |op_name|
|
|
206
349
|
root_type = root_type_for_operation(op_name)
|
|
207
350
|
unvisited_types << root_type if root_type
|
|
208
351
|
end
|
|
209
|
-
unvisited_types.concat(@schema.introspection_system.
|
|
352
|
+
unvisited_types.concat(@schema.introspection_system.types.values)
|
|
353
|
+
|
|
354
|
+
directives.each do |dir_class|
|
|
355
|
+
arguments(dir_class).each do |arg_defn|
|
|
356
|
+
arg_t = arg_defn.type.unwrap
|
|
357
|
+
if get_type(arg_t.graphql_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
|
358
|
+
unvisited_types << arg_t
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
210
363
|
@schema.orphan_types.each do |orphan_type|
|
|
211
|
-
|
|
364
|
+
if get_type(orphan_type.graphql_name) == orphan_type # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
|
365
|
+
unvisited_types << orphan_type
|
|
366
|
+
end
|
|
212
367
|
end
|
|
213
368
|
|
|
214
369
|
until unvisited_types.empty?
|
|
215
370
|
type = unvisited_types.pop
|
|
216
371
|
if @reachable_type_set.add?(type)
|
|
372
|
+
type_by_name = rt_hash[type.graphql_name] ||= type
|
|
373
|
+
if type_by_name != type
|
|
374
|
+
raise DuplicateNamesError, "Found two visible type definitions for `#{type.graphql_name}`: #{type.inspect}, #{type_by_name.inspect}"
|
|
375
|
+
end
|
|
217
376
|
if type.kind.input_object?
|
|
218
377
|
# recurse into visible arguments
|
|
219
378
|
arguments(type).each do |argument|
|