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