graphql 1.13.14 → 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/graphql/analysis/ast/query_complexity.rb +1 -1
 - data/lib/graphql/analysis/ast/query_depth.rb +0 -1
 - data/lib/graphql/analysis/ast/visitor.rb +1 -1
 - data/lib/graphql/analysis/ast.rb +0 -10
 - data/lib/graphql/analysis.rb +0 -7
 - data/lib/graphql/backtrace/table.rb +0 -18
 - data/lib/graphql/backtrace/tracer.rb +1 -2
 - data/lib/graphql/backtrace.rb +2 -8
 - data/lib/graphql/dig.rb +1 -1
 - data/lib/graphql/execution/errors.rb +1 -9
 - data/lib/graphql/execution/interpreter/runtime.rb +2 -9
 - data/lib/graphql/execution/interpreter.rb +0 -22
 - data/lib/graphql/execution/lazy.rb +1 -1
 - data/lib/graphql/execution/lookahead.rb +6 -13
 - data/lib/graphql/execution/multiplex.rb +50 -107
 - data/lib/graphql/execution.rb +11 -3
 - data/lib/graphql/introspection/dynamic_fields.rb +3 -8
 - data/lib/graphql/introspection/entry_points.rb +2 -15
 - data/lib/graphql/language/document_from_schema_definition.rb +0 -17
 - data/lib/graphql/pagination/connections.rb +2 -28
 - data/lib/graphql/query/context.rb +1 -185
 - data/lib/graphql/query/literal_input.rb +8 -13
 - data/lib/graphql/query/validation_pipeline.rb +8 -37
 - data/lib/graphql/query/variables.rb +22 -18
 - data/lib/graphql/query.rb +5 -35
 - data/lib/graphql/railtie.rb +0 -104
 - data/lib/graphql/relay/range_add.rb +0 -4
 - data/lib/graphql/relay.rb +0 -15
 - data/lib/graphql/schema/addition.rb +1 -8
 - data/lib/graphql/schema/argument.rb +1 -25
 - data/lib/graphql/schema/build_from_definition.rb +0 -1
 - data/lib/graphql/schema/directive.rb +0 -21
 - data/lib/graphql/schema/enum.rb +1 -18
 - data/lib/graphql/schema/enum_value.rb +0 -22
 - data/lib/graphql/schema/field.rb +2 -185
 - data/lib/graphql/schema/input_object.rb +9 -56
 - data/lib/graphql/schema/interface.rb +0 -25
 - data/lib/graphql/schema/introspection_system.rb +3 -8
 - data/lib/graphql/schema/late_bound_type.rb +2 -2
 - data/lib/graphql/schema/list.rb +0 -6
 - data/lib/graphql/schema/loader.rb +0 -1
 - data/lib/graphql/schema/member/base_dsl_methods.rb +0 -5
 - data/lib/graphql/schema/member/build_type.rb +4 -6
 - data/lib/graphql/schema/member/has_arguments.rb +14 -18
 - data/lib/graphql/schema/member/has_fields.rb +2 -2
 - data/lib/graphql/schema/member/has_interfaces.rb +0 -2
 - data/lib/graphql/schema/member.rb +0 -6
 - data/lib/graphql/schema/mutation.rb +0 -9
 - data/lib/graphql/schema/non_null.rb +1 -7
 - data/lib/graphql/schema/object.rb +0 -40
 - data/lib/graphql/schema/relay_classic_mutation.rb +17 -28
 - data/lib/graphql/schema/scalar.rb +0 -15
 - data/lib/graphql/schema/union.rb +0 -16
 - data/lib/graphql/schema/warden.rb +1 -1
 - data/lib/graphql/schema/wrapper.rb +0 -5
 - data/lib/graphql/schema.rb +106 -945
 - data/lib/graphql/static_validation/base_visitor.rb +4 -21
 - data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
 - data/lib/graphql/static_validation/validator.rb +2 -24
 - data/lib/graphql/static_validation.rb +0 -2
 - data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
 - data/lib/graphql/subscriptions/event.rb +1 -1
 - data/lib/graphql/subscriptions/instrumentation.rb +0 -51
 - data/lib/graphql/subscriptions.rb +4 -13
 - data/lib/graphql/tracing/data_dog_tracing.rb +2 -19
 - data/lib/graphql/tracing/platform_tracing.rb +4 -31
 - data/lib/graphql/tracing.rb +0 -2
 - data/lib/graphql/types/relay/connection_behaviors.rb +2 -6
 - data/lib/graphql/types/relay/default_relay.rb +0 -10
 - data/lib/graphql/types/relay/node_behaviors.rb +5 -1
 - data/lib/graphql/types/relay.rb +0 -2
 - data/lib/graphql/version.rb +1 -1
 - data/lib/graphql.rb +1 -65
 - metadata +6 -132
 - data/lib/graphql/analysis/analyze_query.rb +0 -98
 - data/lib/graphql/analysis/field_usage.rb +0 -45
 - data/lib/graphql/analysis/max_query_complexity.rb +0 -26
 - data/lib/graphql/analysis/max_query_depth.rb +0 -26
 - data/lib/graphql/analysis/query_complexity.rb +0 -88
 - data/lib/graphql/analysis/query_depth.rb +0 -43
 - data/lib/graphql/analysis/reducer_state.rb +0 -48
 - data/lib/graphql/argument.rb +0 -131
 - data/lib/graphql/authorization.rb +0 -82
 - data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
 - data/lib/graphql/backwards_compatibility.rb +0 -61
 - data/lib/graphql/base_type.rb +0 -232
 - data/lib/graphql/boolean_type.rb +0 -2
 - data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
 - data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
 - data/lib/graphql/compatibility/execution_specification.rb +0 -436
 - data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
 - data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
 - data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
 - data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
 - data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
 - data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
 - data/lib/graphql/compatibility.rb +0 -5
 - data/lib/graphql/define/assign_argument.rb +0 -12
 - data/lib/graphql/define/assign_connection.rb +0 -13
 - data/lib/graphql/define/assign_enum_value.rb +0 -18
 - data/lib/graphql/define/assign_global_id_field.rb +0 -11
 - data/lib/graphql/define/assign_mutation_function.rb +0 -34
 - data/lib/graphql/define/assign_object_field.rb +0 -42
 - data/lib/graphql/define/defined_object_proxy.rb +0 -53
 - data/lib/graphql/define/instance_definable.rb +0 -255
 - 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 -55
 - 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 -133
 - data/lib/graphql/execution/execute.rb +0 -333
 - data/lib/graphql/execution/flatten.rb +0 -40
 - data/lib/graphql/execution/typecast.rb +0 -50
 - data/lib/graphql/field/resolve.rb +0 -59
 - data/lib/graphql/field.rb +0 -226
 - data/lib/graphql/float_type.rb +0 -2
 - data/lib/graphql/function.rb +0 -128
 - data/lib/graphql/id_type.rb +0 -2
 - data/lib/graphql/input_object_type.rb +0 -138
 - data/lib/graphql/int_type.rb +0 -2
 - data/lib/graphql/interface_type.rb +0 -72
 - data/lib/graphql/internal_representation/document.rb +0 -27
 - data/lib/graphql/internal_representation/node.rb +0 -206
 - data/lib/graphql/internal_representation/print.rb +0 -51
 - data/lib/graphql/internal_representation/rewrite.rb +0 -184
 - data/lib/graphql/internal_representation/scope.rb +0 -88
 - data/lib/graphql/internal_representation/visit.rb +0 -36
 - data/lib/graphql/internal_representation.rb +0 -7
 - data/lib/graphql/list_type.rb +0 -80
 - data/lib/graphql/non_null_type.rb +0 -71
 - data/lib/graphql/object_type.rb +0 -130
 - data/lib/graphql/query/arguments.rb +0 -189
 - data/lib/graphql/query/arguments_cache.rb +0 -24
 - data/lib/graphql/query/executor.rb +0 -52
 - data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
 - data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
 - data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
 - data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
 - data/lib/graphql/query/serial_execution.rb +0 -40
 - data/lib/graphql/relay/array_connection.rb +0 -83
 - data/lib/graphql/relay/base_connection.rb +0 -189
 - data/lib/graphql/relay/connection_instrumentation.rb +0 -54
 - data/lib/graphql/relay/connection_resolve.rb +0 -43
 - data/lib/graphql/relay/connection_type.rb +0 -54
 - 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 -39
 - data/lib/graphql/relay/global_id_resolve.rb +0 -17
 - data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
 - data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
 - data/lib/graphql/relay/mutation/resolve.rb +0 -56
 - data/lib/graphql/relay/mutation/result.rb +0 -38
 - data/lib/graphql/relay/mutation.rb +0 -106
 - data/lib/graphql/relay/node.rb +0 -39
 - data/lib/graphql/relay/page_info.rb +0 -7
 - data/lib/graphql/relay/relation_connection.rb +0 -188
 - data/lib/graphql/relay/type_extensions.rb +0 -32
 - data/lib/graphql/scalar_type.rb +0 -91
 - data/lib/graphql/schema/catchall_middleware.rb +0 -35
 - data/lib/graphql/schema/default_parse_error.rb +0 -10
 - data/lib/graphql/schema/default_type_error.rb +0 -17
 - data/lib/graphql/schema/member/accepts_definition.rb +0 -164
 - data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
 - data/lib/graphql/schema/member/instrumentation.rb +0 -131
 - data/lib/graphql/schema/middleware_chain.rb +0 -82
 - data/lib/graphql/schema/possible_types.rb +0 -44
 - data/lib/graphql/schema/rescue_middleware.rb +0 -60
 - data/lib/graphql/schema/timeout_middleware.rb +0 -88
 - data/lib/graphql/schema/traversal.rb +0 -228
 - data/lib/graphql/schema/validation.rb +0 -313
 - data/lib/graphql/static_validation/default_visitor.rb +0 -15
 - data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
 - data/lib/graphql/string_type.rb +0 -2
 - data/lib/graphql/subscriptions/subscription_root.rb +0 -76
 - data/lib/graphql/tracing/opentelemetry_tracing.rb +0 -101
 - data/lib/graphql/tracing/skylight_tracing.rb +0 -70
 - data/lib/graphql/types/relay/node_field.rb +0 -24
 - data/lib/graphql/types/relay/nodes_field.rb +0 -43
 - data/lib/graphql/union_type.rb +0 -115
 - data/lib/graphql/upgrader/member.rb +0 -937
 - data/lib/graphql/upgrader/schema.rb +0 -38
 
