Skip to content

Commit e6b4695

Browse files
author
Robert Mosolgo
authored
Merge pull request #1793 from rmosolgo/fix-replace-inline-fragment
Fix modifying fragment spreads with visitor
2 parents c9ff734 + 0505b3b commit e6b4695

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

lib/graphql/language/nodes.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,11 @@ def children_method_name
375375
class FragmentSpread < AbstractNode
376376
scalar_methods :name
377377
children_methods(directives: GraphQL::Language::Nodes::Directive)
378+
379+
def children_method_name
380+
:selections
381+
end
382+
378383
# @!attribute name
379384
# @return [String] The identifier of the fragment to apply, corresponds with {FragmentDefinition#name}
380385
end
@@ -387,6 +392,10 @@ class InlineFragment < AbstractNode
387392
directives: GraphQL::Language::Nodes::Directive,
388393
})
389394

395+
def children_method_name
396+
:selections
397+
end
398+
390399
# @!attribute type
391400
# @return [String, nil] Name of the type this fragment applies to, or `nil` if this fragment applies to any type
392401
end

spec/graphql/language/visitor_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,25 @@ def on_directive(node, parent)
184184
super
185185
end
186186
end
187+
188+
def on_inline_fragment(node, parent)
189+
if node.selections.map(&:name) == ["renameFragmentField", "spread"]
190+
_field, spread = node.selections
191+
new_node = node.merge(selections: [GraphQL::Language::Nodes::Field.new(name: "renamed"), spread])
192+
super(new_node, parent)
193+
else
194+
super(node, parent)
195+
end
196+
end
197+
198+
def on_fragment_spread(node, parent)
199+
if node.name == "spread"
200+
new_node = node.merge(name: "renamedSpread")
201+
super(new_node, parent)
202+
else
203+
super(node, parent)
204+
end
205+
end
187206
end
188207

189208
def get_result(query_str)
@@ -298,6 +317,30 @@ def get_result(query_str)
298317
}
299318
anotherAddition(addedArgument: 1) @doStuff(addedArgument2: 2)
300319
}
320+
GRAPHQL
321+
322+
document, new_document = get_result(before_query)
323+
assert_equal before_query, document.to_query_string
324+
assert_equal after_query, new_document.to_query_string
325+
end
326+
327+
it "can modify inline fragments" do
328+
before_query = <<-GRAPHQL.chop
329+
query {
330+
... on Query {
331+
renameFragmentField
332+
...spread
333+
}
334+
}
335+
GRAPHQL
336+
337+
after_query = <<-GRAPHQL.chop
338+
query {
339+
... on Query {
340+
renamed
341+
...renamedSpread
342+
}
343+
}
301344
GRAPHQL
302345

303346
document, new_document = get_result(before_query)

0 commit comments

Comments
 (0)