Skip to content

Commit 3b020d4

Browse files
authored
Turbopack: normalize ref type for external tracing (#78226)
Fixes duplicate `CachedExternalModule`s, due to different result depending on the reference type: As opposed to adding the whole reference type to the external's `AssetIdent`, normalize the reference type, tracing an external with `EcmaScriptModules(ImportPart(Evaluation))` (which returns nothing for side-effect-free packages) is strange anyway. ``` request: "@emotion/react" reference_type: EcmaScriptModules(ImportPart(Evaluation)) tracing_resolve_result: [] tracing_resolve_affecting: ["[project]/node_modules/.pnpm/@emotion+react@11.11.1_@types+react@19.1.1_react@19.2.0-canary-1d6c8168-20250411/node_modules/@emotion/react/package.json", "[project]/node_modules/@emotion/react"] ``` ``` request: "@emotion/react" reference_type: EcmaScriptModules(ImportPart(Export("CacheProvider"))) tracing_resolve_result: ["[project]/node_modules/.pnpm/@emotion+react@11.11.1_@types+react@19.1.1_react@19.2.0-canary-1d6c8168-20250411/node_modules/@emotion/react/dist/emotion-react.cjs.mjs [externals-tracing] (ecmascript)"] tracing_resolve_affecting: ["[project]/node_modules/.pnpm/@emotion+react@11.11.1_@types+react@19.1.1_react@19.2.0-canary-1d6c8168-20250411/node_modules/@emotion/react/package.json", "[project]/node_modules/@emotion/react"] ```
1 parent 511a776 commit 3b020d4

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

turbopack/crates/turbopack-core/src/reference_type.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ impl InnerAssets {
2828
// behavior.
2929

3030
#[turbo_tasks::value(serialization = "auto_for_input")]
31-
#[derive(Debug, Clone, Hash)]
31+
#[derive(Debug, Default, Clone, Hash)]
3232
pub enum CommonJsReferenceSubType {
3333
Custom(u8),
34+
#[default]
3435
Undefined,
3536
}
3637

@@ -170,7 +171,7 @@ impl ImportContext {
170171
}
171172

172173
#[turbo_tasks::value(serialization = "auto_for_input")]
173-
#[derive(Debug, Clone, Hash)]
174+
#[derive(Debug, Default, Clone, Hash)]
174175
pub enum CssReferenceSubType {
175176
AtImport(Option<ResolvedVc<ImportContext>>),
176177
/// Reference from ModuleCssAsset to an imported ModuleCssAsset for retrieving the composed
@@ -181,15 +182,17 @@ pub enum CssReferenceSubType {
181182
/// Used for generating the list of classes in a ModuleCssAsset
182183
Analyze,
183184
Custom(u8),
185+
#[default]
184186
Undefined,
185187
}
186188

187189
#[turbo_tasks::value(serialization = "auto_for_input")]
188-
#[derive(Debug, Clone, Hash)]
190+
#[derive(Debug, Default, Clone, Hash)]
189191
pub enum UrlReferenceSubType {
190192
EcmaScriptNewUrl,
191193
CssUrl,
192194
Custom(u8),
195+
#[default]
193196
Undefined,
194197
}
195198

@@ -229,7 +232,7 @@ pub enum EntryReferenceSubType {
229232
}
230233

231234
#[turbo_tasks::value(serialization = "auto_for_input")]
232-
#[derive(Debug, Clone, Hash)]
235+
#[derive(Debug, Default, Clone, Hash)]
233236
pub enum ReferenceType {
234237
CommonJs(CommonJsReferenceSubType),
235238
EcmaScriptModules(EcmaScriptModulesReferenceSubType),
@@ -241,6 +244,7 @@ pub enum ReferenceType {
241244
Runtime,
242245
Internal(ResolvedVc<InnerAssets>),
243246
Custom(u8),
247+
#[default]
244248
Undefined,
245249
}
246250

turbopack/crates/turbopack/src/lib.rs

+22
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,27 @@ impl AssetContext for ModuleAssetContext {
799799
let externals_context = externals_tracing_module_context(ty);
800800
let root_origin = tracing_root.join("_".into());
801801

802+
// Normalize reference type, there is no such thing as a
803+
// `ReferenceType::EcmaScriptModules(ImportPart(Evaluation))`
804+
// for externals (and otherwise, this causes duplicate
805+
// CachedExternalModules for both `ImportPart(Evaluation)` and
806+
// `ImportPart(Export("CacheProvider"))`)
807+
let reference_type = Value::new(match &*reference_type {
808+
ReferenceType::EcmaScriptModules(_) => {
809+
ReferenceType::EcmaScriptModules(Default::default())
810+
}
811+
ReferenceType::CommonJs(_) => {
812+
ReferenceType::CommonJs(Default::default())
813+
}
814+
ReferenceType::Css(_) => {
815+
ReferenceType::Css(Default::default())
816+
}
817+
ReferenceType::Url(_) => {
818+
ReferenceType::Url(Default::default())
819+
}
820+
_ => ReferenceType::Undefined,
821+
});
822+
802823
let external_result = externals_context
803824
.resolve_asset(
804825
root_origin,
@@ -822,6 +843,7 @@ impl AssetContext for ModuleAssetContext {
822843
);
823844

824845
modules
846+
.into_iter()
825847
.map(|s| {
826848
Vc::upcast::<Box<dyn ModuleReference>>(
827849
TracedModuleReference::new(s),

0 commit comments

Comments
 (0)