Skip to content

Commit 78e1499

Browse files
lynnshaoyufacebook-github-bot
authored andcommitted
- support client 3d on concrete objects
Reviewed By: tyao1 Differential Revision: D71421963 fbshipit-source-id: 6c0f72775ba792055ca66195d7a2691ee669493c
1 parent 99adb3b commit 78e1499

File tree

4 files changed

+55
-17
lines changed

4 files changed

+55
-17
lines changed

compiler/crates/relay-transforms/src/match_/match_transform.rs

+17-6
Original file line numberDiff line numberDiff line change
@@ -1104,12 +1104,23 @@ fn validate_parent_type_of_fragment_with_read_time_resolver(
11041104
transform.relay_resolver_model_unions.insert(id);
11051105
}
11061106
Type::Object(id) => {
1107-
return Err(Diagnostic::error(
1108-
ValidationMessage::InvalidModuleOnConcreteParentType {
1109-
object_name: transform.program.schema.object(id).name.item,
1110-
},
1111-
spread.fragment.location,
1112-
));
1107+
let object_has_read_time_resolver = transform
1108+
.program
1109+
.schema
1110+
.object(id)
1111+
.directives
1112+
.named(*RELAY_RESOLVER_MODEL_DIRECTIVE_NAME)
1113+
.is_some();
1114+
1115+
if !object_has_read_time_resolver {
1116+
return Err(Diagnostic::error(
1117+
ValidationMessage::MissingRelayResolverModelForObject {
1118+
spread_name: spread.fragment.item,
1119+
object: transform.program.schema.object(id).name.item,
1120+
},
1121+
spread.fragment.location,
1122+
));
1123+
}
11131124
}
11141125
Type::Enum(_) | Type::Scalar(_) | Type::InputObject(_) => {
11151126
panic!(

compiler/crates/relay-transforms/src/match_/validation_message.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,10 @@ pub enum ValidationMessage {
137137
},
138138

139139
#[error(
140-
"@module was used on a fragment with a concrete parent type: '{object_name}'. The parent type should be an interface or union."
140+
"Invalid fragment spread '...{spread_name}'. Object '{object}' should be backed by a relay resolver model."
141141
)]
142-
InvalidModuleOnConcreteParentType { object_name: ObjectName },
142+
MissingRelayResolverModelForObject {
143+
spread_name: FragmentDefinitionName,
144+
object: ObjectName,
145+
},
143146
}

compiler/crates/relay-transforms/tests/match_transform_client_resolver/fixtures/client-3D-module-on-concrete-parent-type.invalid.expected

+33-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
==================================== INPUT ====================================
2-
# expected-to-throw
32
fragment NameRendererFragment on Persona {
43
id
54
basicUser {
@@ -24,11 +23,37 @@ type BasicUser @__RelayResolverModel {
2423
address: String
2524
__relay_model_instance: RelayResolverValue @relay_resolver(import_path: "ClientUserResolver", fragment_name: "ClientUser__id", inject_fragment_data: "id")
2625
}
27-
==================================== ERROR ====================================
28-
✖︎ @module was used on a fragment with a concrete parent type: 'BasicUser'. The parent type should be an interface or union.
26+
==================================== OUTPUT ===================================
27+
fragment ClientUser_Fragment on BasicUser {
28+
name
29+
address
30+
}
2931

30-
client-3D-module-on-concrete-parent-type.invalid.graphql:5:8
31-
4 │ basicUser {
32-
5 │ ...ClientUser_Fragment @module(name: "ClientUser.react")
33-
│ ^^^^^^^^^^^^^^^^^^^
34-
6 │ }
32+
fragment NameRendererFragment on Persona {
33+
id
34+
basicUser {
35+
... on BasicUser {
36+
... on BasicUser @__ModuleMetadata
37+
# ModuleMetadata {
38+
# location: client-3D-module-on-concrete-parent-type.invalid.graphql:89:96,
39+
# key: "NameRendererFragment",
40+
# module_id: "NameRendererFragment.basicUser",
41+
# module_name: "ClientUser.react",
42+
# source_document_name: FragmentDefinitionName(
43+
# FragmentDefinitionName(
44+
# "NameRendererFragment",
45+
# ),
46+
# ),
47+
# read_time_resolvers: true,
48+
# fragment_name: FragmentDefinitionName(
49+
# "ClientUser_Fragment",
50+
# ),
51+
# fragment_source_location: client-3D-module-on-concrete-parent-type.invalid.graphql:139:158,
52+
# no_inline: false,
53+
# }
54+
{
55+
...ClientUser_Fragment
56+
}
57+
}
58+
}
59+
}

compiler/crates/relay-transforms/tests/match_transform_client_resolver/fixtures/client-3D-module-on-concrete-parent-type.invalid.graphql

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# expected-to-throw
21
fragment NameRendererFragment on Persona {
32
id
43
basicUser {

0 commit comments

Comments
 (0)