Skip to content

Commit

Permalink
refactor ResolveResult to allow mixing special and assets in alternat…
Browse files Browse the repository at this point in the history
…ives (vercel/turborepo#3675)

Co-authored-by: Justin Ridgewell <justin@ridgewell.name>
  • Loading branch information
sokra and jridgewell committed Feb 7, 2023
1 parent f65d709 commit f83691f
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ impl ValueToString for WithChunksAssetReference {
impl AssetReference for WithChunksAssetReference {
#[turbo_tasks::function]
fn resolve_reference(&self) -> ResolveResultVc {
ResolveResult::Single(self.asset, Vec::new()).cell()
ResolveResult::asset(self.asset).cell()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ impl ValueToString for WithClientChunksAssetReference {
impl AssetReference for WithClientChunksAssetReference {
#[turbo_tasks::function]
fn resolve_reference(&self) -> ResolveResultVc {
ResolveResult::Single(self.asset, Vec::new()).cell()
ResolveResult::asset(self.asset).cell()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ impl ImportMappingReplacement for NextFontGoogleReplacer {
.into(),
);

Ok(ImportMapResult::Result(ResolveResult::Single(js_asset.into(), vec![]).into()).into())
Ok(ImportMapResult::Result(ResolveResult::asset(js_asset.into()).into()).into())
}
}

Expand Down Expand Up @@ -227,7 +227,7 @@ impl ImportMappingReplacement for NextFontGoogleCssModuleReplacer {
.into(),
);

Ok(ImportMapResult::Result(ResolveResult::Single(css_asset.into(), vec![]).into()).into())
Ok(ImportMapResult::Result(ResolveResult::asset(css_asset.into()).into()).into())
}
}

Expand Down
4 changes: 2 additions & 2 deletions packages/next-swc/crates/next-core/src/next_server/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use turbopack_core::resolve::{
find_context_file, package_json,
parse::RequestVc,
plugin::{ResolvePlugin, ResolvePluginConditionVc, ResolvePluginVc},
FindContextFileResult, ResolveResult, ResolveResultOptionVc, SpecialType,
FindContextFileResult, PrimaryResolveResult, ResolveResult, ResolveResultOptionVc,
};

#[turbo_tasks::value]
Expand Down Expand Up @@ -91,7 +91,7 @@ impl ResolvePlugin for ExternalCjsModulesResolvePlugin {

// mark as external
Ok(ResolveResultOptionVc::some(
ResolveResult::Special(SpecialType::OriginalReferenceExternal, Vec::new()).cell(),
ResolveResult::primary(PrimaryResolveResult::OriginalReferenceExternal).cell(),
))
}
}
Expand Down
40 changes: 15 additions & 25 deletions packages/next-swc/crates/next-core/src/react_refresh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use turbopack::{
};
use turbopack_core::{
issue::{Issue, IssueSeverity, IssueSeverityVc, IssueVc},
resolve::{origin::ResolveOriginVc, parse::RequestVc, ResolveResult},
resolve::{origin::ResolveOriginVc, parse::RequestVc},
};

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

match &*result.await? {
ResolveResult::Single(_, _) | ResolveResult::Alternatives(_, _) => {
return Ok(AssertReactRefreshResult::Found(request).cell())
}
_ => {}
if result.await?.is_some() {
return Ok(AssertReactRefreshResult::Found(request).cell());
}
}
ReactRefreshResolvingIssue {
Expand All @@ -82,26 +79,19 @@ pub async fn assert_can_resolve_react_refresh(
/// Resolves the React Refresh runtime module from the given [AssetContextVc].
#[turbo_tasks::function]
pub async fn resolve_react_refresh(origin: ResolveOriginVc) -> Result<EcmascriptChunkPlaceableVc> {
match &*cjs_resolve(origin, react_refresh_request()).await? {
ResolveResult::Single(asset, _) => {
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
Ok(placeable)
} else {
Err(anyhow!("React Refresh runtime asset is not placeable"))
}
if let Some(asset) = *cjs_resolve(origin, react_refresh_request())
.first_asset()
.await?
{
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
Ok(placeable)
} else {
Err(anyhow!("React Refresh runtime asset is not placeable"))
}
ResolveResult::Alternatives(assets, _) if !assets.is_empty() => {
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(assets[0]).await? {
Ok(placeable)
} else {
Err(anyhow!("React Refresh runtime asset is not placeable"))
}
}
// The react-refresh-runtime module is not installed.
ResolveResult::Unresolveable(_) => Err(anyhow!(
} else {
Err(anyhow!(
"could not resolve the `@next/react-refresh-utils/dist/runtime` module"
)),
_ => Err(anyhow!("invalid React Refresh runtime asset")),
))
}
}

Expand Down
30 changes: 9 additions & 21 deletions packages/next-swc/crates/next-core/src/runtime.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use anyhow::{anyhow, Result};
use anyhow::{bail, Result};
use turbopack::ecmascript::{chunk::EcmascriptChunkPlaceableVc, resolve::cjs_resolve};
use turbopack_core::resolve::{origin::ResolveOriginVc, parse::RequestVc, ResolveResult};
use turbopack_core::resolve::{origin::ResolveOriginVc, parse::RequestVc};

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

match &*cjs_resolve(origin, request).await? {
ResolveResult::Single(asset, _) => {
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
Ok(placeable)
} else {
Err(anyhow!("turbopack runtime asset is not placeable"))
}
}
ResolveResult::Alternatives(assets, _) if !assets.is_empty() => {
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(assets[0]).await? {
Ok(placeable)
} else {
Err(anyhow!("turbopack runtime asset is not placeable"))
}
if let Some(asset) = *cjs_resolve(origin, request).first_asset().await? {
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
Ok(placeable)
} else {
bail!("turbopack runtime asset is not placeable")
}
} else {
// The @vercel/turbopack-runtime module is not installed.
ResolveResult::Unresolveable(_) => Err(anyhow!(
"could not resolve the `{}` module",
runtime_request_path
)),
_ => Err(anyhow!("invalid turbopack runtime asset")),
bail!("could not resolve the `{}` module", runtime_request_path)
}
}

0 comments on commit f83691f

Please sign in to comment.