Skip to content

Commit c74d3b3

Browse files
authored
Support compiler.removeConsole with Turbopack (#67849)
Should `remove_console` and `react_remove_properties` be dependencies of the `next-next` crate or reuse the dependencies from `next-custom-transforms`?
1 parent 91a8127 commit c74d3b3

File tree

12 files changed

+141
-2
lines changed

12 files changed

+141
-2
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-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+
remove_console = "0.25.15"
3536
turbopack-binding = { workspace = true, features = [
3637
"__swc_transform_modularize_imports",
3738
"__swc_transform_relay",

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ use crate::{
5353
},
5454
transforms::{
5555
emotion::get_emotion_transform_rule, relay::get_relay_transform_rule,
56+
remove_console::get_remove_console_transform_rule,
5657
styled_components::get_styled_components_transform_rule,
5758
styled_jsx::get_styled_jsx_transform_rule,
5859
swc_ecma_transform_plugins::get_swc_ecma_transform_plugin_rule,
@@ -249,6 +250,7 @@ pub async fn get_client_module_options_context(
249250
get_emotion_transform_rule(next_config).await?,
250251
get_styled_components_transform_rule(next_config).await?,
251252
get_styled_jsx_transform_rule(next_config, target_browsers).await?,
253+
get_remove_console_transform_rule(next_config).await?,
252254
]
253255
.into_iter()
254256
.flatten()

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +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-
relay::get_relay_transform_rule,
64+
relay::get_relay_transform_rule, remove_console::get_remove_console_transform_rule,
6565
styled_components::get_styled_components_transform_rule,
6666
styled_jsx::get_styled_jsx_transform_rule,
6767
swc_ecma_transform_plugins::get_swc_ecma_transform_plugin_rule,
@@ -468,6 +468,7 @@ pub async fn get_server_module_options_context(
468468
get_swc_ecma_transform_plugin_rule(next_config, project_path).await?,
469469
get_relay_transform_rule(next_config, project_path).await?,
470470
get_emotion_transform_rule(next_config).await?,
471+
get_remove_console_transform_rule(next_config).await?,
471472
]
472473
.into_iter()
473474
.flatten()

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
@@ -14,6 +14,7 @@ pub(crate) mod next_react_server_components;
1414
pub(crate) mod next_shake_exports;
1515
pub(crate) mod next_strip_page_exports;
1616
pub(crate) mod relay;
17+
pub(crate) mod remove_console;
1718
pub(crate) mod server_actions;
1819
pub(crate) mod styled_components;
1920
pub(crate) mod styled_jsx;
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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, SyntaxContext},
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, RemoveConsoleConfig};
20+
21+
/// Returns a rule which applies the remove_console transform.
22+
pub async fn get_remove_console_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.remove_console.as_ref())
32+
.and_then(|config| match config {
33+
RemoveConsoleConfig::Boolean(false) => None,
34+
RemoveConsoleConfig::Boolean(true) => Some(remove_console::Config::All(true)),
35+
RemoveConsoleConfig::Config { exclude } => Some(remove_console::Config::WithOptions(
36+
remove_console::Options {
37+
exclude: exclude
38+
.as_deref()
39+
.unwrap_or_default()
40+
.iter()
41+
.map(|v| v.clone().into())
42+
.collect(),
43+
},
44+
)),
45+
})
46+
.map(|config| {
47+
get_ecma_transform_rule(
48+
Box::new(RemoveConsoleTransformer { config }),
49+
enable_mdx_rs,
50+
true,
51+
)
52+
});
53+
54+
Ok(module_rule)
55+
}
56+
57+
#[derive(Debug)]
58+
struct RemoveConsoleTransformer {
59+
config: remove_console::Config,
60+
}
61+
62+
#[async_trait]
63+
impl CustomTransformer for RemoveConsoleTransformer {
64+
#[tracing::instrument(level = tracing::Level::TRACE, name = "remove_console", skip_all)]
65+
async fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Result<()> {
66+
let p = std::mem::replace(program, Program::Module(Module::dummy()));
67+
*program = p.fold_with(&mut remove_console::remove_console(
68+
self.config.clone(),
69+
SyntaxContext::empty().apply_mark(ctx.unresolved_mark),
70+
));
71+
72+
Ok(())
73+
}
74+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const unsupportedTurbopackNextConfigOptions = [
1818
// 'compiler.emotion',
1919
'compiler.reactRemoveProperties',
2020
// 'compiler.relay',
21-
'compiler.removeConsole',
21+
// 'compiler.removeConsole',
2222
// 'compiler.styledComponents',
2323
'experimental.fetchCacheKeyPrefix',
2424

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use client'
2+
3+
export function Client() {
4+
console.log('MY LOG MESSAGE')
5+
console.error('MY ERROR MESSAGE')
6+
7+
return <span>client</span>
8+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ReactNode } from 'react'
2+
3+
export default function Root({ children }: { children: ReactNode }) {
4+
return (
5+
<html>
6+
<body>{children}</body>
7+
</html>
8+
)
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Client } from './client'
2+
3+
export default function Page() {
4+
return (
5+
<p>
6+
hello <Client />
7+
</p>
8+
)
9+
}

0 commit comments

Comments
 (0)