Skip to content

Commit 9b95a8b

Browse files
author
Robert Mosolgo
authored
Merge pull request rmosolgo#3376 from gopeter/feature/non-nullable-edges
added option to make edges non-nullable
2 parents efcedef + 2b2e877 commit 9b95a8b

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

lib/graphql/types/relay/connection_behaviors.rb

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ def self.included(child_class)
1212
child_class.extend(Relay::DefaultRelay)
1313
child_class.default_relay(true)
1414
child_class.node_nullable(true)
15+
child_class.edges_nullable(true)
16+
child_class.edge_nullable(true)
1517
add_page_info_field(child_class)
1618
end
1719

@@ -32,16 +34,16 @@ module ClassMethods
3234
# It's called when you subclass this base connection, trying to use the
3335
# class name to set defaults. You can call it again in the class definition
3436
# to override the default (or provide a value, if the default lookup failed).
35-
def edge_type(edge_type_class, edge_class: GraphQL::Relay::Edge, node_type: edge_type_class.node_type, nodes_field: true, node_nullable: self.node_nullable)
37+
def edge_type(edge_type_class, edge_class: GraphQL::Relay::Edge, node_type: edge_type_class.node_type, nodes_field: true, node_nullable: self.node_nullable, edges_nullable: self.edges_nullable, edge_nullable: self.edge_nullable)
3638
# Set this connection's graphql name
3739
node_type_name = node_type.graphql_name
3840

3941
@node_type = node_type
4042
@edge_type = edge_type_class
4143
@edge_class = edge_class
4244

43-
field :edges, [edge_type_class, null: true],
44-
null: true,
45+
field :edges, [edge_type_class, null: edge_nullable],
46+
null: edges_nullable,
4547
description: "A list of edges.",
4648
legacy_edge_class: edge_class, # This is used by the old runtime only, for EdgesInstrumentation
4749
connection: false
@@ -83,6 +85,26 @@ def node_nullable(new_value = nil)
8385
end
8486
end
8587

88+
# Set the default `edges_nullable` for this class and its child classes. (Defaults to `true`.)
89+
# Use `edges_nullable(false)` in your base class to make non-null `edges` fields.
90+
def edges_nullable(new_value = nil)
91+
if new_value.nil?
92+
@edges_nullable || superclass.edges_nullable
93+
else
94+
@edges_nullable ||= new_value
95+
end
96+
end
97+
98+
# Set the default `edge_nullable` for this class and its child classes. (Defaults to `true`.)
99+
# Use `edge_nullable(false)` in your base class to make non-null `edge` fields.
100+
def edge_nullable(new_value = nil)
101+
if new_value.nil?
102+
@edge_nullable || superclass.edge_nullable
103+
else
104+
@edge_nullable ||= new_value
105+
end
106+
end
107+
86108
private
87109

88110
def define_nodes_field(nullable)

spec/graphql/types/relay/base_connection_spec.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class NodeEdgeType < GraphQL::Types::Relay::BaseEdge
1212
end
1313

1414
class NonNullableNodeEdgeConnectionType < GraphQL::Types::Relay::BaseConnection
15-
edge_type(NodeEdgeType, node_nullable: false)
15+
edge_type(NodeEdgeType, node_nullable: false, edges_nullable: false, edge_nullable: false)
1616
end
1717

1818
class Query < GraphQL::Schema::Object
@@ -32,6 +32,20 @@ class Schema < GraphQL::Schema
3232
assert_equal "NON_NULL",nodes_field["type"]["ofType"]["ofType"]["kind"]
3333
end
3434

35+
it "edges_nullable option is works" do
36+
res = NonNullAbleNodeDummy::Schema.execute(GraphQL::Introspection::INTROSPECTION_QUERY)
37+
connection_type = res["data"]["__schema"]["types"].find { |t| t["name"] == "NonNullableNodeEdgeConnection" }
38+
edges_field = connection_type["fields"].find { |f| f["name"] == "edges" }
39+
assert_equal "NON_NULL",edges_field["type"]["kind"]
40+
end
41+
42+
it "edge_nullable option is works" do
43+
res = NonNullAbleNodeDummy::Schema.execute(GraphQL::Introspection::INTROSPECTION_QUERY)
44+
connection_type = res["data"]["__schema"]["types"].find { |t| t["name"] == "NonNullableNodeEdgeConnection" }
45+
edges_field = connection_type["fields"].find { |f| f["name"] == "edges" }
46+
assert_equal "NON_NULL",edges_field["type"]["ofType"]["ofType"]["kind"]
47+
end
48+
3549
it "never treats nodes like a connection" do
3650
type = Class.new(GraphQL::Schema::Object) do
3751
graphql_name "MissedConnection"

0 commit comments

Comments
 (0)