turbopack_ecmascript/references/
typescript.rs1use 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}