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, 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}