turbopack_resolve/
resolve_options_context.rs1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, ValueDefault, Vc};
4use turbo_tasks_fs::FileSystemPath;
5use turbopack_core::{
6 condition::ContextCondition,
7 environment::Environment,
8 resolve::{
9 options::{ImportMap, ResolvedMap},
10 plugin::{AfterResolvePlugin, BeforeResolvePlugin},
11 },
12};
13
14#[turbo_tasks::value(shared)]
15#[derive(Default, Clone)]
16pub struct ResolveOptionsContext {
17 pub emulate_environment: Option<ResolvedVc<Environment>>,
18 pub enable_types: bool,
19 pub enable_typescript: bool,
20 pub enable_react: bool,
21 pub enable_node_native_modules: bool,
22 pub enable_mjs_extension: bool,
24 pub enable_node_modules: Option<FileSystemPath>,
27 pub tsconfig_path: Option<FileSystemPath>,
30 pub enable_node_externals: bool,
33 pub enable_edge_node_externals: bool,
36 pub browser: bool,
38 pub module: bool,
40 pub custom_conditions: Vec<RcStr>,
41 pub custom_extensions: Option<Vec<RcStr>>,
42 pub import_map: Option<ResolvedVc<ImportMap>>,
48 pub fallback_import_map: Option<ResolvedVc<ImportMap>>,
54 pub resolved_map: Option<ResolvedVc<ResolvedMap>>,
56 pub rules: Vec<(ContextCondition, ResolvedVc<ResolveOptionsContext>)>,
59 pub after_resolve_plugins: Vec<ResolvedVc<Box<dyn AfterResolvePlugin>>>,
61 pub before_resolve_plugins: Vec<ResolvedVc<Box<dyn BeforeResolvePlugin>>>,
62 pub loose_errors: bool,
64 pub collect_affecting_sources: bool,
66
67 pub placeholder_for_future_extensions: (),
68}
69
70#[turbo_tasks::value_impl]
71impl ResolveOptionsContext {
72 #[turbo_tasks::function]
73 pub async fn with_types_enabled(self: Vc<Self>) -> Result<Vc<Self>> {
74 let mut clone = self.owned().await?;
75 clone.enable_types = true;
76 clone.enable_typescript = true;
77 Ok(Self::cell(clone))
78 }
79
80 #[turbo_tasks::function]
83 pub async fn with_extended_import_map(
84 self: Vc<Self>,
85 import_map: Vc<ImportMap>,
86 ) -> Result<Vc<Self>> {
87 let mut resolve_options_context = self.owned().await?;
88 resolve_options_context.import_map = Some(
89 resolve_options_context
90 .import_map
91 .map(|current_import_map| current_import_map.extend(import_map))
92 .unwrap_or(import_map)
93 .to_resolved()
94 .await?,
95 );
96 Ok(resolve_options_context.cell())
97 }
98
99 #[turbo_tasks::function]
102 pub async fn with_extended_fallback_import_map(
103 self: Vc<Self>,
104 fallback_import_map: Vc<ImportMap>,
105 ) -> Result<Vc<Self>> {
106 let mut resolve_options_context = self.owned().await?;
107 resolve_options_context.fallback_import_map = Some(
108 resolve_options_context
109 .fallback_import_map
110 .map(|current_fallback_import_map| {
111 current_fallback_import_map.extend(fallback_import_map)
112 })
113 .unwrap_or(fallback_import_map)
114 .to_resolved()
115 .await?,
116 );
117 Ok(resolve_options_context.cell())
118 }
119}
120
121#[turbo_tasks::value_impl]
122impl ValueDefault for ResolveOptionsContext {
123 #[turbo_tasks::function]
124 fn value_default() -> Vc<Self> {
125 Self::cell(Default::default())
126 }
127}