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