Chunking Refactor Step 1 (#56467)

### What?

This change moves a few methods around.

Module::as_chunk is moved to ChunkItem::as_chunk as temporary intermediate state.
EcmascriptPlaceable::as_chunk_item is moved to ChunkableModule::as_chunk_item. This generalizes the concept of converting a Module into a ChunkItem


### Why?

This is the first step of refactoring the chunking. In the end we want to avoid creating chunks from modules directly, but enforce everything going through the ChunkingContext to be chunked. This allows us to replace the existing chunking algorithm with a much more efficient one that avoid duplication between chunks in first place and doesn't require a post-chunking optimization.

### How?

see https://github.com/vercel/turbo/pull/6104

Closes WEB-1715

Co-authored-by: Justin Ridgewell <112982+jridgewell@users.noreply.github.com>
This commit is contained in:
Tobias Koppers 2023-10-05 22:05:05 +02:00 committed by GitHub
parent 11c1d07b89
commit 666ce7bd8b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 188 additions and 174 deletions

66
Cargo.lock generated
View file

@ -321,7 +321,7 @@ dependencies = [
[[package]]
name = "auto-hash-map"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"serde",
"smallvec",
@ -3515,7 +3515,7 @@ dependencies = [
[[package]]
name = "node-file-trace"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"serde",
@ -7368,7 +7368,7 @@ dependencies = [
[[package]]
name = "turbo-tasks"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-trait",
@ -7400,7 +7400,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-build"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"cargo-lock",
@ -7412,7 +7412,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-bytes"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"bytes",
@ -7427,7 +7427,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-env"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"dotenvs",
@ -7441,7 +7441,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-fetch"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"indexmap 1.9.3",
@ -7458,7 +7458,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-fs"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"auto-hash-map",
@ -7488,7 +7488,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-hash"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"base16",
"hex",
@ -7500,7 +7500,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-macros"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@ -7514,7 +7514,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-macros-shared"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"proc-macro2",
"quote",
@ -7524,7 +7524,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-malloc"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"mimalloc",
]
@ -7532,7 +7532,7 @@ dependencies = [
[[package]]
name = "turbo-tasks-memory"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"auto-hash-map",
@ -7557,7 +7557,7 @@ dependencies = [
[[package]]
name = "turbopack"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-recursion",
@ -7588,7 +7588,7 @@ dependencies = [
[[package]]
name = "turbopack-binding"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"auto-hash-map",
"mdxjs",
@ -7628,7 +7628,7 @@ dependencies = [
[[package]]
name = "turbopack-build"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"indexmap 1.9.3",
@ -7650,7 +7650,7 @@ dependencies = [
[[package]]
name = "turbopack-cli-utils"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"clap 4.4.2",
@ -7674,7 +7674,7 @@ dependencies = [
[[package]]
name = "turbopack-core"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-recursion",
@ -7703,7 +7703,7 @@ dependencies = [
[[package]]
name = "turbopack-css"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-trait",
@ -7725,7 +7725,7 @@ dependencies = [
[[package]]
name = "turbopack-dev"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"indexmap 1.9.3",
@ -7749,7 +7749,7 @@ dependencies = [
[[package]]
name = "turbopack-dev-server"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-compression",
@ -7786,7 +7786,7 @@ dependencies = [
[[package]]
name = "turbopack-ecmascript"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-trait",
@ -7820,7 +7820,7 @@ dependencies = [
[[package]]
name = "turbopack-ecmascript-hmr-protocol"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"serde",
"serde_json",
@ -7831,7 +7831,7 @@ dependencies = [
[[package]]
name = "turbopack-ecmascript-plugins"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-trait",
@ -7854,7 +7854,7 @@ dependencies = [
[[package]]
name = "turbopack-ecmascript-runtime"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"indoc",
@ -7871,7 +7871,7 @@ dependencies = [
[[package]]
name = "turbopack-env"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"indexmap 1.9.3",
@ -7887,7 +7887,7 @@ dependencies = [
[[package]]
name = "turbopack-image"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"base64 0.21.4",
@ -7907,7 +7907,7 @@ dependencies = [
[[package]]
name = "turbopack-json"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"serde",
@ -7922,7 +7922,7 @@ dependencies = [
[[package]]
name = "turbopack-mdx"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"mdxjs",
@ -7937,7 +7937,7 @@ dependencies = [
[[package]]
name = "turbopack-node"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"async-stream",
@ -7972,7 +7972,7 @@ dependencies = [
[[package]]
name = "turbopack-static"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"serde",
@ -7988,7 +7988,7 @@ dependencies = [
[[package]]
name = "turbopack-swc-utils"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"swc_core",
"turbo-tasks",
@ -7999,7 +7999,7 @@ dependencies = [
[[package]]
name = "turbopack-wasm"
version = "0.1.0"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231002.1#dc1e2a7a4aa4cbd88c7144bf0bdd4fd0589373c1"
source = "git+https://github.com/vercel/turbo.git?tag=turbopack-231005.2#2207c3eb716b81c719385e43d25d7399f673fc11"
dependencies = [
"anyhow",
"indexmap 1.9.3",

View file

@ -40,11 +40,11 @@ swc_core = { version = "0.83.28", features = [
testing = { version = "0.34.1" }
# Turbo crates
turbopack-binding = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231002.1" }
turbopack-binding = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231005.2" }
# [TODO]: need to refactor embed_directory! macro usages, as well as resolving turbo_tasks::function, macros..
turbo-tasks = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231002.1" }
turbo-tasks = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231005.2" }
# [TODO]: need to refactor embed_directory! macro usage in next-core
turbo-tasks-fs = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231002.1" }
turbo-tasks-fs = { git = "https://github.com/vercel/turbo.git", tag = "turbopack-231005.2" }
# General Deps

View file

@ -39,7 +39,7 @@ use turbopack_binding::{
turbopack::{
core::{
asset::{Asset, AssetContent},
chunk::{ChunkableModule, ChunkingContext, EvaluatableAssets},
chunk::{ChunkableModuleExt, ChunkingContext, EvaluatableAssets},
file_source::FileSource,
output::{OutputAsset, OutputAssets},
virtual_output::VirtualOutputAsset,

View file

@ -13,7 +13,7 @@ use turbopack_binding::{
turbopack::{
core::{
asset::AssetContent,
chunk::{ChunkableModule, ChunkingContext},
chunk::{ChunkableModuleExt, ChunkingContext},
context::AssetContext,
module::Module,
output::{OutputAsset, OutputAssets},

View file

@ -37,7 +37,7 @@ use turbopack_binding::{
build::BuildChunkingContext,
core::{
asset::AssetContent,
chunk::{ChunkableModule, ChunkingContext, EvaluatableAssets},
chunk::{ChunkableModuleExt, ChunkingContext, EvaluatableAssets},
context::AssetContext,
file_source::FileSource,
issue::{IssueSeverity, OptionIssueSource},

View file

@ -16,13 +16,18 @@ use turbopack_binding::{
turbo::tasks_fs::{rope::RopeBuilder, File, FileSystemPath},
turbopack::{
core::{
asset::AssetContent, chunk::EvaluatableAsset, context::AssetContext, module::Module,
output::OutputAsset, reference::primary_referenced_modules,
reference_type::ReferenceType, virtual_output::VirtualOutputAsset,
asset::AssetContent,
chunk::{ChunkItemExt, ChunkableModule, EvaluatableAsset},
context::AssetContext,
module::Module,
output::OutputAsset,
reference::primary_referenced_modules,
reference_type::ReferenceType,
virtual_output::VirtualOutputAsset,
virtual_source::VirtualSource,
},
ecmascript::{
chunk::{EcmascriptChunkItemExt, EcmascriptChunkPlaceable, EcmascriptChunkingContext},
chunk::{EcmascriptChunkPlaceable, EcmascriptChunkingContext},
parse::ParseResult,
EcmascriptModuleAsset,
},
@ -72,7 +77,10 @@ pub(crate) async fn create_server_actions_manifest(
bail!("loader module must be evaluatable");
};
let loader_id = loader.as_chunk_item(chunking_context).id().to_string();
let loader_id = loader
.as_chunk_item(Vc::upcast(chunking_context))
.id()
.to_string();
let manifest =
build_manifest(node_root, pathname, page_name, runtime, actions, loader_id).await?;
Ok((Some(evaluable), manifest))

View file

@ -27,7 +27,7 @@ use turbopack_binding::{
turbopack::{
build::BuildChunkingContext,
core::{
chunk::{ChunkableModule, ChunkingContext, EvaluatableAssets},
chunk::{ChunkableModuleExt, ChunkingContext, EvaluatableAssets},
compile_time_info::CompileTimeInfo,
context::AssetContext,
file_source::FileSource,

View file

@ -5,7 +5,7 @@ use turbo_tasks::{debug::ValueDebugFormat, trace::TraceRawVcs, TryJoinIterExt, V
use turbopack_binding::turbopack::{
build::BuildChunkingContext,
core::{
chunk::{ChunkableModule, ChunkingContext},
chunk::{ChunkableModuleExt, ChunkingContext},
output::OutputAssets,
},
ecmascript::chunk::EcmascriptChunkingContext,

View file

@ -1,17 +1,13 @@
use anyhow::{Context, Result};
use turbo_tasks::{Value, Vc};
use turbo_tasks::Vc;
use turbopack_binding::turbopack::{
core::{
asset::{Asset, AssetContent},
chunk::{availability_info::AvailabilityInfo, Chunk, ChunkableModule, ChunkingContext},
chunk::{ChunkableModule, ChunkingContext},
ident::AssetIdent,
module::Module,
reference::ModuleReferences,
},
ecmascript::chunk::EcmascriptChunkingContext,
turbopack::ecmascript::chunk::{
EcmascriptChunk, EcmascriptChunkItem, EcmascriptChunkPlaceable, EcmascriptExports,
},
turbopack::ecmascript::chunk::{EcmascriptChunkPlaceable, EcmascriptExports},
};
#[turbo_tasks::function]
@ -49,38 +45,19 @@ impl Asset for WithChunkingContextScopeAsset {
#[turbo_tasks::value_impl]
impl ChunkableModule for WithChunkingContextScopeAsset {
#[turbo_tasks::function]
fn as_chunk(
fn as_chunk_item(
&self,
context: Vc<Box<dyn ChunkingContext>>,
availability_info: Value<AvailabilityInfo>,
) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
context.with_layer(self.layer.clone()),
chunking_context: Vc<Box<dyn ChunkingContext>>,
) -> Vc<Box<dyn turbopack_binding::turbopack::core::chunk::ChunkItem>> {
Vc::upcast(ChunkableModule::as_chunk_item(
self.asset,
availability_info,
chunking_context.with_layer(self.layer.clone()),
))
}
}
#[turbo_tasks::value_impl]
impl EcmascriptChunkPlaceable for WithChunkingContextScopeAsset {
#[turbo_tasks::function]
async fn as_chunk_item(
&self,
context: Vc<Box<dyn EcmascriptChunkingContext>>,
) -> Result<Vc<Box<dyn EcmascriptChunkItem>>> {
Ok(self.asset.as_chunk_item(
Vc::try_resolve_sidecast::<Box<dyn EcmascriptChunkingContext>>(
context.with_layer(self.layer.clone()),
)
.await?
.context(
"ChunkingContext::with_layer should not return a different kind of chunking \
context",
)?,
))
}
#[turbo_tasks::function]
fn get_exports(&self) -> Vc<EcmascriptExports> {
self.asset.get_exports()

View file

@ -7,9 +7,9 @@ use turbopack_binding::{
core::{
asset::{Asset, AssetContent},
chunk::{
availability_info::AvailabilityInfo, Chunk, ChunkData, ChunkItem, ChunkableModule,
ChunkableModuleReference, ChunkingContext, ChunkingType, ChunkingTypeOption,
ChunksData,
availability_info::AvailabilityInfo, Chunk, ChunkData, ChunkItem, ChunkItemExt,
ChunkableModule, ChunkableModuleExt, ChunkableModuleReference, ChunkingContext,
ChunkingType, ChunkingTypeOption, ChunksData,
},
ident::AssetIdent,
module::Module,
@ -18,7 +18,7 @@ use turbopack_binding::{
reference::{ModuleReference, ModuleReferences, SingleOutputAssetReference},
resolve::ModuleResolveResult,
},
ecmascript::chunk::{EcmascriptChunkData, EcmascriptChunkItemExt},
ecmascript::chunk::EcmascriptChunkData,
turbopack::ecmascript::{
chunk::{
EcmascriptChunk, EcmascriptChunkItem, EcmascriptChunkItemContent,
@ -69,42 +69,29 @@ impl Asset for WithClientChunksAsset {
#[turbo_tasks::value_impl]
impl ChunkableModule for WithClientChunksAsset {
#[turbo_tasks::function]
fn as_chunk(
async fn as_chunk_item(
self: Vc<Self>,
context: Vc<Box<dyn ChunkingContext>>,
availability_info: Value<AvailabilityInfo>,
) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
context.with_layer("rsc".to_string()),
Vc::upcast(self),
availability_info,
chunking_context: Vc<Box<dyn ChunkingContext>>,
) -> Result<Vc<Box<dyn turbopack_binding::turbopack::core::chunk::ChunkItem>>> {
let context = Vc::try_resolve_sidecast::<Box<dyn EcmascriptChunkingContext>>(
chunking_context.with_layer("rsc".to_string()),
)
.await?
.context(
"ChunkingContext::with_layer should not return a different kind of chunking context",
)?;
Ok(Vc::upcast(
WithClientChunksChunkItem {
context,
inner: self,
}
.cell(),
))
}
}
#[turbo_tasks::value_impl]
impl EcmascriptChunkPlaceable for WithClientChunksAsset {
#[turbo_tasks::function]
async fn as_chunk_item(
self: Vc<Self>,
context: Vc<Box<dyn EcmascriptChunkingContext>>,
) -> Result<Vc<Box<dyn EcmascriptChunkItem>>> {
Ok(Vc::upcast(
WithClientChunksChunkItem {
context: Vc::try_resolve_sidecast::<Box<dyn EcmascriptChunkingContext>>(
context.with_layer("rsc".to_string()),
)
.await?
.context(
"ChunkingContext::with_layer should not return a different kind of chunking \
context",
)?,
inner: self,
}
.cell(),
))
}
#[turbo_tasks::function]
fn get_exports(&self) -> Vc<EcmascriptExports> {
// TODO This should be EsmExports
@ -183,7 +170,11 @@ impl EcmascriptChunkItem for WithClientChunksChunkItem {
.map(|chunk_data| EcmascriptChunkData::new(chunk_data))
.collect();
let module_id = inner.asset.as_chunk_item(this.context).id().await?;
let module_id = inner
.asset
.as_chunk_item(Vc::upcast(this.context))
.id()
.await?;
Ok(EcmascriptChunkItemContent {
inner_code: formatdoc!(
// We store the chunks in a binding, otherwise a new array would be created every
@ -243,6 +234,20 @@ impl ChunkItem for WithClientChunksChunkItem {
}
Ok(Vc::cell(references))
}
#[turbo_tasks::function]
async fn chunking_context(&self) -> Vc<Box<dyn ChunkingContext>> {
Vc::upcast(self.context)
}
#[turbo_tasks::function]
fn as_chunk(&self, availability_info: Value<AvailabilityInfo>) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
Vc::upcast(self.context.with_layer("rsc".to_string())),
Vc::upcast(self.inner),
availability_info,
))
}
}
#[turbo_tasks::value]

View file

@ -1,6 +1,6 @@
use std::{io::Write, iter::once};
use anyhow::{bail, Result};
use anyhow::{bail, Context, Result};
use indoc::writedoc;
use turbo_tasks::{Value, ValueToString, Vc};
use turbo_tasks_fs::File;
@ -85,7 +85,7 @@ impl EcmascriptClientReferenceProxyModule {
// and the $$typeof value is for rendering logic to determine if the module
// is a client boundary.
const {{ __esModule, $$typeof }} = proxy;
export {{ __esModule, $$typeof }};
export default proxy;
"#,
@ -164,36 +164,35 @@ impl Asset for EcmascriptClientReferenceProxyModule {
#[turbo_tasks::value_impl]
impl ChunkableModule for EcmascriptClientReferenceProxyModule {
#[turbo_tasks::function]
fn as_chunk(
async fn as_chunk_item(
self: Vc<Self>,
context: Vc<Box<dyn ChunkingContext>>,
availability_info: Value<AvailabilityInfo>,
) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
context,
Vc::upcast(self),
availability_info,
chunking_context: Vc<Box<dyn ChunkingContext>>,
) -> Result<Vc<Box<dyn turbopack_binding::turbopack::core::chunk::ChunkItem>>> {
let item = self.proxy_module().as_chunk_item(chunking_context);
let ecmascript_item = Vc::try_resolve_downcast::<Box<dyn EcmascriptChunkItem>>(item)
.await?
.context("EcmascriptModuleAsset must implement EcmascriptChunkItem")?;
let chunking_context =
Vc::try_resolve_downcast::<Box<dyn EcmascriptChunkingContext>>(chunking_context)
.await?
.context(
"chunking context must impl EcmascriptChunkingContext to use \
EcmascriptClientReferenceProxyModule",
)?;
Ok(Vc::upcast(
ProxyModuleChunkItem {
client_proxy_asset: self,
inner_proxy_module_chunk_item: ecmascript_item,
chunking_context,
}
.cell(),
))
}
}
#[turbo_tasks::value_impl]
impl EcmascriptChunkPlaceable for EcmascriptClientReferenceProxyModule {
#[turbo_tasks::function]
fn as_chunk_item(
self: Vc<Self>,
chunking_context: Vc<Box<dyn EcmascriptChunkingContext>>,
) -> Vc<Box<dyn EcmascriptChunkItem>> {
Vc::upcast(
ProxyModuleChunkItem {
client_proxy_asset: self,
inner_proxy_module_chunk_item: self.proxy_module().as_chunk_item(chunking_context),
chunking_context,
}
.cell(),
)
}
#[turbo_tasks::function]
fn get_exports(self: Vc<Self>) -> Vc<EcmascriptExports> {
self.proxy_module().get_exports()
@ -232,6 +231,20 @@ impl ChunkItem for ProxyModuleChunkItem {
fn references(&self) -> Vc<ModuleReferences> {
self.client_proxy_asset.references()
}
#[turbo_tasks::function]
async fn chunking_context(&self) -> Vc<Box<dyn ChunkingContext>> {
Vc::upcast(self.chunking_context)
}
#[turbo_tasks::function]
fn as_chunk(&self, availability_info: Value<AvailabilityInfo>) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
Vc::upcast(self.chunking_context),
Vc::upcast(self.client_proxy_asset),
availability_info,
))
}
}
#[turbo_tasks::value_impl]
@ -252,6 +265,6 @@ impl EcmascriptChunkItem for ProxyModuleChunkItem {
#[turbo_tasks::function]
fn chunking_context(&self) -> Vc<Box<dyn EcmascriptChunkingContext>> {
self.inner_proxy_module_chunk_item.chunking_context()
EcmascriptChunkItem::chunking_context(self.inner_proxy_module_chunk_item)
}
}

View file

@ -2,7 +2,7 @@ use anyhow::{bail, Result};
use turbo_tasks::Vc;
use turbopack_binding::turbopack::core::{
asset::{Asset, AssetContent},
chunk::{ChunkableModule, ChunkingContext},
chunk::{ChunkableModule, ChunkableModuleExt, ChunkingContext},
ident::AssetIdent,
module::Module,
output::OutputAssets,

View file

@ -4,13 +4,12 @@ use turbo_tasks::{TryJoinIterExt, ValueToString, Vc};
use turbo_tasks_fs::{File, FileSystemPath};
use turbopack_binding::turbopack::{
core::{
asset::AssetContent, chunk::ModuleId as TurbopackModuleId, output::OutputAsset,
asset::AssetContent,
chunk::{ChunkItemExt, ChunkableModule, ModuleId as TurbopackModuleId},
output::OutputAsset,
virtual_output::VirtualOutputAsset,
},
ecmascript::{
chunk::{EcmascriptChunkItemExt, EcmascriptChunkPlaceable, EcmascriptChunkingContext},
utils::StringifyJs,
},
ecmascript::{chunk::EcmascriptChunkingContext, utils::StringifyJs},
};
use super::{ClientReferenceManifest, ManifestNode, ManifestNodeEntry, ModuleId};
@ -117,12 +116,12 @@ impl ClientReferenceManifest {
let client_module_id = ecmascript_client_reference
.client_module
.as_chunk_item(client_chunking_context)
.as_chunk_item(Vc::upcast(client_chunking_context))
.id()
.await?;
let ssr_module_id = ecmascript_client_reference
.ssr_module
.as_chunk_item(ssr_chunking_context)
.as_chunk_item(Vc::upcast(ssr_chunking_context))
.id()
.await?;

View file

@ -1,4 +1,4 @@
use anyhow::{bail, Result};
use anyhow::{bail, Context, Result};
use indoc::formatdoc;
use turbo_tasks::{Value, Vc};
use turbo_tasks_fs::FileSystemPath;
@ -6,13 +6,13 @@ use turbopack_binding::turbopack::{
core::{
asset::{Asset, AssetContent},
chunk::{
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkableModule, ChunkingContext,
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkItemExt, ChunkableModule,
ChunkingContext,
},
ident::AssetIdent,
module::Module,
reference::ModuleReferences,
},
ecmascript::chunk::EcmascriptChunkItemExt,
turbopack::ecmascript::{
chunk::{
EcmascriptChunk, EcmascriptChunkItem, EcmascriptChunkItemContent,
@ -73,27 +73,18 @@ impl Asset for NextServerComponentModule {
#[turbo_tasks::value_impl]
impl ChunkableModule for NextServerComponentModule {
#[turbo_tasks::function]
fn as_chunk(
self: Vc<Self>,
context: Vc<Box<dyn ChunkingContext>>,
availability_info: Value<AvailabilityInfo>,
) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
context,
Vc::upcast(self),
availability_info,
))
}
}
#[turbo_tasks::value_impl]
impl EcmascriptChunkPlaceable for NextServerComponentModule {
#[turbo_tasks::function]
async fn as_chunk_item(
self: Vc<Self>,
context: Vc<Box<dyn EcmascriptChunkingContext>>,
) -> Result<Vc<Box<dyn EcmascriptChunkItem>>> {
chunking_context: Vc<Box<dyn ChunkingContext>>,
) -> Result<Vc<Box<dyn turbopack_binding::turbopack::core::chunk::ChunkItem>>> {
let context =
Vc::try_resolve_downcast::<Box<dyn EcmascriptChunkingContext>>(chunking_context)
.await?
.context(
"chunking context must impl EcmascriptChunkingContext to use \
NextServerComponentModule",
)?;
Ok(Vc::upcast(
BuildServerComponentChunkItem {
context,
@ -102,7 +93,10 @@ impl EcmascriptChunkPlaceable for NextServerComponentModule {
.cell(),
))
}
}
#[turbo_tasks::value_impl]
impl EcmascriptChunkPlaceable for NextServerComponentModule {
#[turbo_tasks::function]
fn get_exports(&self) -> Vc<EcmascriptExports> {
// TODO This should be EsmExports
@ -128,7 +122,11 @@ impl EcmascriptChunkItem for BuildServerComponentChunkItem {
let this = self.await?;
let inner = this.inner.await?;
let module_id = inner.module.as_chunk_item(this.context).id().await?;
let module_id = inner
.module
.as_chunk_item(Vc::upcast(this.context))
.id()
.await?;
Ok(EcmascriptChunkItemContent {
inner_code: formatdoc!(
r#"
@ -156,4 +154,18 @@ impl ChunkItem for BuildServerComponentChunkItem {
fn references(&self) -> Vc<ModuleReferences> {
self.inner.references()
}
#[turbo_tasks::function]
async fn chunking_context(&self) -> Vc<Box<dyn ChunkingContext>> {
Vc::upcast(self.context)
}
#[turbo_tasks::function]
fn as_chunk(&self, availability_info: Value<AvailabilityInfo>) -> Vc<Box<dyn Chunk>> {
Vc::upcast(EcmascriptChunk::new(
Vc::upcast(self.context),
Vc::upcast(self.inner),
availability_info,
))
}
}

View file

@ -10,7 +10,7 @@ use turbopack_binding::{
core::{
asset::{Asset, AssetContent},
chunk::{
ChunkData, ChunkableModule, ChunkingContext, ChunksData, EvaluatableAsset,
ChunkData, ChunkableModuleExt, ChunkingContext, ChunksData, EvaluatableAsset,
EvaluatableAssets,
},
context::AssetContext,

View file

@ -191,7 +191,7 @@
"@types/ws": "8.2.0",
"@vercel/ncc": "0.34.0",
"@vercel/nft": "0.22.6",
"@vercel/turbopack-ecmascript-runtime": "https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231002.1",
"@vercel/turbopack-ecmascript-runtime": "https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231005.2",
"acorn": "8.5.0",
"amphtml-validator": "1.0.35",
"anser": "1.4.9",

View file

@ -1058,8 +1058,8 @@ importers:
specifier: 0.22.6
version: 0.22.6
'@vercel/turbopack-ecmascript-runtime':
specifier: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231002.1
version: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231002.1(react-refresh@0.12.0)(webpack@5.86.0)'
specifier: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231005.2
version: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231005.2(react-refresh@0.12.0)(webpack@5.86.0)'
acorn:
specifier: 8.5.0
version: 8.5.0
@ -26762,9 +26762,9 @@ packages:
/zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
'@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231002.1(react-refresh@0.12.0)(webpack@5.86.0)':
resolution: {tarball: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231002.1}
id: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231002.1'
'@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231005.2(react-refresh@0.12.0)(webpack@5.86.0)':
resolution: {tarball: https://gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231005.2}
id: '@gitpkg-fork.vercel.sh/vercel/turbo/crates/turbopack-ecmascript-runtime/js?turbopack-231005.2'
name: '@vercel/turbopack-ecmascript-runtime'
version: 0.0.0
dependencies: