turbopack/module_options/
module_options_context.rs1use std::fmt::Debug;
2
3use anyhow::Result;
4use bincode::{Decode, Encode};
5use turbo_esregex::EsRegex;
6use turbo_rcstr::{RcStr, rcstr};
7use turbo_tasks::{NonLocalValue, ResolvedVc, ValueDefault, Vc};
8use turbo_tasks_fs::{
9 FileSystemPath,
10 glob::{Glob, GlobOptions},
11};
12use turbopack_core::{
13 chunk::SourceMapsType, compile_time_info::CompileTimeInfo, condition::ContextCondition,
14 environment::Environment, resolve::options::ImportMapping,
15};
16use turbopack_ecmascript::{
17 AnalyzeMode, TypeofWindow,
18 references::esm::UrlRewriteBehavior,
19 transform::{PresetEnvConfig, ReactCompilerCompilationMode, ReactCompilerTarget},
20};
21pub use turbopack_mdx::MdxTransformOptions;
22use turbopack_node::{
23 execution_context::ExecutionContext,
24 transforms::{postcss::PostCssTransformOptions, webpack::WebpackLoaderItems},
25};
26
27use super::ModuleRule;
28use crate::module_options::RuleCondition;
29
30#[derive(Clone, PartialEq, Eq, Debug, NonLocalValue, Encode, Decode)]
31pub struct LoaderRuleItem {
32 pub loaders: ResolvedVc<WebpackLoaderItems>,
33 pub rename_as: Option<RcStr>,
34 pub condition: Option<ConditionItem>,
35 pub module_type: Option<RcStr>,
36}
37
38#[derive(Default)]
44#[turbo_tasks::value(transparent)]
45pub struct WebpackRules(Vec<(RcStr, LoaderRuleItem)>);
46
47#[derive(Clone, PartialEq, Eq, Debug, NonLocalValue, Encode, Decode)]
48pub enum ConditionPath {
49 Glob(RcStr),
50 Regex(ResolvedVc<EsRegex>),
51}
52
53#[derive(Clone, PartialEq, Eq, Debug, NonLocalValue, Encode, Decode)]
54pub enum ConditionQuery {
55 Constant(RcStr),
56 Regex(ResolvedVc<EsRegex>),
57}
58
59#[derive(Clone, PartialEq, Eq, Debug, NonLocalValue, Encode, Decode)]
60pub enum ConditionContentType {
61 Glob(RcStr),
62 Regex(ResolvedVc<EsRegex>),
63}
64
65#[turbo_tasks::value(shared)]
66#[derive(Clone, Debug)]
67pub enum ConditionItem {
68 All(Box<[ConditionItem]>),
69 Any(Box<[ConditionItem]>),
70 Not(Box<ConditionItem>),
71 Builtin(RcStr),
72 Base {
73 path: Option<ConditionPath>,
74 content: Option<ResolvedVc<EsRegex>>,
75 query: Option<ConditionQuery>,
76 content_type: Option<ConditionContentType>,
77 },
78}
79
80#[turbo_tasks::value(shared)]
81#[derive(Clone, Debug)]
82pub struct WebpackLoadersOptions {
83 pub rules: ResolvedVc<WebpackRules>,
84 pub builtin_conditions: ResolvedVc<Box<dyn WebpackLoaderBuiltinConditionSet>>,
85 pub loader_runner_package: Option<ResolvedVc<ImportMapping>>,
86 pub target: ResolvedVc<RcStr>,
87 pub mode: RcStr,
88}
89
90pub enum WebpackLoaderBuiltinConditionSetMatch {
91 Matched,
92 Unmatched,
93 Invalid,
95}
96
97#[turbo_tasks::value_trait]
100pub trait WebpackLoaderBuiltinConditionSet {
101 fn match_condition(&self, condition: &str) -> WebpackLoaderBuiltinConditionSetMatch;
104}
105
106#[turbo_tasks::value]
109pub struct EmptyWebpackLoaderBuiltinConditionSet;
110
111#[turbo_tasks::value_impl]
112impl EmptyWebpackLoaderBuiltinConditionSet {
113 #[turbo_tasks::function]
114 fn new() -> Vc<Box<dyn WebpackLoaderBuiltinConditionSet>> {
115 Vc::upcast::<Box<dyn WebpackLoaderBuiltinConditionSet>>(
116 EmptyWebpackLoaderBuiltinConditionSet.cell(),
117 )
118 }
119}
120
121#[turbo_tasks::value_impl]
122impl WebpackLoaderBuiltinConditionSet for EmptyWebpackLoaderBuiltinConditionSet {
123 fn match_condition(&self, _condition: &str) -> WebpackLoaderBuiltinConditionSetMatch {
124 WebpackLoaderBuiltinConditionSetMatch::Invalid
125 }
126}
127
128#[derive(Clone, PartialEq, Eq, Debug, NonLocalValue, Encode, Decode)]
132pub enum DecoratorsKind {
133 Ecma,
139
140 Legacy,
151}
152
153#[turbo_tasks::value(shared)]
160#[derive(Default, Clone, Debug)]
161pub struct DecoratorsOptions {
162 pub decorators_kind: Option<DecoratorsKind>,
163 pub emit_decorators_metadata: bool,
168 pub decorators_before_export: bool,
177 pub use_define_for_class_fields: bool,
178}
179
180#[turbo_tasks::value(shared)]
183#[derive(Default, Clone, Debug)]
184pub struct TypescriptTransformOptions {
185 pub use_define_for_class_fields: bool,
186 pub verbatim_module_syntax: bool,
187}
188
189#[turbo_tasks::value(shared)]
190#[derive(Default, Clone, Debug)]
191pub struct JsxTransformOptions {
192 pub development: bool,
193 pub react_refresh: bool,
194 pub import_source: Option<RcStr>,
195 pub runtime: Option<RcStr>,
196}
197
198#[turbo_tasks::value(shared)]
199#[derive(Clone, Debug)]
200pub struct ExternalsTracingOptions {
201 pub tracing_root: FileSystemPath,
203 pub compile_time_info: ResolvedVc<CompileTimeInfo>,
204}
205
206#[turbo_tasks::value(shared)]
207#[derive(Clone, Default)]
208pub struct ModuleOptionsContext {
209 pub ecmascript: EcmascriptOptionsContext,
210 pub css: CssOptionsContext,
211
212 pub enable_postcss_transform: Option<ResolvedVc<PostCssTransformOptions>>,
213 pub enable_webpack_loaders: Option<ResolvedVc<WebpackLoadersOptions>>,
214 pub enable_mdx: bool,
217 pub enable_mdx_rs: Option<ResolvedVc<MdxTransformOptions>>,
218
219 pub environment: Option<ResolvedVc<Environment>>,
220 pub execution_context: Option<ResolvedVc<ExecutionContext>>,
221 pub side_effect_free_packages: Option<ResolvedVc<Glob>>,
222 pub follow_reexports: bool,
223 pub module_fragments_enabled: bool,
224
225 pub static_url_tag: Option<RcStr>,
226
227 pub enable_externals_tracing: Option<ResolvedVc<ExternalsTracingOptions>>,
230
231 pub keep_last_successful_parse: bool,
235
236 pub module_rules: Vec<ModuleRule>,
238 pub rules: Vec<(ContextCondition, ResolvedVc<ModuleOptionsContext>)>,
241
242 pub analyze_mode: AnalyzeMode,
245
246 pub placeholder_for_future_extensions: (),
247}
248
249#[turbo_tasks::value(shared)]
250#[derive(Clone, Default)]
251pub struct EcmascriptOptionsContext {
252 pub enable_typeof_window_inlining: Option<TypeofWindow>,
256 pub enable_jsx: Option<ResolvedVc<JsxTransformOptions>>,
257 pub enable_rust_react_compiler: Option<ReactCompilerCompilationMode>,
258 pub rust_react_compiler_target: ReactCompilerTarget,
259 pub enable_types: bool,
262 pub enable_typescript_transform: Option<ResolvedVc<TypescriptTransformOptions>>,
263 pub enable_decorators: Option<ResolvedVc<DecoratorsOptions>>,
264 pub esm_url_rewrite_behavior: Option<UrlRewriteBehavior>,
265 pub import_externals: bool,
268 pub ignore_dynamic_requests: bool,
272 pub source_maps: SourceMapsType,
274
275 pub enable_exports_info_inlining: bool,
277
278 pub enable_import_as_bytes: bool,
280
281 pub inline_helpers: bool,
283
284 pub infer_module_side_effects: bool,
286
287 pub cjs_tree_shaking: bool,
289
290 pub mangle_export_names: bool,
295 pub cjs_scope_hoisting: bool,
297
298 pub cross_module_constants: bool,
300 pub lazy_compilation: bool,
302
303 pub preset_env_config: Option<ResolvedVc<PresetEnvConfig>>,
305
306 pub placeholder_for_future_extensions: (),
307}
308
309#[turbo_tasks::value(shared)]
310#[derive(Clone, Default)]
311pub struct CssOptionsContext {
312 pub enable_raw_css: bool,
318
319 pub source_maps: SourceMapsType,
321
322 pub module_css_condition: Option<RuleCondition>,
326
327 pub lightningcss_features: turbopack_css::LightningCssFeatureFlags,
329
330 pub module_css_debuggable_idents: bool,
332
333 pub placeholder_for_future_extensions: (),
334}
335
336#[turbo_tasks::value_impl]
337impl ValueDefault for ModuleOptionsContext {
338 #[turbo_tasks::function]
339 fn value_default() -> Vc<Self> {
340 Self::cell(Default::default())
341 }
342}
343
344#[turbo_tasks::function]
345pub async fn side_effect_free_packages_glob(
346 side_effect_free_packages: ResolvedVc<Vec<RcStr>>,
347) -> Result<Vc<Glob>> {
348 let side_effect_free_packages = &*side_effect_free_packages.await?;
349 if side_effect_free_packages.is_empty() {
350 return Ok(Glob::new(rcstr!(""), GlobOptions::default()));
351 }
352
353 let mut globs = String::new();
354 globs.push_str("**/node_modules/{");
355 globs.push_str(&side_effect_free_packages.join(","));
356 globs.push_str("}/**");
357
358 Ok(Glob::new(globs.into(), GlobOptions::default()))
359}