graphql-stitching 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f7587a903fe54feeffe79deb25fdcf341f13af67b46f896003dfdba861cb614
4
- data.tar.gz: 191ff2274244d23b16325579792fd07310bf5b3fc3cc1a2b20e7b30305456851
3
+ metadata.gz: 10489fd6a8670d5a23a7afa132d7941a242848783f3697a4d3ddd519b208a4d8
4
+ data.tar.gz: 7a2e8dda124bdc6e96da43e1a4ed64bbb4baeaf0065f6d8411edaeba2c52e064
5
5
  SHA512:
6
- metadata.gz: 7fd408963db10a7bfdfc272987a793353a190a191eb5de264a1a6a0ccd7e80293605bb57e85c70c52f66a3cd646b966930741b938ca231146f527704b524f0a1
7
- data.tar.gz: 1857a8492545cc4d7da64c541c897bb14e898c391edf271baf54a5e39369d8f387d80500c40fc591726c2dcb06fcce3f1164a9680f266e9a22494da577076648
6
+ metadata.gz: 4c9243880e3b41fcede7fddb5947a962f1d4c43882ba07cc0ab63d1ba154527ef4cc8e5cc130bb2524b40fcbe093ecfd2f3b8fb0bafc9a2a7324050c30d2af00
7
+ data.tar.gz: a2b37c3ab8b98065a0910a458e177b71576c5d8f52c6f6eba0e31d25ae7797f1517a168aeef2f39c7295d27e4f981373b7a90066dc7ab8651670ecbd41fc70d5
data/README.md CHANGED
@@ -305,13 +305,13 @@ class MyExecutable
305
305
  end
306
306
  ```
307
307
 
308
- A [Supergraph](./docs/supergraph.md) is composed with executable resource provided for each location. Any location that omits the `executable` option will use the provided `schema` as the default executable:
308
+ A [Supergraph](./docs/supergraph.md) is composed with executable resources provided for each location. Any location that omits the `executable` option will use the provided `schema` as its default executable:
309
309
 
310
310
  ```ruby
311
311
  supergraph = GraphQL::Stitching::Composer.new.perform({
312
312
  first: {
313
313
  schema: FirstSchema,
314
- # executable: ^^^^^ delegates to FirstSchema,
314
+ # executable:^^^^^^ delegates to FirstSchema,
315
315
  },
316
316
  second: {
317
317
  schema: SecondSchema,
@@ -53,18 +53,16 @@ module GraphQL
53
53
 
54
54
  when "mutation"
55
55
  parent_type = @supergraph.schema.mutation
56
- location_groups = []
57
56
 
58
- @request.operation.selections.reduce(nil) do |last_location, node|
57
+ location_groups = @request.operation.selections.each_with_object([]) do |node, memo|
59
58
  # root fields currently just delegate to the last location that defined them; this should probably be smarter
60
59
  next_location = @supergraph.locations_by_type_and_field[parent_type.graphql_name][node.name].last
61
60
 
62
- if next_location != last_location
63
- location_groups << { location: next_location, selections: [] }
61
+ if memo.none? || memo.last[:location] != next_location
62
+ memo << { location: next_location, selections: [] }
64
63
  end
65
64
 
66
- location_groups.last[:selections] << node
67
- next_location
65
+ memo.last[:selections] << node
68
66
  end
69
67
 
70
68
  location_groups.reduce(0) do |after_key, group|
@@ -144,7 +142,7 @@ module GraphQL
144
142
  implements_fragments = false
145
143
 
146
144
  if parent_type.kind.interface?
147
- expand_interface_selections(current_location, parent_type, input_selections)
145
+ input_selections = expand_interface_selections(current_location, parent_type, input_selections)
148
146
  end
149
147
 
150
148
  input_selections.each do |node|
@@ -328,8 +326,8 @@ module GraphQL
328
326
  local_interface_fields = @supergraph.fields_by_type_and_location[parent_type.graphql_name][current_location]
329
327
 
330
328
  expanded_selections = nil
331
- input_selections.reject! do |node|
332
- if node.is_a?(GraphQL::Language::Nodes::Field) && !local_interface_fields.include?(node.name)
329
+ input_selections = input_selections.reject do |node|
330
+ if node.is_a?(GraphQL::Language::Nodes::Field) && node.name != "__typename" && !local_interface_fields.include?(node.name)
333
331
  expanded_selections ||= []
334
332
  expanded_selections << node
335
333
  true
@@ -344,6 +342,8 @@ module GraphQL
344
342
  input_selections << GraphQL::Language::Nodes::InlineFragment.new(type: type_name, selections: expanded_selections)
345
343
  end
346
344
  end
345
+
346
+ input_selections
347
347
  end
348
348
 
349
349
  # expand concrete type selections into typed fragments when sending to abstract boundaries
@@ -42,15 +42,16 @@ module GraphQL
42
42
  return nil if raw_object[field_name].nil? && node_type.non_null?
43
43
 
44
44
  when GraphQL::Language::Nodes::InlineFragment
45
- next unless typename == node.type.name
46
45
  fragment_type = @schema.types[node.type.name]
46
+ next unless fragment_matches_typename?(fragment_type, typename)
47
+
47
48
  result = resolve_object_scope(raw_object, fragment_type, node.selections, typename)
48
49
  return nil if result.nil?
49
50
 
50
51
  when GraphQL::Language::Nodes::FragmentSpread
51
52
  fragment = @request.fragment_definitions[node.name]
52
53
  fragment_type = @schema.types[fragment.type.name]
53
- next unless typename == fragment_type.graphql_name
54
+ next unless fragment_matches_typename?(fragment_type, typename)
54
55
 
55
56
  result = resolve_object_scope(raw_object, fragment_type, fragment.selections, typename)
56
57
  return nil if result.nil?
@@ -91,6 +92,11 @@ module GraphQL
91
92
 
92
93
  resolved_list
93
94
  end
95
+
96
+ def fragment_matches_typename?(fragment_type, typename)
97
+ return true if fragment_type.graphql_name == typename
98
+ fragment_type.kind.interface? && @schema.possible_types(fragment_type).any? { _1.graphql_name == typename }
99
+ end
94
100
  end
95
101
  end
96
102
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module Stitching
5
- VERSION = "0.3.0"
5
+ VERSION = "0.3.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-stitching
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg MacWilliam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-27 00:00:00.000000000 Z
11
+ date: 2023-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql