Skip to content

Commit fb83b83

Browse files
authored
Turbopack: run styled-jsx after typescript transform (#82359)
Closes PACK-5183 Based on swc-project/swc#10944 (comment), we need to run styled-jsx after typescript Fixes this crash ``` entered unreachable code: This visitor does not support TypeScript. This method fails for optimization purposes. Encountered in unreachable visitor: visit_ts_interface_decl ``` This has become more pressing as swc seems to have turned the debug_assertion into a proper panic/crash in recent versions (I was seeing SIGSEGV when building some app): https://vercel.slack.com/archives/C03EWR7LGEN/p1754390155508789?thread_ts=1753477535.369549&cid=C03EWR7LGEN We now have three phases/stages: - preprocess: to strip typescript/decorators (so to normalize the syntax) - main: for transforms that want to operate on "standard" EcmaScript (though still with raw JSX) - postprocess: react transform, preset-env, etc (so low level "codegen")
1 parent 9e9ee85 commit fb83b83

35 files changed

+276
-156
lines changed

crates/next-core/src/next_server/context.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use crate::{
5858
get_invalid_styled_jsx_resolve_plugin,
5959
},
6060
transforms::{
61-
emotion::get_emotion_transform_rule, get_ecma_transform_rule,
61+
EcmascriptTransformStage, emotion::get_emotion_transform_rule, get_ecma_transform_rule,
6262
next_react_server_components::get_next_react_server_components_transform_rule,
6363
react_remove_properties::get_react_remove_properties_transform_rule,
6464
relay::get_relay_transform_rule, remove_console::get_remove_console_transform_rule,
@@ -768,7 +768,7 @@ pub async fn get_server_module_options_context(
768768
ecmascript_client_reference_transition_name,
769769
)),
770770
enable_mdx_rs.is_some(),
771-
true,
771+
EcmascriptTransformStage::Preprocess,
772772
));
773773
}
774774

@@ -844,7 +844,7 @@ pub async fn get_server_module_options_context(
844844
ecmascript_client_reference_transition_name,
845845
)),
846846
enable_mdx_rs.is_some(),
847-
true,
847+
EcmascriptTransformStage::Preprocess,
848848
));
849849
}
850850

@@ -922,15 +922,15 @@ pub async fn get_server_module_options_context(
922922
ecmascript_client_reference_transition_name,
923923
)),
924924
enable_mdx_rs.is_some(),
925-
true,
925+
EcmascriptTransformStage::Preprocess,
926926
));
927927
} else {
928928
custom_source_transform_rules.push(get_ecma_transform_rule(
929929
Box::new(ClientDisallowedDirectiveTransformer::new(
930930
"next/dist/client/use-client-disallowed.js".to_string(),
931931
)),
932932
enable_mdx_rs.is_some(),
933-
true,
933+
EcmascriptTransformStage::Preprocess,
934934
));
935935
}
936936

crates/next-core/src/next_shared/transforms/debug_fn_name.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ pub fn get_debug_fn_name_rule(enable_mdx_rs: bool) -> ModuleRule {
1616
ModuleRule::new(
1717
module_rule_match_js_no_url(enable_mdx_rs),
1818
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
19-
prepend: ResolvedVc::cell(vec![]),
20-
append: ResolvedVc::cell(vec![debug_fn_name_transform]),
19+
preprocess: ResolvedVc::cell(vec![]),
20+
main: ResolvedVc::cell(vec![]),
21+
postprocess: ResolvedVc::cell(vec![debug_fn_name_transform]),
2122
}],
2223
)
2324
}

crates/next-core/src/next_shared/transforms/emotion.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ use turbopack::module_options::ModuleRule;
44
use turbopack_ecmascript_plugins::transform::emotion::EmotionTransformer;
55

66
use super::get_ecma_transform_rule;
7-
use crate::next_config::{EmotionTransformOptionsOrBoolean, NextConfig};
7+
use crate::{
8+
next_config::{EmotionTransformOptionsOrBoolean, NextConfig},
9+
next_shared::transforms::EcmascriptTransformStage,
10+
};
811

912
pub async fn get_emotion_transform_rule(next_config: Vc<NextConfig>) -> Result<Option<ModuleRule>> {
1013
let enable_mdx_rs = next_config.mdx_rs().await?.is_some();
@@ -20,7 +23,13 @@ pub async fn get_emotion_transform_rule(next_config: Vc<NextConfig>) -> Result<O
2023
EmotionTransformOptionsOrBoolean::Options(value) => EmotionTransformer::new(value),
2124
_ => None,
2225
})
23-
.map(|transformer| get_ecma_transform_rule(Box::new(transformer), enable_mdx_rs, true));
26+
.map(|transformer| {
27+
get_ecma_transform_rule(
28+
Box::new(transformer),
29+
enable_mdx_rs,
30+
EcmascriptTransformStage::Main,
31+
)
32+
});
2433

2534
Ok(module_rule)
2635
}

crates/next-core/src/next_shared/transforms/mod.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,28 +134,32 @@ pub(crate) fn module_rule_match_pages_page_file(
134134
])
135135
}
136136

137+
pub(crate) enum EcmascriptTransformStage {
138+
Preprocess,
139+
Main,
140+
Postprocess,
141+
}
142+
137143
/// Create a new module rule for the given ecmatransform, runs against
138144
/// any ecmascript (with mdx if enabled) except url reference type
139145
pub(crate) fn get_ecma_transform_rule(
140146
transformer: Box<dyn CustomTransformer + Send + Sync>,
141147
enable_mdx_rs: bool,
142-
prepend: bool,
148+
stage: EcmascriptTransformStage,
143149
) -> ModuleRule {
144150
let transformer = EcmascriptInputTransform::Plugin(ResolvedVc::cell(transformer as _));
145-
let (prepend, append) = if prepend {
146-
(
147-
ResolvedVc::cell(vec![transformer]),
148-
ResolvedVc::cell(vec![]),
149-
)
150-
} else {
151-
(
152-
ResolvedVc::cell(vec![]),
153-
ResolvedVc::cell(vec![transformer]),
154-
)
151+
let (preprocess, main, postprocess) = match stage {
152+
EcmascriptTransformStage::Preprocess => (vec![transformer], vec![], vec![]),
153+
EcmascriptTransformStage::Main => (vec![], vec![transformer], vec![]),
154+
EcmascriptTransformStage::Postprocess => (vec![], vec![], vec![transformer]),
155155
};
156156

157157
ModuleRule::new(
158158
module_rule_match_js_no_url(enable_mdx_rs),
159-
vec![ModuleRuleEffect::ExtendEcmascriptTransforms { prepend, append }],
159+
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
160+
preprocess: ResolvedVc::cell(preprocess),
161+
main: ResolvedVc::cell(main),
162+
postprocess: ResolvedVc::cell(postprocess),
163+
}],
160164
)
161165
}

crates/next-core/src/next_shared/transforms/modularize_imports.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ pub fn get_next_modularize_imports_rule(
6363
ModuleRule::new(
6464
module_rule_match_js_no_url(enable_mdx_rs),
6565
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
66-
prepend: ResolvedVc::cell(vec![]),
67-
append: ResolvedVc::cell(vec![transformer]),
66+
preprocess: ResolvedVc::cell(vec![]),
67+
main: ResolvedVc::cell(vec![]),
68+
postprocess: ResolvedVc::cell(vec![transformer]),
6869
}],
6970
)
7071
}

crates/next-core/src/next_shared/transforms/next_amp_attributes.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ pub fn get_next_amp_attr_rule(enable_mdx_rs: bool) -> ModuleRule {
1414
ModuleRule::new(
1515
module_rule_match_js_no_url(enable_mdx_rs),
1616
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
17-
prepend: ResolvedVc::cell(vec![]),
18-
append: ResolvedVc::cell(vec![transformer]),
17+
preprocess: ResolvedVc::cell(vec![]),
18+
main: ResolvedVc::cell(vec![transformer]),
19+
postprocess: ResolvedVc::cell(vec![]),
1920
}],
2021
)
2122
}

crates/next-core/src/next_shared/transforms/next_cjs_optimizer.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ pub fn get_next_cjs_optimizer_rule(enable_mdx_rs: bool) -> ModuleRule {
5454
ModuleRule::new(
5555
module_rule_match_js_no_url(enable_mdx_rs),
5656
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
57-
prepend: ResolvedVc::cell(vec![]),
58-
append: ResolvedVc::cell(vec![transformer]),
57+
preprocess: ResolvedVc::cell(vec![]),
58+
main: ResolvedVc::cell(vec![]),
59+
postprocess: ResolvedVc::cell(vec![transformer]),
5960
}],
6061
)
6162
}

crates/next-core/src/next_shared/transforms/next_disallow_re_export_all_in_page.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ pub fn get_next_disallow_export_all_in_page_rule(
1919
ModuleRule::new(
2020
module_rule_match_pages_page_file(enable_mdx_rs, pages_dir),
2121
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
22-
prepend: ResolvedVc::cell(vec![]),
23-
append: ResolvedVc::cell(vec![transformer]),
22+
preprocess: ResolvedVc::cell(vec![]),
23+
main: ResolvedVc::cell(vec![]),
24+
postprocess: ResolvedVc::cell(vec![transformer]),
2425
}],
2526
)
2627
}

crates/next-core/src/next_shared/transforms/next_dynamic.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ pub async fn get_next_dynamic_transform_rule(
2727
Ok(ModuleRule::new(
2828
module_rule_match_js_no_url(enable_mdx_rs),
2929
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
30-
prepend: ResolvedVc::cell(vec![]),
31-
append: ResolvedVc::cell(vec![dynamic_transform]),
30+
preprocess: ResolvedVc::cell(vec![]),
31+
main: ResolvedVc::cell(vec![]),
32+
postprocess: ResolvedVc::cell(vec![dynamic_transform]),
3233
}],
3334
))
3435
}

crates/next-core/src/next_shared/transforms/next_edge_node_api_assert.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ pub fn next_edge_node_api_assert(
2424
ModuleRule::new(
2525
module_rule_match_js_no_url(enable_mdx_rs),
2626
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
27-
prepend: ResolvedVc::cell(vec![]),
28-
append: ResolvedVc::cell(vec![transformer]),
27+
preprocess: ResolvedVc::cell(vec![]),
28+
main: ResolvedVc::cell(vec![]),
29+
postprocess: ResolvedVc::cell(vec![transformer]),
2930
}],
3031
)
3132
}

0 commit comments

Comments
 (0)