| 
         @@ -1,40 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
            require "graphql/query/serial_execution/value_resolution"
         
     | 
| 
       3 
     | 
    
         
            -
            require "graphql/query/serial_execution/field_resolution"
         
     | 
| 
       4 
     | 
    
         
            -
            require "graphql/query/serial_execution/operation_resolution"
         
     | 
| 
       5 
     | 
    
         
            -
            require "graphql/query/serial_execution/selection_resolution"
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            module GraphQL
         
     | 
| 
       8 
     | 
    
         
            -
              class Query
         
     | 
| 
       9 
     | 
    
         
            -
                class SerialExecution
         
     | 
| 
       10 
     | 
    
         
            -
                  # This is the only required method for an Execution strategy.
         
     | 
| 
       11 
     | 
    
         
            -
                  # You could create a custom execution strategy and configure your schema to
         
     | 
| 
       12 
     | 
    
         
            -
                  # use that custom strategy instead.
         
     | 
| 
       13 
     | 
    
         
            -
                  #
         
     | 
| 
       14 
     | 
    
         
            -
                  # @param ast_operation [GraphQL::Language::Nodes::OperationDefinition] The operation definition to run
         
     | 
| 
       15 
     | 
    
         
            -
                  # @param root_type [GraphQL::ObjectType] either the query type or the mutation type
         
     | 
