Skip to content

Commit ab45970

Browse files
sokrajridgewell
andauthored
refactor ResolveResult to allow mixing special and assets in alternatives (vercel/turborepo#3675)
Co-authored-by: Justin Ridgewell <[email protected]>
1 parent 49505e9 commit ab45970

File tree

29 files changed

+401
-408
lines changed

29 files changed

+401
-408
lines changed

crates/next-core/src/next_client_chunks/with_chunks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ impl ValueToString for WithChunksAssetReference {
180180
impl AssetReference for WithChunksAssetReference {
181181
#[turbo_tasks::function]
182182
fn resolve_reference(&self) -> ResolveResultVc {
183-
ResolveResult::Single(self.asset, Vec::new()).cell()
183+
ResolveResult::asset(self.asset).cell()
184184
}
185185
}
186186

crates/next-core/src/next_client_component/with_client_chunks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ impl ValueToString for WithClientChunksAssetReference {
189189
impl AssetReference for WithClientChunksAssetReference {
190190
#[turbo_tasks::function]
191191
fn resolve_reference(&self) -> ResolveResultVc {
192-
ResolveResult::Single(self.asset, Vec::new()).cell()
192+
ResolveResult::asset(self.asset).cell()
193193
}
194194
}
195195

crates/next-core/src/next_font_google/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ impl ImportMappingReplacement for NextFontGoogleReplacer {
110110
.into(),
111111
);
112112

113-
Ok(ImportMapResult::Result(ResolveResult::Single(js_asset.into(), vec![]).into()).into())
113+
Ok(ImportMapResult::Result(ResolveResult::asset(js_asset.into()).into()).into())
114114
}
115115
}
116116

@@ -227,7 +227,7 @@ impl ImportMappingReplacement for NextFontGoogleCssModuleReplacer {
227227
.into(),
228228
);
229229

230-
Ok(ImportMapResult::Result(ResolveResult::Single(css_asset.into(), vec![]).into()).into())
230+
Ok(ImportMapResult::Result(ResolveResult::asset(css_asset.into()).into()).into())
231231
}
232232
}
233233

crates/next-core/src/next_server/resolve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use turbopack_core::resolve::{
55
find_context_file, package_json,
66
parse::RequestVc,
77
plugin::{ResolvePlugin, ResolvePluginConditionVc, ResolvePluginVc},
8-
FindContextFileResult, ResolveResult, ResolveResultOptionVc, SpecialType,
8+
FindContextFileResult, PrimaryResolveResult, ResolveResult, ResolveResultOptionVc,
99
};
1010

1111
#[turbo_tasks::value]
@@ -91,7 +91,7 @@ impl ResolvePlugin for ExternalCjsModulesResolvePlugin {
9191

9292
// mark as external
9393
Ok(ResolveResultOptionVc::some(
94-
ResolveResult::Special(SpecialType::OriginalReferenceExternal, Vec::new()).cell(),
94+
ResolveResult::primary(PrimaryResolveResult::OriginalReferenceExternal).cell(),
9595
))
9696
}
9797
}

crates/next-core/src/react_refresh.rs

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use turbopack::{
1010
};
1111
use turbopack_core::{
1212
issue::{Issue, IssueSeverity, IssueSeverityVc, IssueVc},
13-
resolve::{origin::ResolveOriginVc, parse::RequestVc, ResolveResult},
13+
resolve::{origin::ResolveOriginVc, parse::RequestVc},
1414
};
1515

