turbopack_ecmascript/side_effect_optimization/facade/
chunk_item.rs1use 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#[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}