graphql 1.9.21 → 2.0.0
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 +44 -7
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +22 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +29 -2
- 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 +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/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 +108 -14
- data/lib/graphql/execution/instrumentation.rb +1 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +715 -387
- data/lib/graphql/execution/interpreter.rb +32 -31
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +32 -114
- data/lib/graphql/execution/multiplex.rb +60 -92
- data/lib/graphql/execution.rb +11 -3
- 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 +27 -17
- data/lib/graphql/introspection.rb +99 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +99 -63
- data/lib/graphql/language/lexer.rb +53 -27
- data/lib/graphql/language/lexer.rl +5 -3
- data/lib/graphql/language/nodes.rb +64 -93
- data/lib/graphql/language/parser.rb +929 -896
- data/lib/graphql/language/parser.y +125 -102
- data/lib/graphql/language/printer.rb +11 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +77 -0
- data/lib/graphql/pagination/connection.rb +226 -0
- data/lib/graphql/pagination/connections.rb +134 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +226 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +51 -190
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +23 -6
- data/lib/graphql/query/literal_input.rb +26 -11
- data/lib/graphql/query/null_context.rb +24 -8
- data/lib/graphql/query/validation_pipeline.rb +12 -38
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +26 -9
- data/lib/graphql/query.rb +62 -32
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +3 -0
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/range_add.rb +23 -9
- 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 +240 -0
- data/lib/graphql/schema/argument.rb +262 -28
- 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 +319 -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/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 +115 -22
- data/lib/graphql/schema/enum_value.rb +16 -21
- data/lib/graphql/schema/field/connection_extension.rb +46 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +376 -291
- 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 +147 -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 +3 -2
- data/lib/graphql/schema/list.rb +46 -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 +23 -14
- data/lib/graphql/schema/member/has_arguments.rb +212 -23
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +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/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 -65
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +57 -32
- data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
- data/lib/graphql/schema/resolver.rb +133 -79
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +57 -21
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +19 -5
- data/lib/graphql/schema/union.rb +39 -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 +182 -32
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +687 -891
- data/lib/graphql/static_validation/all_rules.rb +2 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +51 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +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/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +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 +123 -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 +111 -52
- 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 +14 -1
- 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 +57 -29
- 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 +16 -8
- data/lib/graphql/types/iso_8601_date_time.rb +32 -10
- data/lib/graphql/types/relay/base_connection.rb +6 -88
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +170 -0
- data/lib/graphql/types/relay/default_relay.rb +21 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +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 +97 -231
- 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/interpreter/hash_response.rb +0 -46
- 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/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
data/lib/graphql/directive.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# Directives are server-defined hooks for modifying execution.
|
4
|
-
#
|
5
|
-
# Two directives are included out-of-the-box:
|
6
|
-
# - `@skip(if: ...)` Skips the tagged field if the value of `if` is true
|
7
|
-
# - `@include(if: ...)` Includes the tagged field _only_ if `if` is true
|
8
|
-
#
|
9
|
-
class Directive
|
10
|
-
include GraphQL::Define::InstanceDefinable
|
11
|
-
accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
|
12
|
-
|
13
|
-
attr_accessor :locations, :arguments, :name, :description, :arguments_class
|
14
|
-
attr_accessor :ast_node
|
15
|
-
# @api private
|
16
|
-
attr_writer :default_directive
|
17
|
-
ensure_defined(:locations, :arguments, :graphql_name, :name, :description, :default_directive?)
|
18
|
-
|
19
|
-
# Future-compatible alias
|
20
|
-
# @see {GraphQL::SchemaMember}
|
21
|
-
alias :graphql_name :name
|
22
|
-
|
23
|
-
# Future-compatible alias
|
24
|
-
# @see {GraphQL::SchemaMember}
|
25
|
-
alias :graphql_definition :itself
|
26
|
-
|
27
|
-
LOCATIONS = [
|
28
|
-
QUERY = :QUERY,
|
29
|
-
MUTATION = :MUTATION,
|
30
|
-
SUBSCRIPTION = :SUBSCRIPTION,
|
31
|
-
FIELD = :FIELD,
|
32
|
-
FRAGMENT_DEFINITION = :FRAGMENT_DEFINITION,
|
33
|
-
FRAGMENT_SPREAD = :FRAGMENT_SPREAD,
|
34
|
-
INLINE_FRAGMENT = :INLINE_FRAGMENT,
|
35
|
-
SCHEMA = :SCHEMA,
|
36
|
-
SCALAR = :SCALAR,
|
37
|
-
OBJECT = :OBJECT,
|
38
|
-
FIELD_DEFINITION = :FIELD_DEFINITION,
|
39
|
-
ARGUMENT_DEFINITION = :ARGUMENT_DEFINITION,
|
40
|
-
INTERFACE = :INTERFACE,
|
41
|
-
UNION = :UNION,
|
42
|
-
ENUM = :ENUM,
|
43
|
-
ENUM_VALUE = :ENUM_VALUE,
|
44
|
-
INPUT_OBJECT = :INPUT_OBJECT,
|
45
|
-
INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
|
46
|
-
]
|
47
|
-
|
48
|
-
DEFAULT_DEPRECATION_REASON = 'No longer supported'
|
49
|
-
LOCATION_DESCRIPTIONS = {
|
50
|
-
QUERY: 'Location adjacent to a query operation.',
|
51
|
-
MUTATION: 'Location adjacent to a mutation operation.',
|
52
|
-
SUBSCRIPTION: 'Location adjacent to a subscription operation.',
|
53
|
-
FIELD: 'Location adjacent to a field.',
|
54
|
-
FRAGMENT_DEFINITION: 'Location adjacent to a fragment definition.',
|
55
|
-
FRAGMENT_SPREAD: 'Location adjacent to a fragment spread.',
|
56
|
-
INLINE_FRAGMENT: 'Location adjacent to an inline fragment.',
|
57
|
-
SCHEMA: 'Location adjacent to a schema definition.',
|
58
|
-
SCALAR: 'Location adjacent to a scalar definition.',
|
59
|
-
OBJECT: 'Location adjacent to an object type definition.',
|
60
|
-
FIELD_DEFINITION: 'Location adjacent to a field definition.',
|
61
|
-
ARGUMENT_DEFINITION: 'Location adjacent to an argument definition.',
|
62
|
-
INTERFACE: 'Location adjacent to an interface definition.',
|
63
|
-
UNION: 'Location adjacent to a union definition.',
|
64
|
-
ENUM: 'Location adjacent to an enum definition.',
|
65
|
-
ENUM_VALUE: 'Location adjacent to an enum value definition.',
|
66
|
-
INPUT_OBJECT: 'Location adjacent to an input object type definition.',
|
67
|
-
INPUT_FIELD_DEFINITION: 'Location adjacent to an input object field definition.',
|
68
|
-
}
|
69
|
-
|
70
|
-
def initialize
|
71
|
-
@arguments = {}
|
72
|
-
@default_directive = false
|
73
|
-
end
|
74
|
-
|
75
|
-
def to_s
|
76
|
-
"<GraphQL::Directive #{name}>"
|
77
|
-
end
|
78
|
-
|
79
|
-
def on_field?
|
80
|
-
locations.include?(FIELD)
|
81
|
-
end
|
82
|
-
|
83
|
-
def on_fragment?
|
84
|
-
locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
|
85
|
-
end
|
86
|
-
|
87
|
-
def on_operation?
|
88
|
-
locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
|
89
|
-
end
|
90
|
-
|
91
|
-
# @return [Boolean] Is this directive supplied by default? (eg `@skip`)
|
92
|
-
def default_directive?
|
93
|
-
@default_directive
|
94
|
-
end
|
95
|
-
|
96
|
-
def inspect
|
97
|
-
"#<GraphQL::Directive #{name}>"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
require "graphql/directive/include_directive"
|
103
|
-
require "graphql/directive/skip_directive"
|
104
|
-
require "graphql/directive/deprecated_directive"
|
data/lib/graphql/enum_type.rb
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# Represents a collection of related values.
|
4
|
-
# By convention, enum names are `SCREAMING_CASE_NAMES`,
|
5
|
-
# but other identifiers are supported too.
|
6
|
-
#
|
7
|
-
# You can use as return types _or_ as inputs.
|
8
|
-
#
|
9
|
-
# By default, enums are passed to `resolve` functions as
|
10
|
-
# the strings that identify them, but you can provide a
|
11
|
-
# custom Ruby value with the `value:` keyword.
|
12
|
-
#
|
13
|
-
# @example An enum of programming languages
|
14
|
-
# LanguageEnum = GraphQL::EnumType.define do
|
15
|
-
# name "Language"
|
16
|
-
# description "Programming language for Web projects"
|
17
|
-
# value("PYTHON", "A dynamic, function-oriented language")
|
18
|
-
# value("RUBY", "A very dynamic language aimed at programmer happiness")
|
19
|
-
# value("JAVASCRIPT", "Accidental lingua franca of the web")
|
20
|
-
# end
|
21
|
-
#
|
22
|
-
# @example Using an enum as a return type
|
23
|
-
# field :favoriteLanguage, LanguageEnum, "This person's favorite coding language"
|
24
|
-
# # ...
|
25
|
-
# # In a query:
|
26
|
-
# Schema.execute("{ coder(id: 1) { favoriteLanguage } }")
|
27
|
-
# # { "data" => { "coder" => { "favoriteLanguage" => "RUBY" } } }
|
28
|
-
#
|
29
|
-
# @example Defining an enum input
|
30
|
-
# field :coders, types[CoderType] do
|
31
|
-
# argument :knowing, types[LanguageEnum]
|
32
|
-
# resolve ->(obj, args, ctx) {
|
33
|
-
# Coder.where(language: args[:knowing])
|
34
|
-
# }
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# @example Using an enum as input
|
38
|
-
# {
|
39
|
-
# # find coders who know Python and Ruby
|
40
|
-
# coders(knowing: [PYTHON, RUBY]) {
|
41
|
-
# name
|
42
|
-
# hourlyRate
|
43
|
-
# }
|
44
|
-
# }
|
45
|
-
#
|
46
|
-
# @example Enum whose values are different in Ruby-land
|
47
|
-
# GraphQL::EnumType.define do
|
48
|
-
# # ...
|
49
|
-
# # use the `value:` keyword:
|
50
|
-
# value("RUBY", "Lisp? Smalltalk?", value: :rb)
|
51
|
-
# end
|
52
|
-
#
|
53
|
-
# # Now, resolve functions will receive `:rb` instead of `"RUBY"`
|
54
|
-
# field :favoriteLanguage, LanguageEnum
|
55
|
-
# resolve ->(obj, args, ctx) {
|
56
|
-
# args[:favoriteLanguage] # => :rb
|
57
|
-
# }
|
58
|
-
#
|
59
|
-
# @example Enum whose values are different in ActiveRecord-land
|
60
|
-
# class Language < ActiveRecord::Base
|
61
|
-
# enum language: {
|
62
|
-
# rb: 0
|
63
|
-
# }
|
64
|
-
# end
|
65
|
-
#
|
66
|
-
# # Now enum type should be defined as
|
67
|
-
# GraphQL::EnumType.define do
|
68
|
-
# # ...
|
69
|
-
# # use the `value:` keyword:
|
70
|
-
# value("RUBY", "Lisp? Smalltalk?", value: 'rb')
|
71
|
-
# end
|
72
|
-
#
|
73
|
-
|
74
|
-
class EnumType < GraphQL::BaseType
|
75
|
-
accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
|
76
|
-
ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
|
77
|
-
attr_accessor :ast_node
|
78
|
-
|
79
|
-
def initialize
|
80
|
-
super
|
81
|
-
@values_by_name = {}
|
82
|
-
end
|
83
|
-
|
84
|
-
def initialize_copy(other)
|
85
|
-
super
|
86
|
-
self.values = other.values.values
|
87
|
-
end
|
88
|
-
|
89
|
-
# @param new_values [Array<EnumValue>] The set of values contained in this type
|
90
|
-
def values=(new_values)
|
91
|
-
@values_by_name = {}
|
92
|
-
new_values.each { |enum_value| add_value(enum_value) }
|
93
|
-
end
|
94
|
-
|
95
|
-
# @param enum_value [EnumValue] A value to add to this type's set of values
|
96
|
-
def add_value(enum_value)
|
97
|
-
if @values_by_name.key?(enum_value.name)
|
98
|
-
raise "Enum value names must be unique. Value `#{enum_value.name}` already exists on Enum `#{name}`."
|
99
|
-
end
|
100
|
-
|
101
|
-
@values_by_name[enum_value.name] = enum_value
|
102
|
-
end
|
103
|
-
|
104
|
-
# @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
|
105
|
-
def values
|
106
|
-
@values_by_name
|
107
|
-
end
|
108
|
-
|
109
|
-
def kind
|
110
|
-
GraphQL::TypeKinds::ENUM
|
111
|
-
end
|
112
|
-
|
113
|
-
def coerce_result(value, ctx = nil)
|
114
|
-
if ctx.nil?
|
115
|
-
warn_deprecated_coerce("coerce_isolated_result")
|
116
|
-
ctx = GraphQL::Query::NullContext
|
117
|
-
end
|
118
|
-
|
119
|
-
warden = ctx.warden
|
120
|
-
all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
|
121
|
-
enum_value = all_values.find { |val| val.value == value }
|
122
|
-
if enum_value
|
123
|
-
enum_value.name
|
124
|
-
else
|
125
|
-
raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def to_s
|
130
|
-
name
|
131
|
-
end
|
132
|
-
|
133
|
-
# A value within an {EnumType}
|
134
|
-
#
|
135
|
-
# Created with the `value` helper
|
136
|
-
class EnumValue
|
137
|
-
include GraphQL::Define::InstanceDefinable
|
138
|
-
ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
|
139
|
-
accepts_definitions(*ATTRIBUTES)
|
140
|
-
attr_accessor(*ATTRIBUTES)
|
141
|
-
attr_accessor :ast_node
|
142
|
-
ensure_defined(*ATTRIBUTES)
|
143
|
-
|
144
|
-
undef name=
|
145
|
-
def name=(new_name)
|
146
|
-
# Validate that the name is correct
|
147
|
-
GraphQL::NameValidator.validate!(new_name)
|
148
|
-
@name = new_name
|
149
|
-
end
|
150
|
-
|
151
|
-
def graphql_name
|
152
|
-
name
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
class UnresolvedValueError < GraphQL::Error
|
157
|
-
end
|
158
|
-
|
159
|
-
private
|
160
|
-
|
161
|
-
# Get the underlying value for this enum value
|
162
|
-
#
|
163
|
-
# @example get episode value from Enum
|
164
|
-
# episode = EpisodeEnum.coerce("NEWHOPE")
|
165
|
-
# episode # => 6
|
166
|
-
#
|
167
|
-
# @param value_name [String] the string representation of this enum value
|
168
|
-
# @return [Object] the underlying value for this enum value
|
169
|
-
def coerce_non_null_input(value_name, ctx)
|
170
|
-
if @values_by_name.key?(value_name)
|
171
|
-
@values_by_name.fetch(value_name).value
|
172
|
-
elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
|
173
|
-
# this is for matching default values, which are "inputs", but they're
|
174
|
-
# the Ruby value, not the GraphQL string.
|
175
|
-
match_by_value[1].value
|
176
|
-
else
|
177
|
-
nil
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def validate_non_null_input(value_name, ctx)
|
182
|
-
result = GraphQL::Query::InputValidationResult.new
|
183
|
-
allowed_values = ctx.warden.enum_values(self)
|
184
|
-
matching_value = allowed_values.find { |v| v.name == value_name }
|
185
|
-
|
186
|
-
if matching_value.nil?
|
187
|
-
result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
|
188
|
-
end
|
189
|
-
|
190
|
-
result
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
@@ -1,326 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Execution
|
4
|
-
# A valid execution strategy
|
5
|
-
# @api private
|
6
|
-
class Execute
|
7
|
-
|
8
|
-
# @api private
|
9
|
-
class Skip; end
|
10
|
-
|
11
|
-
# Just a singleton for implementing {Query::Context#skip}
|
12
|
-
# @api private
|
13
|
-
SKIP = Skip.new
|
14
|
-
|
15
|
-
# @api private
|
16
|
-
class PropagateNull
|
17
|
-
end
|
18
|
-
# @api private
|
19
|
-
PROPAGATE_NULL = PropagateNull.new
|
20
|
-
|
21
|
-
def execute(ast_operation, root_type, query)
|
22
|
-
result = resolve_root_selection(query)
|
23
|
-
lazy_resolve_root_selection(result, **{query: query})
|
24
|
-
GraphQL::Execution::Flatten.call(query.context)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.begin_multiplex(_multiplex)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.begin_query(query, _multiplex)
|
31
|
-
ExecutionFunctions.resolve_root_selection(query)
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.finish_multiplex(results, multiplex)
|
35
|
-
ExecutionFunctions.lazy_resolve_root_selection(results, multiplex: multiplex)
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.finish_query(query, _multiplex)
|
39
|
-
{
|
40
|
-
"data" => Execution::Flatten.call(query.context)
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
# @api private
|
45
|
-
module ExecutionFunctions
|
46
|
-
module_function
|
47
|
-
|
48
|
-
def resolve_root_selection(query)
|
49
|
-
query.trace("execute_query", query: query) do
|
50
|
-
operation = query.selected_operation
|
51
|
-
op_type = operation.operation_type
|
52
|
-
root_type = query.root_type_for_operation(op_type)
|
53
|
-
if query.context[:__root_unauthorized]
|
54
|
-
# This was set by member/instrumentation.rb so that we wouldn't continue.
|
55
|
-
else
|
56
|
-
resolve_selection(
|
57
|
-
query.root_value,
|
58
|
-
root_type,
|
59
|
-
query.context,
|
60
|
-
mutation: query.mutation?
|
61
|
-
)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def lazy_resolve_root_selection(result, query: nil, multiplex: nil)
|
67
|
-
if query.nil? && multiplex.queries.length == 1
|
68
|
-
query = multiplex.queries[0]
|
69
|
-
end
|
70
|
-
|
71
|
-
tracer = (query || multiplex)
|
72
|
-
tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
|
73
|
-
GraphQL::Execution::Lazy.resolve(result)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def resolve_selection(object, current_type, current_ctx, mutation: false )
|
78
|
-
# Assign this _before_ resolving the children
|
79
|
-
# so that when a child propagates null, the selection result is
|
80
|
-
# ready for it.
|
81
|
-
current_ctx.value = {}
|
82
|
-
|
83
|
-
selections_on_type = current_ctx.irep_node.typed_children[current_type]
|
84
|
-
|
85
|
-
selections_on_type.each do |name, child_irep_node|
|
86
|
-
field_ctx = current_ctx.spawn_child(
|
87
|
-
key: name,
|
88
|
-
object: object,
|
89
|
-
irep_node: child_irep_node,
|
90
|
-
)
|
91
|
-
|
92
|
-
field_result = resolve_field(
|
93
|
-
object,
|
94
|
-
field_ctx
|
95
|
-
)
|
96
|
-
|
97
|
-
if field_result.is_a?(Skip)
|
98
|
-
next
|
99
|
-
end
|
100
|
-
|
101
|
-
if mutation
|
102
|
-
GraphQL::Execution::Lazy.resolve(field_ctx)
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
|
-
# If the last subselection caused a null to propagate to _this_ selection,
|
107
|
-
# then we may as well quit executing fields because they
|
108
|
-
# won't be in the response
|
109
|
-
if current_ctx.invalid_null?
|
110
|
-
break
|
111
|
-
else
|
112
|
-
current_ctx.value[name] = field_ctx
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
current_ctx.value
|
117
|
-
end
|
118
|
-
|
119
|
-
def resolve_field(object, field_ctx)
|
120
|
-
query = field_ctx.query
|
121
|
-
irep_node = field_ctx.irep_node
|
122
|
-
parent_type = irep_node.owner_type
|
123
|
-
field = field_ctx.field
|
124
|
-
|
125
|
-
raw_value = begin
|
126
|
-
begin
|
127
|
-
arguments = query.arguments_for(irep_node, field)
|
128
|
-
field_ctx.trace("execute_field", { context: field_ctx }) do
|
129
|
-
field_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
|
130
|
-
end
|
131
|
-
rescue GraphQL::UnauthorizedFieldError => err
|
132
|
-
err.field ||= field
|
133
|
-
field_ctx.schema.unauthorized_field(err)
|
134
|
-
rescue GraphQL::UnauthorizedError => err
|
135
|
-
field_ctx.schema.unauthorized_object(err)
|
136
|
-
end
|
137
|
-
rescue GraphQL::ExecutionError => err
|
138
|
-
err
|
139
|
-
end
|
140
|
-
|
141
|
-
if field_ctx.schema.lazy?(raw_value)
|
142
|
-
field_ctx.value = Execution::Lazy.new {
|
143
|
-
inner_value = field_ctx.trace("execute_field_lazy", {context: field_ctx}) {
|
144
|
-
begin
|
145
|
-
begin
|
146
|
-
field_ctx.field.lazy_resolve(raw_value, arguments, field_ctx)
|
147
|
-
rescue GraphQL::UnauthorizedError => err
|
148
|
-
field_ctx.schema.unauthorized_object(err)
|
149
|
-
end
|
150
|
-
rescue GraphQL::ExecutionError => err
|
151
|
-
err
|
152
|
-
end
|
153
|
-
}
|
154
|
-
continue_or_wait(inner_value, field_ctx.type, field_ctx)
|
155
|
-
}
|
156
|
-
else
|
157
|
-
continue_or_wait(raw_value, field_ctx.type, field_ctx)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
# If the returned object is lazy (unfinished),
|
162
|
-
# assign the lazy object to `.value=` so we can resolve it later.
|
163
|
-
# When we resolve it later, reassign it to `.value=` so that
|
164
|
-
# the finished value replaces the unfinished one.
|
165
|
-
#
|
166
|
-
# If the returned object is finished, continue to coerce
|
167
|
-
# and resolve child fields
|
168
|
-
def continue_or_wait(raw_value, field_type, field_ctx)
|
169
|
-
if field_ctx.schema.lazy?(raw_value)
|
170
|
-
field_ctx.value = Execution::Lazy.new {
|
171
|
-
inner_value = begin
|
172
|
-
begin
|
173
|
-
field_ctx.schema.sync_lazy(raw_value)
|
174
|
-
rescue GraphQL::UnauthorizedError => err
|
175
|
-
field_ctx.schema.unauthorized_object(err)
|
176
|
-
end
|
177
|
-
rescue GraphQL::ExecutionError => err
|
178
|
-
err
|
179
|
-
end
|
180
|
-
|
181
|
-
field_ctx.value = continue_or_wait(inner_value, field_type, field_ctx)
|
182
|
-
}
|
183
|
-
else
|
184
|
-
field_ctx.value = continue_resolve_field(raw_value, field_type, field_ctx)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def continue_resolve_field(raw_value, field_type, field_ctx)
|
189
|
-
if field_ctx.parent.invalid_null?
|
190
|
-
return nil
|
191
|
-
end
|
192
|
-
query = field_ctx.query
|
193
|
-
|
194
|
-
case raw_value
|
195
|
-
when GraphQL::ExecutionError
|
196
|
-
raw_value.ast_node ||= field_ctx.ast_node
|
197
|
-
raw_value.path = field_ctx.path
|
198
|
-
query.context.errors.push(raw_value)
|
199
|
-
when Array
|
200
|
-
if field_type.non_null?
|
201
|
-
# List type errors are handled above, this is for the case of fields returning an array of errors
|
202
|
-
list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
|
203
|
-
if list_errors.any?
|
204
|
-
list_errors.each do |error, index|
|
205
|
-
error.ast_node = field_ctx.ast_node
|
206
|
-
error.path = field_ctx.path + (field_ctx.type.list? ? [index] : [])
|
207
|
-
query.context.errors.push(error)
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
resolve_value(
|
214
|
-
raw_value,
|
215
|
-
field_type,
|
216
|
-
field_ctx,
|
217
|
-
)
|
218
|
-
end
|
219
|
-
|
220
|
-
def resolve_value(value, field_type, field_ctx)
|
221
|
-
field_defn = field_ctx.field
|
222
|
-
|
223
|
-
if value.nil?
|
224
|
-
if field_type.kind.non_null?
|
225
|
-
parent_type = field_ctx.irep_node.owner_type
|
226
|
-
type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
|
227
|
-
field_ctx.schema.type_error(type_error, field_ctx)
|
228
|
-
PROPAGATE_NULL
|
229
|
-
else
|
230
|
-
nil
|
231
|
-
end
|
232
|
-
elsif value.is_a?(GraphQL::ExecutionError)
|
233
|
-
if field_type.kind.non_null?
|
234
|
-
PROPAGATE_NULL
|
235
|
-
else
|
236
|
-
nil
|
237
|
-
end
|
238
|
-
elsif value.is_a?(Array) && value.any? && value.all? {|v| v.is_a?(GraphQL::ExecutionError)}
|
239
|
-
if field_type.kind.non_null?
|
240
|
-
PROPAGATE_NULL
|
241
|
-
else
|
242
|
-
nil
|
243
|
-
end
|
244
|
-
elsif value.is_a?(Skip)
|
245
|
-
field_ctx.value = value
|
246
|
-
else
|
247
|
-
case field_type.kind
|
248
|
-
when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
|
249
|
-
field_type.coerce_result(value, field_ctx)
|
250
|
-
when GraphQL::TypeKinds::LIST
|
251
|
-
inner_type = field_type.of_type
|
252
|
-
i = 0
|
253
|
-
result = []
|
254
|
-
field_ctx.value = result
|
255
|
-
|
256
|
-
value.each do |inner_value|
|
257
|
-
inner_ctx = field_ctx.spawn_child(
|
258
|
-
key: i,
|
259
|
-
object: inner_value,
|
260
|
-
irep_node: field_ctx.irep_node,
|
261
|
-
)
|
262
|
-
|
263
|
-
inner_result = continue_or_wait(
|
264
|
-
inner_value,
|
265
|
-
inner_type,
|
266
|
-
inner_ctx,
|
267
|
-
)
|
268
|
-
|
269
|
-
return PROPAGATE_NULL if inner_result == PROPAGATE_NULL
|
270
|
-
|
271
|
-
result << inner_ctx
|
272
|
-
i += 1
|
273
|
-
end
|
274
|
-
|
275
|
-
result
|
276
|
-
when GraphQL::TypeKinds::NON_NULL
|
277
|
-
inner_type = field_type.of_type
|
278
|
-
resolve_value(
|
279
|
-
value,
|
280
|
-
inner_type,
|
281
|
-
field_ctx,
|
282
|
-
)
|
283
|
-
when GraphQL::TypeKinds::OBJECT
|
284
|
-
resolve_selection(
|
285
|
-
value,
|
286
|
-
field_type,
|
287
|
-
field_ctx
|
288
|
-
)
|
289
|
-
when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
|
290
|
-
query = field_ctx.query
|
291
|
-
resolved_type_or_lazy = field_type.resolve_type(value, field_ctx)
|
292
|
-
query.schema.after_lazy(resolved_type_or_lazy) do |resolved_type|
|
293
|
-
possible_types = query.possible_types(field_type)
|
294
|
-
|
295
|
-
if !possible_types.include?(resolved_type)
|
296
|
-
parent_type = field_ctx.irep_node.owner_type
|
297
|
-
type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
|
298
|
-
field_ctx.schema.type_error(type_error, field_ctx)
|
299
|
-
PROPAGATE_NULL
|
300
|
-
else
|
301
|
-
resolve_value(
|
302
|
-
value,
|
303
|
-
resolved_type,
|
304
|
-
field_ctx,
|
305
|
-
)
|
306
|
-
end
|
307
|
-
end
|
308
|
-
else
|
309
|
-
raise("Unknown type kind: #{field_type.kind}")
|
310
|
-
end
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
include ExecutionFunctions
|
316
|
-
|
317
|
-
# A `.call`-able suitable to be the last step in a middleware chain
|
318
|
-
module FieldResolveStep
|
319
|
-
# Execute the field's resolve method
|
320
|
-
def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
|
321
|
-
field_definition.resolve(parent_object, field_args, context)
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Execution
|
4
|
-
# Starting from a root context,
|
5
|
-
# create a hash out of the context tree.
|
6
|
-
# @api private
|
7
|
-
module Flatten
|
8
|
-
def self.call(ctx)
|
9
|
-
flatten(ctx)
|
10
|
-
end
|
11
|
-
|
12
|
-
class << self
|
13
|
-
private
|
14
|
-
|
15
|
-
def flatten(obj)
|
16
|
-
case obj
|
17
|
-
when Hash
|
18
|
-
flattened = {}
|
19
|
-
obj.each do |key, val|
|
20
|
-
flattened[key] = flatten(val)
|
21
|
-
end
|
22
|
-
flattened
|
23
|
-
when Array
|
24
|
-
obj.map { |v| flatten(v) }
|
25
|
-
when Query::Context::SharedMethods
|
26
|
-
if obj.invalid_null?
|
27
|
-
nil
|
28
|
-
elsif obj.skipped? && obj.value.empty?
|
29
|
-
nil
|
30
|
-
else
|
31
|
-
flatten(obj.value)
|
32
|
-
end
|
33
|
-
else
|
34
|
-
obj
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module GraphQL
|
4
|
-
module Execution
|
5
|
-
class Interpreter
|
6
|
-
# This response class handles `#write` by accumulating
|
7
|
-
# values into a Hash.
|
8
|
-
class HashResponse
|
9
|
-
def initialize
|
10
|
-
@result = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def final_value
|
14
|
-
@result
|
15
|
-
end
|
16
|
-
|
17
|
-
def inspect
|
18
|
-
"#<#{self.class.name} result=#{@result.inspect}>"
|
19
|
-
end
|
20
|
-
|
21
|
-
# Add `value` at `path`.
|
22
|
-
# @return [void]
|
23
|
-
def write(path, value)
|
24
|
-
if path.empty?
|
25
|
-
@result = value
|
26
|
-
elsif (write_target = @result)
|
27
|
-
i = 0
|
28
|
-
prefinal_steps = path.size - 1
|
29
|
-
# Use `while` to avoid a closure
|
30
|
-
while i < prefinal_steps
|
31
|
-
path_part = path[i]
|
32
|
-
i += 1
|
33
|
-
write_target = write_target[path_part]
|
34
|
-
end
|
35
|
-
path_part = path[i]
|
36
|
-
write_target[path_part] = value
|
37
|
-
else
|
38
|
-
# The response is completely nulled out
|
39
|
-
end
|
40
|
-
|
41
|
-
nil
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|