1616
#[turbo_tasks::function]
@@ -57,13 +57,10 @@ pub async fn assert_can_resolve_react_refresh(
5757
let resolve_options =
5858
apply_cjs_specific_options(turbopack::resolve_options(path, resolve_options_context));
5959
for request in [react_refresh_request_in_next(), react_refresh_request()] {
60-
let result = turbopack_core::resolve::resolve(path, request, resolve_options);
60+
let result = turbopack_core::resolve::resolve(path, request, resolve_options).first_asset();
6161

62-
match &*result.await? {
63-
ResolveResult::Single(_, _) | ResolveResult::Alternatives(_, _) => {
64-
return Ok(AssertReactRefreshResult::Found(request).cell())
65-
}
66-
_ => {}
62+
if result.await?.is_some() {
63+
return Ok(AssertReactRefreshResult::Found(request).cell());
6764
}
6865
}
6966
ReactRefreshResolvingIssue {
@@ -82,26 +79,19 @@ pub async fn assert_can_resolve_react_refresh(
8279
/// Resolves the React Refresh runtime module from the given [AssetContextVc].
8380
#[turbo_tasks::function]
8481
pub async fn resolve_react_refresh(origin: ResolveOriginVc) -> Result<EcmascriptChunkPlaceableVc> {
85-
match &*cjs_resolve(origin, react_refresh_request()).await? {
86-
ResolveResult::Single(asset, _) => {
87-
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
88-
Ok(placeable)
89-
} else {
90-
Err(anyhow!("React Refresh runtime asset is not placeable"))
91-
}
82+
if let Some(asset) = *cjs_resolve(origin, react_refresh_request())
83+
.first_asset()
84+
.await?
85+
{
86+
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
87+
Ok(placeable)
88+
} else {
89+
Err(anyhow!("React Refresh runtime asset is not placeable"))
9290
}
93-
ResolveResult::Alternatives(assets, _) if !assets.is_empty() => {
94-
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(assets[0]).await? {
95-
Ok(placeable)
96-
} else {
97-
Err(anyhow!("React Refresh runtime asset is not placeable"))
98-
}
99-
}
100-
// The react-refresh-runtime module is not installed.
101-
ResolveResult::Unresolveable(_) => Err(anyhow!(
91+
} else {
92+
Err(anyhow!(
10293
"could not resolve the `@next/react-refresh-utils/dist/runtime` module"
103-
)),
104-
_ => Err(anyhow!("invalid React Refresh runtime asset")),
94+
))
10595
}
10696
}
10797

crates/next-core/src/runtime.rs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use anyhow::{anyhow, Result};
1+
use anyhow::{bail, Result};
22
use turbopack::ecmascript::{chunk::EcmascriptChunkPlaceableVc, resolve::cjs_resolve};
3-
use turbopack_core::resolve::{origin::ResolveOriginVc, parse::RequestVc, ResolveResult};
3+
use turbopack_core::resolve::{origin::ResolveOriginVc, parse::RequestVc};
44

55
/// Resolves the turbopack runtime module from the given [AssetContextVc].
66
#[turbo_tasks::function]
@@ -11,26 +11,14 @@ pub async fn resolve_runtime_request(
1111
let runtime_request_path = format!("@vercel/turbopack-next/{}", path);
1212
let request = RequestVc::parse_string(runtime_request_path.clone());
1313

14-
match &*cjs_resolve(origin, request).await? {
15-
ResolveResult::Single(asset, _) => {
16-
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
17-
Ok(placeable)
18-
} else {
19-
Err(anyhow!("turbopack runtime asset is not placeable"))
20-
}
21-
}
22-
ResolveResult::Alternatives(assets, _) if !assets.is_empty() => {
23-
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(assets[0]).await? {
24-
Ok(placeable)
25-
} else {
26-
Err(anyhow!("turbopack runtime asset is not placeable"))
27-
}
14+
if let Some(asset) = *cjs_resolve(origin, request).first_asset().await? {
15+
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
16+
Ok(placeable)
17+
} else {
18+
bail!("turbopack runtime asset is not placeable")
2819
}
20+
} else {
2921
// The @vercel/turbopack-runtime module is not installed.
30-
ResolveResult::Unresolveable(_) => Err(anyhow!(
31-
"could not resolve the `{}` module",
32-
runtime_request_path
33-
)),
34-
_ => Err(anyhow!("invalid turbopack runtime asset")),
22+
bail!("could not resolve the `{}` module", runtime_request_path)
3523
}
3624
}

crates/turbopack-core/src/chunk/mod.rs

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::{
2323
asset::{Asset, AssetVc, AssetsVc},
2424
environment::EnvironmentVc,
2525
reference::{AssetReference, AssetReferenceVc, AssetReferencesVc},
26-
resolve::{ResolveResult, ResolveResultVc},
26+
resolve::{PrimaryResolveResult, ResolveResult, ResolveResultVc},
2727
};
2828

2929
/// A module id, which can be a number or string
@@ -132,10 +132,16 @@ impl ChunkGroupVc {
132132
if *pc.is_loaded_in_parallel().await? {
133133
result = r
134134
.resolve_reference()
135-
.primary_assets()
136135
.await?
136+
.primary
137137
.iter()
138-
.map(|r| async move { Ok(ChunkVc::resolve_from(r).await?) })
138+
.map(|r| async move {
139+
Ok(if let PrimaryResolveResult::Asset(a) = r {
140+
ChunkVc::resolve_from(a).await?
141+
} else {
142+
None
143+
})
144+
})
139145
.try_join()
140146
.await?;
141147
}
@@ -270,7 +276,7 @@ impl ChunkReferenceVc {
270276
impl AssetReference for ChunkReference {
271277
#[turbo_tasks::function]
272278
fn resolve_reference(&self) -> ResolveResultVc {
273-
ResolveResult::Single(self.chunk.into(), Vec::new()).into()
279+
ResolveResult::asset(self.chunk.into()).into()
274280
}
275281
}
276282

@@ -318,7 +324,7 @@ impl AssetReference for ChunkGroupReference {
318324
.iter()
319325
.map(|c| c.as_asset())
320326
.collect();
321-
Ok(ResolveResult::Alternatives(set, Vec::new()).into())
327+
Ok(ResolveResult::assets(set).into())
322328
}
323329
}
324330

@@ -369,8 +375,8 @@ pub async fn chunk_content<I: FromChunkableAsset>(
369375

370376
enum ChunkContentWorkItem {
371377
AssetReferences(AssetReferencesVc),
372-
Assets {
373-
assets: AssetsVc,
378+
ResolveResult {
379+
result: ResolveResultVc,
374380
reference: AssetReferenceVc,
375381
chunking_type: ChunkingType,
376382
},
@@ -413,8 +419,8 @@ async fn chunk_content_internal<I: FromChunkableAsset>(
413419
for r in item.await?.iter() {
414420
if let Some(pc) = ChunkableAssetReferenceVc::resolve_from(r).await? {
415421
if let Some(chunking_type) = *pc.chunking_type(context).await? {
416-
queue.push_back(ChunkContentWorkItem::Assets {
417-
assets: r.resolve_reference().primary_assets(),
422+
queue.push_back(ChunkContentWorkItem::ResolveResult {
423+
result: r.resolve_reference(),
418424
reference: *r,
419425
chunking_type,
420426
});
@@ -424,8 +430,8 @@ async fn chunk_content_internal<I: FromChunkableAsset>(
424430
external_asset_references.push(*r);
425431
}
426432
}
427-
ChunkContentWorkItem::Assets {
428-
assets,
433+
ChunkContentWorkItem::ResolveResult {
434+
result,
429435
reference,
430436
chunking_type,
431437
} => {
@@ -444,13 +450,16 @@ async fn chunk_content_internal<I: FromChunkableAsset>(
444450
// not loaded in parallel
445451
let mut inner_chunk_groups = Vec::new();
446452

447-
for asset in assets
448-
.await?
449-
.iter()
450-
.filter(|asset| processed_assets.insert((chunking_type, **asset)))
451-
{
452-
let asset: &AssetVc = asset;
453-
453+
let result = result.await?;
454+
let assets = result.primary.iter().filter_map(|result| {
455+
if let PrimaryResolveResult::Asset(asset) = *result {
456+
if processed_assets.insert((chunking_type, asset)) {
457+
return Some(asset);
458+
}
459+
}
460+
None
461+
});
462+
for asset in assets {
454463
let chunkable_asset = match ChunkableAssetVc::resolve_from(asset).await? {
455464
Some(chunkable_asset) => chunkable_asset,
456465
_ => {
@@ -461,7 +470,7 @@ async fn chunk_content_internal<I: FromChunkableAsset>(
461470

462471
match chunking_type {
463472
ChunkingType::Placed => {
464-
if let Some(chunk_item) = I::from_asset(context, *asset).await? {
473+
if let Some(chunk_item) = I::from_asset(context, asset).await? {
465474
inner_chunk_items.push(chunk_item);
466475
} else {
467476
return Err(anyhow!(
@@ -477,9 +486,9 @@ async fn chunk_content_internal<I: FromChunkableAsset>(
477486
}
478487
ChunkingType::PlacedOrParallel => {
479488
// heuristic for being in the same chunk
480-
if !split && *context.can_be_in_same_chunk(entry, *asset).await? {
489+
if !split && *context.can_be_in_same_chunk(entry, asset).await? {
481490
// chunk item, chunk or other asset?
482-
if let Some(chunk_item) = I::from_asset(context, *asset).await? {
491+
if let Some(chunk_item) = I::from_asset(context, asset).await? {
483492
inner_chunk_items.push(chunk_item);
484493
continue;
485494
}

crates/turbopack-core/src/introspect/asset.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use super::{Introspectable, IntrospectableChildrenVc, IntrospectableVc};
88
use crate::{
99
asset::{Asset, AssetContent, AssetContentVc, AssetVc},
1010
reference::{AssetReference, AssetReferencesVc},
11+
resolve::PrimaryResolveResult,
1112
};
1213

1314
#[turbo_tasks::value]
@@ -83,8 +84,10 @@ pub async fn children_from_asset_references(
8384
let mut children = HashSet::new();
8485
let references = references.await?;
8586
for reference in &*references {
86-
for asset in &*reference.resolve_reference().primary_assets().await? {
87-
children.insert((key, IntrospectableAssetVc::new(*asset)));
87+
for result in reference.resolve_reference().await?.primary.iter() {
88+
if let PrimaryResolveResult::Asset(asset) = result {
89+
children.insert((key, IntrospectableAssetVc::new(*asset)));
90+
}
8891
}
8992
}
9093
Ok(IntrospectableChildrenVc::cell(children))

crates/turbopack-core/src/reference/mod.rs

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use turbo_tasks::{primitives::StringVc, ValueToString, ValueToStringVc};
66
use crate::{
77
asset::{Asset, AssetVc, AssetsVc},
88
issue::IssueVc,
9-
resolve::{ResolveResult, ResolveResultVc},
9+
resolve::{PrimaryResolveResult, ResolveResult, ResolveResultVc},
1010
};
1111
pub mod source_map;
1212

13-
pub use source_map::SourceMapVc;
13+
pub use source_map::SourceMapReferenceVc;
1414

1515
/// A reference to one or multiple [Asset]s or other special things.
1616
/// There are a bunch of optional traits that can influence how these references
@@ -57,7 +57,7 @@ impl SingleAssetReference {
5757
impl AssetReference for SingleAssetReference {
5858
#[turbo_tasks::function]
5959
fn resolve_reference(&self) -> ResolveResultVc {
60-
ResolveResult::Single(self.asset, vec![]).cell()
60+
ResolveResult::asset(self.asset).cell()
6161
}
6262
}
6363

@@ -101,31 +101,18 @@ pub async fn all_referenced_assets(asset: AssetVc) -> Result<AssetsVc> {
101101
// while let Some(result) = race_pop(&mut queue).await {
102102
// match &*result? {
103103
while let Some(resolve_result) = queue.pop_front() {
104-
match &*resolve_result.await? {
105-
ResolveResult::Single(module, references) => {
106-
assets.push(*module);
107-
for reference in references {
108-
queue.push_back(reference.resolve_reference());
109-
}
110-
}
111-
ResolveResult::Alternatives(modules, references) => {
112-
assets.extend(modules);
113-
for reference in references {
114-
queue.push_back(reference.resolve_reference());
115-
}
116-
}
117-
ResolveResult::Special(_, references) => {
118-
for reference in references {
119-
queue.push_back(reference.resolve_reference());
120-
}
121-
}
122-
ResolveResult::Keyed(_, _) => todo!(),
123-
ResolveResult::Unresolveable(references) => {
124-
for reference in references {
125-
queue.push_back(reference.resolve_reference());
126-
}
104+
let ResolveResult {
105+
primary,
106+
references,
107+
} = &*resolve_result.await?;
108+
for result in primary {
109+
if let PrimaryResolveResult::Asset(asset) = *result {
110+
assets.push(asset);
127111
}
128112
}
113+
for reference in references {
114+
queue.push_back(reference.resolve_reference());
115+
}
129116
}
130117
Ok(AssetsVc::cell(assets))
131118
}

0 commit comments

Comments
 (0)