Skip to main content

turbopack_ecmascript/hmr/
content.rs

1use anyhow::{Result, bail};
2use turbo_tasks::{ResolvedVc, TryJoinIterExt, Vc};
3use turbopack_core::{
4    asset::AssetContent,
5    version::{Update, Version, VersionedContent},
6};
7
8use crate::hmr::{
9    EcmascriptHmrChunkContent, update::update_ecmascript_merged_chunk,
10    version::EcmascriptMergedChunkVersion,
11};
12
13/// Composite [`VersionedContent`] that is the result of merging multiple
14/// Ecmascript chunk contents together through the
15/// [`super::merger::EcmascriptChunkContentMerger`]. This allows a chunk
16/// list to produce a single `EcmascriptMergedUpdate` for multiple chunks updating
17/// at the same time.
18///
19/// "Merged" here refers to [`turbopack_core::version::VersionedContentMerger`]
20/// combining several chunks into one update payload.
21#[turbo_tasks::value(serialization = "skip", shared)]
22pub struct EcmascriptMergedChunkContent {
23    pub contents: Vec<ResolvedVc<Box<dyn EcmascriptHmrChunkContent>>>,
24}
25
26#[turbo_tasks::value_impl]
27impl EcmascriptMergedChunkContent {
28    #[turbo_tasks::function]
29    pub async fn version(&self) -> Result<Vc<EcmascriptMergedChunkVersion>> {
30        Ok(EcmascriptMergedChunkVersion {
31            versions: self
32                .contents
33                .iter()
34                .map(|content| async move { content.ecmascript_chunk_version().await })
35                .try_join()
36                .await?,
37        }
38        .cell())
39    }
40}
41
42#[turbo_tasks::value_impl]
43impl VersionedContent for EcmascriptMergedChunkContent {
44    #[turbo_tasks::function]
45    fn content(self: Vc<Self>) -> Result<Vc<AssetContent>> {
46        bail!("EcmascriptMergedChunkContent does not have content")
47    }
48
49    #[turbo_tasks::function]
50    fn version(self: Vc<Self>) -> Vc<Box<dyn Version>> {
51        Vc::upcast(self.version())
52    }
53
54    #[turbo_tasks::function]
55    async fn update(
56        self: Vc<Self>,
57        from_version: ResolvedVc<Box<dyn Version>>,
58    ) -> Result<Vc<Update>> {
59        Ok(update_ecmascript_merged_chunk(self, from_version)
60            .await?
61            .cell())
62    }
63}