graphql 1.12.12 → 2.4.8
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 +3 -8
- 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 +60 -4
- data/lib/generators/graphql/interface_generator.rb +7 -7
- 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 +5 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +10 -38
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +23 -12
- 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 +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -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_resolver.erb +8 -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 +5 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -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 +2 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/schema.erb +22 -2
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyzer.rb +89 -0
- data/lib/graphql/analysis/field_usage.rb +65 -28
- data/lib/graphql/analysis/max_query_complexity.rb +11 -17
- data/lib/graphql/analysis/max_query_depth.rb +13 -19
- data/lib/graphql/analysis/query_complexity.rb +156 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +283 -0
- data/lib/graphql/analysis.rb +90 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/inspect_result.rb +0 -12
- data/lib/graphql/backtrace/table.rb +4 -22
- data/lib/graphql/backtrace/trace.rb +93 -0
- data/lib/graphql/backtrace/tracer.rb +8 -6
- data/lib/graphql/backtrace.rb +3 -8
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +52 -0
- data/lib/graphql/dataloader/async_dataloader.rb +89 -0
- data/lib/graphql/dataloader/null_dataloader.rb +4 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +125 -33
- data/lib/graphql/dataloader.rb +193 -143
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -81
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
- data/lib/graphql/execution/interpreter/resolve.rb +38 -4
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
- data/lib/graphql/execution/interpreter/runtime.rb +447 -403
- data/lib/graphql/execution/interpreter.rb +126 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +4 -172
- data/lib/graphql/execution.rb +11 -4
- 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 +6 -4
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +11 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +4 -4
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +17 -15
- data/lib/graphql/introspection/type_type.rb +29 -16
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/invalid_null_error.rb +1 -1
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/comment.rb +18 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +122 -81
- data/lib/graphql/language/lexer.rb +364 -1467
- data/lib/graphql/language/nodes.rb +197 -106
- data/lib/graphql/language/parser.rb +799 -1920
- data/lib/graphql/language/printer.rb +372 -160
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +22 -23
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +60 -28
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +146 -222
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +15 -32
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +149 -82
- data/lib/graphql/railtie.rb +15 -109
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +30 -11
- data/lib/graphql/relay/range_add.rb +9 -16
- 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/graphql/field_type_in_block.rb +144 -0
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
- data/lib/graphql/rubocop.rb +6 -0
- data/lib/graphql/schema/addition.rb +98 -54
- data/lib/graphql/schema/always_visible.rb +14 -0
- data/lib/graphql/schema/argument.rb +179 -82
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +77 -39
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +4 -4
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +2 -2
- data/lib/graphql/schema/directive.rb +36 -22
- data/lib/graphql/schema/enum.rb +158 -63
- data/lib/graphql/schema/enum_value.rb +12 -21
- data/lib/graphql/schema/field/connection_extension.rb +7 -17
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +521 -359
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +3 -7
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +148 -99
- data/lib/graphql/schema/interface.rb +41 -64
- data/lib/graphql/schema/introspection_system.rb +12 -26
- data/lib/graphql/schema/late_bound_type.rb +12 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +6 -5
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +270 -86
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +169 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
- data/lib/graphql/schema/member/has_validators.rb +32 -6
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
- data/lib/graphql/schema/member/validates_input.rb +6 -6
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +38 -119
- data/lib/graphql/schema/printer.rb +24 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +118 -115
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +95 -21
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +16 -16
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/all_validator.rb +62 -0
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +56 -18
- data/lib/graphql/schema/validator.rb +38 -28
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +359 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +294 -0
- data/lib/graphql/schema/warden.rb +423 -134
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1015 -1057
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +15 -28
- 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 +24 -7
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
- 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/fragment_types_exist.rb +12 -2
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- 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 +7 -5
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +32 -6
- data/lib/graphql/static_validation/validator.rb +11 -27
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
- data/lib/graphql/subscriptions/event.rb +87 -38
- data/lib/graphql/subscriptions/serialize.rb +27 -3
- data/lib/graphql/subscriptions.rb +63 -49
- data/lib/graphql/testing/helpers.rb +155 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appoptics_trace.rb +253 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
- data/lib/graphql/tracing/appsignal_trace.rb +79 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +185 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
- data/lib/graphql/tracing/legacy_trace.rb +12 -0
- data/lib/graphql/tracing/new_relic_trace.rb +77 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +61 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/platform_trace.rb +118 -0
- data/lib/graphql/tracing/platform_tracing.rb +46 -49
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +94 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +74 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +114 -0
- data/lib/graphql/tracing/statsd_trace.rb +58 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +79 -0
- data/lib/graphql/tracing.rb +29 -52
- data/lib/graphql/type_kinds.rb +7 -4
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/iso_8601_date.rb +17 -6
- data/lib/graphql/types/iso_8601_date_time.rb +12 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +82 -137
- data/readme.md +13 -6
- metadata +127 -186
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -28
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -268
- data/lib/graphql/analysis/ast.rb +0 -91
- 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/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- 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 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- 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 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- 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 -240
- 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 -47
- data/lib/graphql/deprecation.rb +0 -13
- 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 -111
- data/lib/graphql/enum_type.rb +0 -129
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- 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 -226
- data/lib/graphql/filter.rb +0 -53
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- 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 -262
- data/lib/graphql/language/parser.y +0 -543
- data/lib/graphql/language/token.rb +0 -38
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- 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 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- 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 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- 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 -17
- data/lib/graphql/schema/invalid_type_error.rb +0 -7
- 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 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/instrumentation.rb +0 -79
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/default_relay.rb +0 -27
- data/lib/graphql/types/relay/node_field.rb +0 -25
- data/lib/graphql/types/relay/nodes_field.rb +0 -27
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -1,84 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module GraphQL
|
3
4
|
class Query
|
4
5
|
# Expose some query-specific info to field resolve functions.
|
5
6
|
# It delegates `[]` to the hash that's passed to `GraphQL::Query#initialize`.
|
6
7
|
class Context
|
7
|
-
module SharedMethods
|
8
|
-
# @return [Object] The target for field resolution
|
9
|
-
attr_accessor :object
|
10
|
-
|
11
|
-
# @return [Hash, Array, String, Integer, Float, Boolean, nil] The resolved value for this field
|
12
|
-
attr_reader :value
|
13
|
-
|
14
|
-
# @return [Boolean] were any fields of this selection skipped?
|
15
|
-
attr_reader :skipped
|
16
|
-
alias :skipped? :skipped
|
17
|
-
|
18
|
-
# @api private
|
19
|
-
attr_writer :skipped
|
20
|
-
|
21
|
-
# Return this value to tell the runtime
|
22
|
-
# to exclude this field from the response altogether
|
23
|
-
def skip
|
24
|
-
GraphQL::Execution::Execute::SKIP
|
25
|
-
end
|
26
|
-
|
27
|
-
# @return [Boolean] True if this selection has been nullified by a null child
|
28
|
-
def invalid_null?
|
29
|
-
@invalid_null
|
30
|
-
end
|
31
|
-
|
32
|
-
# Remove this child from the result value
|
33
|
-
# (used for null propagation and skip)
|
34
|
-
# @api private
|
35
|
-
def delete_child(child_ctx)
|
36
|
-
@value.delete(child_ctx.key)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Create a child context to use for `key`
|
40
|
-
# @param key [String, Integer] The key in the response (name or index)
|
41
|
-
# @param irep_node [InternalRepresentation::Node] The node being evaluated
|
42
|
-
# @api private
|
43
|
-
def spawn_child(key:, irep_node:, object:)
|
44
|
-
FieldResolutionContext.new(
|
45
|
-
@context,
|
46
|
-
key,
|
47
|
-
irep_node,
|
48
|
-
self,
|
49
|
-
object
|
50
|
-
)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Add error at query-level.
|
54
|
-
# @param error [GraphQL::ExecutionError] an execution error
|
55
|
-
# @return [void]
|
56
|
-
def add_error(error)
|
57
|
-
if !error.is_a?(ExecutionError)
|
58
|
-
raise TypeError, "expected error to be a ExecutionError, but was #{error.class}"
|
59
|
-
end
|
60
|
-
errors << error
|
61
|
-
nil
|
62
|
-
end
|
63
|
-
|
64
|
-
# @example Print the GraphQL backtrace during field resolution
|
65
|
-
# puts ctx.backtrace
|
66
|
-
#
|
67
|
-
# @return [GraphQL::Backtrace] The backtrace for this point in query execution
|
68
|
-
def backtrace
|
69
|
-
GraphQL::Backtrace.new(self)
|
70
|
-
end
|
71
|
-
|
72
|
-
def execution_errors
|
73
|
-
@execution_errors ||= ExecutionErrors.new(self)
|
74
|
-
end
|
75
|
-
|
76
|
-
def lookahead
|
77
|
-
ast_nodes = irep_node.ast_nodes
|
78
|
-
field = irep_node.definition.metadata[:type_class] || raise("Lookahead is only compatible with class-based schemas")
|
79
|
-
Execution::Lookahead.new(query: query, ast_nodes: ast_nodes, field: field)
|
80
|
-
end
|
81
|
-
end
|
82
8
|
|
83
9
|
class ExecutionErrors
|
84
10
|
def initialize(ctx)
|
@@ -102,30 +28,8 @@ module GraphQL
|
|
102
28
|
alias :push :add
|
103
29
|
end
|
104
30
|
|
105
|
-
include SharedMethods
|
106
31
|
extend Forwardable
|
107
32
|
|
108
|
-
attr_reader :execution_strategy
|
109
|
-
# `strategy` is required by GraphQL::Batch
|
110
|
-
alias_method :strategy, :execution_strategy
|
111
|
-
|
112
|
-
def execution_strategy=(new_strategy)
|
113
|
-
# GraphQL::Batch re-assigns this value but it was previously not used
|
114
|
-
# (ExecutionContext#strategy was used instead)
|
115
|
-
# now it _is_ used, but it breaks GraphQL::Batch tests
|
116
|
-
@execution_strategy ||= new_strategy
|
117
|
-
end
|
118
|
-
|
119
|
-
# @return [GraphQL::InternalRepresentation::Node] The internal representation for this query node
|
120
|
-
def irep_node
|
121
|
-
@irep_node ||= query.irep_selection
|
122
|
-
end
|
123
|
-
|
124
|
-
# @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
|
125
|
-
def ast_node
|
126
|
-
@irep_node.ast_node
|
127
|
-
end
|
128
|
-
|
129
33
|
# @return [Array<GraphQL::ExecutionError>] errors returned during execution
|
130
34
|
attr_reader :errors
|
131
35
|
|
@@ -141,23 +45,27 @@ module GraphQL
|
|
141
45
|
# Make a new context which delegates key lookup to `values`
|
142
46
|
# @param query [GraphQL::Query] the query who owns this context
|
143
47
|
# @param values [Hash] A hash of arbitrary values which will be accessible at query-time
|
144
|
-
def initialize(query:, schema: query.schema, values
|
48
|
+
def initialize(query:, schema: query.schema, values:)
|
145
49
|
@query = query
|
146
50
|
@schema = schema
|
147
51
|
@provided_values = values || {}
|
148
|
-
@object = object
|
149
52
|
# Namespaced storage, where user-provided values are in `nil` namespace:
|
150
53
|
@storage = Hash.new { |h, k| h[k] = {} }
|
151
54
|
@storage[nil] = @provided_values
|
152
55
|
@errors = []
|
153
56
|
@path = []
|
154
57
|
@value = nil
|
155
|
-
@context = self # for SharedMethods
|
156
|
-
@scoped_context =
|
58
|
+
@context = self # for SharedMethods TODO delete sharedmethods
|
59
|
+
@scoped_context = ScopedContext.new(self)
|
60
|
+
end
|
61
|
+
|
62
|
+
# @return [Hash] A hash that will be added verbatim to the result hash, as `"extensions" => { ... }`
|
63
|
+
def response_extensions
|
64
|
+
namespace(:__query_result_extensions__)
|
157
65
|
end
|
158
66
|
|
159
67
|
def dataloader
|
160
|
-
@dataloader ||= query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new
|
68
|
+
@dataloader ||= self[:dataloader] || (query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new)
|
161
69
|
end
|
162
70
|
|
163
71
|
# @api private
|
@@ -167,21 +75,85 @@ module GraphQL
|
|
167
75
|
attr_writer :value
|
168
76
|
|
169
77
|
# @api private
|
170
|
-
|
78
|
+
attr_reader :scoped_context
|
171
79
|
|
172
80
|
def []=(key, value)
|
173
81
|
@provided_values[key] = value
|
174
82
|
end
|
175
83
|
|
176
|
-
def_delegators :@query, :trace
|
84
|
+
def_delegators :@query, :trace
|
177
85
|
|
86
|
+
def types
|
87
|
+
@types ||= @query.types
|
88
|
+
end
|
89
|
+
|
90
|
+
attr_writer :types
|
91
|
+
|
92
|
+
RUNTIME_METADATA_KEYS = Set.new([:current_object, :current_arguments, :current_field, :current_path])
|
178
93
|
# @!method []=(key, value)
|
179
94
|
# Reassign `key` to the hash passed to {Schema#execute} as `context:`
|
180
95
|
|
181
96
|
# Lookup `key` from the hash passed to {Schema#execute} as `context:`
|
182
97
|
def [](key)
|
183
|
-
|
184
|
-
|
98
|
+
if @scoped_context.key?(key)
|
99
|
+
@scoped_context[key]
|
100
|
+
elsif @provided_values.key?(key)
|
101
|
+
@provided_values[key]
|
102
|
+
elsif RUNTIME_METADATA_KEYS.include?(key)
|
103
|
+
if key == :current_path
|
104
|
+
current_path
|
105
|
+
else
|
106
|
+
(current_runtime_state = Fiber[:__graphql_runtime_info]) &&
|
107
|
+
(query_runtime_state = current_runtime_state[@query]) &&
|
108
|
+
(query_runtime_state.public_send(key))
|
109
|
+
end
|
110
|
+
else
|
111
|
+
# not found
|
112
|
+
nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Return this value to tell the runtime
|
117
|
+
# to exclude this field from the response altogether
|
118
|
+
def skip
|
119
|
+
GraphQL::Execution::SKIP
|
120
|
+
end
|
121
|
+
|
122
|
+
# Add error at query-level.
|
123
|
+
# @param error [GraphQL::ExecutionError] an execution error
|
124
|
+
# @return [void]
|
125
|
+
def add_error(error)
|
126
|
+
if !error.is_a?(ExecutionError)
|
127
|
+
raise TypeError, "expected error to be a ExecutionError, but was #{error.class}"
|
128
|
+
end
|
129
|
+
errors << error
|
130
|
+
nil
|
131
|
+
end
|
132
|
+
|
133
|
+
# @example Print the GraphQL backtrace during field resolution
|
134
|
+
# puts ctx.backtrace
|
135
|
+
#
|
136
|
+
# @return [GraphQL::Backtrace] The backtrace for this point in query execution
|
137
|
+
def backtrace
|
138
|
+
GraphQL::Backtrace.new(self)
|
139
|
+
end
|
140
|
+
|
141
|
+
def execution_errors
|
142
|
+
@execution_errors ||= ExecutionErrors.new(self)
|
143
|
+
end
|
144
|
+
|
145
|
+
def current_path
|
146
|
+
current_runtime_state = Fiber[:__graphql_runtime_info]
|
147
|
+
query_runtime_state = current_runtime_state && current_runtime_state[@query]
|
148
|
+
|
149
|
+
path = query_runtime_state &&
|
150
|
+
(result = query_runtime_state.current_result) &&
|
151
|
+
(result.path)
|
152
|
+
if path && (rn = query_runtime_state.current_result_name)
|
153
|
+
path = path.dup
|
154
|
+
path.push(rn)
|
155
|
+
end
|
156
|
+
path
|
185
157
|
end
|
186
158
|
|
187
159
|
def delete(key)
|
@@ -195,8 +167,12 @@ module GraphQL
|
|
195
167
|
UNSPECIFIED_FETCH_DEFAULT = Object.new
|
196
168
|
|
197
169
|
def fetch(key, default = UNSPECIFIED_FETCH_DEFAULT)
|
198
|
-
if
|
199
|
-
|
170
|
+
if RUNTIME_METADATA_KEYS.include?(key)
|
171
|
+
(runtime = Fiber[:__graphql_runtime_info]) &&
|
172
|
+
(query_runtime_state = runtime[@query]) &&
|
173
|
+
(query_runtime_state.public_send(key))
|
174
|
+
elsif @scoped_context.key?(key)
|
175
|
+
scoped_context[key]
|
200
176
|
elsif @provided_values.key?(key)
|
201
177
|
@provided_values[key]
|
202
178
|
elsif default != UNSPECIFIED_FETCH_DEFAULT
|
@@ -209,12 +185,30 @@ module GraphQL
|
|
209
185
|
end
|
210
186
|
|
211
187
|
def dig(key, *other_keys)
|
212
|
-
|
188
|
+
if RUNTIME_METADATA_KEYS.include?(key)
|
189
|
+
(current_runtime_state = Fiber[:__graphql_runtime_info]) &&
|
190
|
+
(query_runtime_state = current_runtime_state[@query]) &&
|
191
|
+
(obj = query_runtime_state.public_send(key)) &&
|
192
|
+
if other_keys.empty?
|
193
|
+
obj
|
194
|
+
else
|
195
|
+
obj.dig(*other_keys)
|
196
|
+
end
|
197
|
+
elsif @scoped_context.key?(key)
|
198
|
+
@scoped_context.dig(key, *other_keys)
|
199
|
+
else
|
200
|
+
@provided_values.dig(key, *other_keys)
|
201
|
+
end
|
213
202
|
end
|
214
203
|
|
215
204
|
def to_h
|
216
|
-
|
205
|
+
if (current_scoped_context = @scoped_context.merged_context)
|
206
|
+
@provided_values.merge(current_scoped_context)
|
207
|
+
else
|
208
|
+
@provided_values
|
209
|
+
end
|
217
210
|
end
|
211
|
+
|
218
212
|
alias :to_hash :to_h
|
219
213
|
|
220
214
|
def key?(key)
|
@@ -223,28 +217,38 @@ module GraphQL
|
|
223
217
|
|
224
218
|
# @return [GraphQL::Schema::Warden]
|
225
219
|
def warden
|
226
|
-
@warden ||= @query.warden
|
220
|
+
@warden ||= (@query && @query.warden)
|
227
221
|
end
|
228
222
|
|
223
|
+
# @api private
|
224
|
+
attr_writer :warden
|
225
|
+
|
229
226
|
# Get an isolated hash for `ns`. Doesn't affect user-provided storage.
|
230
227
|
# @param ns [Object] a usage-specific namespace identifier
|
231
228
|
# @return [Hash] namespaced storage
|
232
229
|
def namespace(ns)
|
233
|
-
|
230
|
+
if ns == :interpreter
|
231
|
+
self
|
232
|
+
else
|
233
|
+
@storage[ns]
|
234
|
+
end
|
234
235
|
end
|
235
236
|
|
236
|
-
|
237
|
-
|
237
|
+
# @return [Boolean] true if this namespace was accessed before
|
238
|
+
def namespace?(ns)
|
239
|
+
@storage.key?(ns)
|
238
240
|
end
|
239
241
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
242
|
+
def logger
|
243
|
+
@query && @query.logger
|
244
|
+
end
|
245
|
+
|
246
|
+
def inspect
|
247
|
+
"#<Query::Context ...>"
|
244
248
|
end
|
245
249
|
|
246
250
|
def scoped_merge!(hash)
|
247
|
-
@scoped_context
|
251
|
+
@scoped_context.merge!(hash)
|
248
252
|
end
|
249
253
|
|
250
254
|
def scoped_set!(key, value)
|
@@ -252,117 +256,37 @@ module GraphQL
|
|
252
256
|
nil
|
253
257
|
end
|
254
258
|
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
@irep_node = irep_node
|
269
|
-
@field = irep_node.definition
|
270
|
-
@parent_type = irep_node.owner_type
|
271
|
-
@type = field.type
|
272
|
-
# This is needed constantly, so set it ahead of time:
|
273
|
-
@query = context.query
|
274
|
-
@schema = context.schema
|
275
|
-
@tracers = @query.tracers
|
276
|
-
# This hack flag is required by ConnectionResolve
|
277
|
-
@wrapped_connection = false
|
278
|
-
@wrapped_object = false
|
279
|
-
end
|
280
|
-
|
281
|
-
# @api private
|
282
|
-
attr_accessor :wrapped_connection, :wrapped_object
|
259
|
+
# Use this when you need to do a scoped set _inside_ a lazy-loaded (or batch-loaded)
|
260
|
+
# block of code.
|
261
|
+
#
|
262
|
+
# @example using scoped context inside a promise
|
263
|
+
# scoped_ctx = context.scoped
|
264
|
+
# SomeBatchLoader.load(...).then do |thing|
|
265
|
+
# # use a scoped_ctx which was created _before_ dataloading:
|
266
|
+
# scoped_ctx.set!(:thing, thing)
|
267
|
+
# end
|
268
|
+
# @return [Context::Scoped]
|
269
|
+
def scoped
|
270
|
+
Scoped.new(@scoped_context, current_path)
|
271
|
+
end
|
283
272
|
|
284
|
-
|
285
|
-
|
273
|
+
class Scoped
|
274
|
+
def initialize(scoped_context, path)
|
275
|
+
@path = path
|
276
|
+
@scoped_context = scoped_context
|
286
277
|
end
|
287
278
|
|
288
|
-
|
289
|
-
|
290
|
-
:spawn, :warden, :errors,
|
291
|
-
:execution_strategy, :strategy, :interpreter?
|
292
|
-
|
293
|
-
# @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
|
294
|
-
def ast_node
|
295
|
-
@irep_node.ast_node
|
279
|
+
def merge!(hash)
|
280
|
+
@scoped_context.merge!(hash, at: @path)
|
296
281
|
end
|
297
282
|
|
298
|
-
|
299
|
-
|
300
|
-
# @return [void]
|
301
|
-
def add_error(error)
|
302
|
-
super
|
303
|
-
error.ast_node ||= irep_node.ast_node
|
304
|
-
error.path ||= path
|
283
|
+
def set!(key, value)
|
284
|
+
@scoped_context.merge!({ key => value }, at: @path)
|
305
285
|
nil
|
306
286
|
end
|
307
|
-
|
308
|
-
def inspect
|
309
|
-
"#<GraphQL Context @ #{irep_node.owner_type.name}.#{field.name}>"
|
310
|
-
end
|
311
|
-
|
312
|
-
# Set a new value for this field in the response.
|
313
|
-
# It may be updated after resolving a {Lazy}.
|
314
|
-
# If it is {Execute::PROPAGATE_NULL}, tell the owner to propagate null.
|
315
|
-
# If it's {Execute::Execution::SKIP}, remove this field result from its parent
|
316
|
-
# @param new_value [Any] The GraphQL-ready value
|
317
|
-
# @api private
|
318
|
-
def value=(new_value)
|
319
|
-
case new_value
|
320
|
-
when GraphQL::Execution::Execute::PROPAGATE_NULL, nil
|
321
|
-
@invalid_null = true
|
322
|
-
@value = nil
|
323
|
-
if @type.kind.non_null?
|
324
|
-
@parent.received_null_child
|
325
|
-
end
|
326
|
-
when GraphQL::Execution::Execute::SKIP
|
327
|
-
@parent.skipped = true
|
328
|
-
@parent.delete_child(self)
|
329
|
-
else
|
330
|
-
@value = new_value
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
protected
|
335
|
-
|
336
|
-
def received_null_child
|
337
|
-
case @value
|
338
|
-
when Hash
|
339
|
-
self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
|
340
|
-
when Array
|
341
|
-
if list_of_non_null_items?(@type)
|
342
|
-
self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
|
343
|
-
end
|
344
|
-
when nil
|
345
|
-
# TODO This is a hack
|
346
|
-
# It was already nulled out but it's getting reassigned
|
347
|
-
else
|
348
|
-
raise "Unexpected value for received_null_child (#{self.value.class}): #{value}"
|
349
|
-
end
|
350
|
-
end
|
351
|
-
|
352
|
-
private
|
353
|
-
|
354
|
-
def list_of_non_null_items?(type)
|
355
|
-
case type
|
356
|
-
when GraphQL::NonNullType
|
357
|
-
# Unwrap [T]!
|
358
|
-
list_of_non_null_items?(type.of_type)
|
359
|
-
when GraphQL::ListType
|
360
|
-
type.of_type.is_a?(GraphQL::NonNullType)
|
361
|
-
else
|
362
|
-
raise "Unexpected list_of_non_null_items check: #{type}"
|
363
|
-
end
|
364
|
-
end
|
365
287
|
end
|
366
288
|
end
|
367
289
|
end
|
368
290
|
end
|
291
|
+
|
292
|
+
require "graphql/query/context/scoped_context"
|
@@ -4,6 +4,12 @@ module GraphQL
|
|
4
4
|
class InputValidationResult
|
5
5
|
attr_accessor :problems
|
6
6
|
|
7
|
+
def self.from_problem(explanation, path = nil, extensions: nil, message: nil)
|
8
|
+
result = self.new
|
9
|
+
result.add_problem(explanation, path, extensions: extensions, message: message)
|
10
|
+
result
|
11
|
+
end
|
12
|
+
|
7
13
|
def initialize(valid: true, problems: nil)
|
8
14
|
@valid = valid
|
9
15
|
@problems = problems
|
@@ -27,7 +33,7 @@ module GraphQL
|
|
27
33
|
end
|
28
34
|
|
29
35
|
def merge_result!(path, inner_result)
|
30
|
-
return if inner_result.valid?
|
36
|
+
return if inner_result.nil? || inner_result.valid?
|
31
37
|
|
32
38
|
if inner_result.problems
|
33
39
|
inner_result.problems.each do |p|
|
@@ -38,6 +44,9 @@ module GraphQL
|
|
38
44
|
# It could have been explicitly set on inner_result (if it had no problems)
|
39
45
|
@valid = false
|
40
46
|
end
|
47
|
+
|
48
|
+
VALID = self.new
|
49
|
+
VALID.freeze
|
41
50
|
end
|
42
51
|
end
|
43
52
|
end
|
@@ -1,49 +1,32 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require "graphql/query/context"
|
2
3
|
module GraphQL
|
3
4
|
class Query
|
4
5
|
# This object can be `ctx` in places where there is no query
|
5
|
-
class NullContext
|
6
|
-
|
7
|
-
def visible?(t); true; end
|
8
|
-
def visible_field?(t); true; end
|
9
|
-
def visible_type?(t); true; end
|
10
|
-
end
|
6
|
+
class NullContext < Context
|
7
|
+
include Singleton
|
11
8
|
|
12
9
|
class NullQuery
|
13
|
-
def
|
14
|
-
yield
|
10
|
+
def after_lazy(value)
|
11
|
+
yield(value)
|
15
12
|
end
|
16
13
|
end
|
17
14
|
|
15
|
+
class NullSchema < GraphQL::Schema
|
16
|
+
end
|
17
|
+
|
18
|
+
extend Forwardable
|
19
|
+
|
18
20
|
attr_reader :schema, :query, :warden, :dataloader
|
21
|
+
def_delegators GraphQL::EmptyObjects::EMPTY_HASH, :[], :fetch, :dig, :key?, :to_h
|
19
22
|
|
20
23
|
def initialize
|
21
24
|
@query = NullQuery.new
|
22
25
|
@dataloader = GraphQL::Dataloader::NullDataloader.new
|
23
|
-
@schema =
|
24
|
-
@warden = NullWarden.new(
|
25
|
-
|
26
|
-
|
27
|
-
schema: @schema,
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
def [](key); end
|
32
|
-
|
33
|
-
def interpreter?
|
34
|
-
false
|
35
|
-
end
|
36
|
-
|
37
|
-
class << self
|
38
|
-
extend Forwardable
|
39
|
-
|
40
|
-
def [](key); end
|
41
|
-
|
42
|
-
def instance
|
43
|
-
@instance = self.new
|
44
|
-
end
|
45
|
-
|
46
|
-
def_delegators :instance, :query, :schema, :warden, :interpreter?, :dataloader
|
26
|
+
@schema = NullSchema
|
27
|
+
@warden = Schema::Warden::NullWarden.new(context: self, schema: @schema)
|
28
|
+
@types = @warden.visibility_profile
|
29
|
+
freeze
|
47
30
|
end
|
48
31
|
end
|
49
32
|
end
|
@@ -14,12 +14,10 @@ module GraphQL
|
|
14
14
|
#
|
15
15
|
# @api private
|
16
16
|
class ValidationPipeline
|
17
|
-
attr_reader :max_depth, :max_complexity
|
17
|
+
attr_reader :max_depth, :max_complexity, :validate_timeout_remaining
|
18
18
|
|
19
|
-
def initialize(query:,
|
19
|
+
def initialize(query:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
|
20
20
|
@validation_errors = []
|
21
|
-
@internal_representation = nil
|
22
|
-
@validate = validate
|
23
21
|
@parse_error = parse_error
|
24
22
|
@operation_name_error = operation_name_error
|
25
23
|
@query = query
|
@@ -42,17 +40,15 @@ module GraphQL
|
|
42
40
|
@validation_errors
|
43
41
|
end
|
44
42
|
|
45
|
-
# @return [Hash<String, nil => GraphQL::InternalRepresentation::Node] Operation name -> Irep node pairs
|
46
|
-
def internal_representation
|
47
|
-
ensure_has_validated
|
48
|
-
@internal_representation
|
49
|
-
end
|
50
|
-
|
51
43
|
def analyzers
|
52
44
|
ensure_has_validated
|
53
45
|
@query_analyzers
|
54
46
|
end
|
55
47
|
|
48
|
+
def has_validated?
|
49
|
+
@has_validated == true
|
50
|
+
end
|
51
|
+
|
56
52
|
private
|
57
53
|
|
58
54
|
# If the pipeline wasn't run yet, run it.
|
@@ -63,7 +59,7 @@ module GraphQL
|
|
63
59
|
|
64
60
|
if @parse_error
|
65
61
|
# This is kind of crazy: we push the parse error into `ctx`
|
66
|
-
# in
|
62
|
+
# in `def self.parse_error` by default so that users can _opt out_ by redefining that hook.
|
67
63
|
# That means we can't _re-add_ the error here (otherwise we'd either
|
68
64
|
# add it twice _or_ override the user's choice to not add it).
|
69
65
|
# So we just have to know that it was invalid and go from there.
|
@@ -72,10 +68,10 @@ module GraphQL
|
|
72
68
|
elsif @operation_name_error
|
73
69
|
@validation_errors << @operation_name_error
|
74
70
|
else
|
75
|
-
|
71
|
+
validator = @query.static_validator || @schema.static_validator
|
72
|
+
validation_result = validator.validate(@query, validate: @query.validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
|
76
73
|
@validation_errors.concat(validation_result[:errors])
|
77
|
-
@
|
78
|
-
|
74
|
+
@validate_timeout_remaining = validation_result[:remaining_timeout]
|
79
75
|
if @validation_errors.empty?
|
80
76
|
@validation_errors.concat(@query.variables.errors)
|
81
77
|
end
|
@@ -100,35 +96,15 @@ module GraphQL
|
|
100
96
|
def build_analyzers(schema, max_depth, max_complexity)
|
101
97
|
qa = schema.query_analyzers.dup
|
102
98
|
|
103
|
-
# Filter out the built in authorization analyzer.
|
104
|
-
# It is deprecated and does not have an AST analyzer alternative.
|
105
|
-
qa = qa.select do |analyzer|
|
106
|
-
if analyzer == GraphQL::Authorization::Analyzer && schema.using_ast_analysis?
|
107
|
-
raise "The Authorization analyzer is not supported with AST Analyzers"
|
108
|
-
else
|
109
|
-
true
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
99
|
if max_depth || max_complexity
|
114
100
|
# Depending on the analysis engine, we must use different analyzers
|
115
101
|
# remove this once everything has switched over to AST analyzers
|
116
|
-
if
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
qa << GraphQL::Analysis::AST::MaxQueryComplexity
|
122
|
-
end
|
123
|
-
else
|
124
|
-
if max_depth
|
125
|
-
qa << GraphQL::Analysis::MaxQueryDepth.new(max_depth)
|
126
|
-
end
|
127
|
-
if max_complexity
|
128
|
-
qa << GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)
|
129
|
-
end
|
102
|
+
if max_depth
|
103
|
+
qa << GraphQL::Analysis::MaxQueryDepth
|
104
|
+
end
|
105
|
+
if max_complexity
|
106
|
+
qa << GraphQL::Analysis::MaxQueryComplexity
|
130
107
|
end
|
131
|
-
|
132
108
|
qa
|
133
109
|
else
|
134
110
|
qa
|
@@ -4,13 +4,13 @@ module GraphQL
|
|
4
4
|
class VariableValidationError < GraphQL::ExecutionError
|
5
5
|
attr_accessor :value, :validation_result
|
6
6
|
|
7
|
-
def initialize(variable_ast, type, value, validation_result)
|
7
|
+
def initialize(variable_ast, type, value, validation_result, msg: nil)
|
8
8
|
@value = value
|
9
9
|
@validation_result = validation_result
|
10
10
|
|
11
|
-
msg
|
11
|
+
msg ||= "Variable $#{variable_ast.name} of type #{type.to_type_signature} was provided invalid value"
|
12
12
|
|
13
|
-
if problem_fields.
|
13
|
+
if !problem_fields.empty?
|
14
14
|
msg += " for #{problem_fields.join(", ")}"
|
15
15
|
end
|
16
16
|
|