| 
       16 
     | 
    
         
            -
                  # @param query_object [GraphQL::Query] the query object for this execution
         
     | 
| 
       17 
     | 
    
         
            -
                  # @return [Hash] a spec-compliant GraphQL result, as a hash
         
     | 
| 
       18 
     | 
    
         
            -
                  def execute(ast_operation, root_type, query_object)
         
     | 
| 
       19 
     | 
    
         
            -
                    GraphQL::Deprecation.warn "#{self.class} will be removed in GraphQL-Ruby 2.0, please upgrade to the Interpreter: https://graphql-ruby.org/queries/interpreter.html"
         
     | 
| 
       20 
     | 
    
         
            -
                    operation_resolution.resolve(
         
     | 
| 
       21 
     | 
    
         
            -
                      query_object.irep_selection,
         
     | 
| 
       22 
     | 
    
         
            -
                      root_type,
         
     | 
| 
       23 
     | 
    
         
            -
                      query_object
         
     | 
| 
       24 
     | 
    
         
            -
                    )
         
     | 
| 
       25 
     | 
    
         
            -
                  end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                  def field_resolution
         
     | 
| 
       28 
     | 
    
         
            -
                    self.class::FieldResolution
         
     | 
| 
       29 
     | 
    
         
            -
                  end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                  def operation_resolution
         
     | 
