facebook/relay · error
Unexpected DynamicImport
Error message
Unexpected DynamicImport
What it means
This is an internal compiler invariant panic in write_constant_value. The printer encountered a Primitive::DynamicImport where the schema only allows true constant values (strings, booleans, enums, etc.). DynamicImport primitives are only valid in resolver export positions, never as an argument or constant.
Source
Thrown at compiler/crates/relay-codegen/src/printer.rs:936
if !obj.is_empty() {
f.pop();
}
f.push('}');
Ok(())
}
}
}
Primitive::Null | Primitive::SkippableNull => {
f.push_str("null");
Ok(())
}
Primitive::StorageKey(_, _) => panic!("Unexpected StorageKey"),
Primitive::RawString(_) => panic!("Unexpected RawString"),
Primitive::GraphQLModuleDependency(_) => panic!("Unexpected GraphQLModuleDependency"),
Primitive::JSModuleDependency { .. } => panic!("Unexpected JSModuleDependency"),
Primitive::ResolverModuleReference { .. } => panic!("Unexpected ResolverModuleReference"),
Primitive::PropertyAccessor(_) => panic!("Unexpected PropertyAccessor"),
Primitive::DynamicImport { .. } => panic!("Unexpected DynamicImport"),
Primitive::RelayResolverModel { .. } => panic!("Unexpected RelayResolver"),
}
}
View on GitHub (pinned to 668b1b85e0)
Solutions
- Check whether the resolver/JS module import is used in a position requiring a literal constant and move it to a valid export/dependency position
- Verify your resolver type annotations so @module/dynamic imports are not inferred as constants
- Reproduce with a minimal schema and file an issue against the Relay compiler (likely a codegen bug)
Defensive patterns
Strategy: validation
Validate before calling
// Rust caller: ensure the primitive is a printable constant before printing
match primitive {
Primitive::DynamicImport { .. } => panic/handle: route dynamic imports to the module/export printer path instead,
_ => write_constant_value(primitive),
} Type guard
fn is_constant_printable(p: &Primitive) -> bool {
!matches!(p, Primitive::DynamicImport { .. } | Primitive::RelayResolverModel { .. })
} Try / catch
// panics are not catchable idiomatically; pre-validate with is_constant_printable before calling
Prevention
- Never pass module/dynamic-import primitives into constant argument printing
- Route @module dependencies through the dedicated dependency printer
- Add a compile-time/debug assertion upstream when constructing Primitive values
When it happens
Trigger: Calling write_argument_value or write_constant_value with a Primitive::DynamicImport node — i.e. a schema/resolver value that resolved to a dynamic import reaching the constant-printing path.
Common situations: A Relay resolver or module dependency (@module) incorrectly typed/positioned so a dynamic import is treated as a literal constant during codegen; usually a compiler bug or malformed resolver definition.
Related errors
- Unexpected RelayResolver
- Expected to have a reader operation for `{normal_name}`
- Expected at least one of an @updatable reader AST, or normal
- Expected to have a typegen operation for `{normal_name}`
- Expected a key
AI-assisted analysis of facebook/relay@668b1b85e0 (2026-09-02).
Data as JSON: /api/errors/c8e22d09387a32eb.
Report an issue: GitHub.