{"record":{"id":"e8c08da4c4820cc3","repo":"facebook/relay","slug":"should-return-one-deduplicated-type-per-match-fiel","errorCode":null,"errorMessage":"should return one deduplicated type per match field","messagePattern":"should return one deduplicated type per match field","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler/crates/relay-typegen/src/write.rs","lineNumber":412,"sourceCode":"            .feature_flags\n            .disable_deduping_common_structures_in_raw_response_types\n            .is_enabled_for(operation_name.0)\n    {\n        let match_fields = match_fields.0.into_iter().collect_vec();\n        let raw_response_types = match_fields\n            .iter()\n            .map(|(_, type_)| type_)\n            .chain(std::iter::once(&raw_response_type))\n            .collect_vec();\n        let deduplicated = deduplicate_raw_response_types(&raw_response_types, operation_name.0);\n        let mut deduplicated_types = deduplicated.types.into_iter();\n        let match_fields = MatchFields(\n            match_fields\n                .into_iter()\n                .map(|(name, _)| {\n                    let type_ = deduplicated_types\n                        .next()\n                        .expect(\"should return one deduplicated type per match field\");\n                    (name, type_)\n                })\n                .collect(),\n        );\n        let raw_response_type = deduplicated_types\n            .next()\n            .expect(\"should return the deduplicated raw response type\");\n        debug_assert!(deduplicated_types.next().is_none());\n\n        (\n            DeduplicatedType {\n                type_: raw_response_type,\n                aliases: deduplicated.aliases,\n            },\n            match_fields,\n        )\n    } else {\n        (","sourceCodeStart":394,"sourceCodeEnd":430,"githubUrl":"https://github.com/facebook/relay/blob/668b1b85e06261aa3b58dabfc51f8b5524a70955/compiler/crates/relay-typegen/src/write.rs#L394-L430","documentation":"Invariant in maybe_deduplicate_raw_response_types: deduplicate_raw_response_types must return exactly one output type per input match field so the iterator aligns with the match-field list. Firing means the dedup pass dropped or merged match-field types incorrectly when building raw response types for an operation.","triggerScenarios":"Thrown at compiler/crates/relay-typegen/src/write.rs:412 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check deduplicate_raw_response_types preserves a 1:1 mapping between input and output types for match fields","Disable the dedup path via disable_deduping_common_structures_in_raw_response_types flag to confirm it as the cause","Add a unit test asserting one deduplicated type per match field"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"668b1b85e06261aa3b58dabfc51f8b5524a70955","analyzedAt":"2026-09-02T19:57:20.783Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}