Skip to content

Commit fd06faa

Browse files
captbaritonefacebook-github-bot
authored andcommitted
Preserve correct resolver path across client edges
Reviewed By: voideanvalue Differential Revision: D45283146 fbshipit-source-id: 3af0c8a931c5b0cd119c94de5f276ce6aab557f1
1 parent 6f2f4cf commit fd06faa

26 files changed

+378
-92
lines changed

compiler/crates/relay-transforms/src/relay_resolvers.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,11 +575,17 @@ impl Transformer for RelayResolverFieldTransform<'_> {
575575
.transform_selection(&client_edge_metadata.backing_field)
576576
.unwrap_or_else(|| client_edge_metadata.backing_field.clone());
577577

578+
let field_name = client_edge_metadata
579+
.linked_field
580+
.alias_or_name(&self.program.schema);
581+
582+
self.path.push(field_name.lookup());
578583
let selections_field = self
579584
.default_transform_linked_field(client_edge_metadata.linked_field)
580585
.unwrap_or_else(|| {
581586
Selection::LinkedField(Arc::new(client_edge_metadata.linked_field.clone()))
582587
});
588+
self.path.pop();
583589

584590
let selections = vec![backing_id_field, selections_field];
585591

compiler/crates/relay-transforms/tests/client_edges/fixtures/nested-client-edges-with-variables.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ fragment Foo_user on User {
6161
# import_path: "BestFriendResolver",
6262
# import_name: None,
6363
# field_alias: None,
64-
# field_path: "best_friend",
64+
# field_path: "best_friend.best_friend",
6565
# field_arguments: [],
6666
# live: false,
6767
# output_type_info: EdgeTo,

compiler/crates/relay-transforms/tests/client_edges/fixtures/nested-client-edges.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ fragment Foo_user on User {
5858
# import_path: "BestFriendResolver",
5959
# import_name: None,
6060
# field_alias: None,
61-
# field_path: "best_friend",
61+
# field_path: "best_friend.best_friend",
6262
# field_arguments: [],
6363
# live: false,
6464
# output_type_info: EdgeTo,
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
==================================== INPUT ====================================
2+
fragment Foo_user on ClientUser {
3+
bff: best_friend {
4+
bffs_bff: best_friend {
5+
id
6+
}
7+
}
8+
}
9+
10+
fragment BestFriendFragment on ClientUser {
11+
id
12+
}
13+
14+
# %extensions%
15+
16+
type ClientUser {
17+
id: ID
18+
}
19+
20+
extend type ClientUser {
21+
best_friend: ClientUser
22+
@relay_resolver(
23+
fragment_name: "BestFriendFragment"
24+
import_path: "BestFriendResolver"
25+
)
26+
}
27+
==================================== OUTPUT ===================================
28+
fragment BestFriendFragment on ClientUser {
29+
id
30+
}
31+
32+
fragment Foo_user on ClientUser {
33+
... @__ClientEdgeMetadataDirective
34+
# ClientObject {
35+
# type_name: Some(
36+
# ObjectName(
37+
# "ClientUser",
38+
# ),
39+
# ),
40+
# unique_id: 1,
41+
# }
42+
{
43+
...BestFriendFragment @__RelayResolverMetadata
44+
# RelayResolverMetadata {
45+
# field_id: FieldID(518),
46+
# import_path: "BestFriendResolver",
47+
# import_name: None,
48+
# field_alias: Some(
49+
# "bff",
50+
# ),
51+
# field_path: "bff",
52+
# field_arguments: [],
53+
# live: false,
54+
# output_type_info: EdgeTo,
55+
# fragment_data_injection_mode: None,
56+
# }
57+
58+
bff: best_friend {
59+
... @__ClientEdgeMetadataDirective
60+
# ClientObject {
61+
# type_name: Some(
62+
# ObjectName(
63+
# "ClientUser",
64+
# ),
65+
# ),
66+
# unique_id: 0,
67+
# }
68+
{
69+
...BestFriendFragment @__RelayResolverMetadata
70+
# RelayResolverMetadata {
71+
# field_id: FieldID(518),
72+
# import_path: "BestFriendResolver",
73+
# import_name: None,
74+
# field_alias: Some(
75+
# "bffs_bff",
76+
# ),
77+
# field_path: "bff.bffs_bff",
78+
# field_arguments: [],
79+
# live: false,
80+
# output_type_info: EdgeTo,
81+
# fragment_data_injection_mode: None,
82+
# }
83+
84+
bffs_bff: best_friend {
85+
id
86+
}
87+
}
88+
}
89+
}
90+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
fragment Foo_user on ClientUser {
2+
bff: best_friend {
3+
bffs_bff: best_friend {
4+
id
5+
}
6+
}
7+
}
8+
9+
fragment BestFriendFragment on ClientUser {
10+
id
11+
}
12+
13+
# %extensions%
14+
15+
type ClientUser {
16+
id: ID
17+
}
18+
19+
extend type ClientUser {
20+
best_friend: ClientUser
21+
@relay_resolver(
22+
fragment_name: "BestFriendFragment"
23+
import_path: "BestFriendResolver"
24+
)
25+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
==================================== INPUT ====================================
2+
fragment Foo_user on ClientUser {
3+
best_friend {
4+
best_friend {
5+
id
6+
}
7+
}
8+
}
9+
10+
fragment BestFriendFragment on ClientUser {
11+
id
12+
}
13+
14+
# %extensions%
15+
16+
type ClientUser {
17+
id: ID
18+
}
19+
20+
extend type ClientUser {
21+
best_friend: ClientUser
22+
@relay_resolver(
23+
fragment_name: "BestFriendFragment"
24+
import_path: "BestFriendResolver"
25+
)
26+
}
27+
==================================== OUTPUT ===================================
28+
fragment BestFriendFragment on ClientUser {
29+
id
30+
}
31+
32+
fragment Foo_user on ClientUser {
33+
... @__ClientEdgeMetadataDirective
34+
# ClientObject {
35+
# type_name: Some(
36+
# ObjectName(
37+
# "ClientUser",
38+
# ),
39+
# ),
40+
# unique_id: 1,
41+
# }
42+
{
43+
...BestFriendFragment @__RelayResolverMetadata
44+
# RelayResolverMetadata {
45+
# field_id: FieldID(518),
46+
# import_path: "BestFriendResolver",
47+
# import_name: None,
48+
# field_alias: None,
49+
# field_path: "best_friend",
50+
# field_arguments: [],
51+
# live: false,
52+
# output_type_info: EdgeTo,
53+
# fragment_data_injection_mode: None,
54+
# }
55+
56+
best_friend {
57+
... @__ClientEdgeMetadataDirective
58+
# ClientObject {
59+
# type_name: Some(
60+
# ObjectName(
61+
# "ClientUser",
62+
# ),
63+
# ),
64+
# unique_id: 0,
65+
# }
66+
{
67+
...BestFriendFragment @__RelayResolverMetadata
68+
# RelayResolverMetadata {
69+
# field_id: FieldID(518),
70+
# import_path: "BestFriendResolver",
71+
# import_name: None,
72+
# field_alias: None,
73+
# field_path: "best_friend.best_friend",
74+
# field_arguments: [],
75+
# live: false,
76+
# output_type_info: EdgeTo,
77+
# fragment_data_injection_mode: None,
78+
# }
79+
80+
best_friend {
81+
id
82+
}
83+
}
84+
}
85+
}
86+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
fragment Foo_user on ClientUser {
2+
best_friend {
3+
best_friend {
4+
id
5+
}
6+
}
7+
}
8+
9+
fragment BestFriendFragment on ClientUser {
10+
id
11+
}
12+
13+
# %extensions%
14+
15+
type ClientUser {
16+
id: ID
17+
}
18+
19+
extend type ClientUser {
20+
best_friend: ClientUser
21+
@relay_resolver(
22+
fragment_name: "BestFriendFragment"
23+
import_path: "BestFriendResolver"
24+
)
25+
}

compiler/crates/relay-transforms/tests/client_edges_test.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<4c8ae6c8320ef3ba5464f80d8fff1afd>>
7+
* @generated SignedSource<<854ac84b500428562e2f3baa3ad4d13b>>
88
*/
99

1010
mod client_edges;
@@ -89,6 +89,20 @@ fn nested_client_edges_with_variables() {
8989
test_fixture(transform_fixture, "nested-client-edges-with-variables.graphql", "client_edges/fixtures/nested-client-edges-with-variables.expected", input, expected);
9090
}
9191

92+
#[test]
93+
fn nested_path() {
94+
let input = include_str!("client_edges/fixtures/nested-path.graphql");
95+
let expected = include_str!("client_edges/fixtures/nested-path.expected");
96+
test_fixture(transform_fixture, "nested-path.graphql", "client_edges/fixtures/nested-path.expected", input, expected);
97+
}
98+
99+
#[test]
100+
fn nested_path_with_alias() {
101+
let input = include_str!("client_edges/fixtures/nested-path-with-alias.graphql");
102+
let expected = include_str!("client_edges/fixtures/nested-path-with-alias.expected");
103+
test_fixture(transform_fixture, "nested-path-with-alias.graphql", "client_edges/fixtures/nested-path-with-alias.expected", input, expected);
104+
}
105+
92106
#[test]
93107
fn output_type() {
94108
let input = include_str!("client_edges/fixtures/output-type.graphql");

packages/react-relay/__tests__/__generated__/RelayResolverModelTestFieldWithArgumentsQuery.graphql.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-relay/__tests__/__generated__/RelayResolverModelTestFieldWithRootFragmentQuery.graphql.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)