1use turbo_rcstr::{RcStr, rcstr};
2use turbo_tasks::{ResolvedVc, Vc};
3use turbopack_core::{
4 chunk::ChunkingContext,
5 ident::AssetIdent,
6 module::{Module, ModuleSideEffects},
7 output::OutputAsset,
8 source::Source,
9};
10use turbopack_css::embed::CssEmbed;
11
12use crate::output_asset::StaticOutputAsset;
13
14#[turbo_tasks::value]
15#[derive(Clone)]
16pub struct StaticUrlCssModule {
17 pub source: ResolvedVc<Box<dyn Source>>,
18 tag: Option<RcStr>,
19}
20
21#[turbo_tasks::value_impl]
22impl StaticUrlCssModule {
23 #[turbo_tasks::function]
24 pub fn new(source: ResolvedVc<Box<dyn Source>>, tag: Option<RcStr>) -> Vc<Self> {
25 Self::cell(StaticUrlCssModule { source, tag })
26 }
27
28 #[turbo_tasks::function]
29 fn static_output_asset(
30 &self,
31 chunking_context: ResolvedVc<Box<dyn ChunkingContext>>,
32 ) -> Vc<StaticOutputAsset> {
33 StaticOutputAsset::new(*chunking_context, *self.source, self.tag.clone())
34 }
35}
36
37#[turbo_tasks::value_impl]
38impl Module for StaticUrlCssModule {
39 #[turbo_tasks::function]
40 fn ident(&self) -> Vc<AssetIdent> {
41 let mut ident = self.source.ident().with_modifier(rcstr!("static in css"));
42 if let Some(tag) = &self.tag {
43 ident = ident.with_modifier(format!("tag {}", tag).into());
44 }
45 ident
46 }
47
48 #[turbo_tasks::function]
49 fn source(&self) -> Vc<turbopack_core::source::OptionSource> {
50 Vc::cell(Some(self.source))
51 }
52
53 #[turbo_tasks::function]
54 fn side_effects(self: Vc<Self>) -> Vc<ModuleSideEffects> {
55 ModuleSideEffects::SideEffectFree.cell()
56 }
57}
58
59#[turbo_tasks::value_impl]
60impl CssEmbed for StaticUrlCssModule {
61 #[turbo_tasks::function]
62 fn embedded_asset(
63 self: Vc<Self>,
64 chunking_context: Vc<Box<dyn ChunkingContext>>,
65 ) -> Vc<Box<dyn OutputAsset>> {
66 Vc::upcast(self.static_output_asset(chunking_context))
67 }
68}