turbopack_core/
proxied_asset.rs

1use turbo_tasks::{ResolvedVc, Vc};
2use turbo_tasks_fs::FileSystemPath;
3
4use crate::{
5    asset::{Asset, AssetContent},
6    output::{OutputAsset, OutputAssetsReference, OutputAssetsWithReferenced},
7    version::VersionedContent,
8};
9
10/// An [`Asset`] with an overwritten path.
11///
12/// This is helpful to expose an asset at a different path than it was originally set up to be, e.g.
13/// to expose layout CSS chunks under the server FS instead of the output FS when rendering
14/// Next.js apps.
15#[turbo_tasks::value]
16pub struct ProxiedAsset {
17    asset: ResolvedVc<Box<dyn OutputAsset>>,
18    path: FileSystemPath,
19}
20
21#[turbo_tasks::value_impl]
22impl ProxiedAsset {
23    /// Creates a new [`ProxiedAsset`] from an [`Asset`] and a path.
24    #[turbo_tasks::function]
25    pub fn new(asset: ResolvedVc<Box<dyn OutputAsset>>, path: FileSystemPath) -> Vc<Self> {
26        ProxiedAsset { asset, path }.cell()
27    }
28}
29
30#[turbo_tasks::value_impl]
31impl OutputAssetsReference for ProxiedAsset {
32    #[turbo_tasks::function]
33    fn references(&self) -> Vc<OutputAssetsWithReferenced> {
34        self.asset.references()
35    }
36}
37
38#[turbo_tasks::value_impl]
39impl OutputAsset for ProxiedAsset {
40    #[turbo_tasks::function]
41    fn path(&self) -> Vc<FileSystemPath> {
42        self.path.clone().cell()
43    }
44}
45
46#[turbo_tasks::value_impl]
47impl Asset for ProxiedAsset {
48    #[turbo_tasks::function]
49    fn content(&self) -> Vc<AssetContent> {
50        self.asset.content()
51    }
52
53    #[turbo_tasks::function]
54    fn versioned_content(&self) -> Vc<Box<dyn VersionedContent>> {
55        self.asset.versioned_content()
56    }
57}