turbopack/module_options/
module_options_context.rs1use std::fmt::Debug;
2
3use serde::{Deserialize, Serialize};
4use turbo_esregex::EsRegex;
5use turbo_rcstr::RcStr;
6use turbo_tasks::{FxIndexMap, NonLocalValue, ResolvedVc, ValueDefault, Vc, trace::TraceRawVcs};
7use turbo_tasks_fs::FileSystemPath;
8use turbopack_core::{
9 chunk::SourceMapsType, compile_time_info::CompileTimeInfo, condition::ContextCondition,
10 environment::Environment, resolve::options::ImportMapping,
11};
12use turbopack_ecmascript::{TreeShakingMode, references::esm::UrlRewriteBehavior};
13pub use turbopack_mdx::MdxTransformOptions;
14use turbopack_node::{
15 execution_context::ExecutionContext,
16 transforms::{postcss::PostCssTransformOptions, webpack::WebpackLoaderItems},
17};
18
19use super::ModuleRule;
20use crate::module_options::RuleCondition;
21
22#[derive(Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)]
23pub struct LoaderRuleItem {
24 pub loaders: ResolvedVc<WebpackLoaderItems>,
25 pub rename_as: Option<RcStr>,
26 pub condition: Option<ConditionItem>,
27}
28
29#[derive(Default)]
35#[turbo_tasks::value(transparent)]
36pub struct WebpackRules(Vec<(RcStr, LoaderRuleItem)>);
37
38#[derive(Default)]
39#[turbo_tasks::value(transparent)]
40pub struct WebpackConditions(pub FxIndexMap<RcStr, ConditionItem>);
41
42#[derive(Default)]
43#[turbo_tasks::value(transparent)]
44pub struct OptionWebpackConditions(Option<ResolvedVc<WebpackConditions>>);
45
46#[derive(Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)]
47pub enum ConditionPath {
48 Glob(RcStr),
49 Regex(ResolvedVc<EsRegex>),
50}
51
52#[turbo_tasks::value(shared)]
53#[derive(Clone, Debug)]
54pub enum ConditionItem {
55 All(Box<[ConditionItem]>),
56 Any(Box<[ConditionItem]>),
57 Not(Box<ConditionItem>),
58 Builtin(RcStr),
59 Base {
60 path: Option<ConditionPath>,
61 content: Option<ResolvedVc<EsRegex>>,
62 },
63}
64
65#[turbo_tasks::value(shared)]
66#[derive(Clone, Debug)]
67pub struct WebpackLoadersOptions {
68 pub rules: ResolvedVc<WebpackRules>,
69 pub conditions: ResolvedVc<OptionWebpackConditions>,
70 pub builtin_conditions: ResolvedVc<Box<dyn WebpackLoaderBuiltinConditionSet>>,
71 pub loader_runner_package: Option<ResolvedVc<ImportMapping>>,
72}
73
74pub enum WebpackLoaderBuiltinConditionSetMatch {
75 Matched,
76 Unmatched,
77 Invalid,
79}
80
81#[turbo_tasks::value_trait]
84pub trait WebpackLoaderBuiltinConditionSet {
85 fn match_condition(&self, condition: &str) -> WebpackLoaderBuiltinConditionSetMatch;
88}
89
90#[turbo_tasks::value]
93pub struct EmptyWebpackLoaderBuiltinConditionSet;
94
95#[turbo_tasks::value_impl]
96impl EmptyWebpackLoaderBuiltinConditionSet {
97 #[turbo_tasks::function]
98 fn new() -> Vc<Box<dyn WebpackLoaderBuiltinConditionSet>> {
99 Vc::upcast::<Box<dyn WebpackLoaderBuiltinConditionSet>>(
100 EmptyWebpackLoaderBuiltinConditionSet.cell(),
101 )
102 }
103}
104
105#[turbo_tasks::value_impl]
106impl WebpackLoaderBuiltinConditionSet for EmptyWebpackLoaderBuiltinConditionSet {
107 fn match_condition(&self, _condition: &str) -> WebpackLoaderBuiltinConditionSetMatch {
108 WebpackLoaderBuiltinConditionSetMatch::Invalid
109 }
110}
111
112#[derive(Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)]
115pub enum DecoratorsKind {
116 Legacy,
117 Ecma,
118}
119
120#[derive(Copy, Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)]
122pub enum TypeofWindow {
123 Object,
124 Undefined,
125}
126
127#[turbo_tasks::value(shared)]
133#[derive(Default, Clone, Debug)]
134pub struct DecoratorsOptions {
135 pub decorators_kind: Option<DecoratorsKind>,
136 pub emit_decorators_metadata: bool,
141 pub decorators_before_export: bool,
146 pub use_define_for_class_fields: bool,
147}
148
149#[turbo_tasks::value_impl]
150impl ValueDefault for DecoratorsOptions {
151 #[turbo_tasks::function]
152 fn value_default() -> Vc<Self> {
153 Self::default().cell()
154 }
155}
156
157#[turbo_tasks::value(shared)]
160#[derive(Default, Clone, Debug)]
161pub struct TypescriptTransformOptions {
162 pub use_define_for_class_fields: bool,
163}
164
165#[turbo_tasks::value_impl]
166impl ValueDefault for TypescriptTransformOptions {
167 #[turbo_tasks::function]
168 fn value_default() -> Vc<Self> {
169 Self::default().cell()
170 }
171}
172
173#[turbo_tasks::value(shared)]
174#[derive(Default, Clone, Debug)]
175pub struct JsxTransformOptions {
176 pub development: bool,
177 pub react_refresh: bool,
178 pub import_source: Option<RcStr>,
179 pub runtime: Option<RcStr>,
180}
181
182#[turbo_tasks::value(shared)]
183#[derive(Clone, Debug)]
184pub struct ExternalsTracingOptions {
185 pub tracing_root: FileSystemPath,
187 pub compile_time_info: ResolvedVc<CompileTimeInfo>,
188}
189
190#[turbo_tasks::value(shared)]
191#[derive(Clone, Default)]
192#[serde(default)]
193pub struct ModuleOptionsContext {
194 pub ecmascript: EcmascriptOptionsContext,
195 pub css: CssOptionsContext,
196
197 pub enable_postcss_transform: Option<ResolvedVc<PostCssTransformOptions>>,
198 pub enable_webpack_loaders: Option<ResolvedVc<WebpackLoadersOptions>>,
199 pub enable_mdx: bool,
202 pub enable_mdx_rs: Option<ResolvedVc<MdxTransformOptions>>,
203
204 pub environment: Option<ResolvedVc<Environment>>,
205 pub execution_context: Option<ResolvedVc<ExecutionContext>>,
206 pub side_effect_free_packages: Vec<RcStr>,
207 pub tree_shaking_mode: Option<TreeShakingMode>,
208
209 pub enable_externals_tracing: Option<ResolvedVc<ExternalsTracingOptions>>,
212
213 pub keep_last_successful_parse: bool,
217
218 pub module_rules: Vec<ModuleRule>,
220 pub rules: Vec<(ContextCondition, ResolvedVc<ModuleOptionsContext>)>,
223
224 pub is_tracing: bool,
227
228 pub placeholder_for_future_extensions: (),
229}
230
231#[turbo_tasks::value(shared)]
232#[derive(Clone, Default)]
233#[serde(default)]
234pub struct EcmascriptOptionsContext {
235 pub enable_typeof_window_inlining: Option<TypeofWindow>,
236 pub enable_jsx: Option<ResolvedVc<JsxTransformOptions>>,
237 pub enable_types: bool,
240 pub enable_typescript_transform: Option<ResolvedVc<TypescriptTransformOptions>>,
241 pub enable_decorators: Option<ResolvedVc<DecoratorsOptions>>,
242 pub esm_url_rewrite_behavior: Option<UrlRewriteBehavior>,
243 pub import_externals: bool,
246 pub ignore_dynamic_requests: bool,
250 pub source_maps: SourceMapsType,
252
253 pub placeholder_for_future_extensions: (),
254}
255
256#[turbo_tasks::value(shared)]
257#[derive(Clone, Default)]
258#[serde(default)]
259pub struct CssOptionsContext {
260 pub enable_raw_css: bool,
266
267 pub source_maps: SourceMapsType,
269
270 pub module_css_condition: Option<RuleCondition>,
274
275 pub placeholder_for_future_extensions: (),
276}
277
278#[turbo_tasks::value_impl]
279impl ValueDefault for ModuleOptionsContext {
280 #[turbo_tasks::function]
281 fn value_default() -> Vc<Self> {
282 Self::cell(Default::default())
283 }
284}