diff --git a/packages/next-swc/crates/next-core/src/next_build.rs b/packages/next-swc/crates/next-core/src/next_build.rs index 4524a5161a..eced1b27d9 100644 --- a/packages/next-swc/crates/next-core/src/next_build.rs +++ b/packages/next-swc/crates/next-core/src/next_build.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use turbo_tasks::primitives::StringVc; use turbo_tasks_fs::FileSystemPathVc; use turbopack_core::resolve::options::{ImportMapping, ImportMappingVc}; @@ -19,3 +20,17 @@ pub async fn get_postcss_package_mapping( ]) .cell()) } + +#[turbo_tasks::function] +pub async fn get_external_next_compiled_package_mapping( + package_name: StringVc, +) -> Result { + Ok( + ImportMapping::Alternatives(vec![ImportMapping::External(Some(format!( + "next/dist/compiled/{}", + &*package_name.await? + ))) + .into()]) + .cell(), + ) +} diff --git a/packages/next-swc/crates/next-core/src/next_client/context.rs b/packages/next-swc/crates/next-core/src/next_client/context.rs index 00ac32c9f3..4c2bded99a 100644 --- a/packages/next-swc/crates/next-core/src/next_client/context.rs +++ b/packages/next-swc/crates/next-core/src/next_client/context.rs @@ -2,13 +2,13 @@ use core::{default::Default, result::Result::Ok}; use std::collections::HashMap; use anyhow::Result; -use turbo_tasks::Value; +use turbo_tasks::{primitives::StringVc, Value}; use turbo_tasks_env::ProcessEnvVc; use turbo_tasks_fs::FileSystemPathVc; use turbopack::{ module_options::{ module_options_context::{ModuleOptionsContext, ModuleOptionsContextVc}, - PostCssTransformOptions, + PostCssTransformOptions, WebpackLoadersOptions, }, resolve_options_context::{ResolveOptionsContext, ResolveOptionsContextVc}, transition::TransitionsByNameVc, @@ -28,7 +28,7 @@ use super::transforms::get_next_client_transforms_rules; use crate::{ embed_js::attached_next_js_package_path, env::env_for_js, - next_build::get_postcss_package_mapping, + next_build::{get_external_next_compiled_package_mapping, get_postcss_package_mapping}, next_client::runtime_entry::{RuntimeEntriesVc, RuntimeEntry}, next_config::NextConfigVc, next_import_map::{ @@ -113,6 +113,16 @@ pub async fn get_client_module_options_context( .await? .is_found(); + let options = &*next_config.webpack_loaders_options().await?; + let enable_webpack_loaders = WebpackLoadersOptions { + extension_to_loaders: options.clone(), + loader_runner_package: Some(get_external_next_compiled_package_mapping(StringVc::cell( + "loader-runner".to_owned(), + ))), + placeholder_for_future_extensions: (), + } + .clone_if(); + let module_options_context = ModuleOptionsContext { preset_env_versions: Some(env), execution_context: Some(execution_context), @@ -131,7 +141,7 @@ pub async fn get_client_module_options_context( postcss_package: Some(get_postcss_package_mapping(project_path)), ..Default::default() }), - enable_webpack_loaders: next_config.webpack_loaders_options().await?.clone_if(), + enable_webpack_loaders, enable_typescript_transform: true, rules: vec![( foreign_code_context_condition(next_config).await?, diff --git a/packages/next-swc/crates/next-core/src/next_config.rs b/packages/next-swc/crates/next-core/src/next_config.rs index a57ecf69c7..5cb869be7d 100644 --- a/packages/next-swc/crates/next-core/src/next_config.rs +++ b/packages/next-swc/crates/next-core/src/next_config.rs @@ -9,10 +9,7 @@ use turbo_tasks::{ }; use turbo_tasks_env::EnvMapVc; use turbo_tasks_fs::json::parse_json_rope_with_source_context; -use turbopack::{ - evaluate_context::node_evaluate_asset_context, - module_options::{WebpackLoadersOptions, WebpackLoadersOptionsVc}, -}; +use turbopack::evaluate_context::node_evaluate_asset_context; use turbopack_core::{ asset::Asset, context::AssetContext, @@ -446,6 +443,10 @@ pub enum RemoveConsoleConfig { Config { exclude: Option> }, } +#[derive(Default)] +#[turbo_tasks::value(transparent)] +pub struct WebpackExtensionToLoaders(IndexMap); + #[turbo_tasks::value_impl] impl NextConfigVc { #[turbo_tasks::function] @@ -500,20 +501,16 @@ impl NextConfigVc { } #[turbo_tasks::function] - pub async fn webpack_loaders_options(self) -> Result { + pub async fn webpack_loaders_options(self) -> Result { let this = self.await?; let Some(turbo_loaders) = this.experimental.turbo.as_ref().and_then(|t| t.loaders.as_ref()) else { - return Ok(WebpackLoadersOptionsVc::cell(WebpackLoadersOptions::default())); + return Ok(WebpackExtensionToLoadersVc::cell(IndexMap::new())); }; let mut extension_to_loaders = IndexMap::new(); for (ext, loaders) in turbo_loaders { extension_to_loaders.insert(ext.clone(), WebpackLoaderConfigsVc::cell(loaders.clone())); } - Ok(WebpackLoadersOptions { - extension_to_loaders, - ..Default::default() - } - .cell()) + Ok(WebpackExtensionToLoaders(extension_to_loaders).cell()) } #[turbo_tasks::function] diff --git a/packages/next-swc/crates/next-core/src/next_server/context.rs b/packages/next-swc/crates/next-core/src/next_server/context.rs index 41fccdfba7..9dd3fc90d3 100644 --- a/packages/next-swc/crates/next-core/src/next_server/context.rs +++ b/packages/next-swc/crates/next-core/src/next_server/context.rs @@ -3,7 +3,10 @@ use turbo_tasks::{primitives::StringVc, Value}; use turbo_tasks_env::ProcessEnvVc; use turbo_tasks_fs::FileSystemPathVc; use turbopack::{ - module_options::{ModuleOptionsContext, ModuleOptionsContextVc, PostCssTransformOptions}, + module_options::{ + ModuleOptionsContext, ModuleOptionsContextVc, PostCssTransformOptions, + WebpackLoadersOptions, + }, resolve_options_context::{ResolveOptionsContext, ResolveOptionsContextVc}, }; use turbopack_core::{ @@ -20,7 +23,7 @@ use super::{ resolve::ExternalCjsModulesResolvePluginVc, transforms::get_next_server_transforms_rules, }; use crate::{ - next_build::get_postcss_package_mapping, + next_build::{get_external_next_compiled_package_mapping, get_postcss_package_mapping}, next_config::NextConfigVc, next_import_map::{get_next_build_import_map, get_next_server_import_map}, util::foreign_code_context_condition, @@ -173,7 +176,15 @@ pub async fn get_server_module_options_context( postcss_package: Some(get_postcss_package_mapping(project_path)), ..Default::default() }); - let enable_webpack_loaders = next_config.webpack_loaders_options().await?.clone_if(); + let options = &*next_config.webpack_loaders_options().await?; + let enable_webpack_loaders = WebpackLoadersOptions { + loader_runner_package: Some(get_external_next_compiled_package_mapping(StringVc::cell( + "loader-runner".to_owned(), + ))), + extension_to_loaders: options.clone(), + placeholder_for_future_extensions: (), + } + .clone_if(); let module_options_context = match ty.into_value() { ServerContextType::Pages { .. } | ServerContextType::PagesData { .. } => {