Skip to content

Commit e7bdb61

Browse files
authored
Support reactRemoveProperties with Turbopack (#67853)
1 parent 0be0abf commit e7bdb61

File tree

10 files changed

+93
-7
lines changed

10 files changed

+93
-7
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/next-swc/crates/next-api/src/project.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ impl Project {
740740
.and_then(|c| c.styled_components.as_ref().map(|sc| sc.is_enabled()))
741741
.unwrap_or_default();
742742
let react_remove_properties_enabled = compiler_options
743-
.and_then(|c| c.react_remove_properties)
743+
.and_then(|c| c.react_remove_properties.as_ref().map(|rc| rc.is_enabled()))
744744
.unwrap_or_default();
745745
let remove_console_enabled = compiler_options
746746
.and_then(|c| c.remove_console.as_ref().map(|rc| rc.is_enabled()))

packages/next-swc/crates/next-core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ lazy_static = { workspace = true }
3232
thiserror = { workspace = true }
3333
tracing = { workspace = true }
3434
rustc-hash = { workspace = true }
35+
react_remove_properties = "0.24.15"
3536
remove_console = "0.25.15"
3637
turbopack-binding = { workspace = true, features = [
3738
"__swc_transform_modularize_imports",

packages/next-swc/crates/next-core/src/next_client/context.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ use crate::{
5252
NextSharedRuntimeResolvePlugin,
5353
},
5454
transforms::{
55-
emotion::get_emotion_transform_rule, relay::get_relay_transform_rule,
56-
remove_console::get_remove_console_transform_rule,
55+
emotion::get_emotion_transform_rule,
56+
react_remove_properties::get_react_remove_properties_transform_rule,
57+
relay::get_relay_transform_rule, remove_console::get_remove_console_transform_rule,
5758
styled_components::get_styled_components_transform_rule,
5859
styled_jsx::get_styled_jsx_transform_rule,
5960
swc_ecma_transform_plugins::get_swc_ecma_transform_plugin_rule,
@@ -250,6 +251,7 @@ pub async fn get_client_module_options_context(
250251
get_emotion_transform_rule(next_config).await?,
251252
get_styled_components_transform_rule(next_config).await?,
252253
get_styled_jsx_transform_rule(next_config, target_browsers).await?,
254+
get_react_remove_properties_transform_rule(next_config).await?,
253255
get_remove_console_transform_rule(next_config).await?,
254256
]
255257
.into_iter()

packages/next-swc/crates/next-core/src/next_config.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ impl StyledComponentsTransformOptionsOrBoolean {
729729
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs)]
730730
#[serde(rename_all = "camelCase")]
731731
pub struct CompilerConfig {
732-
pub react_remove_properties: Option<bool>,
732+
pub react_remove_properties: Option<ReactRemoveProperties>,
733733
pub relay: Option<RelayConfig>,
734734
pub emotion: Option<EmotionTransformOptionsOrBoolean>,
735735
pub remove_console: Option<RemoveConsoleConfig>,
@@ -743,6 +743,15 @@ pub enum ReactRemoveProperties {
743743
Config { properties: Option<Vec<String>> },
744744
}
745745

746+
impl ReactRemoveProperties {
747+
pub fn is_enabled(&self) -> bool {
748+
match self {
749+
Self::Boolean(enabled) => *enabled,
750+
_ => true,
751+
}
752+
}
753+
}
754+
746755
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs)]
747756
#[serde(untagged)]
748757
pub enum RemoveConsoleConfig {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ use crate::{
6161
transforms::{
6262
emotion::get_emotion_transform_rule, get_ecma_transform_rule,
6363
next_react_server_components::get_next_react_server_components_transform_rule,
64+
react_remove_properties::get_react_remove_properties_transform_rule,
6465
relay::get_relay_transform_rule, remove_console::get_remove_console_transform_rule,
6566
styled_components::get_styled_components_transform_rule,
6667
styled_jsx::get_styled_jsx_transform_rule,
@@ -468,6 +469,7 @@ pub async fn get_server_module_options_context(
468469
get_swc_ecma_transform_plugin_rule(next_config, project_path).await?,
469470
get_relay_transform_rule(next_config, project_path).await?,
470471
get_emotion_transform_rule(next_config).await?,
472+
get_react_remove_properties_transform_rule(next_config).await?,
471473
get_remove_console_transform_rule(next_config).await?,
472474
]
473475
.into_iter()

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub(crate) mod next_pure;
1313
pub(crate) mod next_react_server_components;
1414
pub(crate) mod next_shake_exports;
1515
pub(crate) mod next_strip_page_exports;
16+
pub(crate) mod react_remove_properties;
1617
pub(crate) mod relay;
1718
pub(crate) mod remove_console;
1819
pub(crate) mod server_actions;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use anyhow::Result;
2+
use async_trait::async_trait;
3+
use turbo_tasks::Vc;
4+
use turbopack_binding::{
5+
swc::core::{
6+
common::util::take::Take,
7+
ecma::{
8+
ast::{Module, Program},
9+
visit::FoldWith,
10+
},
11+
},
12+
turbopack::{
13+
ecmascript::{CustomTransformer, TransformContext},
14+
turbopack::module_options::ModuleRule,
15+
},
16+
};
17+
18+
use super::get_ecma_transform_rule;
19+
use crate::next_config::{NextConfig, ReactRemoveProperties};
20+
21+
/// Returns a rule which applies the react_remove_properties transform.
22+
pub async fn get_react_remove_properties_transform_rule(
23+
next_config: Vc<NextConfig>,
24+
) -> Result<Option<ModuleRule>> {
25+
let enable_mdx_rs = next_config.mdx_rs().await?.is_some();
26+
27+
let module_rule = next_config
28+
.await?
29+
.compiler
30+
.as_ref()
31+
.and_then(|value| value.react_remove_properties.as_ref())
32+
.and_then(|config| match config {
33+
ReactRemoveProperties::Boolean(false) => None,
34+
ReactRemoveProperties::Boolean(true) => {
35+
Some(react_remove_properties::Config::All(true))
36+
}
37+
ReactRemoveProperties::Config { properties } => Some(
38+
react_remove_properties::Config::WithOptions(react_remove_properties::Options {
39+
properties: properties.as_deref().unwrap_or_default().to_owned(),
40+
}),
41+
),
42+
})
43+
.map(|config| {
44+
get_ecma_transform_rule(
45+
Box::new(ReactRemovePropertiesTransformer { config }),
46+
enable_mdx_rs,
47+
true,
48+
)
49+
});
50+
51+
Ok(module_rule)
52+
}
53+
54+
#[derive(Debug)]
55+
struct ReactRemovePropertiesTransformer {
56+
config: react_remove_properties::Config,
57+
}
58+
59+
#[async_trait]
60+
impl CustomTransformer for ReactRemovePropertiesTransformer {
61+
#[tracing::instrument(level = tracing::Level::TRACE, name = "react_remove_properties", skip_all)]
62+
async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> {
63+
let p = std::mem::replace(program, Program::Module(Module::dummy()));
64+
*program = p.fold_with(&mut react_remove_properties::react_remove_properties(
65+
self.config.clone(),
66+
));
67+
68+
Ok(())
69+
}
70+
}

packages/next/src/lib/turbopack-warning.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const unsupportedTurbopackNextConfigOptions = [
1616
// 'experimental.clientRouterFilter',
1717
// 'experimental.optimizePackageImports',
1818
// 'compiler.emotion',
19-
'compiler.reactRemoveProperties',
19+
// 'compiler.reactRemoveProperties',
2020
// 'compiler.relay',
2121
// 'compiler.removeConsole',
2222
// 'compiler.styledComponents',

test/turbopack-build-tests-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15927,8 +15927,8 @@
1592715927
"runtimeError": false
1592815928
},
1592915929
"test/production/jest/remove-react-properties/remove-react-properties-jest.test.ts": {
15930-
"passed": [],
15931-
"failed": ["next/jest data-testid should be removed in production"],
15930+
"passed": ["next/jest data-testid should be removed in production"],
15931+
"failed": [],
1593215932
"pending": [],
1593315933
"flakey": [],
1593415934
"runtimeError": true

0 commit comments

Comments
 (0)