diff --git a/crates/next-core/src/next_font/local/mod.rs b/crates/next-core/src/next_font/local/mod.rs index 6743f93ae3f473..531c07ba50d7ba 100644 --- a/crates/next-core/src/next_font/local/mod.rs +++ b/crates/next-core/src/next_font/local/mod.rs @@ -15,7 +15,9 @@ use turbopack_core::{ resolve::{ ResolveResult, ResolveResultItem, ResolveResultOption, parse::Request, - plugin::{BeforeResolvePlugin, BeforeResolvePluginCondition}, + plugin::{ + BeforeResolvePlugin, BeforeResolvePluginCondition, OptionBeforeResolvePluginCondition, + }, }, virtual_source::VirtualSource, }; @@ -64,11 +66,14 @@ impl NextFontLocalResolvePlugin { #[turbo_tasks::value_impl] impl BeforeResolvePlugin for NextFontLocalResolvePlugin { #[turbo_tasks::function] - fn before_resolve_condition(&self) -> Vc { - BeforeResolvePluginCondition::from_request_glob(Glob::new( - rcstr!("{next,@vercel/turbopack-next/internal}/font/local/*"), - GlobOptions::default(), - )) + fn before_resolve_condition(&self) -> Vc { + OptionBeforeResolvePluginCondition::some( + BeforeResolvePluginCondition::from_request_glob(Glob::new( + rcstr!("{next,@vercel/turbopack-next/internal}/font/local/*"), + GlobOptions::default(), + )) + .to_resolved(), + ) } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_server/resolve.rs b/crates/next-core/src/next_server/resolve.rs index af9b3ee7ca6806..b56245e0eaa4db 100644 --- a/crates/next-core/src/next_server/resolve.rs +++ b/crates/next-core/src/next_server/resolve.rs @@ -17,7 +17,9 @@ use turbopack_core::{ package_json, parse::Request, pattern::Pattern, - plugin::{AfterResolvePlugin, AfterResolvePluginCondition}, + plugin::{ + AfterResolvePlugin, AfterResolvePluginCondition, OptionAfterResolvePluginCondition, + }, resolve, }, source::Source, @@ -64,17 +66,20 @@ impl ExternalCjsModulesResolvePlugin { } #[turbo_tasks::function] -fn condition(root: FileSystemPath) -> Vc { - AfterResolvePluginCondition::new( - root, - Glob::new(rcstr!("**/node_modules/**"), GlobOptions::default()), +fn condition(root: FileSystemPath) -> Vc { + OptionAfterResolvePluginCondition::some( + AfterResolvePluginCondition::new( + root, + Glob::new(rcstr!("**/node_modules/**"), GlobOptions::default()), + ) + .to_resolved(), ) } #[turbo_tasks::value_impl] impl AfterResolvePlugin for ExternalCjsModulesResolvePlugin { #[turbo_tasks::function] - fn after_resolve_condition(&self) -> Vc { + fn after_resolve_condition(&self) -> Vc { condition(self.root.clone()) } diff --git a/crates/next-core/src/next_shared/resolve.rs b/crates/next-core/src/next_shared/resolve.rs index cbc0c75fda6270..6917421181ba94 100644 --- a/crates/next-core/src/next_shared/resolve.rs +++ b/crates/next-core/src/next_shared/resolve.rs @@ -19,7 +19,8 @@ use turbopack_core::{ pattern::Pattern, plugin::{ AfterResolvePlugin, AfterResolvePluginCondition, BeforeResolvePlugin, - BeforeResolvePluginCondition, + BeforeResolvePluginCondition, OptionAfterResolvePluginCondition, + OptionBeforeResolvePluginCondition, }, }, }; @@ -128,8 +129,11 @@ impl InvalidImportResolvePlugin { #[turbo_tasks::value_impl] impl BeforeResolvePlugin for InvalidImportResolvePlugin { #[turbo_tasks::function] - fn before_resolve_condition(&self) -> Vc { - BeforeResolvePluginCondition::from_modules(Vc::cell(vec![self.invalid_import.clone()])) + fn before_resolve_condition(&self) -> Vc { + OptionBeforeResolvePluginCondition::some( + BeforeResolvePluginCondition::from_modules(Vc::cell(vec![self.invalid_import.clone()])) + .to_resolved(), + ) } #[turbo_tasks::function] @@ -223,13 +227,16 @@ impl NextExternalResolvePlugin { #[turbo_tasks::value_impl] impl AfterResolvePlugin for NextExternalResolvePlugin { #[turbo_tasks::function] - async fn after_resolve_condition(&self) -> Result> { - Ok(AfterResolvePluginCondition::new( - self.project_path.root().owned().await?, - Glob::new( - rcstr!("**/next/dist/**/*.{external,runtime.dev,runtime.prod}.js"), - GlobOptions::default(), - ), + async fn after_resolve_condition(&self) -> Result> { + Ok(OptionAfterResolvePluginCondition::some( + AfterResolvePluginCondition::new( + self.project_path.root().owned().await?, + Glob::new( + rcstr!("**/next/dist/**/*.{external,runtime.dev,runtime.prod}.js"), + GlobOptions::default(), + ), + ) + .to_resolved(), )) } @@ -281,13 +288,16 @@ impl NextNodeSharedRuntimeResolvePlugin { #[turbo_tasks::value_impl] impl AfterResolvePlugin for NextNodeSharedRuntimeResolvePlugin { #[turbo_tasks::function] - async fn after_resolve_condition(&self) -> Result> { - Ok(AfterResolvePluginCondition::new( - self.root.root().owned().await?, - Glob::new( - rcstr!("**/next/dist/**/*.shared-runtime.js"), - GlobOptions::default(), - ), + async fn after_resolve_condition(&self) -> Result> { + Ok(OptionAfterResolvePluginCondition::some( + AfterResolvePluginCondition::new( + self.root.root().owned().await?, + Glob::new( + rcstr!("**/next/dist/**/*.shared-runtime.js"), + GlobOptions::default(), + ), + ) + .to_resolved(), )) } @@ -352,13 +362,16 @@ impl ModuleFeatureReportResolvePlugin { #[turbo_tasks::value_impl] impl BeforeResolvePlugin for ModuleFeatureReportResolvePlugin { #[turbo_tasks::function] - fn before_resolve_condition(&self) -> Vc { - BeforeResolvePluginCondition::from_modules(Vc::cell( - FEATURE_MODULES - .keys() - .map(|k| (*k).into()) - .collect::>(), - )) + fn before_resolve_condition(&self) -> Vc { + OptionBeforeResolvePluginCondition::some( + BeforeResolvePluginCondition::from_modules(Vc::cell( + FEATURE_MODULES + .keys() + .map(|k| (*k).into()) + .collect::>(), + )) + .to_resolved(), + ) } #[turbo_tasks::function] @@ -409,13 +422,16 @@ impl NextSharedRuntimeResolvePlugin { #[turbo_tasks::value_impl] impl AfterResolvePlugin for NextSharedRuntimeResolvePlugin { #[turbo_tasks::function] - async fn after_resolve_condition(&self) -> Result> { - Ok(AfterResolvePluginCondition::new( - self.root.root().owned().await?, - Glob::new( - rcstr!("**/next/dist/esm/**/*.shared-runtime.js"), - GlobOptions::default(), - ), + async fn after_resolve_condition(&self) -> Result> { + Ok(OptionAfterResolvePluginCondition::some( + AfterResolvePluginCondition::new( + self.root.root().owned().await?, + Glob::new( + rcstr!("**/next/dist/esm/**/*.shared-runtime.js"), + GlobOptions::default(), + ), + ) + .to_resolved(), )) } diff --git a/turbopack/crates/turbopack-core/src/resolve/mod.rs b/turbopack/crates/turbopack-core/src/resolve/mod.rs index 3ee8c7a38eb760..99afb11276c323 100644 --- a/turbopack/crates/turbopack-core/src/resolve/mod.rs +++ b/turbopack/crates/turbopack-core/src/resolve/mod.rs @@ -1685,9 +1685,12 @@ async fn handle_before_resolve_plugins( options: Vc, ) -> Result>> { for plugin in &options.await?.before_resolve_plugins { - let condition = plugin.before_resolve_condition().resolve().await?; - if !*condition.matches(request).await? { - continue; + let condition_option = plugin.before_resolve_condition().await?; + if let Some(condition) = *condition_option { + let condition = condition.resolve().await?; + if !*condition.matches(request).await? { + continue; + } } if let Some(result) = *plugin @@ -1716,17 +1719,31 @@ async fn handle_after_resolve_plugins( options: Vc, ) -> Result>> { for plugin in &options.await?.after_resolve_plugins { - let after_resolve_condition = plugin.after_resolve_condition().resolve().await?; - if *after_resolve_condition.matches(path.clone()).await? - && let Some(result) = *plugin - .after_resolve( - path.clone(), - lookup_path.clone(), - reference_type.clone(), - request, - ) - .await? + let after_resolve_condition_option = plugin.after_resolve_condition().await?; + if let Some(after_resolve_condition) = *after_resolve_condition_option { + let after_resolve_condition = after_resolve_condition.resolve().await?; + if *after_resolve_condition.matches(path.clone()).await? + && let Some(result) = *plugin + .after_resolve( + path.clone(), + lookup_path.clone(), + reference_type.clone(), + request, + ) + .await? + { + return Ok(Some(*result)); + } + } else if let Some(result) = *plugin + .after_resolve( + path.clone(), + lookup_path.clone(), + reference_type.clone(), + request, + ) + .await? { + // If there is no condition, the plugin applies to all paths. return Ok(Some(*result)); } } diff --git a/turbopack/crates/turbopack-core/src/resolve/plugin.rs b/turbopack/crates/turbopack-core/src/resolve/plugin.rs index 66d0c7a614927a..08e9723591a5b2 100644 --- a/turbopack/crates/turbopack-core/src/resolve/plugin.rs +++ b/turbopack/crates/turbopack-core/src/resolve/plugin.rs @@ -40,6 +40,22 @@ impl AfterResolvePluginCondition { } } +#[turbo_tasks::value(transparent)] +pub struct OptionAfterResolvePluginCondition(Option>); + +#[turbo_tasks::value_impl] +impl OptionAfterResolvePluginCondition { + #[turbo_tasks::function] + pub fn none() -> Vc { + Vc::cell(None) + } + + #[turbo_tasks::function] + pub fn some(condition: ResolvedVc) -> Vc { + Vc::cell(Some(condition)) + } +} + /// A condition which determines if the hooks of a resolve plugin gets called. #[turbo_tasks::value] pub enum BeforeResolvePluginCondition { @@ -80,10 +96,26 @@ impl BeforeResolvePluginCondition { } } +#[turbo_tasks::value(transparent)] +pub struct OptionBeforeResolvePluginCondition(Option>); + +#[turbo_tasks::value_impl] +impl OptionBeforeResolvePluginCondition { + #[turbo_tasks::function] + pub fn none() -> Vc { + Vc::cell(None) + } + + #[turbo_tasks::function] + pub fn some(condition: ResolvedVc) -> Vc { + Vc::cell(Some(condition)) + } +} + #[turbo_tasks::value_trait] pub trait BeforeResolvePlugin { #[turbo_tasks::function] - fn before_resolve_condition(self: Vc) -> Vc; + fn before_resolve_condition(self: Vc) -> Vc; #[turbo_tasks::function] fn before_resolve( @@ -98,7 +130,7 @@ pub trait BeforeResolvePlugin { pub trait AfterResolvePlugin { /// A condition which determines if the hooks gets called. #[turbo_tasks::function] - fn after_resolve_condition(self: Vc) -> Vc; + fn after_resolve_condition(self: Vc) -> Vc; /// This hook gets called when a full filepath has been resolved and the /// condition matches. If a value is returned it replaces the resolve