Skip to main content

turbopack_ecmascript/references/
typescript.rs

1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, 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, ValueToString)]
18#[value_to_string("tsconfig {tsconfig}")]
19pub struct TsConfigReference {
20    pub tsconfig: FileSystemPath,
21    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
22}
23
24#[turbo_tasks::value_impl]
25impl TsConfigReference {
26    #[turbo_tasks::function]
27    pub fn new(origin: ResolvedVc<Box<dyn ResolveOrigin>>, tsconfig: FileSystemPath) -> Vc<Self> {
28        Self::cell(TsConfigReference { tsconfig, origin })
29    }
30}
31
32#[turbo_tasks::value_impl]
33impl ModuleReference for TsConfigReference {
34    #[turbo_tasks::function]
35    async fn resolve_reference(&self) -> Result<Vc<ModuleResolveResult>> {
36        Ok(*ModuleResolveResult::module(ResolvedVc::upcast(
37            TsConfigModuleAsset::new(
38                *self.origin,
39                Vc::upcast(FileSource::new(self.tsconfig.clone())),
40            )
41            .to_resolved()
42            .await?,
43        )))
44    }
45}
46
47#[turbo_tasks::value]
48#[derive(Hash, Debug, ValueToString)]
49#[value_to_string("typescript reference path comment {path}")]
50pub struct TsReferencePathAssetReference {
51    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
52    pub path: RcStr,
53}
54
55#[turbo_tasks::value_impl]
56impl TsReferencePathAssetReference {
57    #[turbo_tasks::function]
58    pub fn new(origin: ResolvedVc<Box<dyn ResolveOrigin>>, path: RcStr) -> Vc<Self> {
59        Self::cell(TsReferencePathAssetReference { origin, path })
60    }
61}
62
63#[turbo_tasks::value_impl]
64impl ModuleReference for TsReferencePathAssetReference {
65    #[turbo_tasks::function]
66    async fn resolve_reference(&self) -> Result<Vc<ModuleResolveResult>> {
67        Ok(
68            if let Some(path) = self
69                .origin
70                .origin_path()
71                .await?
72                .parent()
73                .try_join(&self.path)
74            {
75                let module = self
76                    .origin
77                    .asset_context()
78                    .process(
79                        Vc::upcast(FileSource::new(path.clone())),
80                        ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined),
81                    )
82                    .module()
83                    .to_resolved()
84                    .await?;
85                *ModuleResolveResult::module(module)
86            } else {
87                *ModuleResolveResult::unresolvable()
88            },
89        )
90    }
91}
92
93#[turbo_tasks::value]
94#[derive(Hash, Debug, ValueToString)]
95#[value_to_string("typescript reference type comment {module}")]
96pub struct TsReferenceTypeAssetReference {
97    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
98    pub module: RcStr,
99}
100
101#[turbo_tasks::value_impl]
102impl TsReferenceTypeAssetReference {
103    #[turbo_tasks::function]
104    pub fn new(origin: ResolvedVc<Box<dyn ResolveOrigin>>, module: RcStr) -> Vc<Self> {
105        Self::cell(TsReferenceTypeAssetReference { origin, module })
106    }
107}
108
109#[turbo_tasks::value_impl]
110impl ModuleReference for TsReferenceTypeAssetReference {
111    #[turbo_tasks::function]
112    fn resolve_reference(&self) -> Vc<ModuleResolveResult> {
113        type_resolve(
114            *self.origin,
115            Request::module(
116                self.module.clone().into(),
117                RcStr::default().into(),
118                RcStr::default(),
119                RcStr::default(),
120            ),
121        )
122    }
123}