graphql 1.13.24 → 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/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,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class Mutation
|
5
|
-
# Wrap a user-provided resolve function,
|
6
|
-
# wrapping the returned value in a {Mutation::Result}.
|
7
|
-
# Also, pass the `clientMutationId` to that result object.
|
8
|
-
# @api private
|
9
|
-
class Resolve
|
10
|
-
def initialize(mutation, resolve)
|
11
|
-
@mutation = mutation
|
12
|
-
@resolve = resolve
|
13
|
-
@wrap_result = mutation.is_a?(GraphQL::Relay::Mutation) && mutation.has_generated_return_type?
|
14
|
-
@class_based = mutation.is_a?(Class)
|
15
|
-
end
|
16
|
-
|
17
|
-
def call(obj, args, ctx)
|
18
|
-
mutation_result = begin
|
19
|
-
@resolve.call(obj, args[:input], ctx)
|
20
|
-
rescue GraphQL::ExecutionError => err
|
21
|
-
err
|
22
|
-
end
|
23
|
-
|
24
|
-
ctx.schema.after_lazy(mutation_result) do |res|
|
25
|
-
build_result(res, args, ctx)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def build_result(mutation_result, args, ctx)
|
32
|
-
if mutation_result.is_a?(GraphQL::ExecutionError)
|
33
|
-
ctx.add_error(mutation_result)
|
34
|
-
mutation_result = nil
|
35
|
-
end
|
36
|
-
|
37
|
-
if mutation_result.nil?
|
38
|
-
nil
|
39
|
-
elsif @wrap_result
|
40
|
-
if mutation_result && !mutation_result.is_a?(Hash)
|
41
|
-
raise StandardError, "Expected `#{mutation_result}` to be a Hash."\
|
42
|
-
" Return a hash when using `return_field` or specify a custom `return_type`."
|
43
|
-
end
|
44
|
-
|
45
|
-
@mutation.result_class.new(client_mutation_id: args[:input][:clientMutationId], result: mutation_result)
|
46
|
-
elsif @class_based
|
47
|
-
mutation_result[:client_mutation_id] = args[:input][:client_mutation_id]
|
48
|
-
mutation_result
|
49
|
-
else
|
50
|
-
mutation_result
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
class Mutation
|
5
|
-
# Use this when the mutation's return type was generated from `return_field`s.
|
6
|
-
# It delegates field lookups to the hash returned from `resolve`.
|
7
|
-
# @api private
|
8
|
-
class Result
|
9
|
-
attr_reader :client_mutation_id
|
10
|
-
def initialize(client_mutation_id:, result:)
|
11
|
-
@client_mutation_id = client_mutation_id
|
12
|
-
result && result.each do |key, value|
|
13
|
-
self.public_send("#{key}=", value)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class << self
|
18
|
-
attr_accessor :mutation
|
19
|
-
end
|
20
|
-
|
21
|
-
# Build a subclass whose instances have a method
|
22
|
-
# for each of `mutation_defn`'s `return_field`s
|
23
|
-
# @param mutation_defn [GraphQL::Relay::Mutation]
|
24
|
-
# @return [Class]
|
25
|
-
def self.define_subclass(mutation_defn)
|
26
|
-
subclass = Class.new(self) do
|
27
|
-
mutation_result_methods = mutation_defn.return_type.all_fields.map do |f|
|
28
|
-
f.property || f.name
|
29
|
-
end
|
30
|
-
attr_accessor(*mutation_result_methods)
|
31
|
-
self.mutation = mutation_defn
|
32
|
-
end
|
33
|
-
subclass
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require "graphql/relay/mutation/instrumentation"
|
3
|
-
require "graphql/relay/mutation/resolve"
|
4
|
-
require "graphql/relay/mutation/result"
|
5
|
-
|
6
|
-
module GraphQL
|
7
|
-
module Relay
|
8
|
-
# @api deprecated
|
9
|
-
class Mutation
|
10
|
-
include GraphQL::Define::InstanceDefinable
|
11
|
-
deprecated_accepts_definitions(
|
12
|
-
:name, :description, :resolve,
|
13
|
-
:return_type,
|
14
|
-
:return_interfaces,
|
15
|
-
input_field: GraphQL::Define::AssignArgument,
|
16
|
-
return_field: GraphQL::Define::AssignObjectField,
|
17
|
-
function: GraphQL::Define::AssignMutationFunction,
|
18
|
-
)
|
19
|
-
attr_accessor :name, :description, :fields, :arguments
|
20
|
-
attr_writer :return_type, :return_interfaces
|
21
|
-
|
22
|
-
ensure_defined(
|
23
|
-
:input_fields, :return_fields, :name, :description,
|
24
|
-
:fields, :arguments, :return_type,
|
25
|
-
:return_interfaces, :resolve=,
|
26
|
-
:field, :result_class, :input_type
|
27
|
-
)
|
28
|
-
# For backwards compat, but do we need this separate API?
|
29
|
-
alias :return_fields :fields
|
30
|
-
alias :input_fields :arguments
|
31
|
-
|
32
|
-
def initialize
|
33
|
-
GraphQL::Deprecation.warn "GraphQL::Relay::Mutation will be removed from GraphQL-Ruby 2.0, use GraphQL::Schema::RelayClassicMutation instead: https://graphql-ruby.org/mutations/mutation_classes"
|
34
|
-
@fields = {}
|
35
|
-
@arguments = {}
|
36
|
-
@has_generated_return_type = false
|
37
|
-
end
|
38
|
-
|
39
|
-
def has_generated_return_type?
|
40
|
-
# Trigger the generation of the return type, if it is dynamically generated:
|
41
|
-
return_type
|
42
|
-
@has_generated_return_type
|
43
|
-
end
|
44
|
-
|
45
|
-
def resolve=(new_resolve_proc)
|
46
|
-
@resolve_proc = new_resolve_proc
|
47
|
-
end
|
48
|
-
|
49
|
-
def field
|
50
|
-
@field ||= begin
|
51
|
-
relay_mutation = self
|
52
|
-
field_resolve_proc = @resolve_proc
|
53
|
-
GraphQL::Field.define do
|
54
|
-
type(relay_mutation.return_type)
|
55
|
-
description(relay_mutation.description)
|
56
|
-
argument :input, !relay_mutation.input_type
|
57
|
-
resolve(field_resolve_proc)
|
58
|
-
mutation(relay_mutation)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def return_interfaces
|
64
|
-
@return_interfaces ||= []
|
65
|
-
end
|
66
|
-
|
67
|
-
def return_type
|
68
|
-
@return_type ||= begin
|
69
|
-
@has_generated_return_type = true
|
70
|
-
relay_mutation = self
|
71
|
-
GraphQL::ObjectType.define do
|
72
|
-
name("#{relay_mutation.name}Payload")
|
73
|
-
description("Autogenerated return type of #{relay_mutation.name}")
|
74
|
-
field :clientMutationId, types.String, "A unique identifier for the client performing the mutation.", property: :client_mutation_id
|
75
|
-
interfaces relay_mutation.return_interfaces
|
76
|
-
relay_mutation.return_fields.each do |name, field_obj|
|
77
|
-
field name, field: field_obj
|
78
|
-
end
|
79
|
-
mutation(relay_mutation)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def input_type
|
85
|
-
@input_type ||= begin
|
86
|
-
relay_mutation = self
|
87
|
-
input_object_type = GraphQL::InputObjectType.define do
|
88
|
-
name("#{relay_mutation.name}Input")
|
89
|
-
description("Autogenerated input type of #{relay_mutation.name}")
|
90
|
-
input_field :clientMutationId, types.String, "A unique identifier for the client performing the mutation."
|
91
|
-
mutation(relay_mutation)
|
92
|
-
end
|
93
|
-
input_fields.each do |name, arg|
|
94
|
-
input_object_type.arguments[name] = arg
|
95
|
-
end
|
96
|
-
|
97
|
-
input_object_type
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def result_class
|
102
|
-
@result_class ||= Result.define_subclass(self)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
data/lib/graphql/relay/node.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Helpers for working with Relay-specific Node objects.
|
5
|
-
module Node
|
6
|
-
# @return [GraphQL::Field] a field for finding objects by their global ID.
|
7
|
-
def self.field(**kwargs, &block)
|
8
|
-
GraphQL::Deprecation.warn "GraphQL::Relay::Node.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodeField instead"
|
9
|
-
# We have to define it fresh each time because
|
10
|
-
# its name will be modified and its description
|
11
|
-
# _may_ be modified.
|
12
|
-
field = GraphQL::Types::Relay::NodeField.graphql_definition
|
13
|
-
|
14
|
-
if kwargs.any? || block
|
15
|
-
field = field.redefine(**kwargs, &block)
|
16
|
-
end
|
17
|
-
|
18
|
-
field
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.plural_field(**kwargs, &block)
|
22
|
-
GraphQL::Deprecation.warn "GraphQL::Relay::Nodes.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodesField instead"
|
23
|
-
field = GraphQL::Types::Relay::NodesField.graphql_definition
|
24
|
-
|
25
|
-
if kwargs.any? || block
|
26
|
-
field = field.redefine(**kwargs, &block)
|
27
|
-
end
|
28
|
-
|
29
|
-
field
|
30
|
-
end
|
31
|
-
|
32
|
-
# @return [GraphQL::InterfaceType] The interface which all Relay types must implement
|
33
|
-
def self.interface
|
34
|
-
GraphQL::Deprecation.warn "GraphQL::Relay::Node.interface will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::Node instead"
|
35
|
-
@interface ||= GraphQL::Types::Relay::Node.graphql_definition
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,188 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# A connection implementation to expose SQL collection objects.
|
5
|
-
# It works for:
|
6
|
-
# - `ActiveRecord::Relation`
|
7
|
-
# - `Sequel::Dataset`
|
8
|
-
class RelationConnection < BaseConnection
|
9
|
-
def cursor_from_node(item)
|
10
|
-
item_index = paged_nodes.index(item)
|
11
|
-
if item_index.nil?
|
12
|
-
raise("Can't generate cursor, item not found in connection: #{item}")
|
13
|
-
else
|
14
|
-
offset = item_index + 1 + ((paged_nodes_offset || 0) - (relation_offset(sliced_nodes) || 0))
|
15
|
-
|
16
|
-
if after
|
17
|
-
offset += offset_from_cursor(after)
|
18
|
-
elsif before
|
19
|
-
offset += offset_from_cursor(before) - 1 - sliced_nodes_count
|
20
|
-
end
|
21
|
-
|
22
|
-
encode(offset.to_s)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def has_next_page
|
27
|
-
if first
|
28
|
-
if defined?(ActiveRecord::Relation) && nodes.is_a?(ActiveRecord::Relation)
|
29
|
-
initial_offset = after ? offset_from_cursor(after) : 0
|
30
|
-
return paged_nodes.length >= first && nodes.offset(first + initial_offset).exists?
|
31
|
-
end
|
32
|
-
return paged_nodes.length >= first && sliced_nodes_count > first
|
33
|
-
end
|
34
|
-
if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
|
35
|
-
return sliced_nodes_count >= last
|
36
|
-
end
|
37
|
-
false
|
38
|
-
end
|
39
|
-
|
40
|
-
def has_previous_page
|
41
|
-
if last
|
42
|
-
paged_nodes.length >= last && sliced_nodes_count > last
|
43
|
-
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
|
44
|
-
# We've already paginated through the collection a bit,
|
45
|
-
# there are nodes behind us
|
46
|
-
offset_from_cursor(after) > 0
|
47
|
-
else
|
48
|
-
false
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def first
|
53
|
-
@first ||= begin
|
54
|
-
capped = limit_pagination_argument(arguments[:first], max_page_size)
|
55
|
-
if capped.nil? && last.nil?
|
56
|
-
capped = max_page_size
|
57
|
-
end
|
58
|
-
capped
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def last
|
63
|
-
@last ||= limit_pagination_argument(arguments[:last], max_page_size)
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
# apply first / last limit results
|
69
|
-
# @return [Array]
|
70
|
-
def paged_nodes
|
71
|
-
return @paged_nodes if defined? @paged_nodes
|
72
|
-
|
73
|
-
items = sliced_nodes
|
74
|
-
|
75
|
-
if first
|
76
|
-
if relation_limit(items).nil? || relation_limit(items) > first
|
77
|
-
items = items.limit(first)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
if last
|
82
|
-
if relation_limit(items)
|
83
|
-
if last <= relation_limit(items)
|
84
|
-
offset = (relation_offset(items) || 0) + (relation_limit(items) - last)
|
85
|
-
items = items.offset(offset).limit(last)
|
86
|
-
end
|
87
|
-
else
|
88
|
-
slice_count = relation_count(items)
|
89
|
-
offset = (relation_offset(items) || 0) + slice_count - [last, slice_count].min
|
90
|
-
items = items.offset(offset).limit(last)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
if max_page_size && !first && !last
|
95
|
-
if relation_limit(items).nil? || relation_limit(items) > max_page_size
|
96
|
-
items = items.limit(max_page_size)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
# Store this here so we can convert the relation to an Array
|
101
|
-
# (this avoids an extra DB call on Sequel)
|
102
|
-
@paged_nodes_offset = relation_offset(items)
|
103
|
-
@paged_nodes = items.to_a
|
104
|
-
end
|
105
|
-
|
106
|
-
def paged_nodes_offset
|
107
|
-
paged_nodes && @paged_nodes_offset
|
108
|
-
end
|
109
|
-
|
110
|
-
def relation_offset(relation)
|
111
|
-
if relation.respond_to?(:offset_value)
|
112
|
-
relation.offset_value
|
113
|
-
else
|
114
|
-
relation.opts[:offset]
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def relation_limit(relation)
|
119
|
-
if relation.respond_to?(:limit_value)
|
120
|
-
relation.limit_value
|
121
|
-
else
|
122
|
-
relation.opts[:limit]
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
127
|
-
def relation_count(relation)
|
128
|
-
count_or_hash = if(defined?(ActiveRecord::Relation) && relation.is_a?(ActiveRecord::Relation))
|
129
|
-
relation.respond_to?(:unscope)? relation.unscope(:order).count(:all) : relation.count(:all)
|
130
|
-
else # eg, Sequel::Dataset, don't mess up others
|
131
|
-
relation.count
|
132
|
-
end
|
133
|
-
count_or_hash.is_a?(Integer) ? count_or_hash : count_or_hash.length
|
134
|
-
end
|
135
|
-
|
136
|
-
# Apply cursors to edges
|
137
|
-
def sliced_nodes
|
138
|
-
return @sliced_nodes if defined? @sliced_nodes
|
139
|
-
|
140
|
-
@sliced_nodes = nodes
|
141
|
-
|
142
|
-
if after
|
143
|
-
offset = (relation_offset(@sliced_nodes) || 0) + offset_from_cursor(after)
|
144
|
-
@sliced_nodes = @sliced_nodes.offset(offset)
|
145
|
-
end
|
146
|
-
|
147
|
-
if before && after
|
148
|
-
if offset_from_cursor(after) < offset_from_cursor(before)
|
149
|
-
@sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - offset_from_cursor(after) - 1)
|
150
|
-
else
|
151
|
-
@sliced_nodes = limit_nodes(@sliced_nodes, 0)
|
152
|
-
end
|
153
|
-
|
154
|
-
elsif before
|
155
|
-
@sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - 1)
|
156
|
-
end
|
157
|
-
|
158
|
-
@sliced_nodes
|
159
|
-
end
|
160
|
-
|
161
|
-
def limit_nodes(sliced_nodes, limit)
|
162
|
-
if limit > 0 || defined?(ActiveRecord::Relation) && sliced_nodes.is_a?(ActiveRecord::Relation)
|
163
|
-
sliced_nodes.limit(limit)
|
164
|
-
else
|
165
|
-
sliced_nodes.where(false)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def sliced_nodes_count
|
170
|
-
return @sliced_nodes_count if defined? @sliced_nodes_count
|
171
|
-
|
172
|
-
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
173
|
-
@sliced_nodes_count = relation_count(sliced_nodes)
|
174
|
-
end
|
175
|
-
|
176
|
-
def offset_from_cursor(cursor)
|
177
|
-
decode(cursor).to_i
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
if defined?(ActiveRecord::Relation)
|
182
|
-
BaseConnection.register_connection_implementation(ActiveRecord::Relation, RelationConnection)
|
183
|
-
end
|
184
|
-
if defined?(Sequel::Dataset)
|
185
|
-
BaseConnection.register_connection_implementation(Sequel::Dataset, RelationConnection)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Mixin for Relay-related methods in type objects
|
5
|
-
# (used by BaseType and Schema::Member).
|
6
|
-
module TypeExtensions
|
7
|
-
# @return [GraphQL::ObjectType] The default connection type for this object type
|
8
|
-
def connection_type
|
9
|
-
@connection_type ||= define_connection
|
10
|
-
end
|
11
|
-
|
12
|
-
# Define a custom connection type for this object type
|
13
|
-
# @return [GraphQL::ObjectType]
|
14
|
-
def define_connection(**kwargs, &block)
|
15
|
-
GraphQL::Deprecation.warn ".connection_type and .define_connection will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
|
16
|
-
GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
|
17
|
-
end
|
18
|
-
|
19
|
-
# @return [GraphQL::ObjectType] The default edge type for this object type
|
20
|
-
def edge_type
|
21
|
-
@edge_type ||= define_edge
|
22
|
-
end
|
23
|
-
|
24
|
-
# Define a custom edge type for this object type
|
25
|
-
# @return [GraphQL::ObjectType]
|
26
|
-
def define_edge(**kwargs, &block)
|
27
|
-
GraphQL::Deprecation.warn ".edge_type and .define_edge will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
|
28
|
-
GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/lib/graphql/scalar_type.rb
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# @api deprecated
|
4
|
-
class ScalarType < GraphQL::BaseType
|
5
|
-
extend Define::InstanceDefinable::DeprecatedDefine
|
6
|
-
|
7
|
-
deprecated_accepts_definitions :coerce, :coerce_input, :coerce_result
|
8
|
-
ensure_defined :coerce_non_null_input, :coerce_result
|
9
|
-
|
10
|
-
module NoOpCoerce
|
11
|
-
def self.call(val, ctx)
|
12
|
-
val
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
super
|
18
|
-
self.coerce = NoOpCoerce
|
19
|
-
end
|
20
|
-
|
21
|
-
def coerce=(proc)
|
22
|
-
self.coerce_input = proc
|
23
|
-
self.coerce_result = proc
|
24
|
-
end
|
25
|
-
|
26
|
-
def coerce_input=(coerce_input_fn)
|
27
|
-
if !coerce_input_fn.nil?
|
28
|
-
@coerce_input_proc = ensure_two_arg(coerce_input_fn, :coerce_input)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def coerce_result(value, ctx = nil)
|
33
|
-
if ctx.nil?
|
34
|
-
warn_deprecated_coerce("coerce_isolated_result")
|
35
|
-
ctx = GraphQL::Query::NullContext
|
36
|
-
end
|
37
|
-
@coerce_result_proc.call(value, ctx)
|
38
|
-
end
|
39
|
-
|
40
|
-
def coerce_result=(coerce_result_fn)
|
41
|
-
if !coerce_result_fn.nil?
|
42
|
-
@coerce_result_proc = ensure_two_arg(coerce_result_fn, :coerce_result)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def kind
|
47
|
-
GraphQL::TypeKinds::SCALAR
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def ensure_two_arg(callable, method_name)
|
53
|
-
GraphQL::BackwardsCompatibility.wrap_arity(callable, from: 1, to: 2, name: "#{name}.#{method_name}(val, ctx)")
|
54
|
-
end
|
55
|
-
|
56
|
-
def coerce_non_null_input(value, ctx)
|
57
|
-
@coerce_input_proc.call(raw_coercion_input(value), ctx)
|
58
|
-
end
|
59
|
-
|
60
|
-
def raw_coercion_input(value)
|
61
|
-
if value.is_a?(GraphQL::Language::Nodes::InputObject)
|
62
|
-
value.to_h
|
63
|
-
elsif value.is_a?(Array)
|
64
|
-
value.map { |element| raw_coercion_input(element) }
|
65
|
-
else
|
66
|
-
value
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def validate_non_null_input(value, ctx)
|
71
|
-
result = Query::InputValidationResult.new
|
72
|
-
|
73
|
-
coerced_result = begin
|
74
|
-
coerce_non_null_input(value, ctx)
|
75
|
-
rescue GraphQL::CoercionError => err
|
76
|
-
err
|
77
|
-
end
|
78
|
-
|
79
|
-
if value.is_a?(GraphQL::Language::Nodes::Enum) || coerced_result.nil?
|
80
|
-
result.add_problem("Could not coerce value #{GraphQL::Language.serialize(value)} to #{name}")
|
81
|
-
elsif coerced_result.is_a?(GraphQL::CoercionError)
|
82
|
-
result.add_problem(
|
83
|
-
coerced_result.message,
|
84
|
-
message: coerced_result.message,
|
85
|
-
extensions: coerced_result.extensions
|
86
|
-
)
|
87
|
-
end
|
88
|
-
result
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Schema
|
4
|
-
# In early GraphQL versions, errors would be "automatically"
|
5
|
-
# rescued and replaced with `"Internal error"`. That behavior
|
6
|
-
# was undesirable but this middleware is offered for people who
|
7
|
-
# want to preserve it.
|
8
|
-
#
|
9
|
-
# It has a couple of differences from the previous behavior:
|
10
|
-
#
|
11
|
-
# - Other parts of the query _will_ be run (previously,
|
12
|
-
# execution would stop when the error was raised and the result
|
13
|
-
# would have no `"data"` key at all)
|
14
|
-
# - The entry in {Query::Context#errors} is a {GraphQL::ExecutionError}, _not_
|
15
|
-
# the originally-raised error.
|
16
|
-
# - The entry in the `"errors"` key includes the location of the field
|
17
|
-
# which raised the errors.
|
18
|
-
#
|
19
|
-
# @example Use CatchallMiddleware with your schema
|
20
|
-
# # All errors will be suppressed and replaced with "Internal error" messages
|
21
|
-
# MySchema.middleware << GraphQL::Schema::CatchallMiddleware
|
22
|
-
#
|
23
|
-
module CatchallMiddleware
|
24
|
-
MESSAGE = "Internal error"
|
25
|
-
|
26
|
-
# Rescue any error and replace it with a {GraphQL::ExecutionError}
|
27
|
-
# whose message is {MESSAGE}
|
28
|
-
def self.call(parent_type, parent_object, field_definition, field_args, query_context)
|
29
|
-
yield
|
30
|
-
rescue StandardError
|
31
|
-
GraphQL::ExecutionError.new(MESSAGE)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Schema
|
4
|
-
module DefaultTypeError
|
5
|
-
def self.call(type_error, ctx)
|
6
|
-
case type_error
|
7
|
-
when GraphQL::InvalidNullError
|
8
|
-
ctx.errors << type_error
|
9
|
-
when GraphQL::UnresolvedTypeError, GraphQL::StringEncodingError, GraphQL::IntegerEncodingError
|
10
|
-
raise type_error
|
11
|
-
when GraphQL::IntegerDecodingError
|
12
|
-
nil
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|