turbopack_core/
context.rs1use anyhow::{Result, bail};
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::{FileSystemPath, glob::Glob};
5
6use crate::{
7 compile_time_info::CompileTimeInfo,
8 ident::Layer,
9 issue::module::emit_unknown_module_type_error,
10 module::{Module, OptionModule},
11 reference_type::ReferenceType,
12 resolve::{ModuleResolveResult, ResolveResult, options::ResolveOptions, parse::Request},
13 source::Source,
14};
15
16#[turbo_tasks::value(shared)]
17pub enum ProcessResult {
18 Module(ResolvedVc<Box<dyn Module>>),
20
21 Unknown(ResolvedVc<Box<dyn Source>>),
23
24 Ignore,
27}
28
29#[turbo_tasks::value_impl]
30impl ProcessResult {
31 #[turbo_tasks::function]
32 pub fn module(&self) -> Result<Vc<Box<dyn Module>>> {
33 match *self {
34 ProcessResult::Module(m) => Ok(*m),
35 ProcessResult::Ignore => {
36 bail!("Expected process result to be a module, but it was ignored")
37 }
38 ProcessResult::Unknown(_) => {
39 bail!("Expected process result to be a module, but it could not be processed")
40 }
41 }
42 }
43
44 #[turbo_tasks::function]
46 pub async fn try_into_module(&self) -> Result<Vc<OptionModule>> {
47 Ok(Vc::cell(match self {
48 ProcessResult::Module(module) => Some(*module),
49 ProcessResult::Unknown(source) => {
50 emit_unknown_module_type_error(**source).await?;
51 None
52 }
53 ProcessResult::Ignore => None,
54 }))
55 }
56}
57
58#[turbo_tasks::value_trait]
62pub trait AssetContext {
63 #[turbo_tasks::function]
65 fn compile_time_info(self: Vc<Self>) -> Vc<CompileTimeInfo>;
66
67 fn layer(&self) -> Layer;
69
70 #[turbo_tasks::function]
72 fn resolve_options(
73 self: Vc<Self>,
74 origin_path: FileSystemPath,
75 reference_type: ReferenceType,
76 ) -> Vc<ResolveOptions>;
77
78 #[turbo_tasks::function]
80 fn resolve_asset(
81 self: Vc<Self>,
82 origin_path: FileSystemPath,
83 request: Vc<Request>,
84 resolve_options: Vc<ResolveOptions>,
85 reference_type: ReferenceType,
86 ) -> Vc<ModuleResolveResult>;
87
88 #[turbo_tasks::function]
90 fn process(
91 self: Vc<Self>,
92 asset: Vc<Box<dyn Source>>,
93 reference_type: ReferenceType,
94 ) -> Vc<ProcessResult>;
95
96 #[turbo_tasks::function]
98 fn process_resolve_result(
99 self: Vc<Self>,
100 result: Vc<ResolveResult>,
101 reference_type: ReferenceType,
102 ) -> Vc<ModuleResolveResult>;
103
104 #[turbo_tasks::function]
106 fn with_transition(self: Vc<Self>, transition: RcStr) -> Vc<Box<dyn AssetContext>>;
107
108 #[turbo_tasks::function]
109 fn side_effect_free_packages(self: Vc<Self>) -> Vc<Glob>;
110}