turbopack_ecmascript/side_effect_optimization/facade/
chunk_item.rs

1use anyhow::Result;
2use turbo_tasks::{ResolvedVc, Vc};
3use turbopack_core::{
4    chunk::{AsyncModuleInfo, ChunkItem, ChunkType, ChunkingContext},
5    ident::AssetIdent,
6    module::Module,
7    module_graph::ModuleGraph,
8};
9
10use super::module::EcmascriptModuleFacadeModule;
11use crate::{
12    EcmascriptAnalyzable, EcmascriptOptions,
13    chunk::{
14        EcmascriptChunkItem, EcmascriptChunkItemContent, EcmascriptChunkPlaceable,
15        EcmascriptChunkType,
16    },
17};
18
19/// The chunk item for [EcmascriptModuleFacadeModule].
20#[turbo_tasks::value(shared)]
21pub struct EcmascriptModuleFacadeChunkItem {
22    pub(crate) module: ResolvedVc<EcmascriptModuleFacadeModule>,
23    pub(crate) module_graph: ResolvedVc<ModuleGraph>,
24    pub(crate) chunking_context: ResolvedVc<Box<dyn ChunkingContext>>,
25}
26
27#[turbo_tasks::value_impl]
28impl EcmascriptChunkItem for EcmascriptModuleFacadeChunkItem {
29    #[turbo_tasks::function]
30    fn content(self: Vc<Self>) -> Vc<EcmascriptChunkItemContent> {
31        panic!("content() should never be called");
32    }
33
34    #[turbo_tasks::function]
35    async fn content_with_async_module_info(
36        &self,
37        async_module_info: Option<Vc<AsyncModuleInfo>>,
38    ) -> Result<Vc<EcmascriptChunkItemContent>> {
39        let chunking_context = self.chunking_context;
40        let module_graph = self.module_graph;
41
42        let content =
43            self.module
44                .module_content(*module_graph, *chunking_context, async_module_info);
45
46        let async_module_options = self
47            .module
48            .get_async_module()
49            .module_options(async_module_info);
50
51        Ok(EcmascriptChunkItemContent::new(
52            content,
53            *chunking_context,
54            EcmascriptOptions::default().cell(),
55            async_module_options,
56        ))
57    }
58}
59
60#[turbo_tasks::value_impl]
61impl ChunkItem for EcmascriptModuleFacadeChunkItem {
62    #[turbo_tasks::function]
63    fn asset_ident(&self) -> Vc<AssetIdent> {
64        self.module.ident()
65    }
66
67    #[turbo_tasks::function]
68    fn chunking_context(&self) -> Vc<Box<dyn ChunkingContext>> {
69        *ResolvedVc::upcast(self.chunking_context)
70    }
71
72    #[turbo_tasks::function]
73    async fn ty(&self) -> Result<Vc<Box<dyn ChunkType>>> {
74        Ok(Vc::upcast(
75            Vc::<EcmascriptChunkType>::default().resolve().await?,
76        ))
77    }
78
79    #[turbo_tasks::function]
80    fn module(&self) -> Vc<Box<dyn Module>> {
81        *ResolvedVc::upcast(self.module)
82    }
83}