From bd8f372b580a1fe916deca6865a65874e772e546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 7 Apr 2025 16:54:46 +0900 Subject: [PATCH 01/11] webpack: disable char freq --- packages/next/src/build/webpack-config.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index f2ba4945ad317..87ab247237b88 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1185,7 +1185,10 @@ export default async function getBaseWebpackConfig( 'process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE': false, }, }, - mangle: !noMangling && { reserved: ['AbortSignal'] }, + mangle: !noMangling && { + reserved: ['AbortSignal'], + disableCharFreq: true, + }, }, }), new (getRspackCore().LightningCssMinimizerRspackPlugin)({ From 8248a10c3e9cc72e659a956b5b6c8fc849bc1866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 7 Apr 2025 16:54:56 +0900 Subject: [PATCH 02/11] turbopack: disable char freq --- turbopack/crates/turbopack-ecmascript/src/minify.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/turbopack/crates/turbopack-ecmascript/src/minify.rs b/turbopack/crates/turbopack-ecmascript/src/minify.rs index a6de8f16e7465..0699d36dcb295 100644 --- a/turbopack/crates/turbopack-ecmascript/src/minify.rs +++ b/turbopack/crates/turbopack-ecmascript/src/minify.rs @@ -87,6 +87,7 @@ pub fn minify(code: &Code, source_maps: bool, mangle: bool) -> Result { mangle: if mangle { Some(MangleOptions { reserved: vec!["AbortSignal".into()], + disable_char_freq: true, ..Default::default() }) } else { From 2a177c3ed3d37175067f7e9f0208a952a0a8916d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 7 Apr 2025 16:57:56 +0900 Subject: [PATCH 03/11] turbopack: server only --- turbopack/crates/turbopack-browser/src/ecmascript/content.rs | 2 +- .../crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs | 2 +- turbopack/crates/turbopack-ecmascript/src/minify.rs | 4 ++-- .../crates/turbopack-nodejs/src/ecmascript/node/content.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs index 48a15635d4772..c1a078d8b6c6a 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs @@ -128,7 +128,7 @@ impl EcmascriptBrowserChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, mangle)?; + code = minify(&code, source_maps, false, mangle)?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs b/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs index ad42afc184b08..b50649669b302 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs @@ -194,7 +194,7 @@ impl EcmascriptBrowserEvaluateChunk { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, mangle)?; + code = minify(&code, source_maps, false, mangle)?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-ecmascript/src/minify.rs b/turbopack/crates/turbopack-ecmascript/src/minify.rs index 0699d36dcb295..752c2599572fc 100644 --- a/turbopack/crates/turbopack-ecmascript/src/minify.rs +++ b/turbopack/crates/turbopack-ecmascript/src/minify.rs @@ -28,7 +28,7 @@ use turbopack_core::code_builder::{Code, CodeBuilder}; use crate::parse::generate_js_source_map; #[instrument(level = Level::INFO, skip_all)] -pub fn minify(code: &Code, source_maps: bool, mangle: bool) -> Result { +pub fn minify(code: &Code, source_maps: bool, is_server_side: bool, mangle: bool) -> Result { let source_maps = source_maps .then(|| code.generate_source_map_ref()) .transpose()?; @@ -87,7 +87,7 @@ pub fn minify(code: &Code, source_maps: bool, mangle: bool) -> Result { mangle: if mangle { Some(MangleOptions { reserved: vec!["AbortSignal".into()], - disable_char_freq: true, + disable_char_freq: is_server_side, ..Default::default() }) } else { diff --git a/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs b/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs index 3736dfbc8c37b..b3bce1be7ea29 100644 --- a/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs +++ b/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs @@ -78,7 +78,7 @@ impl EcmascriptBuildNodeChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, mangle)?; + code = minify(&code, source_maps, true, mangle)?; } Ok(code.cell()) From 62e4ff1f55fcb099bf8dff598a4300e02dc4edab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 7 Apr 2025 16:58:15 +0900 Subject: [PATCH 04/11] webpack: server only --- packages/next/src/build/webpack-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 87ab247237b88..a7245717d99fa 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1187,7 +1187,7 @@ export default async function getBaseWebpackConfig( }, mangle: !noMangling && { reserved: ['AbortSignal'], - disableCharFreq: true, + disableCharFreq: !isClient, }, }, }), From dd245f9d3ee35f19466d97078af3f98d27bd920d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 8 Apr 2025 09:53:08 +0900 Subject: [PATCH 05/11] is_server_side --- turbopack/crates/turbopack-browser/src/chunking_context.rs | 4 ++++ .../crates/turbopack-browser/src/ecmascript/content.rs | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/turbopack/crates/turbopack-browser/src/chunking_context.rs b/turbopack/crates/turbopack-browser/src/chunking_context.rs index 97dbdf152a663..670690f01034a 100644 --- a/turbopack/crates/turbopack-browser/src/chunking_context.rs +++ b/turbopack/crates/turbopack-browser/src/chunking_context.rs @@ -220,6 +220,8 @@ pub struct BrowserChunkingContext { module_id_strategy: ResolvedVc>, /// The chunking configs chunking_configs: Vec<(ResolvedVc>, ChunkingConfig)>, + /// Whether the chunking context is server side + is_server_side: bool, } impl BrowserChunkingContext { @@ -232,6 +234,7 @@ impl BrowserChunkingContext { asset_root_path: ResolvedVc, environment: ResolvedVc, runtime_type: RuntimeType, + is_server_side: bool, ) -> BrowserChunkingContextBuilder { BrowserChunkingContextBuilder { chunking_context: BrowserChunkingContext { @@ -257,6 +260,7 @@ impl BrowserChunkingContext { manifest_chunks: false, module_id_strategy: ResolvedVc::upcast(DevModuleIdStrategy::new_resolved()), chunking_configs: Default::default(), + is_server_side, }, } } diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs index c1a078d8b6c6a..78fe740ddf0a2 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs @@ -128,7 +128,12 @@ impl EcmascriptBrowserChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, false, mangle)?; + code = minify( + &code, + source_maps, + this.chunking_context.await?.is_server_side, + mangle, + )?; } Ok(code.cell()) From e064c1b3efc85a3d75044d8d269e72ef7216c57e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 8 Apr 2025 13:47:05 +0900 Subject: [PATCH 06/11] ContextSide --- .../src/chunk/chunking_context.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs index d184b33903237..17cbe9bebaa07 100644 --- a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs +++ b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs @@ -42,6 +42,25 @@ impl Default for MinifyType { } } +#[derive( + Debug, + TaskInput, + Clone, + Copy, + PartialEq, + Eq, + Hash, + Serialize, + Deserialize, + TraceRawVcs, + DeterministicHash, + NonLocalValue, +)] +pub enum ContextSide { + Client, + Server, +} + #[derive( Debug, Default, From e7fe1fe920b60c17e28f6cdd346d7b003f3e9038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 8 Apr 2025 13:49:37 +0900 Subject: [PATCH 07/11] turbopack-core --- turbopack/crates/turbopack-core/src/chunk/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbopack/crates/turbopack-core/src/chunk/mod.rs b/turbopack/crates/turbopack-core/src/chunk/mod.rs index 4419e08d5ca25..6d258700d95e4 100644 --- a/turbopack/crates/turbopack-core/src/chunk/mod.rs +++ b/turbopack/crates/turbopack-core/src/chunk/mod.rs @@ -29,7 +29,7 @@ pub use self::{ }, chunking_context::{ ChunkGroupResult, ChunkGroupType, ChunkingConfig, ChunkingConfigs, ChunkingContext, - ChunkingContextExt, EntryChunkGroupResult, MinifyType, SourceMapsType, + ChunkingContextExt, ContextSide, EntryChunkGroupResult, MinifyType, SourceMapsType, }, data::{ChunkData, ChunkDataOption, ChunksData}, evaluate::{EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets}, From db87d597b843c7b91356eaf960ccfae2ac935a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 8 Apr 2025 13:51:04 +0900 Subject: [PATCH 08/11] fix build --- crates/next-core/src/next_client/context.rs | 5 +++-- crates/next-core/src/next_edge/context.rs | 6 ++++-- .../crates/turbopack-browser/src/chunking_context.rs | 12 ++++++++---- .../turbopack-browser/src/ecmascript/content.rs | 4 ++-- turbopack/crates/turbopack-cli/src/build/mod.rs | 5 +++-- .../crates/turbopack-cli/src/dev/web_entry_source.rs | 3 ++- turbopack/crates/turbopack-tests/tests/snapshot.rs | 1 + 7 files changed, 23 insertions(+), 13 deletions(-) diff --git a/crates/next-core/src/next_client/context.rs b/crates/next-core/src/next_client/context.rs index a29d2c43ade99..d58072ddc3701 100644 --- a/crates/next-core/src/next_client/context.rs +++ b/crates/next-core/src/next_client/context.rs @@ -19,8 +19,8 @@ use turbopack_browser::{ }; use turbopack_core::{ chunk::{ - module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, MinifyType, - SourceMapsType, + module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, ContextSide, + MinifyType, SourceMapsType, }, compile_time_info::{ CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefineableNameSegment, @@ -449,6 +449,7 @@ pub async fn get_client_chunking_context( get_client_assets_path(*client_root).to_resolved().await?, environment, next_mode.runtime_type(), + ContextSide::Client, ) .chunk_base_path(asset_prefix) .chunk_suffix_path(chunk_suffix_path) diff --git a/crates/next-core/src/next_edge/context.rs b/crates/next-core/src/next_edge/context.rs index 0b31b423334e2..bd7a1a6873149 100644 --- a/crates/next-core/src/next_edge/context.rs +++ b/crates/next-core/src/next_edge/context.rs @@ -7,8 +7,8 @@ use turbopack::{css::chunk::CssChunkType, resolve_options_context::ResolveOption use turbopack_browser::BrowserChunkingContext; use turbopack_core::{ chunk::{ - module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, MinifyType, - SourceMapsType, + module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, ContextSide, + MinifyType, SourceMapsType, }, compile_time_info::{ CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefineableNameSegment, @@ -237,6 +237,7 @@ pub async fn get_edge_chunking_context_with_client_assets( .await?, environment, next_mode.runtime_type(), + ContextSide::Server, ) .asset_base_path(asset_prefix) .minify_type(if *turbo_minify.await? { @@ -296,6 +297,7 @@ pub async fn get_edge_chunking_context( output_root.join("assets".into()).to_resolved().await?, environment, next_mode.runtime_type(), + ContextSide::Server, ) // Since one can't read files in edge directly, any asset need to be fetched // instead. This special blob url is handled by the custom fetch diff --git a/turbopack/crates/turbopack-browser/src/chunking_context.rs b/turbopack/crates/turbopack-browser/src/chunking_context.rs index 670690f01034a..0b8b2d8486a88 100644 --- a/turbopack/crates/turbopack-browser/src/chunking_context.rs +++ b/turbopack/crates/turbopack-browser/src/chunking_context.rs @@ -15,7 +15,7 @@ use turbopack_core::{ chunk_group::{make_chunk_group, MakeChunkGroupResult}, module_id_strategies::{DevModuleIdStrategy, ModuleIdStrategy}, Chunk, ChunkGroupResult, ChunkItem, ChunkType, ChunkableModule, ChunkingConfig, - ChunkingConfigs, ChunkingContext, EntryChunkGroupResult, EvaluatableAsset, + ChunkingConfigs, ChunkingContext, ContextSide, EntryChunkGroupResult, EvaluatableAsset, EvaluatableAssets, MinifyType, ModuleId, SourceMapsType, }, environment::Environment, @@ -221,7 +221,7 @@ pub struct BrowserChunkingContext { /// The chunking configs chunking_configs: Vec<(ResolvedVc>, ChunkingConfig)>, /// Whether the chunking context is server side - is_server_side: bool, + side: ContextSide, } impl BrowserChunkingContext { @@ -234,7 +234,7 @@ impl BrowserChunkingContext { asset_root_path: ResolvedVc, environment: ResolvedVc, runtime_type: RuntimeType, - is_server_side: bool, + side: ContextSide, ) -> BrowserChunkingContextBuilder { BrowserChunkingContextBuilder { chunking_context: BrowserChunkingContext { @@ -260,7 +260,7 @@ impl BrowserChunkingContext { manifest_chunks: false, module_id_strategy: ResolvedVc::upcast(DevModuleIdStrategy::new_resolved()), chunking_configs: Default::default(), - is_server_side, + side, }, } } @@ -294,6 +294,10 @@ impl BrowserChunkingContext { pub fn minify_type(&self) -> MinifyType { self.minify_type } + + pub fn side(&self) -> ContextSide { + self.side + } } #[turbo_tasks::value_impl] diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs index 78fe740ddf0a2..7ba8a89800ae5 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs @@ -8,7 +8,7 @@ use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::{rope::RopeBuilder, File}; use turbopack_core::{ asset::AssetContent, - chunk::{ChunkingContext, MinifyType, ModuleId}, + chunk::{ChunkingContext, ContextSide, MinifyType, ModuleId}, code_builder::{Code, CodeBuilder}, output::OutputAsset, source_map::{GenerateSourceMap, OptionStringifiedSourceMap, SourceMapAsset}, @@ -131,7 +131,7 @@ impl EcmascriptBrowserChunkContent { code = minify( &code, source_maps, - this.chunking_context.await?.is_server_side, + this.chunking_context.await?.side() == ContextSide::Server, mangle, )?; } diff --git a/turbopack/crates/turbopack-cli/src/build/mod.rs b/turbopack/crates/turbopack-cli/src/build/mod.rs index eec33bb857fbe..46e5fc522e49e 100644 --- a/turbopack/crates/turbopack-cli/src/build/mod.rs +++ b/turbopack/crates/turbopack-cli/src/build/mod.rs @@ -26,8 +26,8 @@ use turbopack_cli_utils::issue::{ConsoleUi, LogOptions}; use turbopack_core::{ asset::Asset, chunk::{ - availability_info::AvailabilityInfo, ChunkingConfig, ChunkingContext, EvaluatableAsset, - EvaluatableAssets, MinifyType, SourceMapsType, + availability_info::AvailabilityInfo, ChunkingConfig, ChunkingContext, ContextSide, + EvaluatableAsset, EvaluatableAssets, MinifyType, SourceMapsType, }, environment::{BrowserEnvironment, Environment, ExecutionEnvironment, NodeJsEnvironment}, ident::AssetIdent, @@ -330,6 +330,7 @@ async fn build_internal( .to_resolved() .await?, runtime_type, + ContextSide::Client, ) .source_maps(source_maps_type) .module_id_strategy(module_id_strategy) diff --git a/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs b/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs index 554da13f601e2..555816cad5fa8 100644 --- a/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs +++ b/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs @@ -6,7 +6,7 @@ use turbo_tasks_fs::FileSystemPath; use turbopack_browser::{react_refresh::assert_can_resolve_react_refresh, BrowserChunkingContext}; use turbopack_cli_utils::runtime_entry::{RuntimeEntries, RuntimeEntry}; use turbopack_core::{ - chunk::{ChunkableModule, ChunkingContext, EvaluatableAsset, SourceMapsType}, + chunk::{ChunkableModule, ChunkingContext, ContextSide, EvaluatableAsset, SourceMapsType}, environment::Environment, file_source::FileSource, module::Module, @@ -49,6 +49,7 @@ pub async fn get_client_chunking_context( server_root.join("/_assets".into()).to_resolved().await?, environment, RuntimeType::Development, + ContextSide::Client, ) .hot_module_replacement() .use_file_source_map_uris() diff --git a/turbopack/crates/turbopack-tests/tests/snapshot.rs b/turbopack/crates/turbopack-tests/tests/snapshot.rs index 3006b9dfdb5a0..247556e3d5d38 100644 --- a/turbopack/crates/turbopack-tests/tests/snapshot.rs +++ b/turbopack/crates/turbopack-tests/tests/snapshot.rs @@ -356,6 +356,7 @@ async fn run_test_operation(resource: RcStr) -> Result> { static_root_path, env, options.runtime_type, + ContextSide::Client, ) .build(), ), From 82ece2ca456e7a7d6232fa4a90d1f86cd0cd02a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 8 Apr 2025 13:59:52 +0900 Subject: [PATCH 09/11] import --- turbopack/crates/turbopack-tests/tests/snapshot.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/turbopack/crates/turbopack-tests/tests/snapshot.rs b/turbopack/crates/turbopack-tests/tests/snapshot.rs index 247556e3d5d38..8212948b32dce 100644 --- a/turbopack/crates/turbopack-tests/tests/snapshot.rs +++ b/turbopack/crates/turbopack-tests/tests/snapshot.rs @@ -33,8 +33,8 @@ use turbopack_browser::BrowserChunkingContext; use turbopack_core::{ asset::Asset, chunk::{ - availability_info::AvailabilityInfo, ChunkingContext, ChunkingContextExt, EvaluatableAsset, - EvaluatableAssetExt, EvaluatableAssets, MinifyType, + availability_info::AvailabilityInfo, ChunkingContext, ChunkingContextExt, ContextSide, + EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets, MinifyType, }, compile_time_defines, compile_time_info::CompileTimeInfo, From 4b5f264b37b66c301f3325d3a86f74bce5b742e4 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 8 Apr 2025 08:27:43 +0200 Subject: [PATCH 10/11] remove ContextSide and improve MinifyType instead --- crates/next-core/src/next_client/context.rs | 7 ++-- crates/next-core/src/next_edge/context.rs | 9 +++--- crates/next-core/src/next_server/context.rs | 10 ++++-- .../turbopack-browser/src/chunking_context.rs | 10 +----- .../src/ecmascript/content.rs | 9 ++---- .../src/ecmascript/evaluate/chunk.rs | 2 +- .../crates/turbopack-cli/src/build/mod.rs | 13 +++++--- .../turbopack-cli/src/dev/web_entry_source.rs | 3 +- .../src/chunk/chunking_context.rs | 28 +++++++++------- .../crates/turbopack-core/src/chunk/mod.rs | 2 +- .../crates/turbopack-ecmascript/src/minify.rs | 32 ++++++++++++------- .../src/ecmascript/node/content.rs | 2 +- .../crates/turbopack-tests/tests/snapshot.rs | 5 ++- 13 files changed, 67 insertions(+), 65 deletions(-) diff --git a/crates/next-core/src/next_client/context.rs b/crates/next-core/src/next_client/context.rs index d58072ddc3701..4016c033e3258 100644 --- a/crates/next-core/src/next_client/context.rs +++ b/crates/next-core/src/next_client/context.rs @@ -19,7 +19,7 @@ use turbopack_browser::{ }; use turbopack_core::{ chunk::{ - module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, ContextSide, + module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapsType, }, compile_time_info::{ @@ -397,7 +397,7 @@ pub async fn get_client_module_options_context( css: CssOptionsContext { minify_type: if *next_config.turbo_minify(mode).await? { MinifyType::Minify { - mangle: !*no_mangling.await?, + mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), } } else { MinifyType::NoMinify @@ -449,13 +449,12 @@ pub async fn get_client_chunking_context( get_client_assets_path(*client_root).to_resolved().await?, environment, next_mode.runtime_type(), - ContextSide::Client, ) .chunk_base_path(asset_prefix) .chunk_suffix_path(chunk_suffix_path) .minify_type(if *minify.await? { MinifyType::Minify { - mangle: !*no_mangling.await?, + mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), } } else { MinifyType::NoMinify diff --git a/crates/next-core/src/next_edge/context.rs b/crates/next-core/src/next_edge/context.rs index bd7a1a6873149..934481adfc493 100644 --- a/crates/next-core/src/next_edge/context.rs +++ b/crates/next-core/src/next_edge/context.rs @@ -7,7 +7,7 @@ use turbopack::{css::chunk::CssChunkType, resolve_options_context::ResolveOption use turbopack_browser::BrowserChunkingContext; use turbopack_core::{ chunk::{ - module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, ContextSide, + module_id_strategies::ModuleIdStrategy, ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapsType, }, compile_time_info::{ @@ -237,12 +237,12 @@ pub async fn get_edge_chunking_context_with_client_assets( .await?, environment, next_mode.runtime_type(), - ContextSide::Server, ) .asset_base_path(asset_prefix) .minify_type(if *turbo_minify.await? { MinifyType::Minify { - mangle: !*no_mangling.await?, + // React needs deterministic function names to work correctly. + mangle: (!*no_mangling.await?).then(|| MangleType::Deterministic), } } else { MinifyType::NoMinify @@ -297,7 +297,6 @@ pub async fn get_edge_chunking_context( output_root.join("assets".into()).to_resolved().await?, environment, next_mode.runtime_type(), - ContextSide::Server, ) // Since one can't read files in edge directly, any asset need to be fetched // instead. This special blob url is handled by the custom fetch @@ -306,7 +305,7 @@ pub async fn get_edge_chunking_context( .asset_base_path(ResolvedVc::cell(Some("blob:server/edge/".into()))) .minify_type(if *turbo_minify.await? { MinifyType::Minify { - mangle: !*no_mangling.await?, + mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), } } else { MinifyType::NoMinify diff --git a/crates/next-core/src/next_server/context.rs b/crates/next-core/src/next_server/context.rs index 883000639c51b..9741cac80e8d7 100644 --- a/crates/next-core/src/next_server/context.rs +++ b/crates/next-core/src/next_server/context.rs @@ -15,7 +15,10 @@ use turbopack::{ transition::Transition, }; use turbopack_core::{ - chunk::{module_id_strategies::ModuleIdStrategy, ChunkingConfig, MinifyType, SourceMapsType}, + chunk::{ + module_id_strategies::ModuleIdStrategy, ChunkingConfig, MangleType, MinifyType, + SourceMapsType, + }, compile_time_info::{ CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefineableNameSegment, FreeVarReferences, @@ -1015,7 +1018,8 @@ pub async fn get_server_chunking_context_with_client_assets( .asset_prefix(asset_prefix) .minify_type(if *turbo_minify.await? { MinifyType::Minify { - mangle: !*no_mangling.await?, + // React needs deterministic function names to work correctly. + mangle: (!*no_mangling.await?).then(|| MangleType::Deterministic), } } else { MinifyType::NoMinify @@ -1080,7 +1084,7 @@ pub async fn get_server_chunking_context( ) .minify_type(if *turbo_minify.await? { MinifyType::Minify { - mangle: !*no_mangling.await?, + mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), } } else { MinifyType::NoMinify diff --git a/turbopack/crates/turbopack-browser/src/chunking_context.rs b/turbopack/crates/turbopack-browser/src/chunking_context.rs index 0b8b2d8486a88..97dbdf152a663 100644 --- a/turbopack/crates/turbopack-browser/src/chunking_context.rs +++ b/turbopack/crates/turbopack-browser/src/chunking_context.rs @@ -15,7 +15,7 @@ use turbopack_core::{ chunk_group::{make_chunk_group, MakeChunkGroupResult}, module_id_strategies::{DevModuleIdStrategy, ModuleIdStrategy}, Chunk, ChunkGroupResult, ChunkItem, ChunkType, ChunkableModule, ChunkingConfig, - ChunkingConfigs, ChunkingContext, ContextSide, EntryChunkGroupResult, EvaluatableAsset, + ChunkingConfigs, ChunkingContext, EntryChunkGroupResult, EvaluatableAsset, EvaluatableAssets, MinifyType, ModuleId, SourceMapsType, }, environment::Environment, @@ -220,8 +220,6 @@ pub struct BrowserChunkingContext { module_id_strategy: ResolvedVc>, /// The chunking configs chunking_configs: Vec<(ResolvedVc>, ChunkingConfig)>, - /// Whether the chunking context is server side - side: ContextSide, } impl BrowserChunkingContext { @@ -234,7 +232,6 @@ impl BrowserChunkingContext { asset_root_path: ResolvedVc, environment: ResolvedVc, runtime_type: RuntimeType, - side: ContextSide, ) -> BrowserChunkingContextBuilder { BrowserChunkingContextBuilder { chunking_context: BrowserChunkingContext { @@ -260,7 +257,6 @@ impl BrowserChunkingContext { manifest_chunks: false, module_id_strategy: ResolvedVc::upcast(DevModuleIdStrategy::new_resolved()), chunking_configs: Default::default(), - side, }, } } @@ -294,10 +290,6 @@ impl BrowserChunkingContext { pub fn minify_type(&self) -> MinifyType { self.minify_type } - - pub fn side(&self) -> ContextSide { - self.side - } } #[turbo_tasks::value_impl] diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs index 7ba8a89800ae5..48a15635d4772 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs @@ -8,7 +8,7 @@ use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::{rope::RopeBuilder, File}; use turbopack_core::{ asset::AssetContent, - chunk::{ChunkingContext, ContextSide, MinifyType, ModuleId}, + chunk::{ChunkingContext, MinifyType, ModuleId}, code_builder::{Code, CodeBuilder}, output::OutputAsset, source_map::{GenerateSourceMap, OptionStringifiedSourceMap, SourceMapAsset}, @@ -128,12 +128,7 @@ impl EcmascriptBrowserChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify( - &code, - source_maps, - this.chunking_context.await?.side() == ContextSide::Server, - mangle, - )?; + code = minify(&code, source_maps, mangle)?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs b/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs index b50649669b302..ad42afc184b08 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs @@ -194,7 +194,7 @@ impl EcmascriptBrowserEvaluateChunk { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, false, mangle)?; + code = minify(&code, source_maps, mangle)?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-cli/src/build/mod.rs b/turbopack/crates/turbopack-cli/src/build/mod.rs index 46e5fc522e49e..9408cee663c6f 100644 --- a/turbopack/crates/turbopack-cli/src/build/mod.rs +++ b/turbopack/crates/turbopack-cli/src/build/mod.rs @@ -26,8 +26,8 @@ use turbopack_cli_utils::issue::{ConsoleUi, LogOptions}; use turbopack_core::{ asset::Asset, chunk::{ - availability_info::AvailabilityInfo, ChunkingConfig, ChunkingContext, ContextSide, - EvaluatableAsset, EvaluatableAssets, MinifyType, SourceMapsType, + availability_info::AvailabilityInfo, ChunkingConfig, ChunkingContext, EvaluatableAsset, + EvaluatableAssets, MangleType, MinifyType, SourceMapsType, }, environment::{BrowserEnvironment, Environment, ExecutionEnvironment, NodeJsEnvironment}, ident::AssetIdent, @@ -93,7 +93,9 @@ impl TurbopackBuildBuilder { show_all: false, log_detail: false, source_maps_type: SourceMapsType::Full, - minify_type: MinifyType::Minify { mangle: true }, + minify_type: MinifyType::Minify { + mangle: Some(MangleType::OptimalSize), + }, target: Target::Node, } } @@ -330,7 +332,6 @@ async fn build_internal( .to_resolved() .await?, runtime_type, - ContextSide::Client, ) .source_maps(source_maps_type) .module_id_strategy(module_id_strategy) @@ -523,7 +524,9 @@ pub async fn build(args: &BuildArguments) -> Result<()> { .minify_type(if args.no_minify { MinifyType::NoMinify } else { - MinifyType::Minify { mangle: true } + MinifyType::Minify { + mangle: Some(MangleType::OptimalSize), + } }) .target(args.common.target.unwrap_or(Target::Node)) .show_all(args.common.show_all); diff --git a/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs b/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs index 555816cad5fa8..554da13f601e2 100644 --- a/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs +++ b/turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs @@ -6,7 +6,7 @@ use turbo_tasks_fs::FileSystemPath; use turbopack_browser::{react_refresh::assert_can_resolve_react_refresh, BrowserChunkingContext}; use turbopack_cli_utils::runtime_entry::{RuntimeEntries, RuntimeEntry}; use turbopack_core::{ - chunk::{ChunkableModule, ChunkingContext, ContextSide, EvaluatableAsset, SourceMapsType}, + chunk::{ChunkableModule, ChunkingContext, EvaluatableAsset, SourceMapsType}, environment::Environment, file_source::FileSource, module::Module, @@ -49,7 +49,6 @@ pub async fn get_client_chunking_context( server_root.join("/_assets".into()).to_resolved().await?, environment, RuntimeType::Development, - ContextSide::Client, ) .hot_module_replacement() .use_file_source_map_uris() diff --git a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs index 17cbe9bebaa07..7356db725586e 100644 --- a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs +++ b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs @@ -31,15 +31,9 @@ use crate::{ DeterministicHash, NonLocalValue, )] -pub enum MinifyType { - Minify { mangle: bool }, - NoMinify, -} - -impl Default for MinifyType { - fn default() -> Self { - Self::Minify { mangle: true } - } +pub enum MangleType { + OptimalSize, + Deterministic, } #[derive( @@ -56,9 +50,19 @@ impl Default for MinifyType { DeterministicHash, NonLocalValue, )] -pub enum ContextSide { - Client, - Server, +pub enum MinifyType { + // TODO instead of adding a new property here, + // refactor that to Minify(MinifyOptions) to allow defaults on MinifyOptions + Minify { mangle: Option }, + NoMinify, +} + +impl Default for MinifyType { + fn default() -> Self { + Self::Minify { + mangle: Some(MangleType::OptimalSize), + } + } } #[derive( diff --git a/turbopack/crates/turbopack-core/src/chunk/mod.rs b/turbopack/crates/turbopack-core/src/chunk/mod.rs index 6d258700d95e4..c456c98b547a2 100644 --- a/turbopack/crates/turbopack-core/src/chunk/mod.rs +++ b/turbopack/crates/turbopack-core/src/chunk/mod.rs @@ -29,7 +29,7 @@ pub use self::{ }, chunking_context::{ ChunkGroupResult, ChunkGroupType, ChunkingConfig, ChunkingConfigs, ChunkingContext, - ChunkingContextExt, ContextSide, EntryChunkGroupResult, MinifyType, SourceMapsType, + ChunkingContextExt, EntryChunkGroupResult, MangleType, MinifyType, SourceMapsType, }, data::{ChunkData, ChunkDataOption, ChunksData}, evaluate::{EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets}, diff --git a/turbopack/crates/turbopack-ecmascript/src/minify.rs b/turbopack/crates/turbopack-ecmascript/src/minify.rs index 752c2599572fc..9a26f8a2b0f08 100644 --- a/turbopack/crates/turbopack-ecmascript/src/minify.rs +++ b/turbopack/crates/turbopack-ecmascript/src/minify.rs @@ -23,12 +23,15 @@ use swc_core::{ }, }; use tracing::{instrument, Level}; -use turbopack_core::code_builder::{Code, CodeBuilder}; +use turbopack_core::{ + chunk::MangleType, + code_builder::{Code, CodeBuilder}, +}; use crate::parse::generate_js_source_map; #[instrument(level = Level::INFO, skip_all)] -pub fn minify(code: &Code, source_maps: bool, is_server_side: bool, mangle: bool) -> Result { +pub fn minify(code: &Code, source_maps: bool, mangle: Option) -> Result { let source_maps = source_maps .then(|| code.generate_source_map_ref()) .transpose()?; @@ -84,15 +87,20 @@ pub fn minify(code: &Code, source_maps: bool, is_server_side: bool, mangle: bool passes: 2, ..Default::default() }), - mangle: if mangle { - Some(MangleOptions { - reserved: vec!["AbortSignal".into()], - disable_char_freq: is_server_side, - ..Default::default() - }) - } else { - None - }, + mangle: mangle.map(|mangle| { + let reserved = vec!["AbortSignal".into()]; + match mangle { + MangleType::OptimalSize => MangleOptions { + reserved, + ..Default::default() + }, + MangleType::Deterministic => MangleOptions { + reserved, + disable_char_freq: true, + ..Default::default() + }, + } + }), ..Default::default() }, &ExtraOptions { @@ -102,7 +110,7 @@ pub fn minify(code: &Code, source_maps: bool, is_server_side: bool, mangle: bool }, ); - if !mangle { + if mangle.is_none() { program.mutate(hygiene_with_config(hygiene::Config { top_level_mark, ..Default::default() diff --git a/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs b/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs index b3bce1be7ea29..3736dfbc8c37b 100644 --- a/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs +++ b/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs @@ -78,7 +78,7 @@ impl EcmascriptBuildNodeChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, true, mangle)?; + code = minify(&code, source_maps, mangle)?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-tests/tests/snapshot.rs b/turbopack/crates/turbopack-tests/tests/snapshot.rs index 8212948b32dce..3006b9dfdb5a0 100644 --- a/turbopack/crates/turbopack-tests/tests/snapshot.rs +++ b/turbopack/crates/turbopack-tests/tests/snapshot.rs @@ -33,8 +33,8 @@ use turbopack_browser::BrowserChunkingContext; use turbopack_core::{ asset::Asset, chunk::{ - availability_info::AvailabilityInfo, ChunkingContext, ChunkingContextExt, ContextSide, - EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets, MinifyType, + availability_info::AvailabilityInfo, ChunkingContext, ChunkingContextExt, EvaluatableAsset, + EvaluatableAssetExt, EvaluatableAssets, MinifyType, }, compile_time_defines, compile_time_info::CompileTimeInfo, @@ -356,7 +356,6 @@ async fn run_test_operation(resource: RcStr) -> Result> { static_root_path, env, options.runtime_type, - ContextSide::Client, ) .build(), ), From 478df3e619373a983082271825b52826c52785d1 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 8 Apr 2025 08:45:55 +0200 Subject: [PATCH 11/11] clippy and test case --- crates/next-core/src/next_client/context.rs | 4 ++-- crates/next-core/src/next_edge/context.rs | 4 ++-- crates/next-core/src/next_server/context.rs | 4 ++-- turbopack/crates/turbopack-core/src/chunk/chunking_context.rs | 1 + .../tests/snapshot/basic/ecmascript_minify/options.json | 2 +- .../tests/snapshot/minification/paren-remover/options.json | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/next-core/src/next_client/context.rs b/crates/next-core/src/next_client/context.rs index 4016c033e3258..36d9caef0b627 100644 --- a/crates/next-core/src/next_client/context.rs +++ b/crates/next-core/src/next_client/context.rs @@ -397,7 +397,7 @@ pub async fn get_client_module_options_context( css: CssOptionsContext { minify_type: if *next_config.turbo_minify(mode).await? { MinifyType::Minify { - mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), + mangle: (!*no_mangling.await?).then_some(MangleType::OptimalSize), } } else { MinifyType::NoMinify @@ -454,7 +454,7 @@ pub async fn get_client_chunking_context( .chunk_suffix_path(chunk_suffix_path) .minify_type(if *minify.await? { MinifyType::Minify { - mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), + mangle: (!*no_mangling.await?).then_some(MangleType::OptimalSize), } } else { MinifyType::NoMinify diff --git a/crates/next-core/src/next_edge/context.rs b/crates/next-core/src/next_edge/context.rs index 934481adfc493..71c4b97f2f46a 100644 --- a/crates/next-core/src/next_edge/context.rs +++ b/crates/next-core/src/next_edge/context.rs @@ -242,7 +242,7 @@ pub async fn get_edge_chunking_context_with_client_assets( .minify_type(if *turbo_minify.await? { MinifyType::Minify { // React needs deterministic function names to work correctly. - mangle: (!*no_mangling.await?).then(|| MangleType::Deterministic), + mangle: (!*no_mangling.await?).then_some(MangleType::Deterministic), } } else { MinifyType::NoMinify @@ -305,7 +305,7 @@ pub async fn get_edge_chunking_context( .asset_base_path(ResolvedVc::cell(Some("blob:server/edge/".into()))) .minify_type(if *turbo_minify.await? { MinifyType::Minify { - mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), + mangle: (!*no_mangling.await?).then_some(MangleType::OptimalSize), } } else { MinifyType::NoMinify diff --git a/crates/next-core/src/next_server/context.rs b/crates/next-core/src/next_server/context.rs index 9741cac80e8d7..313fdaca39a98 100644 --- a/crates/next-core/src/next_server/context.rs +++ b/crates/next-core/src/next_server/context.rs @@ -1019,7 +1019,7 @@ pub async fn get_server_chunking_context_with_client_assets( .minify_type(if *turbo_minify.await? { MinifyType::Minify { // React needs deterministic function names to work correctly. - mangle: (!*no_mangling.await?).then(|| MangleType::Deterministic), + mangle: (!*no_mangling.await?).then_some(MangleType::Deterministic), } } else { MinifyType::NoMinify @@ -1084,7 +1084,7 @@ pub async fn get_server_chunking_context( ) .minify_type(if *turbo_minify.await? { MinifyType::Minify { - mangle: (!*no_mangling.await?).then(|| MangleType::OptimalSize), + mangle: (!*no_mangling.await?).then_some(MangleType::OptimalSize), } } else { MinifyType::NoMinify diff --git a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs index 7356db725586e..52f8c40a22fe8 100644 --- a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs +++ b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs @@ -31,6 +31,7 @@ use crate::{ DeterministicHash, NonLocalValue, )] +#[serde(rename_all = "kebab-case")] pub enum MangleType { OptimalSize, Deterministic, diff --git a/turbopack/crates/turbopack-tests/tests/snapshot/basic/ecmascript_minify/options.json b/turbopack/crates/turbopack-tests/tests/snapshot/basic/ecmascript_minify/options.json index 9ee80c5ad1ecc..78197ec333e88 100644 --- a/turbopack/crates/turbopack-tests/tests/snapshot/basic/ecmascript_minify/options.json +++ b/turbopack/crates/turbopack-tests/tests/snapshot/basic/ecmascript_minify/options.json @@ -2,7 +2,7 @@ "runtime": "NodeJs", "minifyType": { "Minify": { - "mangle": true + "mangle": "optimal-size" } } } diff --git a/turbopack/crates/turbopack-tests/tests/snapshot/minification/paren-remover/options.json b/turbopack/crates/turbopack-tests/tests/snapshot/minification/paren-remover/options.json index 3b3b9ab6afcbc..012b46107ba83 100644 --- a/turbopack/crates/turbopack-tests/tests/snapshot/minification/paren-remover/options.json +++ b/turbopack/crates/turbopack-tests/tests/snapshot/minification/paren-remover/options.json @@ -1,7 +1,7 @@ { "minifyType": { "Minify": { - "mangle": true + "mangle": "optimal-size" } } }