turbopack_ecmascript/references/
typescript.rs

1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, Value, ValueToString, Vc};
4use turbo_tasks_fs::FileSystemPath;
5use turbopack_core::{
6    context::AssetContext,
7    file_source::FileSource,
8    reference::ModuleReference,
9    reference_type::{ReferenceType, TypeScriptReferenceSubType},
10    resolve::{ModuleResolveResult, origin::ResolveOrigin, parse::Request},
11};
12use turbopack_resolve::typescript::type_resolve;
13
14use crate::typescript::TsConfigModuleAsset;
15
16#[turbo_tasks::value]
17#[derive(Hash, Clone, Debug)]
18pub struct TsConfigReference {
19    pub tsconfig: ResolvedVc<FileSystemPath>,
20    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
21}
22
23#[turbo_tasks::value_impl]
24impl TsConfigReference {
25    #[turbo_tasks::function]
26    pub fn new(
27        origin: ResolvedVc<Box<dyn ResolveOrigin>>,
28        tsconfig: ResolvedVc<FileSystemPath>,
29    ) -> Vc<Self> {
30        Self::cell(TsConfigReference { tsconfig, origin })
31    }
32}
33
34#[turbo_tasks::value_impl]
35impl ModuleReference for TsConfigReference {
36    #[turbo_tasks::function]
37    async fn resolve_reference(&self) -> Result<Vc<ModuleResolveResult>> {
38        Ok(*ModuleResolveResult::module(ResolvedVc::upcast(
39            TsConfigModuleAsset::new(*self.origin, Vc::upcast(FileSource::new(*self.tsconfig)))
40                .to_resolved()
41                .await?,
42        )))
43    }
44}
45
46#[turbo_tasks::value_impl]
47impl ValueToString for TsConfigReference {
48    #[turbo_tasks::function]
49    async fn to_string(&self) -> Result<Vc<RcStr>> {
50        Ok(Vc::cell(
51            format!("tsconfig {}", self.tsconfig.to_string().await?,).into(),
52        ))
53    }
54}
55
56#[turbo_tasks::value]
57#[derive(Hash, Debug)]
58pub struct TsReferencePathAssetReference {
59    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
60    pub path: RcStr,
61}
62
63#[turbo_tasks::value_impl]
64impl TsReferencePathAssetReference {
65    #[turbo_tasks::function]
66    pub fn new(origin: ResolvedVc<Box<dyn ResolveOrigin>>, path: RcStr) -> Vc<Self> {
67        Self::cell(TsReferencePathAssetReference { origin, path })
68    }
69}
70
71#[turbo_tasks::value_impl]
72impl ModuleReference for TsReferencePathAssetReference {
73    #[turbo_tasks::function]
74    async fn resolve_reference(&self) -> Result<Vc<ModuleResolveResult>> {
75        Ok(
76            if let Some(path) = &*self
77                .origin
78                .origin_path()
79                .parent()
80                .try_join(self.path.clone())
81                .await?
82            {
83                let module = self
84                    .origin
85                    .asset_context()
86                    .process(
87                        Vc::upcast(FileSource::new(**path)),
88                        Value::new(ReferenceType::TypeScript(
89                            TypeScriptReferenceSubType::Undefined,
90                        )),
91                    )
92                    .module()
93                    .to_resolved()
94                    .await?;
95                *ModuleResolveResult::module(module)
96            } else {
97                *ModuleResolveResult::unresolvable()
98            },
99        )
100    }
101}
102
103#[turbo_tasks::value_impl]
104impl ValueToString for TsReferencePathAssetReference {
105    #[turbo_tasks::function]
106    async fn to_string(&self) -> Vc<RcStr> {
107        Vc::cell(format!("typescript reference path comment {}", self.path,).into())
108    }
109}
110
111#[turbo_tasks::value]
112#[derive(Hash, Debug)]
113pub struct TsReferenceTypeAssetReference {
114    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
115    pub module: RcStr,
116}
117
118#[turbo_tasks::value_impl]
119impl TsReferenceTypeAssetReference {
120    #[turbo_tasks::function]
121    pub fn new(origin: ResolvedVc<Box<dyn ResolveOrigin>>, module: RcStr) -> Vc<Self> {
122        Self::cell(TsReferenceTypeAssetReference { origin, module })
123    }
124}
125
126#[turbo_tasks::value_impl]
127impl ModuleReference for TsReferenceTypeAssetReference {
128    #[turbo_tasks::function]
129    fn resolve_reference(&self) -> Vc<ModuleResolveResult> {
130        type_resolve(
131            *self.origin,
132            Request::module(
133                self.module.clone(),
134                Value::new(RcStr::default().into()),
135                Vc::<RcStr>::default(),
136                Vc::<RcStr>::default(),
137            ),
138        )
139    }
140}
141
142#[turbo_tasks::value_impl]
143impl ValueToString for TsReferenceTypeAssetReference {
144    #[turbo_tasks::function]
145    async fn to_string(&self) -> Vc<RcStr> {
146        Vc::cell(format!("typescript reference type comment {}", self.module,).into())
147    }
148}