turbopack_ecmascript/text/
mod.rs1use anyhow::Result;
2use turbo_rcstr::{RcStr, rcstr};
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::FileContent;
5use turbopack_core::{
6 asset::{Asset, AssetContent},
7 ident::AssetIdent,
8 source::Source,
9};
10
11use crate::utils::StringifyJs;
12
13#[turbo_tasks::value]
16pub struct TextContentFileSource {
17 pub source: ResolvedVc<Box<dyn Source>>,
18}
19
20#[turbo_tasks::value_impl]
21impl TextContentFileSource {
22 #[turbo_tasks::function]
23 pub fn new(source: ResolvedVc<Box<dyn Source>>) -> Vc<Self> {
24 TextContentFileSource { source }.cell()
25 }
26}
27
28#[turbo_tasks::value_impl]
29impl Source for TextContentFileSource {
30 #[turbo_tasks::function]
31 fn ident(&self) -> Vc<AssetIdent> {
32 self.source
33 .ident()
34 .with_modifier(rcstr!("text content"))
35 .rename_as(rcstr!("*.mjs"))
36 }
37
38 #[turbo_tasks::function]
39 async fn description(&self) -> Result<Vc<RcStr>> {
40 let inner = self.source.description().await?;
41 Ok(Vc::cell(format!("text content of {}", inner).into()))
42 }
43}
44
45#[turbo_tasks::value_impl]
46impl Asset for TextContentFileSource {
47 #[turbo_tasks::function]
48 async fn content(&self) -> Result<Vc<AssetContent>> {
49 let source = self.source.content().file_content();
50 let FileContent::Content(content) = &*source.await? else {
51 return Ok(AssetContent::file(FileContent::NotFound.cell()));
52 };
53 let text = content.content().to_str()?;
54 let code: RcStr = format!("export default {};", StringifyJs(&text)).into();
55 let content = FileContent::Content(code.into()).cell();
56 Ok(AssetContent::file(content))
57 }
58}