graphql 1.9.21 → 2.0.16
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 +17 -8
- data/lib/graphql/analysis/ast.rb +14 -14
- 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/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +20 -17
- 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 +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +44 -25
- data/lib/graphql/execution/interpreter/runtime.rb +755 -395
- data/lib/graphql/execution/interpreter.rb +201 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -9
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +5 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +1 -1
- 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 +11 -5
- 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 +10 -10
- 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 +104 -68
- data/lib/graphql/language/lexer.rb +83 -40
- data/lib/graphql/language/lexer.rl +31 -9
- data/lib/graphql/language/nodes.rb +64 -93
- data/lib/graphql/language/parser.rb +940 -896
- data/lib/graphql/language/parser.y +130 -103
- 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 +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -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 +172 -198
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +21 -8
- 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 +74 -38
- 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 +286 -31
- 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 +334 -220
- 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 +117 -14
- data/lib/graphql/schema/enum.rb +113 -22
- data/lib/graphql/schema/enum_value.rb +16 -21
- 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 +491 -329
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +28 -43
- data/lib/graphql/schema/introspection_system.rb +101 -38
- data/lib/graphql/schema/late_bound_type.rb +7 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -102
- data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +261 -24
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +113 -0
- data/lib/graphql/schema/member/has_fields.rb +99 -34
- data/lib/graphql/schema/member/has_interfaces.rb +88 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +38 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -6
- data/lib/graphql/schema/resolver.rb +146 -93
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +55 -26
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +22 -5
- data/lib/graphql/schema/union.rb +48 -14
- 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 +187 -33
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +773 -892
- 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 +55 -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 +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/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 +31 -19
- 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 +85 -31
- 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_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +67 -38
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -36
- 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 +158 -0
- data/lib/graphql/types/relay/default_relay.rb +27 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +65 -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 +19 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -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 +41 -58
- data/readme.md +3 -6
- metadata +103 -237
- 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 -53
- data/lib/graphql/define/instance_definable.rb +0 -311
- 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/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 -74
- 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 -135
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,55 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# test_via: ../execution/execute.rb
|
3
|
-
# test_via: ../execution/lazy.rb
|
4
2
|
module GraphQL
|
5
3
|
class Query
|
6
4
|
# Expose some query-specific info to field resolve functions.
|
7
5
|
# It delegates `[]` to the hash that's passed to `GraphQL::Query#initialize`.
|
8
6
|
class Context
|
9
7
|
module SharedMethods
|
10
|
-
# @return [Object] The target for field resolution
|
11
|
-
attr_accessor :object
|
12
|
-
|
13
|
-
# @return [Hash, Array, String, Integer, Float, Boolean, nil] The resolved value for this field
|
14
|
-
attr_reader :value
|
15
|
-
|
16
|
-
# @return [Boolean] were any fields of this selection skipped?
|
17
|
-
attr_reader :skipped
|
18
|
-
alias :skipped? :skipped
|
19
|
-
|
20
|
-
# @api private
|
21
|
-
attr_writer :skipped
|
22
|
-
|
23
8
|
# Return this value to tell the runtime
|
24
9
|
# to exclude this field from the response altogether
|
25
10
|
def skip
|
26
|
-
GraphQL::Execution::
|
27
|
-
end
|
28
|
-
|
29
|
-
# @return [Boolean] True if this selection has been nullified by a null child
|
30
|
-
def invalid_null?
|
31
|
-
@invalid_null
|
32
|
-
end
|
33
|
-
|
34
|
-
# Remove this child from the result value
|
35
|
-
# (used for null propagation and skip)
|
36
|
-
# @api private
|
37
|
-
def delete(child_ctx)
|
38
|
-
@value.delete(child_ctx.key)
|
39
|
-
end
|
40
|
-
|
41
|
-
# Create a child context to use for `key`
|
42
|
-
# @param key [String, Integer] The key in the response (name or index)
|
43
|
-
# @param irep_node [InternalRepresentation::Node] The node being evaluated
|
44
|
-
# @api private
|
45
|
-
def spawn_child(key:, irep_node:, object:)
|
46
|
-
FieldResolutionContext.new(
|
47
|
-
@context,
|
48
|
-
key,
|
49
|
-
irep_node,
|
50
|
-
self,
|
51
|
-
object
|
52
|
-
)
|
11
|
+
GraphQL::Execution::SKIP
|
53
12
|
end
|
54
13
|
|
55
14
|
# Add error at query-level.
|
@@ -74,12 +33,6 @@ module GraphQL
|
|
74
33
|
def execution_errors
|
75
34
|
@execution_errors ||= ExecutionErrors.new(self)
|
76
35
|
end
|
77
|
-
|
78
|
-
def lookahead
|
79
|
-
ast_nodes = irep_node.ast_nodes
|
80
|
-
field = irep_node.definition.metadata[:type_class] || raise("Lookahead is only compatible with class-based schemas")
|
81
|
-
Execution::Lookahead.new(query: query, ast_nodes: ast_nodes, field: field)
|
82
|
-
end
|
83
36
|
end
|
84
37
|
|
85
38
|
class ExecutionErrors
|
@@ -107,27 +60,6 @@ module GraphQL
|
|
107
60
|
include SharedMethods
|
108
61
|
extend Forwardable
|
109
62
|
|
110
|
-
attr_reader :execution_strategy
|
111
|
-
# `strategy` is required by GraphQL::Batch
|
112
|
-
alias_method :strategy, :execution_strategy
|
113
|
-
|
114
|
-
def execution_strategy=(new_strategy)
|
115
|
-
# GraphQL::Batch re-assigns this value but it was previously not used
|
116
|
-
# (ExecutionContext#strategy was used instead)
|
117
|
-
# now it _is_ used, but it breaks GraphQL::Batch tests
|
118
|
-
@execution_strategy ||= new_strategy
|
119
|
-
end
|
120
|
-
|
121
|
-
# @return [GraphQL::InternalRepresentation::Node] The internal representation for this query node
|
122
|
-
def irep_node
|
123
|
-
@irep_node ||= query.irep_selection
|
124
|
-
end
|
125
|
-
|
126
|
-
# @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
|
127
|
-
def ast_node
|
128
|
-
@irep_node.ast_node
|
129
|
-
end
|
130
|
-
|
131
63
|
# @return [Array<GraphQL::ExecutionError>] errors returned during execution
|
132
64
|
attr_reader :errors
|
133
65
|
|
@@ -154,8 +86,101 @@ module GraphQL
|
|
154
86
|
@errors = []
|
155
87
|
@path = []
|
156
88
|
@value = nil
|
157
|
-
@context = self # for SharedMethods
|
158
|
-
@scoped_context =
|
89
|
+
@context = self # for SharedMethods TODO delete sharedmethods
|
90
|
+
@scoped_context = ScopedContext.new(self)
|
91
|
+
end
|
92
|
+
|
93
|
+
class ScopedContext
|
94
|
+
def initialize(query_context)
|
95
|
+
@query_context = query_context
|
96
|
+
@scoped_contexts = {}
|
97
|
+
@no_path = [].freeze
|
98
|
+
end
|
99
|
+
|
100
|
+
def merged_context
|
101
|
+
merged_ctx = {}
|
102
|
+
each_present_path_ctx do |path_ctx|
|
103
|
+
merged_ctx = path_ctx.merge(merged_ctx)
|
104
|
+
end
|
105
|
+
merged_ctx
|
106
|
+
end
|
107
|
+
|
108
|
+
def merge!(hash)
|
109
|
+
ctx = @scoped_contexts
|
110
|
+
current_path.each do |path_part|
|
111
|
+
ctx = ctx[path_part] ||= { parent: ctx }
|
112
|
+
end
|
113
|
+
this_scoped_ctx = ctx[:scoped_context] ||= {}
|
114
|
+
this_scoped_ctx.merge!(hash)
|
115
|
+
end
|
116
|
+
|
117
|
+
def current_path
|
118
|
+
thread_info = Thread.current[:__graphql_runtime_info]
|
119
|
+
(thread_info && thread_info[:current_path]) || @no_path
|
120
|
+
end
|
121
|
+
|
122
|
+
def key?(key)
|
123
|
+
each_present_path_ctx do |path_ctx|
|
124
|
+
if path_ctx.key?(key)
|
125
|
+
return true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
false
|
129
|
+
end
|
130
|
+
|
131
|
+
def [](key)
|
132
|
+
each_present_path_ctx do |path_ctx|
|
133
|
+
if path_ctx.key?(key)
|
134
|
+
return path_ctx[key]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
nil
|
138
|
+
end
|
139
|
+
|
140
|
+
def dig(key, *other_keys)
|
141
|
+
each_present_path_ctx do |path_ctx|
|
142
|
+
if path_ctx.key?(key)
|
143
|
+
found_value = path_ctx[key]
|
144
|
+
if other_keys.any?
|
145
|
+
return found_value.dig(*other_keys)
|
146
|
+
else
|
147
|
+
return found_value
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
nil
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
# Start at the current location,
|
157
|
+
# but look up the tree for previously-assigned scoped values
|
158
|
+
def each_present_path_ctx
|
159
|
+
ctx = @scoped_contexts
|
160
|
+
current_path.each do |path_part|
|
161
|
+
if ctx.key?(path_part)
|
162
|
+
ctx = ctx[path_part]
|
163
|
+
else
|
164
|
+
break
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
while ctx
|
169
|
+
if (scoped_ctx = ctx[:scoped_context])
|
170
|
+
yield(scoped_ctx)
|
171
|
+
end
|
172
|
+
ctx = ctx[:parent]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# @return [Hash] A hash that will be added verbatim to the result hash, as `"extensions" => { ... }`
|
178
|
+
def response_extensions
|
179
|
+
namespace(:__query_result_extensions__)
|
180
|
+
end
|
181
|
+
|
182
|
+
def dataloader
|
183
|
+
@dataloader ||= self[:dataloader] || (query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new)
|
159
184
|
end
|
160
185
|
|
161
186
|
# @api private
|
@@ -165,24 +190,79 @@ module GraphQL
|
|
165
190
|
attr_writer :value
|
166
191
|
|
167
192
|
# @api private
|
168
|
-
|
193
|
+
attr_reader :scoped_context
|
194
|
+
|
195
|
+
def []=(key, value)
|
196
|
+
@provided_values[key] = value
|
197
|
+
end
|
169
198
|
|
170
|
-
def_delegators :@provided_values, :[]=
|
171
|
-
def_delegators :to_h, :fetch, :dig
|
172
199
|
def_delegators :@query, :trace, :interpreter?
|
173
200
|
|
201
|
+
RUNTIME_METADATA_KEYS = Set.new([:current_object, :current_arguments, :current_field, :current_path])
|
174
202
|
# @!method []=(key, value)
|
175
203
|
# Reassign `key` to the hash passed to {Schema#execute} as `context:`
|
176
204
|
|
177
205
|
# Lookup `key` from the hash passed to {Schema#execute} as `context:`
|
178
206
|
def [](key)
|
179
|
-
|
180
|
-
|
207
|
+
if @scoped_context.key?(key)
|
208
|
+
@scoped_context[key]
|
209
|
+
elsif @provided_values.key?(key)
|
210
|
+
@provided_values[key]
|
211
|
+
elsif RUNTIME_METADATA_KEYS.include?(key)
|
212
|
+
thread_info = Thread.current[:__graphql_runtime_info]
|
213
|
+
thread_info && thread_info[key]
|
214
|
+
else
|
215
|
+
# not found
|
216
|
+
nil
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def delete(key)
|
221
|
+
if @scoped_context.key?(key)
|
222
|
+
@scoped_context.delete(key)
|
223
|
+
else
|
224
|
+
@provided_values.delete(key)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
UNSPECIFIED_FETCH_DEFAULT = Object.new
|
229
|
+
|
230
|
+
def fetch(key, default = UNSPECIFIED_FETCH_DEFAULT)
|
231
|
+
if RUNTIME_METADATA_KEYS.include?(key)
|
232
|
+
(thread_info = Thread.current[:__graphql_runtime_info]) &&
|
233
|
+
thread_info[key]
|
234
|
+
elsif @scoped_context.key?(key)
|
235
|
+
scoped_context[key]
|
236
|
+
elsif @provided_values.key?(key)
|
237
|
+
@provided_values[key]
|
238
|
+
elsif default != UNSPECIFIED_FETCH_DEFAULT
|
239
|
+
default
|
240
|
+
elsif block_given?
|
241
|
+
yield(self, key)
|
242
|
+
else
|
243
|
+
raise KeyError.new(key: key)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def dig(key, *other_keys)
|
248
|
+
if RUNTIME_METADATA_KEYS.include?(key)
|
249
|
+
(thread_info = Thread.current[:__graphql_runtime_info]).key?(key) &&
|
250
|
+
thread_info.dig(key, *other_keys)
|
251
|
+
elsif @scoped_context.key?(key)
|
252
|
+
@scoped_context.dig(key, *other_keys)
|
253
|
+
else
|
254
|
+
@provided_values.dig(key, *other_keys)
|
255
|
+
end
|
181
256
|
end
|
182
257
|
|
183
258
|
def to_h
|
184
|
-
|
259
|
+
if (current_scoped_context = @scoped_context.merged_context)
|
260
|
+
@provided_values.merge(current_scoped_context)
|
261
|
+
else
|
262
|
+
@provided_values
|
263
|
+
end
|
185
264
|
end
|
265
|
+
|
186
266
|
alias :to_hash :to_h
|
187
267
|
|
188
268
|
def key?(key)
|
@@ -191,146 +271,40 @@ module GraphQL
|
|
191
271
|
|
192
272
|
# @return [GraphQL::Schema::Warden]
|
193
273
|
def warden
|
194
|
-
@warden ||= @query.warden
|
274
|
+
@warden ||= (@query && @query.warden)
|
195
275
|
end
|
196
276
|
|
277
|
+
# @api private
|
278
|
+
attr_writer :warden
|
279
|
+
|
197
280
|
# Get an isolated hash for `ns`. Doesn't affect user-provided storage.
|
198
281
|
# @param ns [Object] a usage-specific namespace identifier
|
199
282
|
# @return [Hash] namespaced storage
|
200
283
|
def namespace(ns)
|
201
|
-
|
284
|
+
if ns == :interpreter
|
285
|
+
self
|
286
|
+
else
|
287
|
+
@storage[ns]
|
288
|
+
end
|
202
289
|
end
|
203
290
|
|
204
|
-
|
205
|
-
|
291
|
+
# @return [Boolean] true if this namespace was accessed before
|
292
|
+
def namespace?(ns)
|
293
|
+
@storage.key?(ns)
|
206
294
|
end
|
207
295
|
|
208
|
-
|
209
|
-
|
210
|
-
@invalid_null = true
|
211
|
-
@value = nil
|
296
|
+
def inspect
|
297
|
+
"#<Query::Context ...>"
|
212
298
|
end
|
213
299
|
|
214
300
|
def scoped_merge!(hash)
|
215
|
-
@scoped_context
|
301
|
+
@scoped_context.merge!(hash)
|
216
302
|
end
|
217
303
|
|
218
304
|
def scoped_set!(key, value)
|
219
305
|
scoped_merge!(key => value)
|
220
306
|
nil
|
221
307
|
end
|
222
|
-
|
223
|
-
class FieldResolutionContext
|
224
|
-
include SharedMethods
|
225
|
-
include Tracing::Traceable
|
226
|
-
extend Forwardable
|
227
|
-
|
228
|
-
attr_reader :irep_node, :field, :parent_type, :query, :schema, :parent, :key, :type
|
229
|
-
alias :selection :irep_node
|
230
|
-
|
231
|
-
def initialize(context, key, irep_node, parent, object)
|
232
|
-
@context = context
|
233
|
-
@key = key
|
234
|
-
@parent = parent
|
235
|
-
@object = object
|
236
|
-
@irep_node = irep_node
|
237
|
-
@field = irep_node.definition
|
238
|
-
@parent_type = irep_node.owner_type
|
239
|
-
@type = field.type
|
240
|
-
# This is needed constantly, so set it ahead of time:
|
241
|
-
@query = context.query
|
242
|
-
@schema = context.schema
|
243
|
-
@tracers = @query.tracers
|
244
|
-
# This hack flag is required by ConnectionResolve
|
245
|
-
@wrapped_connection = false
|
246
|
-
@wrapped_object = false
|
247
|
-
end
|
248
|
-
|
249
|
-
# @api private
|
250
|
-
attr_accessor :wrapped_connection, :wrapped_object
|
251
|
-
|
252
|
-
def path
|
253
|
-
@path ||= @parent.path.dup << @key
|
254
|
-
end
|
255
|
-
|
256
|
-
def_delegators :@context,
|
257
|
-
:[], :[]=, :key?, :fetch, :to_h, :namespace, :dig,
|
258
|
-
:spawn, :warden, :errors,
|
259
|
-
:execution_strategy, :strategy, :interpreter?
|
260
|
-
|
261
|
-
# @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
|
262
|
-
def ast_node
|
263
|
-
@irep_node.ast_node
|
264
|
-
end
|
265
|
-
|
266
|
-
# Add error to current field resolution.
|
267
|
-
# @param error [GraphQL::ExecutionError] an execution error
|
268
|
-
# @return [void]
|
269
|
-
def add_error(error)
|
270
|
-
super
|
271
|
-
error.ast_node ||= irep_node.ast_node
|
272
|
-
error.path ||= path
|
273
|
-
nil
|
274
|
-
end
|
275
|
-
|
276
|
-
def inspect
|
277
|
-
"#<GraphQL Context @ #{irep_node.owner_type.name}.#{field.name}>"
|
278
|
-
end
|
279
|
-
|
280
|
-
# Set a new value for this field in the response.
|
281
|
-
# It may be updated after resolving a {Lazy}.
|
282
|
-
# If it is {Execute::PROPAGATE_NULL}, tell the owner to propagate null.
|
283
|
-
# If it's {Execute::Execution::SKIP}, remove this field result from its parent
|
284
|
-
# @param new_value [Any] The GraphQL-ready value
|
285
|
-
# @api private
|
286
|
-
def value=(new_value)
|
287
|
-
case new_value
|
288
|
-
when GraphQL::Execution::Execute::PROPAGATE_NULL, nil
|
289
|
-
@invalid_null = true
|
290
|
-
@value = nil
|
291
|
-
if @type.kind.non_null?
|
292
|
-
@parent.received_null_child
|
293
|
-
end
|
294
|
-
when GraphQL::Execution::Execute::SKIP
|
295
|
-
@parent.skipped = true
|
296
|
-
@parent.delete(self)
|
297
|
-
else
|
298
|
-
@value = new_value
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
protected
|
303
|
-
|
304
|
-
def received_null_child
|
305
|
-
case @value
|
306
|
-
when Hash
|
307
|
-
self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
|
308
|
-
when Array
|
309
|
-
if list_of_non_null_items?(@type)
|
310
|
-
self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
|
311
|
-
end
|
312
|
-
when nil
|
313
|
-
# TODO This is a hack
|
314
|
-
# It was already nulled out but it's getting reassigned
|
315
|
-
else
|
316
|
-
raise "Unexpected value for received_null_child (#{self.value.class}): #{value}"
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
private
|
321
|
-
|
322
|
-
def list_of_non_null_items?(type)
|
323
|
-
case type
|
324
|
-
when GraphQL::NonNullType
|
325
|
-
# Unwrap [T]!
|
326
|
-
list_of_non_null_items?(type.of_type)
|
327
|
-
when GraphQL::ListType
|
328
|
-
type.of_type.is_a?(GraphQL::NonNullType)
|
329
|
-
else
|
330
|
-
raise "Unexpected list_of_non_null_items check: #{type}"
|
331
|
-
end
|
332
|
-
end
|
333
|
-
end
|
334
308
|
end
|
335
309
|
end
|
336
310
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest/sha2'
|
4
|
+
|
5
|
+
module GraphQL
|
6
|
+
class Query
|
7
|
+
# @api private
|
8
|
+
# @see Query#query_fingerprint
|
9
|
+
# @see Query#variables_fingerprint
|
10
|
+
# @see Query#fingerprint
|
11
|
+
module Fingerprint
|
12
|
+
# Make an obfuscated hash of the given string (either a query string or variables JSON)
|
13
|
+
# @param string [String]
|
14
|
+
# @return [String] A normalized, opaque hash
|
15
|
+
def self.generate(input_str)
|
16
|
+
# Implemented to be:
|
17
|
+
# - Short (and uniform) length
|
18
|
+
# - Stable
|
19
|
+
# - Irreversibly Opaque (don't want to leak variable values)
|
20
|
+
# - URL-friendly
|
21
|
+
bytes = Digest::SHA256.digest(input_str)
|
22
|
+
Base64.urlsafe_encode64(bytes)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -4,23 +4,49 @@ 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
|
+
|
13
|
+
def initialize(valid: true, problems: nil)
|
14
|
+
@valid = valid
|
15
|
+
@problems = problems
|
16
|
+
end
|
17
|
+
|
7
18
|
def valid?
|
8
|
-
@
|
19
|
+
@valid
|
9
20
|
end
|
10
21
|
|
11
|
-
def add_problem(explanation, path = nil)
|
22
|
+
def add_problem(explanation, path = nil, extensions: nil, message: nil)
|
12
23
|
@problems ||= []
|
13
|
-
@
|
24
|
+
@valid = false
|
25
|
+
problem = { "path" => path || [], "explanation" => explanation }
|
26
|
+
if extensions
|
27
|
+
problem["extensions"] = extensions
|
28
|
+
end
|
29
|
+
if message
|
30
|
+
problem["message"] = message
|
31
|
+
end
|
32
|
+
@problems.push(problem)
|
14
33
|
end
|
15
34
|
|
16
35
|
def merge_result!(path, inner_result)
|
17
|
-
return if inner_result.valid?
|
36
|
+
return if inner_result.nil? || inner_result.valid?
|
18
37
|
|
19
|
-
inner_result.problems
|
20
|
-
|
21
|
-
|
38
|
+
if inner_result.problems
|
39
|
+
inner_result.problems.each do |p|
|
40
|
+
item_path = [path, *p["path"]]
|
41
|
+
add_problem(p["explanation"], item_path, message: p["message"], extensions: p["extensions"])
|
42
|
+
end
|
22
43
|
end
|
44
|
+
# It could have been explicitly set on inner_result (if it had no problems)
|
45
|
+
@valid = false
|
23
46
|
end
|
47
|
+
|
48
|
+
VALID = self.new
|
49
|
+
VALID.freeze
|
24
50
|
end
|
25
51
|
end
|
26
52
|
end
|
@@ -4,16 +4,25 @@ module GraphQL
|
|
4
4
|
# This object can be `ctx` in places where there is no query
|
5
5
|
class NullContext
|
6
6
|
class NullWarden < GraphQL::Schema::Warden
|
7
|
-
def
|
8
|
-
def
|
9
|
-
def visible_type?(
|
7
|
+
def visible_field?(field, ctx); true; end
|
8
|
+
def visible_argument?(arg, ctx); true; end
|
9
|
+
def visible_type?(type, ctx); true; end
|
10
|
+
def visible_enum_value?(ev, ctx); true; end
|
11
|
+
def visible_type_membership?(tm, ctx); true; end
|
10
12
|
end
|
11
13
|
|
12
|
-
|
14
|
+
class NullQuery
|
15
|
+
end
|
16
|
+
|
17
|
+
class NullSchema < GraphQL::Schema
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :schema, :query, :warden, :dataloader
|
13
21
|
|
14
22
|
def initialize
|
15
|
-
@query =
|
16
|
-
@
|
23
|
+
@query = NullQuery.new
|
24
|
+
@dataloader = GraphQL::Dataloader::NullDataloader.new
|
25
|
+
@schema = NullSchema
|
17
26
|
@warden = NullWarden.new(
|
18
27
|
GraphQL::Filter.new,
|
19
28
|
context: self,
|
@@ -23,16 +32,20 @@ module GraphQL
|
|
23
32
|
|
24
33
|
def [](key); end
|
25
34
|
|
35
|
+
def interpreter?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
26
39
|
class << self
|
27
40
|
extend Forwardable
|
28
41
|
|
29
42
|
def [](key); end
|
30
43
|
|
31
44
|
def instance
|
32
|
-
@instance
|
45
|
+
@instance ||= self.new
|
33
46
|
end
|
34
47
|
|
35
|
-
def_delegators :instance, :query, :schema, :
|
48
|
+
def_delegators :instance, :query, :warden, :schema, :interpreter?, :dataloader
|
36
49
|
end
|
37
50
|
end
|
38
51
|
end
|
@@ -16,10 +16,8 @@ module GraphQL
|
|
16
16
|
class ValidationPipeline
|
17
17
|
attr_reader :max_depth, :max_complexity
|
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
|
@@ -36,23 +34,21 @@ module GraphQL
|
|
36
34
|
@valid
|
37
35
|
end
|
38
36
|
|
39
|
-
# @return [Array<GraphQL::StaticValidation::Error >] Static validation errors for the query string
|
37
|
+
# @return [Array<GraphQL::StaticValidation::Error, GraphQL::Query::VariableValidationError>] Static validation errors for the query string
|
40
38
|
def validation_errors
|
41
39
|
ensure_has_validated
|
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,9 +68,8 @@ module GraphQL
|
|
72
68
|
elsif @operation_name_error
|
73
69
|
@validation_errors << @operation_name_error
|
74
70
|
else
|
75
|
-
validation_result = @schema.static_validator.validate(@query, validate: @validate)
|
71
|
+
validation_result = @schema.static_validator.validate(@query, validate: @query.validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
|
76
72
|
@validation_errors.concat(validation_result[:errors])
|
77
|
-
@internal_representation = validation_result[:irep]
|
78
73
|
|
79
74
|
if @validation_errors.empty?
|
80
75
|
@validation_errors.concat(@query.variables.errors)
|
@@ -90,6 +85,9 @@ module GraphQL
|
|
90
85
|
end
|
91
86
|
|
92
87
|
@valid = @validation_errors.empty?
|
88
|
+
rescue SystemStackError => err
|
89
|
+
@valid = false
|
90
|
+
@schema.query_stack_error(@query, err)
|
93
91
|
end
|
94
92
|
|
95
93
|
# If there are max_* values, add them,
|
@@ -97,35 +95,15 @@ module GraphQL
|
|
97
95
|
def build_analyzers(schema, max_depth, max_complexity)
|
98
96
|
qa = schema.query_analyzers.dup
|
99
97
|
|
100
|
-
# Filter out the built in authorization analyzer.
|
101
|
-
# It is deprecated and does not have an AST analyzer alternative.
|
102
|
-
qa = qa.select do |analyzer|
|
103
|
-
if analyzer == GraphQL::Authorization::Analyzer && schema.using_ast_analysis?
|
104
|
-
raise "The Authorization analyzer is not supported with AST Analyzers"
|
105
|
-
else
|
106
|
-
true
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
98
|
if max_depth || max_complexity
|
111
99
|
# Depending on the analysis engine, we must use different analyzers
|
112
100
|
# remove this once everything has switched over to AST analyzers
|
113
|
-
if
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
qa << GraphQL::Analysis::AST::MaxQueryComplexity
|
119
|
-
end
|
120
|
-
else
|
121
|
-
if max_depth
|
122
|
-
qa << GraphQL::Analysis::MaxQueryDepth.new(max_depth)
|
123
|
-
end
|
124
|
-
if max_complexity
|
125
|
-
qa << GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)
|
126
|
-
end
|
101
|
+
if max_depth
|
102
|
+
qa << GraphQL::Analysis::AST::MaxQueryDepth
|
103
|
+
end
|
104
|
+
if max_complexity
|
105
|
+
qa << GraphQL::Analysis::AST::MaxQueryComplexity
|
127
106
|
end
|
128
|
-
|
129
107
|
qa
|
130
108
|
else
|
131
109
|
qa
|