| 
       32 
     | 
    
         
            -
                    self.class::OperationResolution
         
     | 
| 
       33 
     | 
    
         
            -
                  end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                  def selection_resolution
         
     | 
| 
       36 
     | 
    
         
            -
                    self.class::SelectionResolution
         
     | 
| 
       37 
     | 
    
         
            -
                  end
         
     | 
| 
       38 
     | 
    
         
            -
                end
         
     | 
| 
       39 
     | 
    
         
            -
              end
         
     | 
| 
       40 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,83 +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 
     | 
    
         
            -
                  def first
         
     | 
| 
       35 
     | 
    
         
            -
                    @first ||= begin
         
     | 
| 
       36 
     | 
    
         
            -
                      capped = limit_pagination_argument(arguments[:first], max_page_size)
         
     | 
| 
       37 
     | 
    
         
            -
                      if capped.nil? && last.nil?
         
     | 
| 
       38 
     | 
    
         
            -
                        capped = max_page_size
         
     | 
| 
       39 
     | 
    
         
            -
                      end
         
     | 
| 
       40 
     | 
    
         
            -
                      capped
         
     | 
| 
       41 
     | 
    
         
            -
                    end
         
     | 
| 
       42 
     | 
    
         
            -
                  end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                  def last
         
     | 
| 
       45 
     | 
    
         
            -
                    @last ||= limit_pagination_argument(arguments[:last], max_page_size)
         
     | 
| 
       46 
     | 
    
         
            -
                  end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                  private
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                  # apply first / last limit results
         
     | 
| 
       51 
     | 
    
         
            -
                  def paged_nodes
         
     | 
| 
       52 
     | 
    
         
            -
                    @paged_nodes ||= begin
         
     | 
| 
       53 
     | 
    
         
            -
                      items = sliced_nodes
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                      items = items.first(first) if first
         
     | 
| 
       56 
     | 
    
         
            -
                      items = items.last(last) if last
         
     | 
| 
       57 
     | 
    
         
            -
                      items = items.first(max_page_size) if max_page_size && !first && !last
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                      items
         
     | 
| 
       60 
     | 
    
         
            -
                    end
         
     | 
| 
       61 
     | 
    
         
            -
                  end
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
                  # Apply cursors to edges
         
     | 
| 
       64 
     | 
    
         
            -
                  def sliced_nodes
         
     | 
| 
       65 
     | 
    
         
            -
                    @sliced_nodes ||= if before && after
         
     | 
| 
       66 
     | 
    
         
            -
                      nodes[index_from_cursor(after)..index_from_cursor(before)-1] || []
         
     | 
| 
       67 
     | 
    
         
            -
                    elsif before
         
     | 
| 
       68 
     | 
    
         
            -
                      nodes[0..index_from_cursor(before)-2] || []
         
     | 
| 
       69 
     | 
    
         
            -
                    elsif after
         
     | 
| 
       70 
     | 
    
         
            -
                      nodes[index_from_cursor(after)..-1] || []
         
     | 
| 
       71 
     | 
    
         
            -
                    else
         
     | 
| 
       72 
     | 
    
         
            -
                      nodes
         
     | 
