{"record":{"id":"07a3f3cc701ccb3e","repo":"facebook/relay","slug":"unexpected-resolvermodulereference","errorCode":null,"errorMessage":"Unexpected ResolverModuleReference","messagePattern":"Unexpected ResolverModuleReference","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler/crates/relay-codegen/src/printer.rs","lineNumber":934,"sourceCode":"                        f.push(',');\n                    }\n                    if !obj.is_empty() {\n                        f.pop();\n                    }\n                    f.push('}');\n                    Ok(())\n                }\n            }\n        }\n        Primitive::Null | Primitive::SkippableNull => {\n            f.push_str(\"null\");\n            Ok(())\n        }\n        Primitive::StorageKey(_, _) => panic!(\"Unexpected StorageKey\"),\n        Primitive::RawString(_) => panic!(\"Unexpected RawString\"),\n        Primitive::GraphQLModuleDependency(_) => panic!(\"Unexpected GraphQLModuleDependency\"),\n        Primitive::JSModuleDependency { .. } => panic!(\"Unexpected JSModuleDependency\"),\n        Primitive::ResolverModuleReference { .. } => panic!(\"Unexpected ResolverModuleReference\"),\n        Primitive::PropertyAccessor(_) => panic!(\"Unexpected PropertyAccessor\"),\n        Primitive::DynamicImport { .. } => panic!(\"Unexpected DynamicImport\"),\n        Primitive::RelayResolverModel { .. } => panic!(\"Unexpected RelayResolver\"),\n    }\n}\n","sourceCodeStart":916,"sourceCodeEnd":940,"githubUrl":"https://github.com/facebook/relay/blob/668b1b85e06261aa3b58dabfc51f8b5524a70955/compiler/crates/relay-codegen/src/printer.rs#L916-L940","documentation":"Primitive::ResolverModuleReference points to a Relay Resolver module and is printed through write_resolver_module_reference (requiring a named import). If it appears in write_constant_value — i.e. in an ordinary argument/literal position — the printer cannot serialize it and panics, preserving the invariant that resolver references are only printed via the resolver path.","triggerScenarios":"A resolver field reference primitive flowing into write_constant_value — e.g. a Relay Resolver value used inside an argument, list, or object literal instead of as a field; custom transforms placing ResolverModuleReference in constant positions.","commonSituations":"Misconfigured Relay Resolvers where a resolver is referenced from an argument (@arguments/@static_arg) rather than a field; custom IR passes emitting resolver references in wrong positions; compiler version mismatch between transform output and printer expectations.","solutions":["Reference the resolver only as a field (via @relay_resolver / resolver field definitions), not inside argument values","Move the resolver usage out of arguments/lists printed as constants and into a resolver field position","Fix custom transforms so ResolverModuleReference primitives are only created for resolver field printing","Update the Relay compiler if transforms and printer are out of sync"],"exampleFix":"// before\nuser { name(arg: <ResolverModuleReference>) }\n// after\nuser { name @relay_resolver(module: \"./myResolver\") }","handlingStrategy":"validation","validationCode":"// Ensure resolvers are only referenced as fields, never in arguments:\nfunction assertResolverUsage(doc) {\n  visit(doc, {\n    Argument(node) {\n      if (referencesResolver(node)) {\n        throw new Error(`Resolver reference not allowed in argument '${node.name.value}'`);\n      }\n    }\n  });\n}","typeGuard":"const isResolverRef = (p) => p != null && p.type === 'resolverModuleReference';","tryCatchPattern":"try {\n  generateArtifacts();\n} catch (e) {\n  if (String(e).includes('Unexpected ResolverModuleReference')) {\n    // move the resolver usage to a resolver field position\n  }\n  throw e;\n}","preventionTips":["Use @relay_resolver / resolver field definitions only on fields","Never place resolver references inside argument values","Keep Relay compiler and runtime versions aligned","Test Relay Resolver documents through codegen in CI"],"tags":["compiler","codegen","relay-resolvers","primitive"],"backgroundTag":"unexpected-primitive-kind","analyzedSha":"668b1b85e06261aa3b58dabfc51f8b5524a70955","analyzedAt":"2026-09-02T19:57:20.783Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}