turbopack_core/
context.rs1use anyhow::{Result, bail};
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::FileSystemPath;
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(self: Vc<Self>, origin_path: FileSystemPath) -> Vc<ResolveOptions>;
73
74 #[turbo_tasks::function]
76 fn resolve_asset(
77 self: Vc<Self>,
78 origin_path: FileSystemPath,
79 request: Vc<Request>,
80 resolve_options: Vc<ResolveOptions>,
81 reference_type: ReferenceType,
82 ) -> Vc<ModuleResolveResult>;
83
84 #[turbo_tasks::function]
86 fn process(
87 self: Vc<Self>,
88 asset: Vc<Box<dyn Source>>,
89 reference_type: ReferenceType,
90 ) -> Vc<ProcessResult>;
91
92 #[turbo_tasks::function]
94 fn process_resolve_result(
95 self: Vc<Self>,
96 result: Vc<ResolveResult>,
97 reference_type: ReferenceType,
98 ) -> Vc<ModuleResolveResult>;
99
100 #[turbo_tasks::function]
102 fn with_transition(self: Vc<Self>, transition: RcStr) -> Vc<Box<dyn AssetContext>>;
103}