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)]
18pub struct TsConfigReference {
19    pub tsconfig: 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(origin: ResolvedVc<Box<dyn ResolveOrigin>>, tsconfig: FileSystemPath) -> Vc<Self> {
27        Self::cell(TsConfigReference { tsconfig, origin })
28    }
29}
30
31#[turbo_tasks::value_impl]
32impl ModuleReference for TsConfigReference {
33    #[turbo_tasks::function]
34    async fn resolve_reference(&self) -> Result<Vc<ModuleResolveResult>> {
35        Ok(*ModuleResolveResult::module(ResolvedVc::upcast(
36            TsConfigModuleAsset::new(
37                *self.origin,
38                Vc::upcast(FileSource::new(self.tsconfig.clone())),
39            )
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.value_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                .await?
80                .parent()
81                .try_join(&self.path)?
82            {
83                let module = self
84                    .origin
85                    .asset_context()
86                    .process(
87                        Vc::upcast(FileSource::new(path.clone())),
88                        ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined),
89                    )
90                    .module()
91                    .to_resolved()
92                    .await?;
93                *ModuleResolveResult::module(module)
94            } else {
95                *ModuleResolveResult::unresolvable()
96            },
97        )
98    }
99}
100
101#[turbo_tasks::value_impl]
102impl ValueToString for TsReferencePathAssetReference {
103    #[turbo_tasks::function]
104    fn to_string(&self) -> Vc<RcStr> {
105        Vc::cell(format!("typescript reference path comment {}", self.path,).into())
106    }
107}
108
109#[turbo_tasks::value]
110#[derive(Hash, Debug)]
111pub struct TsReferenceTypeAssetReference {
112    pub origin: ResolvedVc<Box<dyn ResolveOrigin>>,
113    pub module: RcStr,
114}
115
116#[turbo_tasks::value_impl]
117impl TsReferenceTypeAssetReference {
118    #[turbo_tasks::function]
119    pub fn new(origin: ResolvedVc<Box<dyn ResolveOrigin>>, module: RcStr) -> Vc<Self> {
120        Self::cell(TsReferenceTypeAssetReference { origin, module })
121    }
122}
123
124#[turbo_tasks::value_impl]
125impl ModuleReference for TsReferenceTypeAssetReference {
126    #[turbo_tasks::function]
127    fn resolve_reference(&self) -> Vc<ModuleResolveResult> {
128        type_resolve(
129            *self.origin,
130            Request::module(
131                self.module.clone(),
132                RcStr::default().into(),
133                RcStr::default(),
134                RcStr::default(),
135            ),
136        )
137    }
138}
139
140#[turbo_tasks::value_impl]
141impl ValueToString for TsReferenceTypeAssetReference {
142    #[turbo_tasks::function]
143    fn to_string(&self) -> Vc<RcStr> {
144        Vc::cell(format!("typescript reference type comment {}", self.module,).into())
145    }
146}