diff --git a/Cargo.lock b/Cargo.lock index 621eb73e4c..6ae5ea955e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -322,7 +322,7 @@ dependencies = [ [[package]] name = "auto-hash-map" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "serde", "smallvec", @@ -3549,7 +3549,7 @@ dependencies = [ [[package]] name = "node-file-trace" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "serde", @@ -7678,7 +7678,7 @@ dependencies = [ [[package]] name = "turbo-tasks" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-trait", @@ -7710,7 +7710,7 @@ dependencies = [ [[package]] name = "turbo-tasks-build" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "cargo-lock", @@ -7722,7 +7722,7 @@ dependencies = [ [[package]] name = "turbo-tasks-bytes" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "bytes", @@ -7737,7 +7737,7 @@ dependencies = [ [[package]] name = "turbo-tasks-env" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "dotenvs", @@ -7751,7 +7751,7 @@ dependencies = [ [[package]] name = "turbo-tasks-fetch" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "indexmap 1.9.3", @@ -7768,7 +7768,7 @@ dependencies = [ [[package]] name = "turbo-tasks-fs" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "auto-hash-map", @@ -7799,7 +7799,7 @@ dependencies = [ [[package]] name = "turbo-tasks-hash" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "base16", "hex", @@ -7811,7 +7811,7 @@ dependencies = [ [[package]] name = "turbo-tasks-macros" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -7825,7 +7825,7 @@ dependencies = [ [[package]] name = "turbo-tasks-macros-shared" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "proc-macro2", "quote", @@ -7835,7 +7835,7 @@ dependencies = [ [[package]] name = "turbo-tasks-malloc" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "mimalloc", ] @@ -7843,7 +7843,7 @@ dependencies = [ [[package]] name = "turbo-tasks-memory" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "auto-hash-map", @@ -7868,7 +7868,7 @@ dependencies = [ [[package]] name = "turbopack" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-recursion", @@ -7900,7 +7900,7 @@ dependencies = [ [[package]] name = "turbopack-binding" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "auto-hash-map", "mdxjs", @@ -7941,7 +7941,7 @@ dependencies = [ [[package]] name = "turbopack-build" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "indexmap 1.9.3", @@ -7965,7 +7965,7 @@ dependencies = [ [[package]] name = "turbopack-cli-utils" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "clap 4.4.2", @@ -7983,7 +7983,7 @@ dependencies = [ [[package]] name = "turbopack-core" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-recursion", @@ -8013,7 +8013,7 @@ dependencies = [ [[package]] name = "turbopack-css" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-trait", @@ -8027,6 +8027,7 @@ dependencies = [ "serde", "smallvec", "swc_core", + "tracing", "turbo-tasks", "turbo-tasks-build", "turbo-tasks-fs", @@ -8039,7 +8040,7 @@ dependencies = [ [[package]] name = "turbopack-dev" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "indexmap 1.9.3", @@ -8063,7 +8064,7 @@ dependencies = [ [[package]] name = "turbopack-dev-server" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-compression", @@ -8100,7 +8101,7 @@ dependencies = [ [[package]] name = "turbopack-ecmascript" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-trait", @@ -8134,7 +8135,7 @@ dependencies = [ [[package]] name = "turbopack-ecmascript-hmr-protocol" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "serde", "serde_json", @@ -8145,7 +8146,7 @@ dependencies = [ [[package]] name = "turbopack-ecmascript-plugins" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-trait", @@ -8168,7 +8169,7 @@ dependencies = [ [[package]] name = "turbopack-ecmascript-runtime" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "indoc", @@ -8185,7 +8186,7 @@ dependencies = [ [[package]] name = "turbopack-env" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "indexmap 1.9.3", @@ -8201,7 +8202,7 @@ dependencies = [ [[package]] name = "turbopack-image" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "base64 0.21.4", @@ -8221,7 +8222,7 @@ dependencies = [ [[package]] name = "turbopack-json" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "serde", @@ -8236,7 +8237,7 @@ dependencies = [ [[package]] name = "turbopack-mdx" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "mdxjs", @@ -8251,7 +8252,7 @@ dependencies = [ [[package]] name = "turbopack-node" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "async-stream", @@ -8286,7 +8287,7 @@ dependencies = [ [[package]] name = "turbopack-static" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "serde", @@ -8302,7 +8303,7 @@ dependencies = [ [[package]] name = "turbopack-swc-utils" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "swc_core", "turbo-tasks", @@ -8313,7 +8314,7 @@ dependencies = [ [[package]] name = "turbopack-trace-utils" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "crossbeam-channel", @@ -8328,7 +8329,7 @@ dependencies = [ [[package]] name = "turbopack-wasm" version = "0.1.0" -source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231205.2#8cb1c34181948ea6e85584d05eb9f69e86e11859" +source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231206.2#16bbf81a2a45b85737e569312b1ee76eec6c388c" dependencies = [ "anyhow", "indexmap 1.9.3", diff --git a/Cargo.toml b/Cargo.toml index 51f53646dd..6cc2e8c07e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,11 +43,11 @@ swc_core = { version = "0.86.81", features = [ testing = { version = "0.35.11" } # Turbo crates -turbopack-binding = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231205.2" } +turbopack-binding = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231206.2" } # [TODO]: need to refactor embed_directory! macro usages, as well as resolving turbo_tasks::function, macros.. -turbo-tasks = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231205.2" } +turbo-tasks = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231206.2" } # [TODO]: need to refactor embed_directory! macro usage in next-core -turbo-tasks-fs = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231205.2" } +turbo-tasks-fs = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231206.2" } # General Deps diff --git a/packages/next-swc/crates/next-api/src/app.rs b/packages/next-swc/crates/next-api/src/app.rs index 0baadc9a7f..1f4c52511d 100644 --- a/packages/next-swc/crates/next-api/src/app.rs +++ b/packages/next-swc/crates/next-api/src/app.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result}; use indexmap::IndexSet; use next_core::{ all_assets_from_entries, @@ -822,9 +822,9 @@ impl AppEndpoint { .edge_rsc_runtime_entries() .await? .clone_value(); - let Some(evaluatable) = Vc::try_resolve_sidecast(app_entry.rsc_entry).await? else { - bail!("Entry module must be evaluatable"); - }; + let evaluatable = Vc::try_resolve_sidecast(app_entry.rsc_entry) + .await? + .context("Entry module must be evaluatable")?; evaluatable_assets.push(evaluatable); let (loader, manifest) = create_server_actions_manifest( diff --git a/packages/next-swc/crates/next-api/src/instrumentation.rs b/packages/next-swc/crates/next-api/src/instrumentation.rs index 1871334d01..97df566479 100644 --- a/packages/next-swc/crates/next-api/src/instrumentation.rs +++ b/packages/next-swc/crates/next-api/src/instrumentation.rs @@ -17,6 +17,8 @@ use turbopack_binding::{ context::AssetContext, module::Module, output::{OutputAsset, OutputAssets}, + reference_type::{EntryReferenceSubType, ReferenceType}, + source::Source, virtual_output::VirtualOutputAsset, }, ecmascript::chunk::EcmascriptChunkPlaceable, @@ -34,7 +36,7 @@ use crate::{ pub struct InstrumentationEndpoint { project: Vc, context: Vc>, - userland_module: Vc>, + source: Vc>, is_edge: bool, } @@ -44,13 +46,13 @@ impl InstrumentationEndpoint { pub fn new( project: Vc, context: Vc>, - userland_module: Vc>, + source: Vc>, is_edge: bool, ) -> Vc { Self { project, context, - userland_module, + source, is_edge, } .cell() @@ -58,10 +60,18 @@ impl InstrumentationEndpoint { #[turbo_tasks::function] async fn edge_files(&self) -> Result> { + let userland_module = self + .context + .process( + self.source, + Value::new(ReferenceType::Entry(EntryReferenceSubType::Instrumentation)), + ) + .module(); + let module = wrap_edge_entry( self.context, self.project.project_path(), - self.userland_module, + userland_module, "instrumentation".to_string(), ); @@ -102,7 +112,15 @@ impl InstrumentationEndpoint { self.project.server_compile_time_info().environment(), ); - let Some(module) = Vc::try_resolve_downcast(self.userland_module).await? else { + let userland_module = self + .context + .process( + self.source, + Value::new(ReferenceType::Entry(EntryReferenceSubType::Instrumentation)), + ) + .module(); + + let Some(module) = Vc::try_resolve_downcast(userland_module).await? else { bail!("Entry module must be evaluatable"); }; diff --git a/packages/next-swc/crates/next-api/src/middleware.rs b/packages/next-swc/crates/next-api/src/middleware.rs index a87b9d4a42..8472b4876f 100644 --- a/packages/next-swc/crates/next-api/src/middleware.rs +++ b/packages/next-swc/crates/next-api/src/middleware.rs @@ -21,6 +21,8 @@ use turbopack_binding::{ context::AssetContext, module::Module, output::{OutputAsset, OutputAssets}, + reference_type::{EntryReferenceSubType, ReferenceType}, + source::Source, virtual_output::VirtualOutputAsset, }, ecmascript::chunk::EcmascriptChunkPlaceable, @@ -37,7 +39,7 @@ use crate::{ pub struct MiddlewareEndpoint { project: Vc, context: Vc>, - userland_module: Vc>, + source: Vc>, } #[turbo_tasks::value_impl] @@ -46,23 +48,28 @@ impl MiddlewareEndpoint { pub fn new( project: Vc, context: Vc>, - userland_module: Vc>, + source: Vc>, ) -> Vc { Self { project, context, - userland_module, + source, } .cell() } #[turbo_tasks::function] async fn edge_files(&self) -> Result> { - let module = get_middleware_module( - self.context, - self.project.project_path(), - self.userland_module, - ); + let userland_module = self + .context + .process( + self.source, + Value::new(ReferenceType::Entry(EntryReferenceSubType::Middleware)), + ) + .module(); + + let module = + get_middleware_module(self.context, self.project.project_path(), userland_module); let module = wrap_edge_entry( self.context, @@ -85,9 +92,9 @@ impl MiddlewareEndpoint { bail!("Entry module must be evaluatable"); }; - let Some(evaluatable) = Vc::try_resolve_sidecast(module).await? else { - bail!("Entry module must be evaluatable"); - }; + let evaluatable = Vc::try_resolve_sidecast(module) + .await? + .context("Entry module must be evaluatable")?; evaluatable_assets.push(evaluatable); let edge_chunking_context = self.project.edge_chunking_context(); @@ -102,7 +109,15 @@ impl MiddlewareEndpoint { async fn output_assets(self: Vc) -> Result> { let this = self.await?; - let config = parse_config_from_source(this.userland_module); + let userland_module = this + .context + .process( + this.source, + Value::new(ReferenceType::Entry(EntryReferenceSubType::Middleware)), + ) + .module(); + + let config = parse_config_from_source(userland_module); let edge_files = self.edge_files(); let mut output_assets = edge_files.await?.clone_value(); diff --git a/packages/next-swc/crates/next-api/src/pages.rs b/packages/next-swc/crates/next-api/src/pages.rs index a9ddba24fb..84c8bfd794 100644 --- a/packages/next-swc/crates/next-api/src/pages.rs +++ b/packages/next-swc/crates/next-api/src/pages.rs @@ -645,7 +645,9 @@ impl PageEndpoint { async move { let this = self.await?; - let ssr_module = module_context.process(self.source(), reference_type.clone()); + let ssr_module = module_context + .process(self.source(), reference_type.clone()) + .module(); let config = parse_config_from_source(ssr_module).await?; let is_edge = matches!(config.runtime, NextRuntime::Edge); @@ -663,9 +665,9 @@ impl PageEndpoint { ); let mut evaluatable_assets = edge_runtime_entries.await?.clone_value(); - let Some(evaluatable) = Vc::try_resolve_sidecast(ssr_module).await? else { - bail!("Entry module must be evaluatable"); - }; + let evaluatable = Vc::try_resolve_sidecast(ssr_module) + .await? + .context("could not process page loader entry module")?; evaluatable_assets.push(evaluatable); let edge_files = edge_chunking_context.evaluated_chunk_group( diff --git a/packages/next-swc/crates/next-api/src/project.rs b/packages/next-swc/crates/next-api/src/project.rs index a1e42a312a..a913a38f66 100644 --- a/packages/next-swc/crates/next-api/src/project.rs +++ b/packages/next-swc/crates/next-api/src/project.rs @@ -42,7 +42,6 @@ use turbopack_binding::{ environment::ServerAddr, file_source::FileSource, output::{OutputAsset, OutputAssets}, - reference_type::{EntryReferenceSubType, ReferenceType}, resolve::{find_context_file, FindContextFileResult}, source::Source, version::{Update, Version, VersionState, VersionedContent}, @@ -729,15 +728,13 @@ impl Project { } #[turbo_tasks::function] - fn middleware_endpoint(self: Vc, source: Vc>) -> Vc { + async fn middleware_endpoint( + self: Vc, + source: Vc>, + ) -> Result> { let context = self.middleware_context(); - let module = context.process( - source, - Value::new(ReferenceType::Entry(EntryReferenceSubType::Middleware)), - ); - - MiddlewareEndpoint::new(self, context, module) + Ok(MiddlewareEndpoint::new(self, context, source)) } #[turbo_tasks::function] @@ -775,12 +772,7 @@ impl Project { self.node_instrumentation_context() }; - let module = context.process( - source, - Value::new(ReferenceType::Entry(EntryReferenceSubType::Undefined)), - ); - - InstrumentationEndpoint::new(self, context, module, is_edge) + InstrumentationEndpoint::new(self, context, source, is_edge) } #[turbo_tasks::function] diff --git a/packages/next-swc/crates/next-api/src/server_actions.rs b/packages/next-swc/crates/next-api/src/server_actions.rs index dee4e5fd10..c2cb352135 100644 --- a/packages/next-swc/crates/next-api/src/server_actions.rs +++ b/packages/next-swc/crates/next-api/src/server_actions.rs @@ -1,6 +1,6 @@ use std::{io::Write, iter::once}; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use indexmap::{map::Entry, IndexMap}; use next_core::{ next_manifests::{ActionLayer, ActionManifestWorkerEntry, ServerReferenceManifest}, @@ -57,10 +57,9 @@ pub(crate) async fn create_server_actions_manifest( let actions = get_actions(rsc_entry, server_reference_modules, asset_context); let loader = build_server_actions_loader(project_path, page_name, actions, asset_context).await?; - let Some(evaluable) = Vc::try_resolve_sidecast::>(loader).await? - else { - bail!("loader module must be evaluatable"); - }; + let evaluable = Vc::try_resolve_sidecast::>(loader) + .await? + .context("loader module must be evaluatable")?; let loader_id = loader .as_chunk_item(Vc::upcast(chunking_context)) @@ -108,10 +107,12 @@ async fn build_server_actions_loader( let file = File::from(contents.build()); let source = VirtualSource::new(output_path, AssetContent::file(file.into())); let import_map = import_map.into_iter().map(|(k, v)| (v, k)).collect(); - let module = asset_context.process( - Vc::upcast(source), - Value::new(ReferenceType::Internal(Vc::cell(import_map))), - ); + let module = asset_context + .process( + Vc::upcast(source), + Value::new(ReferenceType::Internal(Vc::cell(import_map))), + ) + .module(); let Some(placeable) = Vc::try_resolve_sidecast::>(module).await? @@ -249,7 +250,10 @@ async fn to_rsc_context( } else { ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined) }; - Ok(asset_context.process(Vc::upcast(source), Value::new(ty))) + let module = asset_context + .process(Vc::upcast(source), Value::new(ty)) + .module(); + Ok(module) } /// Our graph traversal visitor, which finds the primary modules directly diff --git a/packages/next-swc/crates/next-core/src/bootstrap.rs b/packages/next-swc/crates/next-core/src/bootstrap.rs index ed33404956..d5645e2829 100644 --- a/packages/next-swc/crates/next-core/src/bootstrap.rs +++ b/packages/next-swc/crates/next-core/src/bootstrap.rs @@ -1,4 +1,4 @@ -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use indexmap::IndexMap; use turbo_tasks::{Value, ValueToString, Vc}; use turbo_tasks_fs::{File, FileSystemPath}; @@ -77,35 +77,39 @@ pub async fn bootstrap( config.insert("PAGE".to_string(), path.to_string()); config.insert("PATHNAME".to_string(), pathname); - let config_asset = context.process( - Vc::upcast(VirtualSource::new( - asset.ident().path().join("bootstrap-config.ts".to_string()), - AssetContent::file( - File::from( - config - .iter() - .map(|(k, v)| format!("export const {} = {};\n", k, StringifyJs(v))) - .collect::>() - .join(""), - ) - .into(), - ), - )), - Value::new(ReferenceType::Internal(InnerAssets::empty())), - ); + let config_asset = context + .process( + Vc::upcast(VirtualSource::new( + asset.ident().path().join("bootstrap-config.ts".to_string()), + AssetContent::file( + File::from( + config + .iter() + .map(|(k, v)| format!("export const {} = {};\n", k, StringifyJs(v))) + .collect::>() + .join(""), + ) + .into(), + ), + )), + Value::new(ReferenceType::Internal(InnerAssets::empty())), + ) + .module(); let mut inner_assets = inner_assets.await?.clone_value(); inner_assets.insert("ENTRY".to_string(), asset); inner_assets.insert("BOOTSTRAP_CONFIG".to_string(), config_asset); - let asset = context.process( - bootstrap_asset, - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let asset = context + .process( + bootstrap_asset, + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); - let Some(asset) = Vc::try_resolve_sidecast::>(asset).await? else { - bail!("internal module must be evaluatable"); - }; + let asset = Vc::try_resolve_sidecast::>(asset) + .await? + .context("internal module must be evaluatable")?; Ok(asset) } diff --git a/packages/next-swc/crates/next-core/src/loader_tree.rs b/packages/next-swc/crates/next-core/src/loader_tree.rs index 5c471de68e..50248ca514 100644 --- a/packages/next-swc/crates/next-core/src/loader_tree.rs +++ b/packages/next-swc/crates/next-core/src/loader_tree.rs @@ -146,9 +146,10 @@ impl LoaderTreeBuilder { EcmaScriptModulesReferenceSubType::Undefined, )); - let module = - self.server_component_transition - .process(source, self.context, reference_ty); + let module = self + .server_component_transition + .process(source, self.context, reference_ty) + .module(); self.inner_assets.insert(format!("COMPONENT_{i}"), module); } @@ -268,15 +269,16 @@ impl LoaderTreeBuilder { app_page.clone(), ); - self.inner_assets.insert( - inner_module_id, - self.context.process( + let module = self + .context + .process( source, Value::new(ReferenceType::EcmaScriptModules( EcmaScriptModulesReferenceSubType::Undefined, )), - ), - ); + ) + .module(); + self.inner_assets.insert(inner_module_id, module); let s = " "; writeln!(self.loader_tree_code, "{s}{identifier},")?; @@ -346,15 +348,16 @@ impl LoaderTreeBuilder { let inner_module_id = format!("METADATA_ALT_{i}"); self.imports .push(format!("import {identifier} from \"{inner_module_id}\";")); - self.inner_assets.insert( - inner_module_id, - self.context.process( + let module = self + .context + .process( Vc::upcast(TextContentFileSource::new(Vc::upcast(FileSource::new( alt_path, )))), Value::new(ReferenceType::Internal(InnerAssets::empty())), - ), - ); + ) + .module(); + self.inner_assets.insert(inner_module_id, module); writeln!(self.loader_tree_code, "{s} alt: {identifier},")?; } diff --git a/packages/next-swc/crates/next-core/src/middleware.rs b/packages/next-swc/crates/next-core/src/middleware.rs index 643aa2dcb2..92ff48c07d 100644 --- a/packages/next-swc/crates/next-core/src/middleware.rs +++ b/packages/next-swc/crates/next-core/src/middleware.rs @@ -47,10 +47,12 @@ pub async fn get_middleware_module( INNER.to_string() => userland_module }; - let module = context.process( - source, - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let module = context + .process( + source, + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); Ok(module) } diff --git a/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs b/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs index 640e7a70cc..0ad5161f4f 100644 --- a/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs +++ b/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs @@ -106,10 +106,12 @@ pub async fn get_app_page_entry( let file = File::from(result.build()); let source = VirtualSource::new(source.ident().path(), AssetContent::file(file.into())); - let mut rsc_entry = context.process( - Vc::upcast(source), - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let mut rsc_entry = context + .process( + Vc::upcast(source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); if is_edge { rsc_entry = wrap_edge_page( @@ -190,10 +192,12 @@ async fn wrap_edge_page( INNER.to_string() => entry }; - let wrapped = context.process( - Vc::upcast(source), - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let wrapped = context + .process( + Vc::upcast(source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); Ok(wrap_edge_entry( context, diff --git a/packages/next-swc/crates/next-core/src/next_app/app_route_entry.rs b/packages/next-swc/crates/next-core/src/next_app/app_route_entry.rs index dd5db449f6..5cf997000e 100644 --- a/packages/next-swc/crates/next-core/src/next_app/app_route_entry.rs +++ b/packages/next-swc/crates/next-core/src/next_app/app_route_entry.rs @@ -67,19 +67,23 @@ pub async fn get_app_route_entry( ) .await?; - let userland_module = context.process( - source, - Value::new(ReferenceType::Entry(EntryReferenceSubType::AppRoute)), - ); + let userland_module = context + .process( + source, + Value::new(ReferenceType::Entry(EntryReferenceSubType::AppRoute)), + ) + .module(); let inner_assets = indexmap! { INNER.to_string() => userland_module }; - let mut rsc_entry = context.process( - Vc::upcast(virtual_source), - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let mut rsc_entry = context + .process( + Vc::upcast(virtual_source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); if is_edge { rsc_entry = wrap_edge_route( @@ -129,10 +133,12 @@ async fn wrap_edge_route( INNER.to_string() => entry }; - let wrapped = context.process( - Vc::upcast(source), - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let wrapped = context + .process( + Vc::upcast(source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); Ok(wrap_edge_entry(context, project_root, wrapped, pathname)) } diff --git a/packages/next-swc/crates/next-core/src/next_app/metadata/image.rs b/packages/next-swc/crates/next-core/src/next_app/metadata/image.rs index 68e8a7c667..888252b862 100644 --- a/packages/next-swc/crates/next-core/src/next_app/metadata/image.rs +++ b/packages/next-swc/crates/next-core/src/next_app/metadata/image.rs @@ -63,13 +63,15 @@ pub async fn dynamic_image_metadata_source( }; let source = Vc::upcast(FileSource::new(path)); - let exports = &*collect_direct_exports(asset_context.process( - source, - turbo_tasks::Value::new(ReferenceType::EcmaScriptModules( - EcmaScriptModulesReferenceSubType::Undefined, - )), - )) - .await?; + let module = asset_context + .process( + source, + turbo_tasks::Value::new(ReferenceType::EcmaScriptModules( + EcmaScriptModulesReferenceSubType::Undefined, + )), + ) + .module(); + let exports = &*collect_direct_exports(module).await?; let exported_fields_excluding_default = exports .iter() .filter(|e| *e != "default") 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 fd63edfcc0..43e32b2435 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 @@ -17,7 +17,7 @@ use turbopack_binding::{ resolve::{parse::Request, pattern::Pattern}, }, dev::{react_refresh::assert_can_resolve_react_refresh, DevChunkingContext}, - ecmascript::chunk::EcmascriptChunkingContext, + ecmascript::{chunk::EcmascriptChunkingContext, TreeShakingMode}, node::execution_context::ExecutionContext, turbopack::{ condition::ContextCondition, @@ -267,6 +267,7 @@ pub async fn get_client_module_options_context( preset_env_versions: Some(env), execution_context: Some(execution_context), custom_ecma_transform_plugins, + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() }; diff --git a/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module.rs b/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module.rs index 8a3f6fc73c..ab14d203d9 100644 --- a/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module.rs +++ b/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module.rs @@ -1,4 +1,4 @@ -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use turbo_tasks::Vc; use turbopack_binding::turbopack::{ core::{ @@ -72,10 +72,9 @@ impl ParseCss for CssClientReferenceModule { impl ProcessCss for CssClientReferenceModule { #[turbo_tasks::function] async fn get_css_with_placeholder(&self) -> Result> { - let Some(imp) = Vc::try_resolve_sidecast::>(self.client_module).await? - else { - bail!("CSS client reference client module must be CSS processable"); - }; + let imp = Vc::try_resolve_sidecast::>(self.client_module) + .await? + .context("CSS client reference client module must be CSS processable")?; Ok(imp.get_css_with_placeholder()) } @@ -85,10 +84,9 @@ impl ProcessCss for CssClientReferenceModule { &self, chunking_context: Vc>, ) -> Result> { - let Some(imp) = Vc::try_resolve_sidecast::>(self.client_module).await? - else { - bail!("CSS client reference client module must be CSS processable"); - }; + let imp = Vc::try_resolve_sidecast::>(self.client_module) + .await? + .context("CSS client reference client module must be CSS processable")?; Ok(imp.finalize_css(chunking_context)) } diff --git a/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module_type.rs b/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module_type.rs index cc9f4b343d..029fc68060 100644 --- a/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module_type.rs +++ b/packages/next-swc/crates/next-core/src/next_client_reference/css_client_reference/css_client_reference_module_type.rs @@ -39,11 +39,14 @@ impl CustomModuleType for CssClientReferenceModuleType { context: Vc, _part: Option>, ) -> Result>> { - let client_module = self.client_transition.process( - source, - context, - Value::new(ReferenceType::Css(CssReferenceSubType::Internal)), - ); + let client_module = self + .client_transition + .process( + source, + context, + Value::new(ReferenceType::Css(CssReferenceSubType::Internal)), + ) + .module(); let Some(client_module) = Vc::try_resolve_sidecast::>(client_module).await? diff --git a/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_proxy_module.rs b/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_proxy_module.rs index 61b52dba98..d9f0b8784f 100644 --- a/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_proxy_module.rs +++ b/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_proxy_module.rs @@ -99,10 +99,13 @@ impl EcmascriptClientReferenceProxyModule { proxy_module_content, ); - let proxy_module = this.server_asset_context.process( - Vc::upcast(proxy_source), - Value::new(ReferenceType::Undefined), - ); + let proxy_module = this + .server_asset_context + .process( + Vc::upcast(proxy_source), + Value::new(ReferenceType::Undefined), + ) + .module(); let Some(proxy_module) = Vc::try_resolve_downcast_type::(proxy_module).await? diff --git a/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_transition.rs b/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_transition.rs index 32a72b0fb6..c2c38ffa5e 100644 --- a/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_transition.rs +++ b/packages/next-swc/crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_transition.rs @@ -2,8 +2,8 @@ use anyhow::{bail, Result}; use turbo_tasks::{Value, Vc}; use turbopack_binding::turbopack::{ core::{ + context::ProcessResult, file_source::FileSource, - module::Module, reference_type::{EntryReferenceSubType, ReferenceType}, source::Source, }, @@ -50,7 +50,7 @@ impl Transition for NextEcmascriptClientReferenceTransition { source: Vc>, context: Vc, _reference_type: Value, - ) -> Result>> { + ) -> Result> { let context = self.process_context(context); let this = self.await?; @@ -66,21 +66,27 @@ impl Transition for NextEcmascriptClientReferenceTransition { } else { source }; - let client_module = this.client_transition.process( - client_source, - context, - Value::new(ReferenceType::Entry( - EntryReferenceSubType::AppClientComponent, - )), - ); + let client_module = this + .client_transition + .process( + client_source, + context, + Value::new(ReferenceType::Entry( + EntryReferenceSubType::AppClientComponent, + )), + ) + .module(); - let ssr_module = this.ssr_transition.process( - source, - context, - Value::new(ReferenceType::Entry( - EntryReferenceSubType::AppClientComponent, - )), - ); + let ssr_module = this + .ssr_transition + .process( + source, + context, + Value::new(ReferenceType::Entry( + EntryReferenceSubType::AppClientComponent, + )), + ) + .module(); let Some(client_module) = Vc::try_resolve_sidecast::>(client_module).await? @@ -105,11 +111,14 @@ impl Transition for NextEcmascriptClientReferenceTransition { context.layer, ); - Ok(Vc::upcast(EcmascriptClientReferenceProxyModule::new( - source.ident(), - Vc::upcast(server_context), - client_module, - ssr_module, - ))) + Ok( + ProcessResult::Module(Vc::upcast(EcmascriptClientReferenceProxyModule::new( + source.ident(), + Vc::upcast(server_context), + client_module, + ssr_module, + ))) + .cell(), + ) } } 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 9c012d17bb..63a202b74a 100644 --- a/packages/next-swc/crates/next-core/src/next_config.rs +++ b/packages/next-swc/crates/next-core/src/next_config.rs @@ -9,7 +9,7 @@ use turbopack_binding::{ turbopack::{ core::{ changed::any_content_changed_of_module, - context::AssetContext, + context::{AssetContext, ProcessResult}, file_source::FileSource, ident::AssetIdent, issue::{ @@ -849,19 +849,28 @@ async fn load_next_config_and_custom_routes_internal( ); let config_asset = config_file.map(FileSource::new); - let config_changed = config_asset.map_or_else(Completion::immutable, |config_asset| { + let config_changed = if let Some(config_asset) = config_asset { // This invalidates the execution when anything referenced by the config file // changes - let config_asset = context.process( - Vc::upcast(config_asset), - Value::new(ReferenceType::Internal(InnerAssets::empty())), - ); - any_content_changed_of_module(config_asset) - }); - let load_next_config_asset = context.process( - next_asset("entry/config/next.js".to_string()), - Value::new(ReferenceType::Entry(EntryReferenceSubType::Undefined)), - ); + match *context + .process( + Vc::upcast(config_asset), + Value::new(ReferenceType::Internal(InnerAssets::empty())), + ) + .await? + { + ProcessResult::Module(module) => any_content_changed_of_module(module), + ProcessResult::Ignore => Completion::immutable(), + } + } else { + Completion::immutable() + }; + let load_next_config_asset = context + .process( + next_asset("entry/config/next.js".to_string()), + Value::new(ReferenceType::Entry(EntryReferenceSubType::Undefined)), + ) + .module(); let config_value = evaluate( load_next_config_asset, project_path, diff --git a/packages/next-swc/crates/next-core/src/next_dynamic/dynamic_transition.rs b/packages/next-swc/crates/next-core/src/next_dynamic/dynamic_transition.rs index 3f82dfe025..6ff27e0708 100644 --- a/packages/next-swc/crates/next-core/src/next_dynamic/dynamic_transition.rs +++ b/packages/next-swc/crates/next-core/src/next_dynamic/dynamic_transition.rs @@ -1,7 +1,7 @@ use anyhow::Result; use turbo_tasks::{Value, Vc}; use turbopack_binding::turbopack::{ - core::{module::Module, reference_type::ReferenceType, source::Source}, + core::{context::ProcessResult, reference_type::ReferenceType, source::Source}, turbopack::{ transition::{ContextTransition, Transition}, ModuleAssetContext, @@ -39,15 +39,21 @@ impl Transition for NextDynamicTransition { source: Vc>, context: Vc, _reference_type: Value, - ) -> Result>> { + ) -> Result> { let context = self.process_context(context); let this = self.await?; - let client_module = - this.client_transition - .process(source, context, Value::new(ReferenceType::Undefined)); - - Ok(Vc::upcast(NextDynamicEntryModule::new(client_module))) + Ok(match *this + .client_transition + .process(source, context, Value::new(ReferenceType::Undefined)) + .await? + { + ProcessResult::Module(client_module) => { + ProcessResult::Module(Vc::upcast(NextDynamicEntryModule::new(client_module))) + } + ProcessResult::Ignore => ProcessResult::Ignore, + } + .cell()) } } diff --git a/packages/next-swc/crates/next-core/src/next_edge/entry.rs b/packages/next-swc/crates/next-core/src/next_edge/entry.rs index 62b0833d0f..87adebc2bc 100644 --- a/packages/next-swc/crates/next-core/src/next_edge/entry.rs +++ b/packages/next-swc/crates/next-core/src/next_edge/entry.rs @@ -39,8 +39,11 @@ pub async fn wrap_edge_entry( "MODULE".to_string() => entry }; - Ok(context.process( - Vc::upcast(virtual_source), - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - )) + let module = context + .process( + Vc::upcast(virtual_source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); + Ok(module) } diff --git a/packages/next-swc/crates/next-core/src/next_font/google/mod.rs b/packages/next-swc/crates/next-core/src/next_font/google/mod.rs index 094833ceca..ece90cfc8f 100644 --- a/packages/next-swc/crates/next-core/src/next_font/google/mod.rs +++ b/packages/next-swc/crates/next-core/src/next_font/google/mod.rs @@ -446,22 +446,25 @@ async fn get_mock_stylesheet( let context = node_evaluate_asset_context(execution_context, None, None, "next_font".to_string()); let loader_path = mock_fs.root().join("loader.js".to_string()); - let mocked_response_asset = context.process( - Vc::upcast(VirtualSource::new( - loader_path, - AssetContent::file( - File::from(format!( - "import data from './{}'; export default function load() {{ return data; }};", - response_path - .file_name() - .context("Must exist")? - .to_string_lossy(), - )) - .into(), - ), - )), - Value::new(ReferenceType::Internal(InnerAssets::empty())), - ); + let mocked_response_asset = context + .process( + Vc::upcast(VirtualSource::new( + loader_path, + AssetContent::file( + File::from(format!( + "import data from './{}'; export default function load() {{ return data; \ + }};", + response_path + .file_name() + .context("Must exist")? + .to_string_lossy(), + )) + .into(), + ), + )), + Value::new(ReferenceType::Internal(InnerAssets::empty())), + ) + .module(); let root = mock_fs.root(); let val = evaluate( diff --git a/packages/next-swc/crates/next-core/src/next_image/module.rs b/packages/next-swc/crates/next-core/src/next_image/module.rs index 72369f3cec..459c6517cc 100644 --- a/packages/next-swc/crates/next-core/src/next_image/module.rs +++ b/packages/next-swc/crates/next-core/src/next_image/module.rs @@ -1,5 +1,6 @@ +use anyhow::Result; use indexmap::indexmap; -use turbo_tasks::Vc; +use turbo_tasks::{TaskInput, Vc}; use turbopack_binding::{ turbo::tasks::Value, turbopack::{ @@ -15,7 +16,7 @@ use turbopack_binding::{ use super::source_asset::StructuredImageFileSource; #[turbo_tasks::value(serialization = "auto_for_input")] -#[derive(Clone, Copy, Debug, PartialOrd, Ord, Hash)] +#[derive(Clone, Copy, Debug, PartialOrd, Ord, Hash, TaskInput)] pub enum BlurPlaceholderMode { /// Do not generate a blur placeholder at all. None, @@ -37,30 +38,32 @@ pub struct StructuredImageModuleType { pub blur_placeholder_mode: BlurPlaceholderMode, } +#[turbo_tasks::value_impl] impl StructuredImageModuleType { - pub(crate) fn create_module( + #[turbo_tasks::function] + pub(crate) async fn create_module( source: Vc>, blur_placeholder_mode: BlurPlaceholderMode, context: Vc, - ) -> Vc> { + ) -> Result>> { let static_asset = StaticModuleAsset::new(source, Vc::upcast(context)); - context.process( - Vc::upcast( - StructuredImageFileSource { - image: source, - blur_placeholder_mode, - } - .cell(), - ), - Value::new(ReferenceType::Internal(Vc::cell(indexmap!( - "IMAGE".to_string() => Vc::upcast(static_asset) - )))), - ) + let module = context + .process( + Vc::upcast( + StructuredImageFileSource { + image: source, + blur_placeholder_mode, + } + .cell(), + ), + Value::new(ReferenceType::Internal(Vc::cell(indexmap!( + "IMAGE".to_string() => Vc::upcast(static_asset) + )))), + ) + .module(); + Ok(module) } -} -#[turbo_tasks::value_impl] -impl StructuredImageModuleType { #[turbo_tasks::function] pub fn new(blur_placeholder_mode: Value) -> Vc { StructuredImageModuleType::cell(StructuredImageModuleType { diff --git a/packages/next-swc/crates/next-core/src/next_pages/page_entry.rs b/packages/next-swc/crates/next-core/src/next_pages/page_entry.rs index be587ac651..ef20616bcc 100644 --- a/packages/next-swc/crates/next-core/src/next_pages/page_entry.rs +++ b/packages/next-swc/crates/next-core/src/next_pages/page_entry.rs @@ -43,7 +43,9 @@ pub async fn create_page_ssr_entry_module( let definition_page = &*next_original_name.await?; let definition_pathname = &*pathname.await?; - let ssr_module = ssr_module_context.process(source, reference_type.clone()); + let ssr_module = ssr_module_context + .process(source, reference_type.clone()) + .module(); let reference_type = reference_type.into_value(); @@ -116,12 +118,14 @@ pub async fn create_page_ssr_entry_module( )); } - let mut ssr_module = ssr_module_context.process( - source, - Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - INNER.to_string() => ssr_module, - }))), - ); + let mut ssr_module = ssr_module_context + .process( + source, + Value::new(ReferenceType::Internal(Vc::cell(indexmap! { + INNER.to_string() => ssr_module, + }))), + ) + .module(); if matches!(runtime, NextRuntime::Edge) { if reference_type == ReferenceType::Entry(EntryReferenceSubType::Page) { @@ -209,10 +213,12 @@ async fn wrap_edge_page( INNER.to_string() => entry }; - let wrapped = context.process( - Vc::upcast(source), - Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), - ); + let wrapped = context + .process( + Vc::upcast(source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + ) + .module(); Ok(wrap_edge_entry( context, 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 41efaa11ec..4b2f34a482 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 @@ -17,7 +17,7 @@ use turbopack_binding::{ free_var_references, resolve::{parse::Request, pattern::Pattern}, }, - ecmascript::{references::esm::UrlRewriteBehavior, TransformPlugin}, + ecmascript::{references::esm::UrlRewriteBehavior, TransformPlugin, TreeShakingMode}, ecmascript_plugin::transform::directives::client::ClientDirectiveTransformer, node::execution_context::ExecutionContext, turbopack::{ @@ -389,6 +389,7 @@ pub async fn get_server_module_options_context( execution_context: Some(execution_context), esm_url_rewrite_behavior: url_rewrite_behavior, use_lightningcss, + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() }; @@ -458,6 +459,7 @@ pub async fn get_server_module_options_context( custom_ecma_transform_plugins: base_ecma_transform_plugins, execution_context: Some(execution_context), use_lightningcss, + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() }; let foreign_code_module_options_context = ModuleOptionsContext { @@ -543,6 +545,7 @@ pub async fn get_server_module_options_context( custom_ecma_transform_plugins: base_ecma_transform_plugins, execution_context: Some(execution_context), use_lightningcss, + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() }; let foreign_code_module_options_context = ModuleOptionsContext { @@ -582,6 +585,7 @@ pub async fn get_server_module_options_context( ServerContextType::AppRoute { .. } => { let module_options_context = ModuleOptionsContext { execution_context: Some(execution_context), + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() }; let internal_module_options_context = ModuleOptionsContext { @@ -630,6 +634,7 @@ pub async fn get_server_module_options_context( let module_options_context = ModuleOptionsContext { execution_context: Some(execution_context), + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() }; let internal_module_options_context = ModuleOptionsContext { @@ -669,6 +674,7 @@ pub async fn get_server_module_options_context( pub fn get_build_module_options_context() -> Vc { ModuleOptionsContext { enable_typescript_transform: Some(Default::default()), + tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly), ..Default::default() } .cell() diff --git a/packages/next-swc/crates/next-core/src/next_server/resolve.rs b/packages/next-swc/crates/next-core/src/next_server/resolve.rs index 411030c757..985d8e9525 100644 --- a/packages/next-swc/crates/next-core/src/next_server/resolve.rs +++ b/packages/next-swc/crates/next-core/src/next_server/resolve.rs @@ -187,17 +187,19 @@ impl ResolvePlugin for ExternalCjsModulesResolvePlugin { // unsupported file type, bundle it Ok(ResolveResultOption::none()) } - (FileType::CommonJs, _) => { - // mark as external - Ok(ResolveResultOption::some( - ResolveResult::primary(ResolveResultItem::OriginalReferenceExternal).cell(), - )) - } - (FileType::EcmaScriptModule, true) => { - // mark as external - Ok(ResolveResultOption::some( - ResolveResult::primary(ResolveResultItem::OriginalReferenceExternal).cell(), - )) + (FileType::CommonJs, _) | (FileType::EcmaScriptModule, true) => { + if let Some(request) = request.await?.request() { + // mark as external + Ok(ResolveResultOption::some( + ResolveResult::primary(ResolveResultItem::OriginalReferenceTypeExternal( + request, + )) + .cell(), + )) + } else { + // unsupported request, bundle it + Ok(ResolveResultOption::none()) + } } (FileType::EcmaScriptModule, false) => { // even with require() this resolves to a ESM, diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/swc_ecma_transform_plugins.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/swc_ecma_transform_plugins.rs index 8346d11d01..1148fcc97c 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/transforms/swc_ecma_transform_plugins.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/swc_ecma_transform_plugins.rs @@ -33,7 +33,7 @@ pub async fn get_swc_ecma_transform_plugin_impl( project_path: Vc, plugin_configs: &[(String, serde_json::Value)], ) -> Result> { - use anyhow::bail; + use anyhow::{bail, Context}; use turbo_tasks::Value; use turbo_tasks_fs::FileContent; use turbopack_binding::turbopack::{ @@ -83,9 +83,10 @@ pub async fn get_swc_ecma_transform_plugin_impl( None, ) .await?; - let Some(plugin_module) = *plugin_wasm_module_resolve_result.first_module().await? else { - bail!("Expected to find module"); - }; + let plugin_module = plugin_wasm_module_resolve_result + .first_module() + .await? + .context("Expected to find module")?; let content = &*plugin_module.content().file_content().await?; diff --git a/packages/next-swc/crates/next-core/src/page_loader.rs b/packages/next-swc/crates/next-core/src/page_loader.rs index a8b2f2a907..aa6a622124 100644 --- a/packages/next-swc/crates/next-core/src/page_loader.rs +++ b/packages/next-swc/crates/next-core/src/page_loader.rs @@ -53,15 +53,22 @@ pub async fn create_page_loader_entry_module( AssetContent::file(file.into()), )); - Ok(client_context.process( - virtual_source, - Value::new(ReferenceType::Internal(Vc::cell(indexmap! { - "PAGE".to_string() => client_context.process( - entry_asset, - Value::new(ReferenceType::Entry(EntryReferenceSubType::Page)) - ), - }))), - )) + let module = client_context + .process( + entry_asset, + Value::new(ReferenceType::Entry(EntryReferenceSubType::Page)), + ) + .module(); + + let module = client_context + .process( + virtual_source, + Value::new(ReferenceType::Internal(Vc::cell(indexmap! { + "PAGE".to_string() => module, + }))), + ) + .module(); + Ok(module) } #[turbo_tasks::value(shared)] diff --git a/packages/next/package.json b/packages/next/package.json index 41d7aa76be..beec68c485 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -195,7 +195,7 @@ "@types/ws": "8.2.0", "@vercel/ncc": "0.34.0", "@vercel/nft": "0.24.4", - "@vercel/turbopack-ecmascript-runtime": "https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231205.2", + "@vercel/turbopack-ecmascript-runtime": "https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231206.2", "acorn": "8.5.0", "amphtml-validator": "1.0.35", "anser": "1.4.9", diff --git a/packages/react-refresh-utils/internal/helpers.ts b/packages/react-refresh-utils/internal/helpers.ts index 3b6aabc39a..fd26cc0599 100644 --- a/packages/react-refresh-utils/internal/helpers.ts +++ b/packages/react-refresh-utils/internal/helpers.ts @@ -73,7 +73,12 @@ function registerExportsForReactRefresh( if (isSafeExport(key)) { continue } - var exportValue = moduleExports[key] + try { + var exportValue = moduleExports[key] + } catch { + // This might fail due to circular dependencies + continue + } var typeID = moduleID + ' %exports% ' + key RefreshRuntime.register(exportValue, typeID) } @@ -91,7 +96,12 @@ function getRefreshBoundarySignature(moduleExports: unknown): Array { if (isSafeExport(key)) { continue } - var exportValue = moduleExports[key] + try { + var exportValue = moduleExports[key] + } catch { + // This might fail due to circular dependencies + continue + } signature.push(key) signature.push(RefreshRuntime.getFamilyByType(exportValue)) } @@ -113,7 +123,12 @@ function isReactRefreshBoundary(moduleExports: unknown): boolean { if (isSafeExport(key)) { continue } - var exportValue = moduleExports[key] + try { + var exportValue = moduleExports[key] + } catch { + // This might fail due to circular dependencies + return false + } if (!RefreshRuntime.isLikelyComponentType(exportValue)) { areAllExportsComponents = false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 513a8290d8..7aed958b5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1077,8 +1077,8 @@ importers: specifier: 0.24.4 version: 0.24.4 '@vercel/turbopack-ecmascript-runtime': - specifier: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231205.2 - version: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231205.2(react-refresh@0.12.0)(webpack@5.86.0)' + specifier: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231206.2 + version: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231206.2(react-refresh@0.12.0)(webpack@5.86.0)' acorn: specifier: 8.5.0 version: 8.5.0 @@ -24647,9 +24647,9 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231205.2(react-refresh@0.12.0)(webpack@5.86.0)': - resolution: {registry: https://registry.npmjs.org/, tarball: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231205.2} - id: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231205.2' + '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231206.2(react-refresh@0.12.0)(webpack@5.86.0)': + resolution: {tarball: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231206.2} + id: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231206.2' name: '@vercel/turbopack-ecmascript-runtime' version: 0.0.0 dependencies: