Skip to main content

next_core/next_app/
app_client_shared_chunks.rs

1use anyhow::Result;
2use tracing::Instrument;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbopack_core::{
5    chunk::{
6        ChunkGroupResult, ChunkingContext, EvaluatableAssets, availability_info::AvailabilityInfo,
7    },
8    ident::AssetIdent,
9    module_graph::{ModuleGraph, chunk_group_info::ChunkGroup},
10    output::OutputAssets,
11};
12
13#[turbo_tasks::function]
14pub async fn get_app_client_shared_chunk_group(
15    ident: Vc<AssetIdent>,
16    app_client_runtime_entries: Vc<EvaluatableAssets>,
17    module_graph: Vc<ModuleGraph>,
18    client_chunking_context: Vc<Box<dyn ChunkingContext>>,
19) -> Result<Vc<ChunkGroupResult>> {
20    if app_client_runtime_entries.await?.is_empty() {
21        return Ok(ChunkGroupResult::empty());
22    }
23
24    let span = tracing::trace_span!("app client shared");
25    let app_client_shared_chunk_group = async {
26        client_chunking_context
27            .evaluated_chunk_group(
28                ident,
29                ChunkGroup::Entry(
30                    app_client_runtime_entries
31                        .await?
32                        .iter()
33                        .map(|v| ResolvedVc::upcast(*v))
34                        .collect(),
35                ),
36                module_graph,
37                // The shared chunk group must stay shared across pages; page-specific HMR
38                // chunks (e.g. client references) are routed through a separate page-specific
39                // evaluated chunk group instead.
40                OutputAssets::empty(),
41                AvailabilityInfo::root(),
42            )
43            .to_resolved()
44            .await
45            .map(|r| *r)
46    }
47    .instrument(span)
48    .await?;
49
50    Ok(app_client_shared_chunk_group)
51}