facebook/relay · error
should return the deduplicated raw response type
Error message
should return the deduplicated raw response type
What it means
Invariant in maybe_deduplicate_raw_response_types: the final raw response type itself must be present in deduplicate_raw_response_types' output after the per-match-field types are consumed. Firing means the dedup result omitted the root raw response type, indicating an off-by-one or misaligned output ordering in the dedup pass.
Source
Thrown at compiler/crates/relay-typegen/src/write.rs:419
.map(|(_, type_)| type_)
.chain(std::iter::once(&raw_response_type))
.collect_vec();
let deduplicated = deduplicate_raw_response_types(&raw_response_types, operation_name.0);
let mut deduplicated_types = deduplicated.types.into_iter();
let match_fields = MatchFields(
match_fields
.into_iter()
.map(|(name, _)| {
let type_ = deduplicated_types
.next()
.expect("should return one deduplicated type per match field");
(name, type_)
})
.collect(),
);
let raw_response_type = deduplicated_types
.next()
.expect("should return the deduplicated raw response type");
debug_assert!(deduplicated_types.next().is_none());
(
DeduplicatedType {
type_: raw_response_type,
aliases: deduplicated.aliases,
},
match_fields,
)
} else {
(
DeduplicatedType {
type_: raw_response_type,
aliases: Vec::new(),
},
match_fields,
)
}View on GitHub (pinned to 668b1b85e0)
Solutions
- Verify deduplicate_raw_response_types returns match-field types first then the root raw response type in order
- Audit the dedup output construction for dropped entries
- Write a regression test with multiple match fields plus a root type
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at compiler/crates/relay-typegen/src/write.rs:419 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of facebook/relay@668b1b85e0 (2026-09-02).
Data as JSON: /api/errors/7409dea76a01e32a.
Report an issue: GitHub.