graphql 1.13.25 → 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 +6 -13
- 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/directive_type.rb +2 -2
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +2 -15
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +2 -2
- data/lib/graphql/introspection/type_type.rb +5 -5
- data/lib/graphql/language/document_from_schema_definition.rb +0 -17
- data/lib/graphql/language/nodes.rb +0 -3
- data/lib/graphql/pagination/connections.rb +2 -28
- data/lib/graphql/pagination/relation_connection.rb +0 -2
- data/lib/graphql/query/context.rb +1 -185
- data/lib/graphql/query/input_validation_result.rb +0 -9
- data/lib/graphql/query/literal_input.rb +8 -13
- data/lib/graphql/query/validation_pipeline.rb +6 -34
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +8 -31
- data/lib/graphql/query.rb +5 -34
- 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 +6 -28
- data/lib/graphql/schema/build_from_definition.rb +7 -9
- data/lib/graphql/schema/directive.rb +1 -22
- data/lib/graphql/schema/enum.rb +3 -19
- data/lib/graphql/schema/enum_value.rb +1 -23
- data/lib/graphql/schema/field.rb +22 -221
- data/lib/graphql/schema/input_object.rb +17 -65
- data/lib/graphql/schema/interface.rb +1 -30
- 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 +3 -24
- data/lib/graphql/schema/loader.rb +0 -1
- data/lib/graphql/schema/member/base_dsl_methods.rb +1 -6
- data/lib/graphql/schema/member/build_type.rb +4 -6
- data/lib/graphql/schema/member/has_arguments.rb +16 -20
- data/lib/graphql/schema/member/has_fields.rb +3 -3
- data/lib/graphql/schema/member/has_interfaces.rb +1 -13
- data/lib/graphql/schema/member/validates_input.rb +2 -2
- data/lib/graphql/schema/member.rb +0 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +3 -9
- data/lib/graphql/schema/object.rb +0 -40
- data/lib/graphql/schema/relay_classic_mutation.rb +17 -28
- data/lib/graphql/schema/scalar.rb +1 -16
- data/lib/graphql/schema/union.rb +0 -16
- data/lib/graphql/schema/warden.rb +3 -12
- 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 +16 -20
- data/lib/graphql/tracing/platform_tracing.rb +4 -32
- data/lib/graphql/tracing.rb +0 -1
- 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/types/string.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +1 -66
- metadata +28 -164
- 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/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
|