| 
       73 
     | 
    
         
            -
                    end
         
     | 
| 
       74 
     | 
    
         
            -
                  end
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
                  def index_from_cursor(cursor)
         
     | 
| 
       77 
     | 
    
         
            -
                    decode(cursor).to_i
         
     | 
| 
       78 
     | 
    
         
            -
                  end
         
     | 
| 
       79 
     | 
    
         
            -
                end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                BaseConnection.register_connection_implementation(Array, ArrayConnection)
         
     | 
| 
       82 
     | 
    
         
            -
              end
         
     | 
| 
       83 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,189 +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 
     | 
    
         
            -
                    GraphQL::Deprecation.warn "GraphQL::Relay::BaseConnection (used for #{self.class}) will be removed from GraphQL-Ruby 2.0, use GraphQL::Pagination::Connections instead: https://graphql-ruby.org/pagination/overview.html"
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                    deprecated_caller = caller(0, 10).find { |c| !c.include?("lib/graphql") }
         
     | 
| 
       65 
     | 
    
         
            -
                    if deprecated_caller
         
     | 
| 
       66 
     | 
    
         
            -
                      GraphQL::Deprecation.warn "  -> called from #{deprecated_caller}"
         
     | 
| 
       67 
     | 
    
         
            -
                    end
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                    @context = context
         
     | 
| 
       70 
     | 
    
         
            -
                    @nodes = nodes
         
     | 
| 
       71 
     | 
    
         
            -
                    @arguments = arguments
         
     | 
| 
       72 
     | 
    
         
            -
                    @field = field
         
     | 
| 
       73 
     | 
    
         
            -
                    @parent = parent
         
     | 
| 
       74 
     | 
    
         
            -
                    @encoder = context ? @context.schema.cursor_encoder : GraphQL::Schema::Base64Encoder
         
     | 
| 
       75 
     | 
    
         
            -
                    @max_page_size = max_page_size.nil? && context ? @context.schema.default_max_page_size : max_page_size
         
     | 
| 
       76 
     | 
    
         
            -
                  end
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                  def encode(data)
         
     | 
| 
       79 
     | 
    
         
            -
                    @encoder.encode(data, nonce: true)
         
     | 
| 
       80 
     | 
    
         
            -
                  end
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
                  def decode(data)
         
     | 
| 
       83 
     | 
    
         
            -
                    @encoder.decode(data, nonce: true)
         
     | 
| 
       84 
     | 
    
         
            -
                  end
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
                  # The value passed as `first:`, if there was one. Negative numbers become `0`.
         
     | 
| 
       87 
     | 
    
         
            -
                  # @return [Integer, nil]
         
     | 
| 
       88 
     | 
    
         
            -
                  def first
         
     | 
| 
       89 
     | 
    
         
            -
                    @first ||= begin
         
     | 
| 
       90 
     | 
    
         
            -
                      capped = limit_pagination_argument(arguments[:first], max_page_size)
         
     | 
| 
       91 
     | 
    
         
            -
                      if capped.nil? && last.nil?
         
     | 
| 
       92 
     | 
    
         
            -
                        capped = max_page_size
         
     | 
| 
       93 
     | 
    
         
            -
                      end
         
     | 
| 
       94 
     | 
    
         
            -
                      capped
         
     | 
| 
       95 
     | 
    
         
            -
                    end
         
     | 
| 
       96 
     | 
    
         
            -
                  end
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
                  # The value passed as `after:`, if there was one
         
     | 
| 
       99 
     | 
    
         
            -
                  # @return [String, nil]
         
     | 
| 
       100 
     | 
    
         
            -
                  def after
         
     | 
| 
       101 
     | 
    
         
            -
                    arguments[:after]
         
     | 
| 
       102 
     | 
    
         
            -
                  end
         
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
                  # The value passed as `last:`, if there was one. Negative numbers become `0`.
         
     | 
| 
       105 
     | 
    
         
            -
                  # @return [Integer, nil]
         
     | 
| 
       106 
     | 
    
         
            -
                  def last
         
     | 
