graphql 1.10.2 → 2.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +45 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +49 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +24 -33
- 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 +30 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +125 -117
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +52 -36
- data/lib/graphql/analysis/ast.rb +7 -8
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +31 -18
- data/lib/graphql/backtrace/trace.rb +96 -0
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +26 -18
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +77 -44
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +104 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +62 -24
- data/lib/graphql/execution/interpreter/runtime.rb +826 -464
- data/lib/graphql/execution/interpreter.rb +206 -68
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +55 -136
- data/lib/graphql/execution/multiplex.rb +6 -162
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +7 -2
- data/lib/graphql/integer_decoding_error.rb +17 -0
- 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 +11 -5
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +4 -17
- 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 +15 -3
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +11 -6
- data/lib/graphql/introspection/type_type.rb +31 -14
- 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/document_from_schema_definition.rb +96 -44
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +126 -129
- data/lib/graphql/language/parser.rb +997 -933
- data/lib/graphql/language/parser.y +148 -118
- data/lib/graphql/language/printer.rb +48 -23
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +192 -84
- data/lib/graphql/language.rb +2 -0
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +45 -3
- data/lib/graphql/pagination/array_connection.rb +6 -4
- data/lib/graphql/pagination/connection.rb +105 -23
- data/lib/graphql/pagination/connections.rb +62 -35
- data/lib/graphql/pagination/relation_connection.rb +88 -36
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +203 -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 +22 -9
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +36 -12
- data/lib/graphql/query.rb +92 -44
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +1 -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 +250 -46
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
- data/lib/graphql/schema/build_from_definition.rb +243 -89
- data/lib/graphql/schema/directive/deprecated.rb +1 -1
- 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 +1 -1
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +108 -20
- data/lib/graphql/schema/enum.rb +105 -44
- data/lib/graphql/schema/enum_value.rb +15 -25
- data/lib/graphql/schema/field/connection_extension.rb +50 -30
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +476 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +6 -8
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/input_object.rb +133 -121
- data/lib/graphql/schema/interface.rb +17 -45
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +25 -8
- data/lib/graphql/schema/loader.rb +139 -103
- data/lib/graphql/schema/member/base_dsl_methods.rb +29 -35
- data/lib/graphql/schema/member/build_type.rb +19 -14
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +16 -1
- data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
- data/lib/graphql/schema/member/has_directives.rb +118 -0
- data/lib/graphql/schema/member/has_fields.rb +164 -42
- data/lib/graphql/schema/member/has_interfaces.rb +129 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +57 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
- data/lib/graphql/schema/member/validates_input.rb +3 -3
- data/lib/graphql/schema/member.rb +6 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +12 -7
- data/lib/graphql/schema/object.rb +35 -69
- data/lib/graphql/schema/printer.rb +16 -34
- data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +144 -79
- data/lib/graphql/schema/scalar.rb +27 -18
- data/lib/graphql/schema/subscription.rb +55 -26
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +48 -13
- 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 +185 -32
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +471 -1116
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +13 -27
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +69 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +44 -87
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
- 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 +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 +92 -49
- 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/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 +6 -7
- 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 +9 -10
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +32 -20
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +126 -19
- 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 +81 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -52
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +113 -58
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -21
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +26 -2
- data/lib/graphql/tracing/legacy_trace.rb +65 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +1 -12
- data/lib/graphql/tracing/notifications_trace.rb +42 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +109 -0
- data/lib/graphql/tracing/platform_tracing.rb +64 -43
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +11 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing/trace.rb +75 -0
- data/lib/graphql/tracing.rb +23 -71
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -92
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +25 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
- data/lib/graphql/types/relay.rb +10 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +54 -65
- data/readme.md +3 -6
- metadata +116 -236
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- 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 -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 -87
- 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 -210
- 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 -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 -107
- data/lib/graphql/enum_type.rb +0 -127
- 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 -222
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -124
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -132
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -65
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/language/lexer.rl +0 -258
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -121
- data/lib/graphql/query/arguments.rb +0 -188
- 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 -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 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -176
- 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 -105
- 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 -76
- 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 -31
- 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 -65
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- 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 -113
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,85 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class ArrayConnection < BaseConnection
|
5
|
-
def cursor_from_node(item)
|
6
|
-
idx = (after ? index_from_cursor(after) : 0) + sliced_nodes.find_index(item) + 1
|
7
|
-
encode(idx.to_s)
|
8
|
-
end
|
9
|
-
|
10
|
-
def has_next_page
|
11
|
-
if first
|
12
|
-
# There are more items after these items
|
13
|
-
sliced_nodes.count > first
|
14
|
-
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && before
|
15
|
-
# The original array is longer than the `before` index
|
16
|
-
index_from_cursor(before) < nodes.length + 1
|
17
|
-
else
|
18
|
-
false
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def has_previous_page
|
23
|
-
if last
|
24
|
-
# There are items preceding the ones in this result
|
25
|
-
sliced_nodes.count > last
|
26
|
-
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
|
27
|
-
# We've paginated into the Array a bit, there are some behind us
|
28
|
-
index_from_cursor(after) > 0
|
29
|
-
else
|
30
|
-
false
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def first
|
37
|
-
return @first if defined? @first
|
38
|
-
|
39
|
-
@first = get_limited_arg(:first)
|
40
|
-
@first = max_page_size if @first && max_page_size && @first > max_page_size
|
41
|
-
@first
|
42
|
-
end
|
43
|
-
|
44
|
-
def last
|
45
|
-
return @last if defined? @last
|
46
|
-
|
47
|
-
@last = get_limited_arg(:last)
|
48
|
-
@last = max_page_size if @last && max_page_size && @last > max_page_size
|
49
|
-
@last
|
50
|
-
end
|
51
|
-
|
52
|
-
# apply first / last limit results
|
53
|
-
def paged_nodes
|
54
|
-
@paged_nodes ||= begin
|
55
|
-
items = sliced_nodes
|
56
|
-
|
57
|
-
items = items.first(first) if first
|
58
|
-
items = items.last(last) if last
|
59
|
-
items = items.first(max_page_size) if max_page_size && !first && !last
|
60
|
-
|
61
|
-
items
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# Apply cursors to edges
|
66
|
-
def sliced_nodes
|
67
|
-
@sliced_nodes ||= if before && after
|
68
|
-
nodes[index_from_cursor(after)..index_from_cursor(before)-1] || []
|
69
|
-
elsif before
|
70
|
-
nodes[0..index_from_cursor(before)-2] || []
|
71
|
-
elsif after
|
72
|
-
nodes[index_from_cursor(after)..-1] || []
|
73
|
-
else
|
74
|
-
nodes
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def index_from_cursor(cursor)
|
79
|
-
decode(cursor).to_i
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
BaseConnection.register_connection_implementation(Array, ArrayConnection)
|
84
|
-
end
|
85
|
-
end
|
@@ -1,176 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Subclasses must implement:
|
5
|
-
# - {#cursor_from_node}, which returns an opaque cursor for the given item
|
6
|
-
# - {#sliced_nodes}, which slices by `before` & `after`
|
7
|
-
# - {#paged_nodes}, which applies `first` & `last` limits
|
8
|
-
#
|
9
|
-
# In a subclass, you have access to
|
10
|
-
# - {#nodes}, the collection which the connection will wrap
|
11
|
-
# - {#first}, {#after}, {#last}, {#before} (arguments passed to the field)
|
12
|
-
# - {#max_page_size} (the specified maximum page size that can be returned from a connection)
|
13
|
-
#
|
14
|
-
class BaseConnection
|
15
|
-
# Just to encode data in the cursor, use something that won't conflict
|
16
|
-
CURSOR_SEPARATOR = "---"
|
17
|
-
|
18
|
-
# Map of collection class names -> connection_classes
|
19
|
-
# eg `{"Array" => ArrayConnection}`
|
20
|
-
CONNECTION_IMPLEMENTATIONS = {}
|
21
|
-
|
22
|
-
class << self
|
23
|
-
# Find a connection implementation suitable for exposing `nodes`
|
24
|
-
#
|
25
|
-
# @param nodes [Object] A collection of nodes (eg, Array, AR::Relation)
|
26
|
-
# @return [subclass of BaseConnection] a connection Class for wrapping `nodes`
|
27
|
-
def connection_for_nodes(nodes)
|
28
|
-
# If it's a new-style connection object, it's already ready to go
|
29
|
-
if nodes.is_a?(GraphQL::Pagination::Connection)
|
30
|
-
return nodes
|
31
|
-
end
|
32
|
-
# Check for class _names_ because classes can be redefined in Rails development
|
33
|
-
nodes.class.ancestors.each do |ancestor|
|
34
|
-
conn_impl = CONNECTION_IMPLEMENTATIONS[ancestor.name]
|
35
|
-
if conn_impl
|
36
|
-
return conn_impl
|
37
|
-
end
|
38
|
-
end
|
39
|
-
# Should have found a connection during the loop:
|
40
|
-
raise("No connection implementation to wrap #{nodes.class} (#{nodes})")
|
41
|
-
end
|
42
|
-
|
43
|
-
# Add `connection_class` as the connection wrapper for `nodes_class`
|
44
|
-
# eg, `RelationConnection` is the implementation for `AR::Relation`
|
45
|
-
# @param nodes_class [Class] A class representing a collection (eg, Array, AR::Relation)
|
46
|
-
# @param connection_class [Class] A class implementing Connection methods
|
47
|
-
def register_connection_implementation(nodes_class, connection_class)
|
48
|
-
CONNECTION_IMPLEMENTATIONS[nodes_class.name] = connection_class
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
attr_reader :nodes, :arguments, :max_page_size, :parent, :field, :context
|
53
|
-
|
54
|
-
# Make a connection, wrapping `nodes`
|
55
|
-
# @param nodes [Object] The collection of nodes
|
56
|
-
# @param arguments [GraphQL::Query::Arguments] Query arguments
|
57
|
-
# @param field [GraphQL::Field] The underlying field
|
58
|
-
# @param max_page_size [Int] The maximum number of results to return
|
59
|
-
# @param parent [Object] The object which this collection belongs to
|
60
|
-
# @param context [GraphQL::Query::Context] The context from the field being resolved
|
61
|
-
def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil)
|
62
|
-
@context = context
|
63
|
-
@nodes = nodes
|
64
|
-
@arguments = arguments
|
65
|
-
@field = field
|
66
|
-
@parent = parent
|
67
|
-
@encoder = context ? @context.schema.cursor_encoder : GraphQL::Schema::Base64Encoder
|
68
|
-
@max_page_size = max_page_size.nil? && context ? @context.schema.default_max_page_size : max_page_size
|
69
|
-
end
|
70
|
-
|
71
|
-
def encode(data)
|
72
|
-
@encoder.encode(data, nonce: true)
|
73
|
-
end
|
74
|
-
|
75
|
-
def decode(data)
|
76
|
-
@encoder.decode(data, nonce: true)
|
77
|
-
rescue ArgumentError
|
78
|
-
raise GraphQL::ExecutionError, "Invalid cursor: #{data.inspect}"
|
79
|
-
end
|
80
|
-
|
81
|
-
# The value passed as `first:`, if there was one. Negative numbers become `0`.
|
82
|
-
# @return [Integer, nil]
|
83
|
-
def first
|
84
|
-
@first ||= get_limited_arg(:first)
|
85
|
-
end
|
86
|
-
|
87
|
-
# The value passed as `after:`, if there was one
|
88
|
-
# @return [String, nil]
|
89
|
-
def after
|
90
|
-
arguments[:after]
|
91
|
-
end
|
92
|
-
|
93
|
-
# The value passed as `last:`, if there was one. Negative numbers become `0`.
|
94
|
-
# @return [Integer, nil]
|
95
|
-
def last
|
96
|
-
@last ||= get_limited_arg(:last)
|
97
|
-
end
|
98
|
-
|
99
|
-
# The value passed as `before:`, if there was one
|
100
|
-
# @return [String, nil]
|
101
|
-
def before
|
102
|
-
arguments[:before]
|
103
|
-
end
|
104
|
-
|
105
|
-
# These are the nodes to render for this connection,
|
106
|
-
# probably wrapped by {GraphQL::Relay::Edge}
|
107
|
-
def edge_nodes
|
108
|
-
@edge_nodes ||= paged_nodes
|
109
|
-
end
|
110
|
-
|
111
|
-
# Support the `pageInfo` field
|
112
|
-
def page_info
|
113
|
-
self
|
114
|
-
end
|
115
|
-
|
116
|
-
# Used by `pageInfo`
|
117
|
-
def has_next_page
|
118
|
-
!!(first && sliced_nodes.count > first)
|
119
|
-
end
|
120
|
-
|
121
|
-
# Used by `pageInfo`
|
122
|
-
def has_previous_page
|
123
|
-
!!(last && sliced_nodes.count > last)
|
124
|
-
end
|
125
|
-
|
126
|
-
# Used by `pageInfo`
|
127
|
-
def start_cursor
|
128
|
-
if start_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).first
|
129
|
-
return cursor_from_node(start_node)
|
130
|
-
else
|
131
|
-
return nil
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Used by `pageInfo`
|
136
|
-
def end_cursor
|
137
|
-
if end_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).last
|
138
|
-
return cursor_from_node(end_node)
|
139
|
-
else
|
140
|
-
return nil
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
# An opaque operation which returns a connection-specific cursor.
|
145
|
-
def cursor_from_node(object)
|
146
|
-
raise GraphQL::RequiredImplementationMissingError, "must return a cursor for this object/connection pair"
|
147
|
-
end
|
148
|
-
|
149
|
-
def inspect
|
150
|
-
"#<GraphQL::Relay::Connection @parent=#{@parent.inspect} @arguments=#{@arguments.to_h.inspect}>"
|
151
|
-
end
|
152
|
-
|
153
|
-
private
|
154
|
-
|
155
|
-
# Return a sanitized `arguments[arg_name]` (don't allow negatives)
|
156
|
-
def get_limited_arg(arg_name)
|
157
|
-
arg_value = arguments[arg_name]
|
158
|
-
if arg_value.nil?
|
159
|
-
arg_value
|
160
|
-
elsif arg_value < 0
|
161
|
-
0
|
162
|
-
else
|
163
|
-
arg_value
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def paged_nodes
|
168
|
-
raise GraphQL::RequiredImplementationMissingError, "must return nodes for this connection after paging"
|
169
|
-
end
|
170
|
-
|
171
|
-
def sliced_nodes
|
172
|
-
raise GraphQL::RequiredImplementationMissingError, "must return all nodes for this connection after chopping off first and last"
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Provided a GraphQL field which returns a collection of nodes,
|
5
|
-
# wrap that field to expose those nodes as a connection.
|
6
|
-
#
|
7
|
-
# The original resolve proc is used to fetch nodes,
|
8
|
-
# then a connection implementation is fetched with {BaseConnection.connection_for_nodes}.
|
9
|
-
module ConnectionInstrumentation
|
10
|
-
def self.default_arguments
|
11
|
-
@default_arguments ||= begin
|
12
|
-
argument_definitions = [
|
13
|
-
["first", GraphQL::INT_TYPE, "Returns the first _n_ elements from the list."],
|
14
|
-
["after", GraphQL::STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
|
15
|
-
["last", GraphQL::INT_TYPE, "Returns the last _n_ elements from the list."],
|
16
|
-
["before", GraphQL::STRING_TYPE, "Returns the elements in the list that come before the specified cursor."],
|
17
|
-
]
|
18
|
-
|
19
|
-
argument_definitions.reduce({}) do |memo, arg_defn|
|
20
|
-
argument = GraphQL::Argument.new
|
21
|
-
name, type, description = arg_defn
|
22
|
-
argument.name = name
|
23
|
-
argument.type = type
|
24
|
-
argument.description = description
|
25
|
-
memo[argument.name.to_s] = argument
|
26
|
-
memo
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Build a connection field from a {GraphQL::Field} by:
|
32
|
-
# - Merging in the default arguments
|
33
|
-
# - Transforming its resolve function to return a connection object
|
34
|
-
def self.instrument(type, field)
|
35
|
-
# Don't apply the wrapper to class-based fields, since they
|
36
|
-
# use Schema::Field::ConnectionFilter
|
37
|
-
if field.connection? && !field.metadata[:type_class]
|
38
|
-
connection_arguments = default_arguments.merge(field.arguments)
|
39
|
-
original_resolve = field.resolve_proc
|
40
|
-
original_lazy_resolve = field.lazy_resolve_proc
|
41
|
-
connection_resolve = GraphQL::Relay::ConnectionResolve.new(field, original_resolve)
|
42
|
-
connection_lazy_resolve = GraphQL::Relay::ConnectionResolve.new(field, original_lazy_resolve)
|
43
|
-
field.redefine(
|
44
|
-
resolve: connection_resolve,
|
45
|
-
lazy_resolve: connection_lazy_resolve,
|
46
|
-
arguments: connection_arguments,
|
47
|
-
)
|
48
|
-
else
|
49
|
-
field
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class ConnectionResolve
|
5
|
-
def initialize(field, underlying_resolve)
|
6
|
-
@field = field
|
7
|
-
@underlying_resolve = underlying_resolve
|
8
|
-
@max_page_size = field.connection_max_page_size
|
9
|
-
end
|
10
|
-
|
11
|
-
def call(obj, args, ctx)
|
12
|
-
# in a lazy resolve hook, obj is the promise,
|
13
|
-
# get the object that the promise was
|
14
|
-
# originally derived from
|
15
|
-
parent = ctx.object
|
16
|
-
|
17
|
-
nodes = @underlying_resolve.call(obj, args, ctx)
|
18
|
-
|
19
|
-
if nodes.nil? || ctx.schema.lazy?(nodes) || nodes.is_a?(GraphQL::Execution::Execute::Skip) || ctx.wrapped_connection
|
20
|
-
nodes
|
21
|
-
else
|
22
|
-
ctx.wrapped_connection = true
|
23
|
-
build_connection(nodes, args, parent, ctx)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def build_connection(nodes, args, parent, ctx)
|
30
|
-
if nodes.is_a? GraphQL::ExecutionError
|
31
|
-
ctx.add_error(nodes)
|
32
|
-
nil
|
33
|
-
else
|
34
|
-
if parent.is_a?(GraphQL::Schema::Object)
|
35
|
-
parent = parent.object
|
36
|
-
end
|
37
|
-
connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(nodes)
|
38
|
-
connection_class.new(nodes, args, field: @field, max_page_size: @max_page_size, parent: parent, context: ctx)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# @api deprecated
|
5
|
-
module ConnectionType
|
6
|
-
class << self
|
7
|
-
# @return [Boolean] If true, connection types get a `nodes` shortcut field
|
8
|
-
attr_accessor :default_nodes_field
|
9
|
-
# @return [Boolean] If true, connections check for reverse-direction `has*Page` values
|
10
|
-
attr_accessor :bidirectional_pagination
|
11
|
-
end
|
12
|
-
|
13
|
-
self.default_nodes_field = false
|
14
|
-
self.bidirectional_pagination = false
|
15
|
-
|
16
|
-
# @api deprecated
|
17
|
-
def self.create_type(wrapped_type, edge_type: nil, edge_class: GraphQL::Relay::Edge, nodes_field: ConnectionType.default_nodes_field, &block)
|
18
|
-
custom_edge_class = edge_class
|
19
|
-
|
20
|
-
# Any call that would trigger `wrapped_type.ensure_defined`
|
21
|
-
# must be inside this lazy block, otherwise we get weird
|
22
|
-
# cyclical dependency errors :S
|
23
|
-
ObjectType.define do
|
24
|
-
type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
|
25
|
-
edge_type ||= wrapped_type.edge_type
|
26
|
-
name("#{type_name}Connection")
|
27
|
-
description("The connection type for #{type_name}.")
|
28
|
-
field :edges, types[edge_type], "A list of edges.", edge_class: custom_edge_class, property: :edge_nodes
|
29
|
-
|
30
|
-
if nodes_field
|
31
|
-
field :nodes, types[wrapped_type], "A list of nodes.", property: :edge_nodes
|
32
|
-
end
|
33
|
-
|
34
|
-
field :pageInfo, !PageInfo, "Information to aid in pagination.", property: :page_info
|
35
|
-
relay_node_type(wrapped_type)
|
36
|
-
block && instance_eval(&block)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/graphql/relay/edge.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Mostly an internal concern.
|
5
|
-
#
|
6
|
-
# Wraps an object as a `node`, and exposes a connection-specific `cursor`.
|
7
|
-
class Edge
|
8
|
-
attr_reader :node, :connection
|
9
|
-
def initialize(node, connection)
|
10
|
-
@node = node
|
11
|
-
@connection = connection
|
12
|
-
end
|
13
|
-
|
14
|
-
def cursor
|
15
|
-
@cursor ||= connection.cursor_from_node(node)
|
16
|
-
end
|
17
|
-
|
18
|
-
def parent
|
19
|
-
@parent ||= connection.parent
|
20
|
-
end
|
21
|
-
|
22
|
-
def inspect
|
23
|
-
"#<GraphQL::Relay::Edge (#{parent.inspect} => #{node.inspect})>"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
module EdgeType
|
5
|
-
# @api deprecated
|
6
|
-
def self.create_type(wrapped_type, name: nil, &block)
|
7
|
-
GraphQL::ObjectType.define do
|
8
|
-
type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
|
9
|
-
name("#{type_name}Edge")
|
10
|
-
description "An edge in a connection."
|
11
|
-
field :node, wrapped_type, "The item at the end of the edge."
|
12
|
-
field :cursor, !types.String, "A cursor for use in pagination."
|
13
|
-
relay_node_type(wrapped_type)
|
14
|
-
block && instance_eval(&block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
module EdgesInstrumentation
|
5
|
-
def self.instrument(type, field)
|
6
|
-
if field.edges?
|
7
|
-
edges_resolve = EdgesResolve.new(edge_class: field.edge_class, resolve: field.resolve_proc)
|
8
|
-
edges_lazy_resolve = EdgesResolve.new(edge_class: field.edge_class, resolve: field.lazy_resolve_proc)
|
9
|
-
|
10
|
-
field.redefine(
|
11
|
-
resolve: edges_resolve,
|
12
|
-
lazy_resolve: edges_lazy_resolve,
|
13
|
-
)
|
14
|
-
else
|
15
|
-
field
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
class EdgesResolve
|
21
|
-
def initialize(edge_class:, resolve:)
|
22
|
-
@edge_class = edge_class
|
23
|
-
@resolve_proc = resolve
|
24
|
-
end
|
25
|
-
|
26
|
-
# A user's custom Connection may return a lazy object,
|
27
|
-
# if so, handle it later.
|
28
|
-
def call(obj, args, ctx)
|
29
|
-
parent = ctx.object
|
30
|
-
nodes = @resolve_proc.call(obj, args, ctx)
|
31
|
-
if ctx.schema.lazy?(nodes)
|
32
|
-
nodes
|
33
|
-
else
|
34
|
-
nodes.map { |item| item.is_a?(GraphQL::Pagination::Connection::Edge) ? item : @edge_class.new(item, parent) }
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class GlobalIdResolve
|
5
|
-
def initialize(type:)
|
6
|
-
@type = type
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(obj, args, ctx)
|
10
|
-
if obj.is_a?(GraphQL::Schema::Object)
|
11
|
-
obj = obj.object
|
12
|
-
end
|
13
|
-
type = @type.respond_to?(:graphql_definition) ? @type.graphql_definition : @type
|
14
|
-
ctx.query.schema.id_from_object(obj, type, ctx)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# A connection implementation to expose MongoDB collection objects.
|
5
|
-
# It works for:
|
6
|
-
# - `Mongoid::Criteria`
|
7
|
-
class MongoRelationConnection < RelationConnection
|
8
|
-
private
|
9
|
-
|
10
|
-
def relation_offset(relation)
|
11
|
-
relation.options.skip
|
12
|
-
end
|
13
|
-
|
14
|
-
def relation_limit(relation)
|
15
|
-
relation.options.limit
|
16
|
-
end
|
17
|
-
|
18
|
-
def relation_count(relation)
|
19
|
-
# Must perform query (hence #to_a) to count results https://jira.mongodb.org/browse/MONGOID-2325
|
20
|
-
relation.to_a.count
|
21
|
-
end
|
22
|
-
|
23
|
-
def limit_nodes(sliced_nodes, limit)
|
24
|
-
if limit == 0
|
25
|
-
if sliced_nodes.respond_to?(:none) # added in Mongoid 4.0
|
26
|
-
sliced_nodes.without_options.none
|
27
|
-
else
|
28
|
-
sliced_nodes.where(id: nil) # trying to simulate #none for 3.1.7
|
29
|
-
end
|
30
|
-
else
|
31
|
-
sliced_nodes.limit(limit)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
if defined?(Mongoid::Criteria)
|
37
|
-
BaseConnection.register_connection_implementation(Mongoid::Criteria, MongoRelationConnection)
|
38
|
-
end
|
39
|
-
|
40
|
-
# Mongoid 5 and 6
|
41
|
-
if defined?(Mongoid::Relations::Targets::Enumerable)
|
42
|
-
BaseConnection.register_connection_implementation(Mongoid::Relations::Targets::Enumerable, MongoRelationConnection)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Mongoid 7
|
46
|
-
if defined?(Mongoid::Association::Referenced::HasMany::Targets::Enumerable)
|
47
|
-
BaseConnection.register_connection_implementation(Mongoid::Association::Referenced::HasMany::Targets::Enumerable, MongoRelationConnection)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class Mutation
|
5
|
-
# @api private
|
6
|
-
module Instrumentation
|
7
|
-
# Modify mutation `return_field` resolves by wrapping the returned object
|
8
|
-
# in a {Mutation::Result}.
|
9
|
-
#
|
10
|
-
# By using an instrumention, we can apply our wrapper _last_,
|
11
|
-
# giving users access to the original resolve function in earlier instrumentation.
|
12
|
-
def self.instrument(type, field)
|
13
|
-
if field.mutation.is_a?(GraphQL::Relay::Mutation) || (field.mutation.is_a?(Class) && field.mutation < GraphQL::Schema::RelayClassicMutation)
|
14
|
-
new_resolve = Mutation::Resolve.new(field.mutation, field.resolve_proc)
|
15
|
-
field.redefine(resolve: new_resolve)
|
16
|
-
else
|
17
|
-
field
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class Mutation
|
5
|
-
# Wrap a user-provided resolve function,
|
6
|
-
# wrapping the returned value in a {Mutation::Result}.
|
7
|
-
# Also, pass the `clientMutationId` to that result object.
|
8
|
-
# @api private
|
9
|
-
class Resolve
|
10
|
-
def initialize(mutation, resolve)
|
11
|
-
@mutation = mutation
|
12
|
-
@resolve = resolve
|
13
|
-
@wrap_result = mutation.is_a?(GraphQL::Relay::Mutation) && mutation.has_generated_return_type?
|
14
|
-
@class_based = mutation.is_a?(Class)
|
15
|
-
end
|
16
|
-
|
17
|
-
def call(obj, args, ctx)
|
18
|
-
mutation_result = begin
|
19
|
-
@resolve.call(obj, args[:input], ctx)
|
20
|
-
rescue GraphQL::ExecutionError => err
|
21
|
-
err
|
22
|
-
end
|
23
|
-
|
24
|
-
ctx.schema.after_lazy(mutation_result) do |res|
|
25
|
-
build_result(res, args, ctx)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def build_result(mutation_result, args, ctx)
|
32
|
-
if mutation_result.is_a?(GraphQL::ExecutionError)
|
33
|
-
ctx.add_error(mutation_result)
|
34
|
-
mutation_result = nil
|
35
|
-
end
|
36
|
-
|
37
|
-
if mutation_result.nil?
|
38
|
-
nil
|
39
|
-
elsif @wrap_result
|
40
|
-
if mutation_result && !mutation_result.is_a?(Hash)
|
41
|
-
raise StandardError, "Expected `#{mutation_result}` to be a Hash."\
|
42
|
-
" Return a hash when using `return_field` or specify a custom `return_type`."
|
43
|
-
end
|
44
|
-
|
45
|
-
@mutation.result_class.new(client_mutation_id: args[:input][:clientMutationId], result: mutation_result)
|
46
|
-
elsif @class_based
|
47
|
-
mutation_result[:client_mutation_id] = args[:input][:client_mutation_id]
|
48
|
-
mutation_result
|
49
|
-
else
|
50
|
-
mutation_result
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class Mutation
|
5
|
-
# Use this when the mutation's return type was generated from `return_field`s.
|
6
|
-
# It delegates field lookups to the hash returned from `resolve`.
|
7
|
-
# @api private
|
8
|
-
class Result
|
9
|
-
attr_reader :client_mutation_id
|
10
|
-
def initialize(client_mutation_id:, result:)
|
11
|
-
@client_mutation_id = client_mutation_id
|
12
|
-
result && result.each do |key, value|
|
13
|
-
self.public_send("#{key}=", value)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class << self
|
18
|
-
attr_accessor :mutation
|
19
|
-
end
|
20
|
-
|
21
|
-
# Build a subclass whose instances have a method
|
22
|
-
# for each of `mutation_defn`'s `return_field`s
|
23
|
-
# @param mutation_defn [GraphQL::Relay::Mutation]
|
24
|
-
# @return [Class]
|
25
|
-
def self.define_subclass(mutation_defn)
|
26
|
-
subclass = Class.new(self) do
|
27
|
-
mutation_result_methods = mutation_defn.return_type.all_fields.map do |f|
|
28
|
-
f.property || f.name
|
29
|
-
end
|
30
|
-
attr_accessor(*mutation_result_methods)
|
31
|
-
self.mutation = mutation_defn
|
32
|
-
end
|
33
|
-
subclass
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|