turbopack_resolve/
resolve_options_context.rs1use anyhow::Result;
2use bincode::{Decode, Encode};
3use turbo_rcstr::RcStr;
4use turbo_tasks::{NonLocalValue, ResolvedVc, ValueDefault, Vc, trace::TraceRawVcs};
5use turbo_tasks_fs::FileSystemPath;
6use turbopack_core::{
7 condition::ContextCondition,
8 environment::Environment,
9 resolve::{
10 options::{ConditionValue, ImportMap, ResolvedMap},
11 plugin::{AfterResolvePlugin, BeforeResolvePlugin},
12 },
13};
14
15#[derive(Default, Debug, Clone, TraceRawVcs, PartialEq, Eq, NonLocalValue, Encode, Decode)]
16pub enum TsConfigHandling {
17 Disabled,
19 #[default]
20 ContextFile,
22 Fixed(FileSystemPath),
25}
26
27#[turbo_tasks::value(shared)]
28#[derive(Default, Clone)]
29pub struct ResolveOptionsContext {
30 pub emulate_environment: Option<ResolvedVc<Environment>>,
34 pub enable_types: bool,
35 pub enable_typescript: bool,
36 pub enable_react: bool,
37 pub enable_node_native_modules: bool,
38 pub enable_mjs_extension: bool,
40 pub enable_node_modules: Option<FileSystemPath>,
43 pub tsconfig_path: TsConfigHandling,
46 pub enable_node_externals: bool,
49 pub enable_edge_node_externals: bool,
52 pub browser: bool,
54 pub module: bool,
56 pub module_sync: ConditionValue,
58 pub custom_conditions: Vec<RcStr>,
59 pub custom_extensions: Option<Vec<RcStr>>,
60 pub import_map: Option<ResolvedVc<ImportMap>>,
66 pub fallback_import_map: Option<ResolvedVc<ImportMap>>,
72 pub resolved_map: Option<ResolvedVc<ResolvedMap>>,
74 pub rules: Vec<(ContextCondition, ResolvedVc<ResolveOptionsContext>)>,
77 pub after_resolve_plugins: Vec<ResolvedVc<Box<dyn AfterResolvePlugin>>>,
79 pub before_resolve_plugins: Vec<ResolvedVc<Box<dyn BeforeResolvePlugin>>>,
80 pub loose_errors: bool,
82 pub collect_affecting_sources: bool,
84
85 pub placeholder_for_future_extensions: (),
86}
87
88#[turbo_tasks::value_impl]
89impl ResolveOptionsContext {
90 #[turbo_tasks::function]
91 pub async fn with_types_enabled(self: Vc<Self>) -> Result<Vc<Self>> {
92 let mut clone = self.owned().await?;
93 clone.enable_types = true;
94 clone.enable_typescript = true;
95 Ok(Self::cell(clone))
96 }
97
98 #[turbo_tasks::function]
101 pub async fn with_extended_import_map(
102 self: Vc<Self>,
103 import_map: Vc<ImportMap>,
104 ) -> Result<Vc<Self>> {
105 let mut resolve_options_context = self.owned().await?;
106 resolve_options_context.import_map = Some(
107 resolve_options_context
108 .import_map
109 .map(|current_import_map| current_import_map.extend(import_map))
110 .unwrap_or(import_map)
111 .to_resolved()
112 .await?,
113 );
114 Ok(resolve_options_context.cell())
115 }
116
117 #[turbo_tasks::function]
120 pub async fn with_extended_fallback_import_map(
121 self: Vc<Self>,
122 fallback_import_map: Vc<ImportMap>,
123 ) -> Result<Vc<Self>> {
124 let mut resolve_options_context = self.owned().await?;
125 resolve_options_context.fallback_import_map = Some(
126 resolve_options_context
127 .fallback_import_map
128 .map(|current_fallback_import_map| {
129 current_fallback_import_map.extend(fallback_import_map)
130 })
131 .unwrap_or(fallback_import_map)
132 .to_resolved()
133 .await?,
134 );
135 Ok(resolve_options_context.cell())
136 }
137}
138
139#[turbo_tasks::value_impl]
140impl ValueDefault for ResolveOptionsContext {
141 #[turbo_tasks::function]
142 fn value_default() -> Vc<Self> {
143 Self::cell(Default::default())
144 }
145}