in compiler/crates/relay-transforms/src/refetchable_fragment/mod.rs [263:307]
fn validate_connection_metadata(&self, fragment: &FragmentDefinition) -> DiagnosticsResult<()> {
if let Some(metadatas) = extract_connection_metadata_from_directive(&fragment.directives) {
// TODO: path or connection field locations in the error messages
if metadatas.len() > 1 {
return Err(vec![Diagnostic::error(
ValidationMessage::RefetchableWithMultipleConnections {
fragment_name: fragment.name.item,
},
fragment.name.location,
)]);
} else if metadatas.len() == 1 {
let metadata = &metadatas[0];
if metadata.path.is_none() {
return Err(vec![Diagnostic::error(
ValidationMessage::RefetchableWithConnectionInPlural {
fragment_name: fragment.name.item,
},
fragment.name.location,
)]);
}
if (metadata.after.is_none() || metadata.first.is_none())
&& metadata.direction != self.connection_constants.direction_backward
{
return Err(vec![Diagnostic::error(
ValidationMessage::RefetchableWithConstConnectionArguments {
fragment_name: fragment.name.item,
arguments: "after and first",
},
fragment.name.location,
)]);
} else if (metadata.before.is_none() || metadata.last.is_none())
&& metadata.direction != self.connection_constants.direction_forward
{
return Err(vec![Diagnostic::error(
ValidationMessage::RefetchableWithConstConnectionArguments {
fragment_name: fragment.name.item,
arguments: "before and last",
},
fragment.name.location,
)]);
}
}
}
Ok(())
}