turbopack_css/chunk/
source_map.rs

1use anyhow::Result;
2use turbo_rcstr::rcstr;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::{File, FileContent, FileSystemPath};
5use turbopack_core::{
6    asset::{Asset, AssetContent},
7    chunk::ChunkingContext,
8    output::{OutputAsset, OutputAssetsReference},
9    source_map::{GenerateSourceMap, SourceMap},
10};
11
12use super::CssChunk;
13
14/// Represents the source map of an css chunk.
15#[turbo_tasks::value]
16pub struct CssChunkSourceMapAsset {
17    chunk: ResolvedVc<CssChunk>,
18}
19
20#[turbo_tasks::value_impl]
21impl CssChunkSourceMapAsset {
22    #[turbo_tasks::function]
23    pub fn new(chunk: ResolvedVc<CssChunk>) -> Vc<Self> {
24        CssChunkSourceMapAsset { chunk }.cell()
25    }
26}
27
28#[turbo_tasks::value_impl]
29impl OutputAssetsReference for CssChunkSourceMapAsset {}
30
31#[turbo_tasks::value_impl]
32impl OutputAsset for CssChunkSourceMapAsset {
33    #[turbo_tasks::function]
34    async fn path(self: Vc<Self>) -> Result<Vc<FileSystemPath>> {
35        let this = self.await?;
36        let ident = this.chunk.ident_for_path();
37        Ok(this
38            .chunk
39            .await?
40            .chunking_context
41            .chunk_path(Some(Vc::upcast(self)), ident, None, rcstr!(".css"))
42            .await?
43            .append(".map")?
44            .cell())
45    }
46}
47
48#[turbo_tasks::value_impl]
49impl Asset for CssChunkSourceMapAsset {
50    #[turbo_tasks::function]
51    async fn content(&self) -> Result<Vc<AssetContent>> {
52        let content = self.chunk.generate_source_map();
53        if content.await?.is_content() {
54            Ok(AssetContent::file(content))
55        } else {
56            Ok(AssetContent::file(
57                FileContent::Content(File::from(SourceMap::empty_rope())).cell(),
58            ))
59        }
60    }
61}