Skip to content

Commit

Permalink
Preserve correct resolver path across client edges
Browse files Browse the repository at this point in the history
Reviewed By: voideanvalue

Differential Revision: D45283146

fbshipit-source-id: 3af0c8a931c5b0cd119c94de5f276ce6aab557f1
  • Loading branch information
captbaritone authored and facebook-github-bot committed Apr 28, 2023
1 parent 6f2f4cf commit fd06faa
Show file tree
Hide file tree
Showing 26 changed files with 378 additions and 92 deletions.
6 changes: 6 additions & 0 deletions compiler/crates/relay-transforms/src/relay_resolvers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -575,11 +575,17 @@ impl Transformer for RelayResolverFieldTransform<'_> {
.transform_selection(&client_edge_metadata.backing_field)
.unwrap_or_else(|| client_edge_metadata.backing_field.clone());

let field_name = client_edge_metadata
.linked_field
.alias_or_name(&self.program.schema);

self.path.push(field_name.lookup());
let selections_field = self
.default_transform_linked_field(client_edge_metadata.linked_field)
.unwrap_or_else(|| {
Selection::LinkedField(Arc::new(client_edge_metadata.linked_field.clone()))
});
self.path.pop();

let selections = vec![backing_id_field, selections_field];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ fragment Foo_user on User {
# import_path: "BestFriendResolver",
# import_name: None,
# field_alias: None,
# field_path: "best_friend",
# field_path: "best_friend.best_friend",
# field_arguments: [],
# live: false,
# output_type_info: EdgeTo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ fragment Foo_user on User {
# import_path: "BestFriendResolver",
# import_name: None,
# field_alias: None,
# field_path: "best_friend",
# field_path: "best_friend.best_friend",
# field_arguments: [],
# live: false,
# output_type_info: EdgeTo,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
==================================== INPUT ====================================
fragment Foo_user on ClientUser {
bff: best_friend {
bffs_bff: best_friend {
id
}
}
}

fragment BestFriendFragment on ClientUser {
id
}

# %extensions%

type ClientUser {
id: ID
}

extend type ClientUser {
best_friend: ClientUser
@relay_resolver(
fragment_name: "BestFriendFragment"
import_path: "BestFriendResolver"
)
}
==================================== OUTPUT ===================================
fragment BestFriendFragment on ClientUser {
id
}

fragment Foo_user on ClientUser {
... @__ClientEdgeMetadataDirective
# ClientObject {
# type_name: Some(
# ObjectName(
# "ClientUser",
# ),
# ),
# unique_id: 1,
# }
{
...BestFriendFragment @__RelayResolverMetadata
# RelayResolverMetadata {
# field_id: FieldID(518),
# import_path: "BestFriendResolver",
# import_name: None,
# field_alias: Some(
# "bff",
# ),
# field_path: "bff",
# field_arguments: [],
# live: false,
# output_type_info: EdgeTo,
# fragment_data_injection_mode: None,
# }

bff: best_friend {
... @__ClientEdgeMetadataDirective
# ClientObject {
# type_name: Some(
# ObjectName(
# "ClientUser",
# ),
# ),
# unique_id: 0,
# }
{
...BestFriendFragment @__RelayResolverMetadata
# RelayResolverMetadata {
# field_id: FieldID(518),
# import_path: "BestFriendResolver",
# import_name: None,
# field_alias: Some(
# "bffs_bff",
# ),
# field_path: "bff.bffs_bff",
# field_arguments: [],
# live: false,
# output_type_info: EdgeTo,
# fragment_data_injection_mode: None,
# }

bffs_bff: best_friend {
id
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
fragment Foo_user on ClientUser {
bff: best_friend {
bffs_bff: best_friend {
id
}
}
}

fragment BestFriendFragment on ClientUser {
id
}

# %extensions%

type ClientUser {
id: ID
}

extend type ClientUser {
best_friend: ClientUser
@relay_resolver(
fragment_name: "BestFriendFragment"
import_path: "BestFriendResolver"
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
==================================== INPUT ====================================
fragment Foo_user on ClientUser {
best_friend {
best_friend {
id
}
}
}

fragment BestFriendFragment on ClientUser {
id
}

# %extensions%

type ClientUser {
id: ID
}

extend type ClientUser {
best_friend: ClientUser
@relay_resolver(
fragment_name: "BestFriendFragment"
import_path: "BestFriendResolver"
)
}
==================================== OUTPUT ===================================
fragment BestFriendFragment on ClientUser {
id
}

fragment Foo_user on ClientUser {
... @__ClientEdgeMetadataDirective
# ClientObject {
# type_name: Some(
# ObjectName(
# "ClientUser",
# ),
# ),
# unique_id: 1,
# }
{
...BestFriendFragment @__RelayResolverMetadata
# RelayResolverMetadata {
# field_id: FieldID(518),
# import_path: "BestFriendResolver",
# import_name: None,
# field_alias: None,
# field_path: "best_friend",
# field_arguments: [],
# live: false,
# output_type_info: EdgeTo,
# fragment_data_injection_mode: None,
# }

best_friend {
... @__ClientEdgeMetadataDirective
# ClientObject {
# type_name: Some(
# ObjectName(
# "ClientUser",
# ),
# ),
# unique_id: 0,
# }
{
...BestFriendFragment @__RelayResolverMetadata
# RelayResolverMetadata {
# field_id: FieldID(518),
# import_path: "BestFriendResolver",
# import_name: None,
# field_alias: None,
# field_path: "best_friend.best_friend",
# field_arguments: [],
# live: false,
# output_type_info: EdgeTo,
# fragment_data_injection_mode: None,
# }

best_friend {
id
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
fragment Foo_user on ClientUser {
best_friend {
best_friend {
id
}
}
}

fragment BestFriendFragment on ClientUser {
id
}

# %extensions%

type ClientUser {
id: ID
}

extend type ClientUser {
best_friend: ClientUser
@relay_resolver(
fragment_name: "BestFriendFragment"
import_path: "BestFriendResolver"
)
}
16 changes: 15 additions & 1 deletion compiler/crates/relay-transforms/tests/client_edges_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated SignedSource<<4c8ae6c8320ef3ba5464f80d8fff1afd>>
* @generated SignedSource<<854ac84b500428562e2f3baa3ad4d13b>>
*/

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

#[test]
fn nested_path() {
let input = include_str!("client_edges/fixtures/nested-path.graphql");
let expected = include_str!("client_edges/fixtures/nested-path.expected");
test_fixture(transform_fixture, "nested-path.graphql", "client_edges/fixtures/nested-path.expected", input, expected);
}

#[test]
fn nested_path_with_alias() {
let input = include_str!("client_edges/fixtures/nested-path-with-alias.graphql");
let expected = include_str!("client_edges/fixtures/nested-path-with-alias.expected");
test_fixture(transform_fixture, "nested-path-with-alias.graphql", "client_edges/fixtures/nested-path-with-alias.expected", input, expected);
}

#[test]
fn output_type() {
let input = include_str!("client_edges/fixtures/output-type.graphql");
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit fd06faa

Please sign in to comment.