{"record":{"id":"5c74151a47bf343b","repo":"facebook/relay","slug":"expected-a-named-import-for-relay-resolvers","errorCode":null,"errorMessage":"Expected a named import for Relay Resolvers","messagePattern":"Expected a named import for Relay Resolvers","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler/crates/relay-codegen/src/printer.rs","lineNumber":656,"sourceCode":"            } => self.write_relay_resolver_model(\n                f,\n                *graphql_module_name,\n                *graphql_module_path,\n                resolver_fn,\n                injected_field_name_details.as_ref().copied(),\n            ),\n        }\n    }\n\n    fn write_resolver_module_reference(\n        &mut self,\n        f: &mut String,\n        resolver_function_name: ModuleImportName,\n        field_type: &StringKey,\n    ) -> FmtResult {\n        match resolver_function_name {\n            ModuleImportName::Default(_) => {\n                panic!(\"Expected a named import for Relay Resolvers\")\n            }\n            ModuleImportName::Named { name, .. } => {\n                write!(\n                    f,\n                    \"{{ resolverFunctionName: \\\"{name}\\\", fieldType: \\\"{field_type}\\\" }}\"\n                )\n            }\n        }\n    }\n\n    fn write_js_dependency(\n        &mut self,\n        f: &mut String,\n        module_import_name: ModuleImportName,\n        path: Cow<'_, str>,\n    ) -> FmtResult {\n        if self.eager_es_modules {\n            let path = path.into_owned();","sourceCodeStart":638,"sourceCodeEnd":674,"githubUrl":"https://github.com/facebook/relay/blob/668b1b85e06261aa3b58dabfc51f8b5524a70955/compiler/crates/relay-codegen/src/printer.rs#L638-L674","documentation":"When printing a Relay Resolver field that references a resolver module, the printer must emit a named module import. A default import (ModuleImportName::Default) is invalid for Relay Resolvers, so the printer panics. The named-import requirement exists because generated code accesses the resolver by `resolverFunctionName` and the import machinery only tracks named bindings for these modules.","triggerScenarios":"Printing a ResolverModuleReference primitive whose module import was registered as a default import instead of a named import; a resolver field definition (e.g. `export default function ...` in a Relay Resolver file, or module config mapping the resolver as default) reaching write_resolver_module_reference during codegen.","commonSituations":"Writing a Relay Resolver file using `export default` instead of a named export; custom codegen/transform that builds a ModuleImportName::Default for resolver modules; misconfigured artifact generation for Relay Resolvers.","solutions":["Change the resolver file to use a named export (e.g. `export function myResolver() {...}`) rather than `export default`","Ensure the module reference for the resolver is constructed with ModuleImportName::Named in the transform/printer pipeline","Update the Relay compiler version so resolver module imports are always registered as named imports","If using custom IR transforms, fix the pass that lowers resolver references so it never produces Default import names"],"exampleFix":"// before\nexport default function userName(root) { return root.name; }\n// after\nexport function userName(root) { return root.name; }","handlingStrategy":"validation","validationCode":"// Ensure resolver files use named exports, not default exports:\nconst src = fs.readFileSync(resolverPath, 'utf8');\nif (/export\\s+default/.test(src)) {\n  throw new Error(`Relay Resolver ${resolverPath} must use named exports, not default`);\n}","typeGuard":"const isNamedImport = (imp) => imp != null && imp.type === 'named';","tryCatchPattern":"try {\n  generateArtifacts();\n} catch (e) {\n  if (String(e).includes('Expected a named import for Relay Resolvers')) {\n    // convert resolver default exports to named exports\n  }\n  throw e;\n}","preventionTips":["Use named exports for all Relay Resolver functions","Never map resolver modules to default imports in custom transforms","Keep the compiler and relay runtime packages in sync","Codegen custom transforms should always construct ModuleImportName::Named for resolvers"],"tags":["compiler","codegen","relay-resolvers","imports"],"backgroundTag":"expected-named-import","analyzedSha":"668b1b85e06261aa3b58dabfc51f8b5524a70955","analyzedAt":"2026-09-02T19:57:20.783Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}