| 
       107 
     | 
    
         
            -
                    @last ||= limit_pagination_argument(arguments[:last], max_page_size)
         
     | 
| 
       108 
     | 
    
         
            -
                  end
         
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
                  # The value passed as `before:`, if there was one
         
     | 
| 
       111 
     | 
    
         
            -
                  # @return [String, nil]
         
     | 
| 
       112 
     | 
    
         
            -
                  def before
         
     | 
| 
       113 
     | 
    
         
            -
                    arguments[:before]
         
     | 
| 
       114 
     | 
    
         
            -
                  end
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
                  # These are the nodes to render for this connection,
         
     | 
| 
       117 
     | 
    
         
            -
                  # probably wrapped by {GraphQL::Relay::Edge}
         
     | 
| 
       118 
     | 
    
         
            -
                  def edge_nodes
         
     | 
| 
       119 
     | 
    
         
            -
                    @edge_nodes ||= paged_nodes
         
     | 
| 
       120 
     | 
    
         
            -
                  end
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
                  # Support the `pageInfo` field
         
     | 
| 
       123 
     | 
    
         
            -
                  def page_info
         
     | 
| 
       124 
     | 
    
         
            -
                    self
         
     | 
| 
       125 
     | 
    
         
            -
                  end
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                  # Used by `pageInfo`
         
     | 
| 
       128 
     | 
    
         
            -
                  def has_next_page
         
     | 
| 
       129 
     | 
    
         
            -
                    !!(first && sliced_nodes.count > first)
         
     | 
| 
       130 
     | 
    
         
            -
                  end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
                  # Used by `pageInfo`
         
     | 
| 
       133 
     | 
    
         
            -
                  def has_previous_page
         
     | 
| 
       134 
     | 
    
         
            -
                    !!(last && sliced_nodes.count > last)
         
     | 
| 
       135 
     | 
    
         
            -
                  end
         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
                  # Used by `pageInfo`
         
     | 
| 
       138 
     | 
    
         
            -
                  def start_cursor
         
     | 
| 
       139 
     | 
    
         
            -
                    if start_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).first
         
     | 
| 
       140 
     | 
    
         
            -
                      return cursor_from_node(start_node)
         
     | 
| 
       141 
     | 
    
         
            -
                    else
         
     | 
| 
       142 
     | 
    
         
            -
                      return nil
         
     | 
| 
       143 
     | 
    
         
            -
                    end
         
     | 
| 
       144 
     | 
    
         
            -
                  end
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
                  # Used by `pageInfo`
         
     | 
| 
       147 
     | 
    
         
            -
                  def end_cursor
         
     | 
| 
       148 
     | 
    
         
            -
                    if end_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).last
         
     | 
| 
       149 
     | 
    
         
            -
                      return cursor_from_node(end_node)
         
     | 
| 
       150 
     | 
    
         
            -
                    else
         
     | 
| 
       151 
     | 
    
         
            -
                      return nil
         
     | 
| 
       152 
     | 
    
         
            -
                    end
         
     | 
| 
       153 
     | 
    
         
            -
                  end
         
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
                  # An opaque operation which returns a connection-specific cursor.
         
     | 
| 
       156 
     | 
    
         
            -
                  def cursor_from_node(object)
         
     | 
| 
       157 
     | 
    
         
            -
                    raise GraphQL::RequiredImplementationMissingError, "must return a cursor for this object/connection pair"
         
     | 
| 
       158 
     | 
    
         
            -
                  end
         
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
                  def inspect
         
     | 
| 
       161 
     | 
    
         
            -
                    "#<GraphQL::Relay::Connection @parent=#{@parent.inspect} @arguments=#{@arguments.to_h.inspect}>"
         
     | 
| 
       162 
     | 
    
         
            -
                  end
         
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
                  private
         
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
       166 
     | 
    
         
            -
                  # @param argument [nil, Integer] `first` or `last`, as provided by the client
         
     | 
| 
       167 
     | 
    
         
            -
                  # @param max_page_size [nil, Integer]
         
     | 
| 
       168 
     | 
    
         
            -
                  # @return [nil, Integer] `nil` if the input was `nil`, otherwise a value between `0` and `max_page_size`
         
     | 
