graphql 1.12.12 → 2.2.14
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 +14 -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 +6 -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 +19 -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/ast/analyzer.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +55 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +88 -140
- data/lib/graphql/analysis/ast/query_depth.rb +7 -3
- data/lib/graphql/analysis/ast/visitor.rb +50 -42
- data/lib/graphql/analysis/ast.rb +26 -23
- data/lib/graphql/analysis.rb +0 -7
- 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/dataloader/async_dataloader.rb +85 -0
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +120 -31
- data/lib/graphql/dataloader.rb +168 -142
- 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/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +36 -34
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
- data/lib/graphql/execution/interpreter/runtime.rb +414 -341
- data/lib/graphql/execution/interpreter.rb +122 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +125 -54
- 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 +5 -3
- 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 +3 -3
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +12 -5
- data/lib/graphql/introspection/type_type.rb +25 -12
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +78 -65
- data/lib/graphql/language/lexer.rb +345 -1467
- data/lib/graphql/language/nodes.rb +145 -91
- data/lib/graphql/language/parser.rb +701 -1921
- data/lib/graphql/language/printer.rb +351 -155
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +1 -0
- 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 +109 -189
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +14 -29
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +78 -65
- data/lib/graphql/railtie.rb +8 -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.rb +4 -0
- data/lib/graphql/schema/addition.rb +78 -45
- data/lib/graphql/schema/always_visible.rb +10 -0
- data/lib/graphql/schema/argument.rb +134 -80
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +60 -38
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +2 -2
- 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 +33 -21
- data/lib/graphql/schema/enum.rb +93 -46
- data/lib/graphql/schema/enum_value.rb +4 -21
- data/lib/graphql/schema/field/connection_extension.rb +6 -16
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +432 -337
- 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 +156 -0
- data/lib/graphql/schema/input_object.rb +88 -90
- data/lib/graphql/schema/interface.rb +19 -59
- data/lib/graphql/schema/introspection_system.rb +6 -9
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +3 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +18 -19
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +288 -84
- 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 +149 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- 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 +17 -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 +0 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +30 -119
- data/lib/graphql/schema/printer.rb +23 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -90
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +101 -102
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +45 -17
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +15 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- 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 +29 -15
- data/lib/graphql/schema/validator.rb +35 -27
- data/lib/graphql/schema/warden.rb +259 -132
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +658 -989
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +14 -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 +21 -4
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +54 -28
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/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 +5 -3
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
- 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 +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
- data/lib/graphql/static_validation/validation_context.rb +16 -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 +46 -9
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +75 -37
- data/lib/graphql/subscriptions/serialize.rb +25 -3
- data/lib/graphql/subscriptions.rb +59 -47
- data/lib/graphql/testing/helpers.rb +129 -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 +251 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +183 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +25 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +10 -28
- data/lib/graphql/tracing/legacy_trace.rb +69 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -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 +4 -2
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/sentry_trace.rb +112 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/trace.rb +76 -0
- data/lib/graphql/tracing.rb +20 -41
- data/lib/graphql/type_kinds.rb +6 -3
- 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 +82 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +36 -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 +7 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +33 -95
- data/readme.md +13 -6
- metadata +102 -185
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/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/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/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,53 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require "graphql/query/context/scoped_context"
|
3
|
+
|
2
4
|
module GraphQL
|
3
5
|
class Query
|
4
6
|
# Expose some query-specific info to field resolve functions.
|
5
7
|
# It delegates `[]` to the hash that's passed to `GraphQL::Query#initialize`.
|
6
8
|
class Context
|
7
9
|
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
10
|
# Return this value to tell the runtime
|
22
11
|
# to exclude this field from the response altogether
|
23
12
|
def skip
|
24
|
-
GraphQL::Execution::
|
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
|
-
)
|
13
|
+
GraphQL::Execution::SKIP
|
51
14
|
end
|
52
15
|
|
53
16
|
# Add error at query-level.
|
@@ -72,12 +35,6 @@ module GraphQL
|
|
72
35
|
def execution_errors
|
73
36
|
@execution_errors ||= ExecutionErrors.new(self)
|
74
37
|
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
38
|
end
|
82
39
|
|
83
40
|
class ExecutionErrors
|
@@ -105,27 +62,6 @@ module GraphQL
|
|
105
62
|
include SharedMethods
|
106
63
|
extend Forwardable
|
107
64
|
|
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
65
|
# @return [Array<GraphQL::ExecutionError>] errors returned during execution
|
130
66
|
attr_reader :errors
|
131
67
|
|
@@ -152,12 +88,17 @@ module GraphQL
|
|
152
88
|
@errors = []
|
153
89
|
@path = []
|
154
90
|
@value = nil
|
155
|
-
@context = self # for SharedMethods
|
156
|
-
@scoped_context =
|
91
|
+
@context = self # for SharedMethods TODO delete sharedmethods
|
92
|
+
@scoped_context = ScopedContext.new(self)
|
93
|
+
end
|
94
|
+
|
95
|
+
# @return [Hash] A hash that will be added verbatim to the result hash, as `"extensions" => { ... }`
|
96
|
+
def response_extensions
|
97
|
+
namespace(:__query_result_extensions__)
|
157
98
|
end
|
158
99
|
|
159
100
|
def dataloader
|
160
|
-
@dataloader ||= query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new
|
101
|
+
@dataloader ||= self[:dataloader] || (query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new)
|
161
102
|
end
|
162
103
|
|
163
104
|
# @api private
|
@@ -167,7 +108,7 @@ module GraphQL
|
|
167
108
|
attr_writer :value
|
168
109
|
|
169
110
|
# @api private
|
170
|
-
|
111
|
+
attr_reader :scoped_context
|
171
112
|
|
172
113
|
def []=(key, value)
|
173
114
|
@provided_values[key] = value
|
@@ -175,13 +116,42 @@ module GraphQL
|
|
175
116
|
|
176
117
|
def_delegators :@query, :trace, :interpreter?
|
177
118
|
|
119
|
+
RUNTIME_METADATA_KEYS = Set.new([:current_object, :current_arguments, :current_field, :current_path])
|
178
120
|
# @!method []=(key, value)
|
179
121
|
# Reassign `key` to the hash passed to {Schema#execute} as `context:`
|
180
122
|
|
181
123
|
# Lookup `key` from the hash passed to {Schema#execute} as `context:`
|
182
124
|
def [](key)
|
183
|
-
|
184
|
-
|
125
|
+
if @scoped_context.key?(key)
|
126
|
+
@scoped_context[key]
|
127
|
+
elsif @provided_values.key?(key)
|
128
|
+
@provided_values[key]
|
129
|
+
elsif RUNTIME_METADATA_KEYS.include?(key)
|
130
|
+
if key == :current_path
|
131
|
+
current_path
|
132
|
+
else
|
133
|
+
(current_runtime_state = Thread.current[:__graphql_runtime_info]) &&
|
134
|
+
(query_runtime_state = current_runtime_state[@query]) &&
|
135
|
+
(query_runtime_state.public_send(key))
|
136
|
+
end
|
137
|
+
else
|
138
|
+
# not found
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def current_path
|
144
|
+
current_runtime_state = Thread.current[:__graphql_runtime_info]
|
145
|
+
query_runtime_state = current_runtime_state && current_runtime_state[@query]
|
146
|
+
|
147
|
+
path = query_runtime_state &&
|
148
|
+
(result = query_runtime_state.current_result) &&
|
149
|
+
(result.path)
|
150
|
+
if path && (rn = query_runtime_state.current_result_name)
|
151
|
+
path = path.dup
|
152
|
+
path.push(rn)
|
153
|
+
end
|
154
|
+
path
|
185
155
|
end
|
186
156
|
|
187
157
|
def delete(key)
|
@@ -195,8 +165,12 @@ module GraphQL
|
|
195
165
|
UNSPECIFIED_FETCH_DEFAULT = Object.new
|
196
166
|
|
197
167
|
def fetch(key, default = UNSPECIFIED_FETCH_DEFAULT)
|
198
|
-
if
|
199
|
-
|
168
|
+
if RUNTIME_METADATA_KEYS.include?(key)
|
169
|
+
(runtime = Thread.current[:__graphql_runtime_info]) &&
|
170
|
+
(query_runtime_state = runtime[@query]) &&
|
171
|
+
(query_runtime_state.public_send(key))
|
172
|
+
elsif @scoped_context.key?(key)
|
173
|
+
scoped_context[key]
|
200
174
|
elsif @provided_values.key?(key)
|
201
175
|
@provided_values[key]
|
202
176
|
elsif default != UNSPECIFIED_FETCH_DEFAULT
|
@@ -209,12 +183,30 @@ module GraphQL
|
|
209
183
|
end
|
210
184
|
|
211
185
|
def dig(key, *other_keys)
|
212
|
-
|
186
|
+
if RUNTIME_METADATA_KEYS.include?(key)
|
187
|
+
(current_runtime_state = Thread.current[:__graphql_runtime_info]) &&
|
188
|
+
(query_runtime_state = current_runtime_state[@query]) &&
|
189
|
+
(obj = query_runtime_state.public_send(key)) &&
|
190
|
+
if other_keys.empty?
|
191
|
+
obj
|
192
|
+
else
|
193
|
+
obj.dig(*other_keys)
|
194
|
+
end
|
195
|
+
elsif @scoped_context.key?(key)
|
196
|
+
@scoped_context.dig(key, *other_keys)
|
197
|
+
else
|
198
|
+
@provided_values.dig(key, *other_keys)
|
199
|
+
end
|
213
200
|
end
|
214
201
|
|
215
202
|
def to_h
|
216
|
-
|
203
|
+
if (current_scoped_context = @scoped_context.merged_context)
|
204
|
+
@provided_values.merge(current_scoped_context)
|
205
|
+
else
|
206
|
+
@provided_values
|
207
|
+
end
|
217
208
|
end
|
209
|
+
|
218
210
|
alias :to_hash :to_h
|
219
211
|
|
220
212
|
def key?(key)
|
@@ -223,28 +215,38 @@ module GraphQL
|
|
223
215
|
|
224
216
|
# @return [GraphQL::Schema::Warden]
|
225
217
|
def warden
|
226
|
-
@warden ||= @query.warden
|
218
|
+
@warden ||= (@query && @query.warden)
|
227
219
|
end
|
228
220
|
|
221
|
+
# @api private
|
222
|
+
attr_writer :warden
|
223
|
+
|
229
224
|
# Get an isolated hash for `ns`. Doesn't affect user-provided storage.
|
230
225
|
# @param ns [Object] a usage-specific namespace identifier
|
231
226
|
# @return [Hash] namespaced storage
|
232
227
|
def namespace(ns)
|
233
|
-
|
228
|
+
if ns == :interpreter
|
229
|
+
self
|
230
|
+
else
|
231
|
+
@storage[ns]
|
232
|
+
end
|
234
233
|
end
|
235
234
|
|
236
|
-
|
237
|
-
|
235
|
+
# @return [Boolean] true if this namespace was accessed before
|
236
|
+
def namespace?(ns)
|
237
|
+
@storage.key?(ns)
|
238
238
|
end
|
239
239
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
240
|
+
def logger
|
241
|
+
@query && @query.logger
|
242
|
+
end
|
243
|
+
|
244
|
+
def inspect
|
245
|
+
"#<Query::Context ...>"
|
244
246
|
end
|
245
247
|
|
246
248
|
def scoped_merge!(hash)
|
247
|
-
@scoped_context
|
249
|
+
@scoped_context.merge!(hash)
|
248
250
|
end
|
249
251
|
|
250
252
|
def scoped_set!(key, value)
|
@@ -252,116 +254,34 @@ module GraphQL
|
|
252
254
|
nil
|
253
255
|
end
|
254
256
|
|
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
|
257
|
+
# Use this when you need to do a scoped set _inside_ a lazy-loaded (or batch-loaded)
|
258
|
+
# block of code.
|
259
|
+
#
|
260
|
+
# @example using scoped context inside a promise
|
261
|
+
# scoped_ctx = context.scoped
|
262
|
+
# SomeBatchLoader.load(...).then do |thing|
|
263
|
+
# # use a scoped_ctx which was created _before_ dataloading:
|
264
|
+
# scoped_ctx.set!(:thing, thing)
|
265
|
+
# end
|
266
|
+
# @return [Context::Scoped]
|
267
|
+
def scoped
|
268
|
+
Scoped.new(@scoped_context, current_path)
|
269
|
+
end
|
283
270
|
|
284
|
-
|
285
|
-
|
271
|
+
class Scoped
|
272
|
+
def initialize(scoped_context, path)
|
273
|
+
@path = path
|
274
|
+
@scoped_context = scoped_context
|
286
275
|
end
|
287
276
|
|
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
|
277
|
+
def merge!(hash)
|
278
|
+
@scoped_context.merge!(hash, at: @path)
|
296
279
|
end
|
297
280
|
|
298
|
-
|
299
|
-
|
300
|
-
# @return [void]
|
301
|
-
def add_error(error)
|
302
|
-
super
|
303
|
-
error.ast_node ||= irep_node.ast_node
|
304
|
-
error.path ||= path
|
281
|
+
def set!(key, value)
|
282
|
+
@scoped_context.merge!({ key => value }, at: @path)
|
305
283
|
nil
|
306
284
|
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
285
|
end
|
366
286
|
end
|
367
287
|
end
|
@@ -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,34 @@
|
|
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?
|
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
|
-
GraphQL::Filter.new,
|
26
|
-
context: self,
|
27
|
-
schema: @schema,
|
28
|
-
)
|
26
|
+
@schema = NullSchema
|
27
|
+
@warden = Schema::Warden::NullWarden.new(context: self, schema: @schema)
|
29
28
|
end
|
30
29
|
|
31
|
-
def [](key); end
|
32
|
-
|
33
30
|
def interpreter?
|
34
|
-
|
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
|
31
|
+
true
|
47
32
|
end
|
48
33
|
end
|
49
34
|
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::AST::MaxQueryDepth
|
104
|
+
end
|
105
|
+
if max_complexity
|
106
|
+
qa << GraphQL::Analysis::AST::MaxQueryComplexity
|
130
107
|
end
|
131
|
-
|
132
108
|
qa
|
133
109
|
else
|
134
110
|
qa
|
@@ -4,11 +4,11 @@ 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
13
|
if problem_fields.any?
|
14
14
|
msg += " for #{problem_fields.join(", ")}"
|