From c24415d990fa9d2f4e144d2c98c2dccc31b68599 Mon Sep 17 00:00:00 2001 From: LichuAcu Date: Wed, 21 Aug 2024 11:48:28 -0700 Subject: [PATCH] Fix next server component modules in graph traversal --- .../next_app/app_client_references_chunks.rs | 4 +-- .../server_component_module.rs | 19 ++++++++++-- .../src/references/external_module.rs | 31 +++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/crates/next-core/src/next_app/app_client_references_chunks.rs b/crates/next-core/src/next_app/app_client_references_chunks.rs index cc48e42d2e9f18..4060d7931b115d 100644 --- a/crates/next-core/src/next_app/app_client_references_chunks.rs +++ b/crates/next-core/src/next_app/app_client_references_chunks.rs @@ -18,12 +18,12 @@ use crate::{ }; #[turbo_tasks::function] -fn client_modules_modifier() -> Vc { +pub fn client_modules_modifier() -> Vc { Vc::cell("client modules".into()) } #[turbo_tasks::function] -fn client_modules_ssr_modifier() -> Vc { +pub fn client_modules_ssr_modifier() -> Vc { Vc::cell("client modules ssr".into()) } diff --git a/crates/next-core/src/next_server_component/server_component_module.rs b/crates/next-core/src/next_server_component/server_component_module.rs index 504018e88e004e..549faa5f02ab5c 100644 --- a/crates/next-core/src/next_server_component/server_component_module.rs +++ b/crates/next-core/src/next_server_component/server_component_module.rs @@ -6,7 +6,7 @@ use turbopack_core::{ asset::{Asset, AssetContent}, chunk::{ChunkItem, ChunkItemExt, ChunkType, ChunkableModule, ChunkingContext}, ident::AssetIdent, - module::Module, + module::{Module, Modules}, reference::ModuleReferences, }; use turbopack_ecmascript::{ @@ -14,11 +14,14 @@ use turbopack_ecmascript::{ EcmascriptChunkItem, EcmascriptChunkItemContent, EcmascriptChunkPlaceable, EcmascriptChunkType, EcmascriptExports, }, - references::esm::EsmExports, + references::{esm::EsmExports, external_module::IncludeIdentModule}, utils::StringifyJs, }; use super::server_component_reference::NextServerComponentModuleReference; +use crate::next_app::app_client_references_chunks::{ + client_modules_modifier, client_modules_ssr_modifier, +}; #[turbo_tasks::function] fn modifier() -> Vc { @@ -57,6 +60,18 @@ impl Module for NextServerComponentModule { Vc::upcast(self.module), ))]) } + + #[turbo_tasks::function] + fn additional_layers_modules(self: Vc) -> Vc { + let base_ident = self.ident(); + let ssr_entry_module = Vc::upcast(IncludeIdentModule::new( + base_ident.with_modifier(client_modules_ssr_modifier()), + )); + let client_entry_module = Vc::upcast(IncludeIdentModule::new( + base_ident.with_modifier(client_modules_modifier()), + )); + Vc::cell(vec![ssr_entry_module, client_entry_module]) + } } #[turbo_tasks::value_impl] diff --git a/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs b/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs index 5108f6b37bf272..89211f9ba94cda 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs @@ -244,3 +244,34 @@ impl EcmascriptChunkItem for CachedExternalModuleChunkItem { )) } } + +/// A module that only has an ident and no content. This is used +/// to include a module's ident in the module graph before the module +/// itself is resolved, as is the case with NextServerComponentModule's +/// "client modules" and "client modules ssr". +#[turbo_tasks::value] +pub struct IncludeIdentModule { + ident: Vc, +} + +#[turbo_tasks::value_impl] +impl IncludeIdentModule { + #[turbo_tasks::function] + pub fn new(ident: Vc) -> Vc { + Self { ident }.cell() + } +} + +impl Asset for IncludeIdentModule { + fn content(self: Vc) -> Vc { + todo!("IncludeIdentModule doesn't implement content()") + } +} + +#[turbo_tasks::value_impl] +impl Module for IncludeIdentModule { + #[turbo_tasks::function] + fn ident(&self) -> Vc { + self.ident + } +}