| 
       169 
     | 
    
         
            -
                  def limit_pagination_argument(argument, max_page_size)
         
     | 
| 
       170 
     | 
    
         
            -
                    if argument
         
     | 
| 
       171 
     | 
    
         
            -
                      if argument < 0
         
     | 
| 
       172 
     | 
    
         
            -
                        argument = 0
         
     | 
| 
       173 
     | 
    
         
            -
                      elsif max_page_size && argument > max_page_size
         
     | 
| 
       174 
     | 
    
         
            -
                        argument = max_page_size
         
     | 
| 
       175 
     | 
    
         
            -
                      end
         
     | 
| 
       176 
     | 
    
         
            -
                    end
         
     | 
| 
       177 
     | 
    
         
            -
                    argument
         
     | 
| 
       178 
     | 
    
         
            -
                  end
         
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
       180 
     | 
    
         
            -
                  def paged_nodes
         
     | 
| 
       181 
     | 
    
         
            -
                    raise GraphQL::RequiredImplementationMissingError, "must return nodes for this connection after paging"
         
     | 
| 
       182 
     | 
    
         
            -
                  end
         
     | 
| 
       183 
     | 
    
         
            -
             
     | 
| 
       184 
     | 
    
         
            -
                  def sliced_nodes
         
     | 
| 
       185 
     | 
    
         
            -
                    raise GraphQL::RequiredImplementationMissingError, "must return  all nodes for this connection after chopping off first and last"
         
     | 
| 
       186 
     | 
    
         
            -
                  end
         
     | 
| 
       187 
     | 
    
         
            -
                end
         
     | 
| 
       188 
     | 
    
         
            -
              end
         
     | 
| 
       189 
     | 
    
         
            -
            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::DEPRECATED_INT_TYPE, "Returns the first _n_ elements from the list."],
         
     | 
| 
       14 
     | 
    
         
            -
                          ["after", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
         
     | 
| 
       15 
     | 
    
         
            -
                          ["last", GraphQL::DEPRECATED_INT_TYPE, "Returns the last _n_ elements from the list."],
         
     | 
| 
       16 
     | 
    
         
            -
                          ["before", GraphQL::DEPRECATED_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,54 +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 
     | 
    
         
            -
                    def default_nodes_field=(new_setting)
         
     | 
| 
       9 
     | 
    
         
            -
                      if new_setting
         
     | 
| 
       10 
     | 
    
         
            -
                        warn("GraphQL::Relay::ConnectionType will be removed in GraphQL 2.0.0; migrate to `GraphQL::Pagination::Connections` and remove this setting (`default_nodes_field = true`).")
         
     | 
| 
       11 
     | 
    
         
            -
                      end
         
     | 
| 
       12 
     | 
    
         
            -
                      @default_nodes_field = new_setting
         
     | 
| 
       13 
     | 
    
         
            -
                    end
         
     | 
| 
       14 
     | 
    
         
            -
                    attr_reader :default_nodes_field
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                    # @return [Boolean] If true, connections check for reverse-direction `has*Page` values
         
     | 
| 
       17 
     | 
    
         
            -
                    def bidirectional_pagination=(new_setting)
         
     | 
| 
       18 
     | 
    
         
            -
                      if new_setting
         
     | 
| 
       19 
     | 
    
         
            -
                        warn("GraphQL::Relay::ConnectionType will be removed in GraphQL 2.0.0; migrate to `GraphQL::Pagination::Connections` and remove this setting (`bidirectional_pagination = true`).")
         
     | 
| 
       20 
     | 
    
         
            -
                      end
         
     | 
| 
       21 
     | 
    
         
            -
                      @bidirectional_pagination = new_setting
         
     | 
| 
       22 
     | 
    
         
            -
                    end
         
     | 
| 
       23 
     | 
    
         
            -
                    attr_reader :bidirectional_pagination
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  self.default_nodes_field = false
         
     | 
| 
       27 
     | 
    
         
            -
                  self.bidirectional_pagination = false
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                  # @api deprecated
         
     | 
| 
       30 
     | 
    
         
            -
                  def self.create_type(wrapped_type, edge_type: nil, edge_class: GraphQL::Relay::Edge, nodes_field: ConnectionType.default_nodes_field, &block)
         
     | 
| 
       31 
     | 
    
         
            -
                    custom_edge_class = edge_class
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                    # Any call that would trigger `wrapped_type.ensure_defined`
         
     | 
| 
       34 
     | 
    
         
            -
                    # must be inside this lazy block, otherwise we get weird
         
     | 
| 
       35 
     | 
    
         
            -
                    # cyclical dependency errors :S
         
     | 
| 
       36 
     | 
    
         
            -
                    ObjectType.deprecated_define do
         
     | 
| 
       37 
     | 
    
         
            -
                      type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
         
     | 
| 
       38 
     | 
    
         
            -
                      edge_type ||= wrapped_type.edge_type
         
     | 
| 
       39 
     | 
    
         
            -
                      name("#{type_name}Connection")
         
     | 
| 
       40 
     | 
    
         
            -
                      description("The connection type for #{type_name}.")
         
     | 
| 
       41 
     | 
    
         
            -
                      field :edges, types[edge_type], "A list of edges.", edge_class: custom_edge_class, property: :edge_nodes
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                      if nodes_field
         
     | 
| 
       44 
     | 
    
         
            -
                        field :nodes, types[wrapped_type],  "A list of nodes.", property: :edge_nodes
         
     | 
| 
       45 
     | 
    
         
            -
                      end
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                      field :pageInfo, !PageInfo, "Information to aid in pagination.", property: :page_info
         
     | 
| 
       48 
     | 
    
         
            -
                      relay_node_type(wrapped_type)
         
     | 
| 
       49 
     | 
    
         
            -
                      block && instance_eval(&block)
         
     | 
| 
       50 
     | 
    
         
            -
                    end
         
     | 
| 
       51 
     | 
    
         
            -
                  end
         
     | 
| 
       52 
     | 
    
         
            -
                end
         
     | 
| 
       53 
     | 
    
         
            -
              end
         
     | 
| 
       54 
     | 
    
         
            -
            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,39 +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 
     | 
    
         
            -
                  class EdgesResolve
         
     | 
| 
       20 
     | 
    
         
            -
                    def initialize(edge_class:, resolve:)
         
     | 
| 
       21 
     | 
    
         
            -
                      @edge_class = edge_class
         
     | 
| 
       22 
     | 
    
         
            -
                      @resolve_proc = resolve
         
     | 
| 
       23 
     | 
    
         
            -
                    end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                    # A user's custom Connection may return a lazy object,
         
     | 
| 
       26 
     | 
    
         
            -
                    # if so, handle it later.
         
     | 
| 
       27 
     | 
    
         
            -
                    def call(obj, args, ctx)
         
     | 
| 
       28 
     | 
    
         
            -
                      parent = ctx.object
         
     | 
| 
       29 
     | 
    
         
            -
                      nodes = @resolve_proc.call(obj, args, ctx)
         
     | 
| 
       30 
     | 
    
         
            -
                      if ctx.schema.lazy?(nodes)
         
     | 
| 
       31 
     | 
    
         
            -
                        nodes
         
     | 
| 
       32 
     | 
    
         
            -
                      else
         
     | 
| 
       33 
     | 
    
         
            -
                        nodes.map { |item| item.is_a?(GraphQL::Pagination::Connection::Edge) ? item : @edge_class.new(item, parent) }
         
     | 
| 
       34 
     | 
    
         
            -
                      end
         
     | 
| 
       35 
     | 
    
         
            -
                    end
         
     | 
| 
       36 
     | 
    
         
            -
                  end
         
     | 
| 
       37 
     | 
    
         
            -
                end
         
     | 
| 
       38 
     | 
    
         
            -
              end
         
     | 
| 
       39 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,17 +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 
     | 
    
         
            -
                    ctx.query.schema.id_from_object(obj, @type, ctx)
         
     | 
| 
       14 
     | 
    
         
            -
                  end
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
              end
         
     | 
| 
       17 
     | 
    
         
            -
            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
         
     |