graphql_includable 0.5.0 → 1.0.0.beta.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.
- checksums.yaml +4 -4
- data/lib/graphql_includable/includes.rb +67 -0
- data/lib/graphql_includable/includes_builder.rb +108 -0
- data/lib/graphql_includable/relay/edge_with_node.rb +25 -2
- data/lib/graphql_includable/relay/edge_with_node_connection.rb +16 -6
- data/lib/graphql_includable/relay/edge_with_node_connection_type.rb +2 -0
- data/lib/graphql_includable/relay/instrumentation.rb +77 -0
- data/lib/graphql_includable/resolver.rb +129 -141
- data/lib/graphql_includable.rb +33 -25
- metadata +7 -15
- data/lib/graphql_includable/concern.rb +0 -39
- data/lib/graphql_includable/edge.rb +0 -108
- data/lib/graphql_includable/new/gql_includable.rb +0 -49
- data/lib/graphql_includable/new/includes.rb +0 -69
- data/lib/graphql_includable/new/includes_builder.rb +0 -110
- data/lib/graphql_includable/new/relay/edge_with_node.rb +0 -48
- data/lib/graphql_includable/new/relay/edge_with_node_connection.rb +0 -101
- data/lib/graphql_includable/new/relay/edge_with_node_connection_type.rb +0 -37
- data/lib/graphql_includable/new/relay/instrumentation.rb +0 -79
- data/lib/graphql_includable/new/resolver.rb +0 -203
- data/lib/graphql_includable/relay/instrumentation/connection.rb +0 -83
@@ -1,83 +0,0 @@
|
|
1
|
-
module GraphQLIncludable
|
2
|
-
module Relay
|
3
|
-
module Instrumentation
|
4
|
-
class Connection
|
5
|
-
# rubocop:disable Metrics/AbcSize
|
6
|
-
def instrument(_type, field)
|
7
|
-
return field unless edge_with_node_connection?(field)
|
8
|
-
|
9
|
-
raise ArgumentError, 'Connection does not support fetching using :property' if field.property.present?
|
10
|
-
|
11
|
-
validate!(field)
|
12
|
-
edge_to_node_property = field.metadata[:edge_to_node_property]
|
13
|
-
explicit_includes = field.metadata[:includes]
|
14
|
-
edges_prop = explicit_includes[:edges]
|
15
|
-
nodes_prop = explicit_includes[:nodes]
|
16
|
-
|
17
|
-
if proc_based?(field)
|
18
|
-
edges_resolver = field.metadata[:resolve_edges]
|
19
|
-
nodes_resolver = field.metadata[:resolve_nodes]
|
20
|
-
else
|
21
|
-
# Use the edges and nodes symbols from the incldues pattern as the propeties to fetch
|
22
|
-
edges_resolver = ->(obj, _args, _ctx) { obj.public_send(edges_prop) }
|
23
|
-
nodes_resolver = ->(obj, _args, _ctx) { obj.public_send(nodes_prop) }
|
24
|
-
end
|
25
|
-
|
26
|
-
_original_resolve = field.resolve_proc
|
27
|
-
new_resolve_proc = ->(obj, args, ctx) do
|
28
|
-
ConnectionEdgesAndNodes.new(obj, args, ctx,
|
29
|
-
edges_prop, nodes_prop, edge_to_node_property,
|
30
|
-
edges_resolver, nodes_resolver)
|
31
|
-
end
|
32
|
-
|
33
|
-
field.redefine { resolve(new_resolve_proc) }
|
34
|
-
end
|
35
|
-
# rubocop:enable Metrics/AbcSize
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def edge_with_node_connection?(field)
|
40
|
-
field.connection? && field.type.fields['edges'].metadata.key?(:_includable_connection_marker)
|
41
|
-
end
|
42
|
-
|
43
|
-
def proc_based?(field)
|
44
|
-
required_metadata = [:resolve_edges, :resolve_nodes]
|
45
|
-
has_a_resolver = required_metadata.any? { |key| field.metadata.key?(key) }
|
46
|
-
|
47
|
-
return false unless has_a_resolver
|
48
|
-
unless required_metadata.all? { |key| field.metadata.key?(key) }
|
49
|
-
raise ArgumentError, "Missing one of #{required_metadata}"
|
50
|
-
end
|
51
|
-
|
52
|
-
true
|
53
|
-
end
|
54
|
-
|
55
|
-
# rubocop:disable Metrics/AbcSize
|
56
|
-
def validate!(field)
|
57
|
-
unless field.metadata.key?(:edge_to_node_property)
|
58
|
-
raise ArgumentError, 'Missing edge_to_node_property definition for field'
|
59
|
-
end
|
60
|
-
unless field.metadata[:edge_to_node_property].is_a?(Symbol)
|
61
|
-
raise ArgumentError, ':edge_to_node_property must be a symbol'
|
62
|
-
end
|
63
|
-
|
64
|
-
raise ArgumentError, 'Missing includes definition for field' unless field.metadata.key?(:includes)
|
65
|
-
includes = field.metadata[:includes]
|
66
|
-
unless includes.is_a?(Hash)
|
67
|
-
raise ArgumentError, 'Connection includes must be a hash containing :edges and :nodes keys'
|
68
|
-
end
|
69
|
-
raise ArgumentError, 'Missing :nodes includes' unless includes.key?(:nodes)
|
70
|
-
raise ArgumentError, 'Missing :edges includes' unless includes.key?(:edges)
|
71
|
-
raise ArgumentError, ':edges must be a symbol' unless includes[:edges].is_a?(Symbol)
|
72
|
-
raise ArgumentError, ':nodes must be a symbol' unless includes[:edges].is_a?(Symbol)
|
73
|
-
end
|
74
|
-
# rubocop:enable Metrics/AbcSize
|
75
|
-
end
|
76
|
-
|
77
|
-
GraphQL::Relay::BaseConnection.register_connection_implementation(
|
78
|
-
GraphQLIncludable::Relay::ConnectionEdgesAndNodes,
|
79
|
-
GraphQLIncludable::Relay::EdgeWithNodeConnection
|
80
|
-
)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|