graphql 1.9.17 → 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 +25 -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/ast/field_usage.rb +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +54 -38
- data/lib/graphql/analysis/ast.rb +16 -16
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- 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/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- 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 +830 -417
- data/lib/graphql/execution/interpreter.rb +206 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +6 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +8 -3
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -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/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- 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 +34 -17
- 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/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +136 -78
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +129 -132
- data/lib/graphql/language/parser.rb +994 -932
- data/lib/graphql/language/parser.y +152 -120
- 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 +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -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/context.rb +205 -203
- 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 +39 -12
- data/lib/graphql/query.rb +95 -43
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -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 +285 -36
- 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 +348 -205
- data/lib/graphql/schema/built_in_types.rb +5 -5
- 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/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +134 -15
- data/lib/graphql/schema/enum.rb +137 -39
- data/lib/graphql/schema/enum_value.rb +17 -23
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +504 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +12 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +24 -49
- data/lib/graphql/schema/introspection_system.rb +103 -37
- data/lib/graphql/schema/late_bound_type.rb +9 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -96
- data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +32 -0
- 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 +166 -44
- 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 +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +36 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +147 -94
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +60 -31
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +23 -6
- data/lib/graphql/schema/union.rb +49 -15
- 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 +213 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +857 -884
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- 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 +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 +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- 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 +15 -7
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
- 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/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 +9 -10
- 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 +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 +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 +129 -22
- 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 +84 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- 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 +23 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -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 +9 -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 +76 -35
- 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 +11 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -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 -67
- 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 -90
- 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/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +63 -65
- data/readme.md +3 -6
- metadata +127 -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 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- 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 -91
- 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 -50
- data/lib/graphql/define/instance_definable.rb +0 -300
- 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 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- 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 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- 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 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- 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 -116
- 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 -172
- 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 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- 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 -190
- 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 -133
- 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 -26
- 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 -66
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- 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 -128
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -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,94 @@ 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
94
|
@schema = schema
|
95
|
+
# Cache these to avoid repeated hits to the inheritance chain when one isn't present
|
96
|
+
@query = @schema.query
|
97
|
+
@mutation = @schema.mutation
|
98
|
+
@subscription = @schema.subscription
|
46
99
|
@context = context
|
47
|
-
@visibility_cache = read_through { |m| filter.call(m,
|
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
|
48
108
|
end
|
49
109
|
|
50
|
-
# @return [
|
110
|
+
# @return [Hash<String, GraphQL::BaseType>] Visible types in the schema
|
51
111
|
def types
|
52
|
-
@types ||=
|
112
|
+
@types ||= begin
|
113
|
+
vis_types = {}
|
114
|
+
@schema.types(@context).each do |n, t|
|
115
|
+
if visible_and_reachable_type?(t)
|
116
|
+
vis_types[n] = t
|
117
|
+
end
|
118
|
+
end
|
119
|
+
vis_types
|
120
|
+
end
|
53
121
|
end
|
54
122
|
|
55
123
|
# @return [GraphQL::BaseType, nil] The type named `type_name`, if it exists (else `nil`)
|
56
124
|
def get_type(type_name)
|
57
125
|
@visible_types ||= read_through do |name|
|
58
|
-
type_defn = @schema.
|
59
|
-
if type_defn &&
|
126
|
+
type_defn = @schema.get_type(name, @context)
|
127
|
+
if type_defn && visible_and_reachable_type?(type_defn)
|
60
128
|
type_defn
|
61
129
|
else
|
62
130
|
nil
|
@@ -73,17 +141,16 @@ module GraphQL
|
|
73
141
|
|
74
142
|
# @return Boolean True if the type is visible and reachable in the schema
|
75
143
|
def reachable_type?(type_name)
|
76
|
-
type = get_type(type_name)
|
144
|
+
type = get_type(type_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
77
145
|
type && reachable_type_set.include?(type)
|
78
146
|
end
|
79
147
|
|
80
148
|
# @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`, if it exists
|
81
149
|
def get_field(parent_type, field_name)
|
82
|
-
|
83
150
|
@visible_parent_fields ||= read_through do |type|
|
84
151
|
read_through do |f_name|
|
85
|
-
field_defn = @schema.get_field(type, f_name)
|
86
|
-
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)
|
87
154
|
field_defn
|
88
155
|
else
|
89
156
|
nil
|
@@ -94,35 +161,55 @@ module GraphQL
|
|
94
161
|
@visible_parent_fields[parent_type][field_name]
|
95
162
|
end
|
96
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
|
+
|
97
170
|
# @return [Array<GraphQL::BaseType>] The types which may be member of `type_defn`
|
98
171
|
def possible_types(type_defn)
|
99
|
-
@visible_possible_types ||= read_through { |type_defn|
|
172
|
+
@visible_possible_types ||= read_through { |type_defn|
|
173
|
+
pt = @schema.possible_types(type_defn, @context)
|
174
|
+
pt.select { |t| visible_and_reachable_type?(t) }
|
175
|
+
}
|
100
176
|
@visible_possible_types[type_defn]
|
101
177
|
end
|
102
178
|
|
103
179
|
# @param type_defn [GraphQL::ObjectType, GraphQL::InterfaceType]
|
104
180
|
# @return [Array<GraphQL::Field>] Fields on `type_defn`
|
105
181
|
def fields(type_defn)
|
106
|
-
@visible_fields ||= read_through { |t| @schema.get_fields(t).
|
182
|
+
@visible_fields ||= read_through { |t| @schema.get_fields(t, @context).values }
|
107
183
|
@visible_fields[type_defn]
|
108
184
|
end
|
109
185
|
|
110
186
|
# @param argument_owner [GraphQL::Field, GraphQL::InputObjectType]
|
111
187
|
# @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|
|
188
|
+
def arguments(argument_owner, ctx = nil)
|
189
|
+
@visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a, @context) } }
|
114
190
|
@visible_arguments[argument_owner]
|
115
191
|
end
|
116
192
|
|
117
193
|
# @return [Array<GraphQL::EnumType::EnumValue>] Visible members of `enum_defn`
|
118
194
|
def enum_values(enum_defn)
|
119
|
-
@
|
120
|
-
|
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]
|
121
208
|
end
|
122
209
|
|
123
210
|
# @return [Array<GraphQL::InterfaceType>] Visible interfaces implemented by `obj_type`
|
124
211
|
def interfaces(obj_type)
|
125
|
-
@visible_interfaces ||= read_through { |t| t.interfaces.select { |i|
|
212
|
+
@visible_interfaces ||= read_through { |t| t.interfaces(@context).select { |i| visible_type?(i) } }
|
126
213
|
@visible_interfaces[obj_type]
|
127
214
|
end
|
128
215
|
|
@@ -139,40 +226,112 @@ module GraphQL
|
|
139
226
|
end
|
140
227
|
end
|
141
228
|
|
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
|
239
|
+
|
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]
|
247
|
+
end
|
248
|
+
|
249
|
+
def visible_type_membership?(type_membership, _ctx = nil)
|
250
|
+
visible?(type_membership)
|
251
|
+
end
|
252
|
+
|
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
|
+
|
142
260
|
private
|
143
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)
|
265
|
+
next true if root_type?(type_defn) || type_defn.introspection?
|
266
|
+
|
267
|
+
if type_defn.kind.union?
|
268
|
+
visible_possible_types?(type_defn) && (referenced?(type_defn) || orphan_type?(type_defn))
|
269
|
+
elsif type_defn.kind.interface?
|
270
|
+
visible_possible_types?(type_defn)
|
271
|
+
else
|
272
|
+
referenced?(type_defn) || visible_abstract_type?(type_defn)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
@visible_and_reachable_type[type_defn]
|
277
|
+
end
|
278
|
+
|
144
279
|
def union_memberships(obj_type)
|
145
280
|
@unions ||= read_through { |obj_type| @schema.union_memberships(obj_type).select { |u| visible?(u) } }
|
146
281
|
@unions[obj_type]
|
147
282
|
end
|
148
283
|
|
149
|
-
|
150
|
-
|
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]
|
151
289
|
end
|
152
290
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
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
|
157
308
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
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
|
162
315
|
else
|
163
|
-
|
316
|
+
true
|
164
317
|
end
|
165
318
|
end
|
166
319
|
|
167
320
|
def root_type?(type_defn)
|
168
|
-
@
|
321
|
+
@query == type_defn ||
|
322
|
+
@mutation == type_defn ||
|
323
|
+
@subscription == type_defn
|
169
324
|
end
|
170
325
|
|
171
326
|
def referenced?(type_defn)
|
172
|
-
|
327
|
+
@references_to ||= @schema.references_to
|
328
|
+
graphql_name = type_defn.unwrap.graphql_name
|
329
|
+
members = @references_to[graphql_name] || NO_REFERENCES
|
173
330
|
members.any? { |m| visible?(m) }
|
174
331
|
end
|
175
332
|
|
333
|
+
NO_REFERENCES = [].freeze
|
334
|
+
|
176
335
|
def orphan_type?(type_defn)
|
177
336
|
@schema.orphan_types.include?(type_defn)
|
178
337
|
end
|
@@ -185,7 +344,7 @@ module GraphQL
|
|
185
344
|
end
|
186
345
|
|
187
346
|
def visible_possible_types?(type_defn)
|
188
|
-
|
347
|
+
possible_types(type_defn).any? { |t| visible_and_reachable_type?(t) }
|
189
348
|
end
|
190
349
|
|
191
350
|
def visible?(member)
|
@@ -197,23 +356,42 @@ module GraphQL
|
|
197
356
|
end
|
198
357
|
|
199
358
|
def reachable_type_set
|
200
|
-
return @reachable_type_set if
|
359
|
+
return @reachable_type_set if @reachable_type_set
|
201
360
|
|
202
361
|
@reachable_type_set = Set.new
|
362
|
+
rt_hash = {}
|
203
363
|
|
204
364
|
unvisited_types = []
|
205
365
|
['query', 'mutation', 'subscription'].each do |op_name|
|
206
366
|
root_type = root_type_for_operation(op_name)
|
207
367
|
unvisited_types << root_type if root_type
|
208
368
|
end
|
209
|
-
unvisited_types.concat(@schema.introspection_system.
|
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
|
+
|
210
380
|
@schema.orphan_types.each do |orphan_type|
|
211
|
-
|
381
|
+
if get_type(orphan_type.graphql_name) == orphan_type # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
|
382
|
+
unvisited_types << orphan_type
|
383
|
+
end
|
212
384
|
end
|
213
385
|
|
214
386
|
until unvisited_types.empty?
|
215
387
|
type = unvisited_types.pop
|
216
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
|
217
395
|
if type.kind.input_object?
|
218
396
|
# recurse into visible arguments
|
219
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
|