Skip to content

Commit

Permalink
refactor(turbopack): Remove cast to EcmascriptModuleAsset (#68427)
Browse files Browse the repository at this point in the history
### What?

Now we have tree shaking implementation but it uses
`EcmascriptModulePartAsset` as the module type. So casting to
`EcmascriptModuleAsset` can break the tree shaking.

This PR also removes `special exports` of turbopack, which is
cumbersome. The previous analysis logic for those special exports may
depend on the value being `EcmascriptModuleAsset`, which is resolved in
this PR.

### Why?

Clean code & for future woork.


### How?

Closes PACK-3175
  • Loading branch information
kdy1 authored and ForsakenHarmony committed Aug 16, 2024
1 parent 4eed47c commit 646a110
Show file tree
Hide file tree
Showing 40 changed files with 303 additions and 202 deletions.
4 changes: 2 additions & 2 deletions crates/next-api/src/dynamic_imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use turbopack_core::{
reference_type::EcmaScriptModulesReferenceSubType,
resolve::{origin::PlainResolveOrigin, parse::Request, pattern::Pattern},
};
use turbopack_ecmascript::{parse::ParseResult, resolve::esm_resolve, EcmascriptModuleAsset};
use turbopack_ecmascript::{parse::ParseResult, resolve::esm_resolve, EcmascriptParsable};

async fn collect_chunk_group_inner<F, Fu>(
dynamic_import_entries: IndexMap<Vc<Box<dyn Module>>, DynamicImportedModules>,
Expand Down Expand Up @@ -259,7 +259,7 @@ async fn build_dynamic_imports_map_for_module(
server_module: Vc<Box<dyn Module>>,
) -> Result<Vc<OptionDynamicImportsMap>> {
let Some(ecmascript_asset) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(server_module).await?
Vc::try_resolve_sidecast::<Box<dyn EcmascriptParsable>>(server_module).await?
else {
return Ok(Vc::cell(None));
};
Expand Down
24 changes: 6 additions & 18 deletions crates/next-api/src/server_actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ use turbopack_core::{
virtual_source::VirtualSource,
};
use turbopack_ecmascript::{
chunk::EcmascriptChunkPlaceable, parse::ParseResult,
tree_shake::asset::EcmascriptModulePartAsset, EcmascriptModuleAsset, EcmascriptModuleAssetType,
chunk::EcmascriptChunkPlaceable, parse::ParseResult, EcmascriptModuleAssetType,
EcmascriptParsable,
};

/// Scans the RSC entry point's full module graph looking for exported Server
Expand Down Expand Up @@ -235,17 +235,9 @@ async fn to_rsc_context(
module.content(),
);
let ty = if let Some(module) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(module).await?
Vc::try_resolve_sidecast::<Box<dyn EcmascriptParsable>>(module).await?
{
if module.await?.ty == EcmascriptModuleAssetType::Ecmascript {
ReferenceType::EcmaScriptModules(EcmaScriptModulesReferenceSubType::Undefined)
} else {
ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined)
}
} else if let Some(module) =
Vc::try_resolve_downcast_type::<EcmascriptModulePartAsset>(module).await?
{
if module.await?.full_module.await?.ty == EcmascriptModuleAssetType::Ecmascript {
if *module.ty().await? == EcmascriptModuleAssetType::Ecmascript {
ReferenceType::EcmaScriptModules(EcmaScriptModulesReferenceSubType::Undefined)
} else {
ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined)
Expand Down Expand Up @@ -299,13 +291,9 @@ pub fn parse_server_actions<C: Comments>(
#[turbo_tasks::function]
async fn parse_actions(module: Vc<Box<dyn Module>>) -> Result<Vc<OptionActionMap>> {
let parsed = if let Some(ecmascript_asset) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(module).await?
{
ecmascript_asset.failsafe_parse()
} else if let Some(ecmascript_asset) =
Vc::try_resolve_downcast_type::<EcmascriptModulePartAsset>(module).await?
Vc::try_resolve_sidecast::<Box<dyn EcmascriptParsable>>(module).await?
{
ecmascript_asset.await?.full_module.failsafe_parse()
ecmascript_asset.parse_original()
} else {
return Ok(OptionActionMap::none());
};
Expand Down
3 changes: 1 addition & 2 deletions crates/next-core/src/next_app/metadata/image.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ use turbopack_core::{
use turbopack_ecmascript::{
chunk::{EcmascriptChunkPlaceable, EcmascriptExports},
utils::StringifyJs,
EcmascriptModuleAsset,
};

use crate::next_app::AppPage;
Expand Down Expand Up @@ -132,7 +131,7 @@ pub async fn dynamic_image_metadata_source(
#[turbo_tasks::function]
async fn collect_direct_exports(module: Vc<Box<dyn Module>>) -> Result<Vc<Vec<RcStr>>> {
let Some(ecmascript_asset) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(module).await?
Vc::try_resolve_sidecast::<Box<dyn EcmascriptChunkPlaceable>>(module).await?
else {
return Ok(Default::default());
};
Expand Down
2 changes: 0 additions & 2 deletions crates/next-core/src/next_client/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ use crate::{
get_next_client_resolved_map,
},
next_shared::{
next_js_special_exports,
resolve::{
get_invalid_server_only_resolve_plugin, ModuleFeatureReportResolvePlugin,
NextSharedRuntimeResolvePlugin,
Expand Down Expand Up @@ -284,7 +283,6 @@ pub async fn get_client_module_options_context(
preset_env_versions: Some(env),
execution_context: Some(execution_context),
tree_shaking_mode: tree_shaking_mode_for_user_code,
special_exports: Some(next_js_special_exports()),
enable_postcss_transform,
side_effect_free_packages: next_config.optimize_package_imports().await?.clone_value(),
..Default::default()
Expand Down
2 changes: 0 additions & 2 deletions crates/next-core/src/next_server/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ use crate::{
next_import_map::get_next_server_import_map,
next_server::resolve::ExternalPredicate,
next_shared::{
next_js_special_exports,
resolve::{
get_invalid_client_only_resolve_plugin, get_invalid_styled_jsx_resolve_plugin,
ModuleFeatureReportResolvePlugin, NextExternalResolvePlugin,
Expand Down Expand Up @@ -493,7 +492,6 @@ pub async fn get_server_module_options_context(
..Default::default()
},
tree_shaking_mode: tree_shaking_mode_for_user_code,
special_exports: Some(next_js_special_exports()),
side_effect_free_packages: next_config.optimize_package_imports().await?.clone_value(),
..Default::default()
};
Expand Down
28 changes: 0 additions & 28 deletions crates/next-core/src/next_shared/mod.rs
Original file line number Diff line number Diff line change
@@ -1,31 +1,3 @@
use turbo_tasks::{RcStr, Vc};

pub(crate) mod resolve;
pub(crate) mod transforms;
pub(crate) mod webpack_rules;

#[turbo_tasks::function]
pub fn next_js_special_exports() -> Vc<Vec<RcStr>> {
Vc::cell(
[
"config",
"middleware",
"runtime",
"revalidate",
"dynamic",
"dynamicParams",
"fetchCache",
"preferredRegion",
"maxDuration",
"generateStaticParams",
"metadata",
"generateMetadata",
"getServerSideProps",
"getInitialProps",
"getStaticProps",
]
.into_iter()
.map(RcStr::from)
.collect::<Vec<RcStr>>(),
)
}
4 changes: 2 additions & 2 deletions crates/next-core/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use turbopack_ecmascript::{
analyzer::{JsValue, ObjectPart},
parse::ParseResult,
utils::StringifyJs,
EcmascriptModuleAsset,
EcmascriptParsable,
};

use crate::{
Expand Down Expand Up @@ -371,7 +371,7 @@ fn parse_route_matcher_from_js_value(
#[turbo_tasks::function]
pub async fn parse_config_from_source(module: Vc<Box<dyn Module>>) -> Result<Vc<NextSourceConfig>> {
if let Some(ecmascript_asset) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(module).await?
Vc::try_resolve_sidecast::<Box<dyn EcmascriptParsable>>(module).await?
{
if let ParseResult::Ok {
program: Program::Module(module_ast),
Expand Down
5 changes: 2 additions & 3 deletions turbopack/crates/turbopack-cli/src/build/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@ use anyhow::{bail, Context, Result};
use turbo_tasks::{RcStr, TransientInstance, TryJoinIterExt, TurboTasks, Value, Vc};
use turbo_tasks_fs::FileSystem;
use turbo_tasks_memory::MemoryBackend;
use turbopack::ecmascript::EcmascriptModuleAsset;
use turbopack_cli_utils::issue::{ConsoleUi, LogOptions};
use turbopack_core::{
asset::Asset,
chunk::{
availability_info::AvailabilityInfo, ChunkableModule, ChunkingContext, ChunkingContextExt,
EvaluatableAssets, MinifyType,
EvaluatableAsset, EvaluatableAssets, MinifyType,
},
environment::{BrowserEnvironment, Environment, ExecutionEnvironment},
issue::{handle_issues, IssueReporter, IssueSeverity},
Expand Down Expand Up @@ -259,7 +258,7 @@ async fn build_internal(
.map(|entry_module| async move {
Ok(
if let Some(ecmascript) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(entry_module).await?
Vc::try_resolve_sidecast::<Box<dyn EvaluatableAsset>>(entry_module).await?
{
Vc::cell(vec![
Vc::try_resolve_downcast_type::<NodeJsChunkingContext>(chunking_context)
Expand Down
14 changes: 7 additions & 7 deletions turbopack/crates/turbopack-cli/src/dev/web_entry_source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@ use anyhow::{anyhow, Result};
use turbo_tasks::{RcStr, TryJoinIterExt, Value, Vc};
use turbo_tasks_env::ProcessEnv;
use turbo_tasks_fs::FileSystemPath;
use turbopack::ecmascript::EcmascriptModuleAsset;
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},
chunk::{ChunkableModule, ChunkingContext, EvaluatableAsset},
environment::Environment,
file_source::FileSource,
reference_type::{EntryReferenceSubType, ReferenceType},
Expand Down Expand Up @@ -121,13 +120,14 @@ pub async fn create_web_entry_source(
.into_iter()
.flatten()
.map(|module| async move {
if let Some(ecmascript) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(module).await?
{
if let (Some(chnkable), Some(entry)) = (
Vc::try_resolve_sidecast::<Box<dyn ChunkableModule>>(module).await?,
Vc::try_resolve_sidecast::<Box<dyn EvaluatableAsset>>(module).await?,
) {
Ok((
Vc::upcast(ecmascript),
chnkable,
chunking_context,
Some(runtime_entries.with_entry(Vc::upcast(ecmascript))),
Some(runtime_entries.with_entry(entry)),
))
} else if let Some(chunkable) =
Vc::try_resolve_sidecast::<Box<dyn ChunkableModule>>(module).await?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use turbopack_core::{
asset::{Asset, AssetContent},
chunk::{
availability_info::AvailabilityInfo, ChunkItem, ChunkType, ChunkableModule,
ChunkingContext, ChunkingContextExt, EvaluatableAssets,
ChunkingContext, ChunkingContextExt, EvaluatableAsset, EvaluatableAssets,
},
ident::AssetIdent,
introspect::{
Expand All @@ -26,7 +26,6 @@ use crate::{
EcmascriptChunkType, EcmascriptExports,
},
utils::StringifyJs,
EcmascriptModuleAsset,
};

#[turbo_tasks::function]
Expand Down Expand Up @@ -129,14 +128,14 @@ impl ChunkGroupFilesChunkItem {
let this = self.await?;
let inner = this.inner.await?;
let chunks = if let Some(ecma) =
Vc::try_resolve_downcast_type::<EcmascriptModuleAsset>(inner.module).await?
Vc::try_resolve_sidecast::<Box<dyn EvaluatableAsset>>(inner.module).await?
{
inner.chunking_context.evaluated_chunk_group_assets(
inner.module.ident(),
inner
.runtime_entries
.unwrap_or_else(EvaluatableAssets::empty)
.with_entry(Vc::upcast(ecma)),
.with_entry(ecma),
Value::new(AvailabilityInfo::Root),
)
} else {
Expand Down
Loading

0 comments on commit 646a110

Please sign in to comment.