diff --git a/turbopack/crates/turbopack-core/src/reference_type.rs b/turbopack/crates/turbopack-core/src/reference_type.rs index 8e9751fd6a3f..dd5fe4e5e53e 100644 --- a/turbopack/crates/turbopack-core/src/reference_type.rs +++ b/turbopack/crates/turbopack-core/src/reference_type.rs @@ -28,9 +28,10 @@ impl InnerAssets { // behavior. #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Default, Clone, Hash)] pub enum CommonJsReferenceSubType { Custom(u8), + #[default] Undefined, } @@ -170,7 +171,7 @@ impl ImportContext { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Default, Clone, Hash)] pub enum CssReferenceSubType { AtImport(Option>), /// Reference from ModuleCssAsset to an imported ModuleCssAsset for retrieving the composed @@ -181,15 +182,17 @@ pub enum CssReferenceSubType { /// Used for generating the list of classes in a ModuleCssAsset Analyze, Custom(u8), + #[default] Undefined, } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Default, Clone, Hash)] pub enum UrlReferenceSubType { EcmaScriptNewUrl, CssUrl, Custom(u8), + #[default] Undefined, } @@ -229,7 +232,7 @@ pub enum EntryReferenceSubType { } #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Default, Clone, Hash)] pub enum ReferenceType { CommonJs(CommonJsReferenceSubType), EcmaScriptModules(EcmaScriptModulesReferenceSubType), @@ -241,6 +244,7 @@ pub enum ReferenceType { Runtime, Internal(ResolvedVc), Custom(u8), + #[default] Undefined, } diff --git a/turbopack/crates/turbopack/src/lib.rs b/turbopack/crates/turbopack/src/lib.rs index e530e98f2c7a..022f3e15cdb2 100644 --- a/turbopack/crates/turbopack/src/lib.rs +++ b/turbopack/crates/turbopack/src/lib.rs @@ -799,6 +799,27 @@ impl AssetContext for ModuleAssetContext { let externals_context = externals_tracing_module_context(ty); let root_origin = tracing_root.join("_".into()); + // Normalize reference type, there is no such thing as a + // `ReferenceType::EcmaScriptModules(ImportPart(Evaluation))` + // for externals (and otherwise, this causes duplicate + // CachedExternalModules for both `ImportPart(Evaluation)` and + // `ImportPart(Export("CacheProvider"))`) + let reference_type = Value::new(match &*reference_type { + ReferenceType::EcmaScriptModules(_) => { + ReferenceType::EcmaScriptModules(Default::default()) + } + ReferenceType::CommonJs(_) => { + ReferenceType::CommonJs(Default::default()) + } + ReferenceType::Css(_) => { + ReferenceType::Css(Default::default()) + } + ReferenceType::Url(_) => { + ReferenceType::Url(Default::default()) + } + _ => ReferenceType::Undefined, + }); + let external_result = externals_context .resolve_asset( root_origin, @@ -822,6 +843,7 @@ impl AssetContext for ModuleAssetContext { ); modules + .into_iter() .map(|s| { Vc::upcast::>( TracedModuleReference::new(s),