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

  1. Verify deduplicate_raw_response_types returns match-field types first then the root raw response type in order
  2. Audit the dedup output construction for dropped entries
  3. 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.