From 752794f63801de3445c3a9bdd443168201b07413 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 1 Mar 2023 11:11:27 +0100 Subject: [PATCH] refactor asset identification (vercel/turbo#3999) * add Asset::ident() as unique identifier of an Asset * add ChunkItem::ident() instead of ChunkItem::to_string() (ValueToString) * base `chunk_path` on AssetIdent instead of path only Motivation: We want to get rid of the `import "."` in favor of inner assets. When doing this we no longer need to place virtual assets below the actual file path and they can stay in their original path. But placing virtual assets below the actual asset also made the `Asset::path` unique, which would no longer be the case after using inner assets. Some parts of the code base relied on `Asset::path` being unique (e. g. module ids and chunk paths). But actually we never guaranteed that to be unique. After this PR `Asset::ident` is intended to be unique and allow to carry more information than only the path: * Query string (`module?query`) * Fragment (`module#fragment`) * Asset (additional wrapped assets by key value pairs) * Modifiers (additional transformations applied on the module, e. g. `chunks`, `client chunks`) * In future: Part (select a subpart of the module, e. g. only export abc, or the module evaluation, or some internal part) --- .../next_layout_entry_transition.rs | 2 +- .../crates/next-core/src/app_source.rs | 3 +- .../src/next_client/runtime_entry.rs | 2 +- .../next-core/src/next_client/transition.rs | 9 ++-- .../in_chunking_context_asset.rs | 12 ++++-- .../src/next_client_chunks/with_chunks.rs | 39 ++++++++---------- .../server_to_client_transition.rs | 2 +- .../with_chunking_context_scope_asset.rs | 12 ++++-- .../with_client_chunks.rs | 41 ++++++++----------- .../crates/next-core/src/next_config.rs | 5 ++- .../next-core/src/next_edge/transition.rs | 9 ++-- .../crates/next-core/src/next_import_map.rs | 4 +- .../next-core/src/next_server/resolve.rs | 2 +- .../crates/next-core/src/page_loader.rs | 20 +++++---- .../crates/next-core/src/page_source.rs | 8 ++-- .../next-swc/crates/next-core/src/router.rs | 8 ++-- .../next-swc/crates/next-core/src/util.rs | 9 ++-- ...tar__0__star__) is very dynamic-c19e79.txt | 4 +- ...__utf-8__quo__) is very dynamic-58d7af.txt | 4 +- ...tar__0__star__) is very dynamic-667243.txt | 4 +- ... Error evaluating Node.js code-28e1f2.txt} | 2 +- ...__.__b__quo__]) is very dynamic-8bc115.txt | 4 +- ...__.__c__quo__]) is very dynamic-80ea5a.txt | 4 +- 23 files changed, 111 insertions(+), 98 deletions(-) rename packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/{Error evaluating Node.js code-be8dbe.txt => Error evaluating Node.js code-28e1f2.txt} (78%) diff --git a/packages/next-swc/crates/next-core/src/app_render/next_layout_entry_transition.rs b/packages/next-swc/crates/next-core/src/app_render/next_layout_entry_transition.rs index 0166f42b1777d..cb6cb306a716f 100644 --- a/packages/next-swc/crates/next-core/src/app_render/next_layout_entry_transition.rs +++ b/packages/next-swc/crates/next-core/src/app_render/next_layout_entry_transition.rs @@ -31,7 +31,7 @@ impl Transition for NextLayoutEntryTransition { #[turbo_tasks::function] fn process_source(&self, asset: AssetVc) -> AssetVc { VirtualAssetVc::new( - asset.path().join("layout-entry.tsx"), + asset.ident().path().join("layout-entry.tsx"), next_js_file("entry/app/layout-entry.tsx").into(), ) .into() diff --git a/packages/next-swc/crates/next-core/src/app_source.rs b/packages/next-swc/crates/next-core/src/app_source.rs index 29c4890d1abc6..9db646a122343 100644 --- a/packages/next-swc/crates/next-core/src/app_source.rs +++ b/packages/next-swc/crates/next-core/src/app_source.rs @@ -4,6 +4,7 @@ use std::{ }; use anyhow::{anyhow, Result}; +use indexmap::IndexMap; use turbo_tasks::{TryJoinIterExt, Value, ValueToString}; use turbo_tasks_env::ProcessEnvVc; use turbo_tasks_fs::{rebase, rope::RopeBuilder, File, FileContent, FileSystemPathVc}; @@ -716,7 +717,7 @@ impl AppRouteVc { Value::new(EcmascriptModuleAssetType::Typescript), EcmascriptInputTransformsVc::cell(vec![EcmascriptInputTransform::TypeScript]), this.context.compile_time_info(), - InnerAssetsVc::cell(HashMap::from([("ROUTE_CHUNK_GROUP".to_string(), entry)])), + InnerAssetsVc::cell(IndexMap::from([("ROUTE_CHUNK_GROUP".to_string(), entry)])), ), chunking_context, intermediate_output_path: this.intermediate_output_path, diff --git a/packages/next-swc/crates/next-core/src/next_client/runtime_entry.rs b/packages/next-swc/crates/next-core/src/next_client/runtime_entry.rs index e25832bb37019..b847981ff301b 100644 --- a/packages/next-swc/crates/next-core/src/next_client/runtime_entry.rs +++ b/packages/next-swc/crates/next-core/src/next_client/runtime_entry.rs @@ -41,7 +41,7 @@ impl RuntimeEntryVc { bail!( "runtime reference resolved to an asset ({}) that is not placeable into an \ ecmascript chunk", - asset.path().to_string().await? + asset.ident().to_string().await? ); } } diff --git a/packages/next-swc/crates/next-core/src/next_client/transition.rs b/packages/next-swc/crates/next-core/src/next_client/transition.rs index 0dc444d6e6a53..18993dbcf970b 100644 --- a/packages/next-swc/crates/next-core/src/next_client/transition.rs +++ b/packages/next-swc/crates/next-core/src/next_client/transition.rs @@ -40,13 +40,13 @@ impl Transition for NextClientTransition { fn process_source(&self, asset: AssetVc) -> AssetVc { if self.is_app { VirtualAssetVc::new( - asset.path().join("next-app-hydrate.tsx"), + asset.ident().path().join("next-app-hydrate.tsx"), next_js_file("entry/app/hydrate.tsx").into(), ) .into() } else { VirtualAssetVc::new( - asset.path().join("next-hydrate.tsx"), + asset.ident().path().join("next-hydrate.tsx"), next_js_file("entry/next-hydrate.tsx").into(), ) .into() @@ -85,7 +85,10 @@ impl Transition for NextClientTransition { ) -> Result { let chunkable_asset = match ChunkableAssetVc::resolve_from(asset).await? { Some(chunkable_asset) => chunkable_asset, - None => bail!("asset {} is not chunkable", asset.path().to_string().await?), + None => bail!( + "asset {} is not chunkable", + asset.ident().to_string().await? + ), }; let runtime_entries = self.runtime_entries.resolve_entries(context.into()); diff --git a/packages/next-swc/crates/next-core/src/next_client_chunks/in_chunking_context_asset.rs b/packages/next-swc/crates/next-core/src/next_client_chunks/in_chunking_context_asset.rs index b91e523a8398d..b2dae4ba07533 100644 --- a/packages/next-swc/crates/next-core/src/next_client_chunks/in_chunking_context_asset.rs +++ b/packages/next-swc/crates/next-core/src/next_client_chunks/in_chunking_context_asset.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks_fs::FileSystemPathVc; +use turbo_tasks::primitives::StringVc; use turbopack::ecmascript::chunk::{ EcmascriptChunkItemVc, EcmascriptChunkPlaceable, EcmascriptChunkPlaceableVc, EcmascriptChunkVc, EcmascriptExportsVc, @@ -7,9 +7,15 @@ use turbopack::ecmascript::chunk::{ use turbopack_core::{ asset::{Asset, AssetContentVc, AssetVc}, chunk::{ChunkVc, ChunkableAsset, ChunkableAssetVc, ChunkingContextVc}, + ident::AssetIdentVc, reference::AssetReferencesVc, }; +#[turbo_tasks::function] +fn modifier() -> StringVc { + StringVc::cell("in chunking context".to_string()) +} + #[turbo_tasks::value(shared)] pub struct InChunkingContextAsset { pub asset: EcmascriptChunkPlaceableVc, @@ -19,8 +25,8 @@ pub struct InChunkingContextAsset { #[turbo_tasks::value_impl] impl Asset for InChunkingContextAsset { #[turbo_tasks::function] - fn path(&self) -> FileSystemPathVc { - self.asset.path() + fn ident(&self) -> AssetIdentVc { + self.asset.ident().with_modifier(modifier()) } #[turbo_tasks::function] diff --git a/packages/next-swc/crates/next-core/src/next_client_chunks/with_chunks.rs b/packages/next-swc/crates/next-core/src/next_client_chunks/with_chunks.rs index f27478af46b39..3f2d26b2a8f00 100644 --- a/packages/next-swc/crates/next-core/src/next_client_chunks/with_chunks.rs +++ b/packages/next-swc/crates/next-core/src/next_client_chunks/with_chunks.rs @@ -13,16 +13,22 @@ use turbopack::ecmascript::{ use turbopack_core::{ asset::{Asset, AssetContentVc, AssetVc}, chunk::{ - ChunkGroupVc, ChunkItem, ChunkItemVc, ChunkVc, ChunkableAsset, ChunkableAssetReference, - ChunkableAssetReferenceVc, ChunkableAssetVc, ChunkingContextVc, ChunkingType, - ChunkingTypeOptionVc, + Chunk, ChunkGroupVc, ChunkItem, ChunkItemVc, ChunkVc, ChunkableAsset, + ChunkableAssetReference, ChunkableAssetReferenceVc, ChunkableAssetVc, ChunkingContextVc, + ChunkingType, ChunkingTypeOptionVc, }, + ident::AssetIdentVc, reference::{AssetReference, AssetReferenceVc, AssetReferencesVc}, resolve::{ResolveResult, ResolveResultVc}, }; use super::in_chunking_context_asset::InChunkingContextAsset; +#[turbo_tasks::function] +fn modifier() -> StringVc { + StringVc::cell("chunks".to_string()) +} + #[turbo_tasks::value(shared)] pub struct WithChunksAsset { pub asset: EcmascriptChunkPlaceableVc, @@ -33,8 +39,8 @@ pub struct WithChunksAsset { #[turbo_tasks::value_impl] impl Asset for WithChunksAsset { #[turbo_tasks::function] - fn path(&self) -> FileSystemPathVc { - self.asset.path().join("with-chunks.js") + fn ident(&self) -> AssetIdentVc { + self.asset.ident().with_modifier(modifier()) } #[turbo_tasks::function] @@ -87,17 +93,6 @@ struct WithChunksChunkItem { inner: WithChunksAssetVc, } -#[turbo_tasks::value_impl] -impl ValueToString for WithChunksChunkItem { - #[turbo_tasks::function] - async fn to_string(&self) -> Result { - Ok(StringVc::cell(format!( - "{}/with-chunks.js", - self.inner.await?.asset.path().to_string().await? - ))) - } -} - #[turbo_tasks::value_impl] impl EcmascriptChunkItem for WithChunksChunkItem { #[turbo_tasks::function] @@ -105,11 +100,6 @@ impl EcmascriptChunkItem for WithChunksChunkItem { self.context } - #[turbo_tasks::function] - fn related_path(&self) -> FileSystemPathVc { - self.inner.path() - } - #[turbo_tasks::function] async fn content(&self) -> Result { let inner = self.inner.await?; @@ -143,6 +133,11 @@ const chunks = {}; #[turbo_tasks::value_impl] impl ChunkItem for WithChunksChunkItem { + #[turbo_tasks::function] + fn asset_ident(&self) -> AssetIdentVc { + self.inner.ident() + } + #[turbo_tasks::function] async fn references(&self) -> Result { let inner = self.inner.await?; @@ -170,7 +165,7 @@ impl ValueToString for WithChunksAssetReference { async fn to_string(&self) -> Result { Ok(StringVc::cell(format!( "referenced asset {}", - self.asset.path().to_string().await? + self.asset.ident().to_string().await? ))) } } diff --git a/packages/next-swc/crates/next-core/src/next_client_component/server_to_client_transition.rs b/packages/next-swc/crates/next-core/src/next_client_component/server_to_client_transition.rs index 382d56fac4d5e..558fefcb504ca 100644 --- a/packages/next-swc/crates/next-core/src/next_client_component/server_to_client_transition.rs +++ b/packages/next-swc/crates/next-core/src/next_client_component/server_to_client_transition.rs @@ -16,7 +16,7 @@ impl Transition for NextServerToClientTransition { #[turbo_tasks::function] fn process_source(&self, asset: AssetVc) -> AssetVc { VirtualAssetVc::new( - asset.path().join("client-proxy.tsx"), + asset.ident().path().join("client-proxy.tsx"), next_js_file(if self.ssr { "entry/app/server-to-client-ssr.tsx" } else { diff --git a/packages/next-swc/crates/next-core/src/next_client_component/with_chunking_context_scope_asset.rs b/packages/next-swc/crates/next-core/src/next_client_component/with_chunking_context_scope_asset.rs index 56f86d9ef6f53..1ef70f884c74e 100644 --- a/packages/next-swc/crates/next-core/src/next_client_component/with_chunking_context_scope_asset.rs +++ b/packages/next-swc/crates/next-core/src/next_client_component/with_chunking_context_scope_asset.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use turbo_tasks_fs::FileSystemPathVc; +use turbo_tasks::primitives::StringVc; use turbopack::ecmascript::chunk::{ EcmascriptChunkItemVc, EcmascriptChunkPlaceable, EcmascriptChunkPlaceableVc, EcmascriptChunkVc, EcmascriptExportsVc, @@ -7,9 +7,15 @@ use turbopack::ecmascript::chunk::{ use turbopack_core::{ asset::{Asset, AssetContentVc, AssetVc}, chunk::{ChunkVc, ChunkableAsset, ChunkableAssetVc, ChunkingContext, ChunkingContextVc}, + ident::AssetIdentVc, reference::AssetReferencesVc, }; +#[turbo_tasks::function] +fn modifier() -> StringVc { + StringVc::cell("with chunking context scope".to_string()) +} + #[turbo_tasks::value(shared)] pub struct WithChunkingContextScopeAsset { pub asset: EcmascriptChunkPlaceableVc, @@ -19,8 +25,8 @@ pub struct WithChunkingContextScopeAsset { #[turbo_tasks::value_impl] impl Asset for WithChunkingContextScopeAsset { #[turbo_tasks::function] - fn path(&self) -> FileSystemPathVc { - self.asset.path() + fn ident(&self) -> AssetIdentVc { + self.asset.ident().with_modifier(modifier()) } #[turbo_tasks::function] diff --git a/packages/next-swc/crates/next-core/src/next_client_component/with_client_chunks.rs b/packages/next-swc/crates/next-core/src/next_client_component/with_client_chunks.rs index 2873e6c020762..82f90787d544b 100644 --- a/packages/next-swc/crates/next-core/src/next_client_component/with_client_chunks.rs +++ b/packages/next-swc/crates/next-core/src/next_client_component/with_client_chunks.rs @@ -13,16 +13,22 @@ use turbopack::ecmascript::{ use turbopack_core::{ asset::{Asset, AssetContentVc, AssetVc}, chunk::{ - ChunkGroupVc, ChunkItem, ChunkItemVc, ChunkVc, ChunkableAsset, ChunkableAssetReference, - ChunkableAssetReferenceVc, ChunkableAssetVc, ChunkingContext, ChunkingContextVc, - ChunkingType, ChunkingTypeOptionVc, + Chunk, ChunkGroupVc, ChunkItem, ChunkItemVc, ChunkVc, ChunkableAsset, + ChunkableAssetReference, ChunkableAssetReferenceVc, ChunkableAssetVc, ChunkingContext, + ChunkingContextVc, ChunkingType, ChunkingTypeOptionVc, }, + ident::AssetIdentVc, reference::{AssetReference, AssetReferenceVc, AssetReferencesVc}, resolve::{ResolveResult, ResolveResultVc}, }; use crate::next_client_chunks::in_chunking_context_asset::InChunkingContextAsset; +#[turbo_tasks::function] +fn modifier() -> StringVc { + StringVc::cell("client chunks".to_string()) +} + #[turbo_tasks::value(shared)] pub struct WithClientChunksAsset { pub asset: EcmascriptChunkPlaceableVc, @@ -32,8 +38,8 @@ pub struct WithClientChunksAsset { #[turbo_tasks::value_impl] impl Asset for WithClientChunksAsset { #[turbo_tasks::function] - fn path(&self) -> FileSystemPathVc { - self.asset.path().join("with-client-chunks.js") + fn ident(&self) -> AssetIdentVc { + self.asset.ident().with_modifier(modifier()) } #[turbo_tasks::function] @@ -87,17 +93,6 @@ struct WithClientChunksChunkItem { inner: WithClientChunksAssetVc, } -#[turbo_tasks::value_impl] -impl ValueToString for WithClientChunksChunkItem { - #[turbo_tasks::function] - async fn to_string(&self) -> Result { - Ok(StringVc::cell(format!( - "{}/with-client-chunks.js", - self.inner.await?.asset.path().to_string().await? - ))) - } -} - #[turbo_tasks::value_impl] impl EcmascriptChunkItem for WithClientChunksChunkItem { #[turbo_tasks::function] @@ -105,11 +100,6 @@ impl EcmascriptChunkItem for WithClientChunksChunkItem { self.context } - #[turbo_tasks::function] - fn related_path(&self) -> FileSystemPathVc { - self.inner.path() - } - #[turbo_tasks::function] async fn content(&self) -> Result { let inner = self.inner.await?; @@ -122,7 +112,7 @@ impl EcmascriptChunkItem for WithClientChunksChunkItem { for reference in chunk.references().await?.iter() { let assets = &*reference.resolve_reference().primary_assets().await?; for asset in assets.iter() { - asset_paths.push(asset.path().await?); + asset_paths.push(asset.ident().path().await?); } } @@ -158,6 +148,11 @@ impl EcmascriptChunkItem for WithClientChunksChunkItem { #[turbo_tasks::value_impl] impl ChunkItem for WithClientChunksChunkItem { + #[turbo_tasks::function] + fn asset_ident(&self) -> AssetIdentVc { + self.inner.ident() + } + #[turbo_tasks::function] async fn references(&self) -> Result { let inner = self.inner.await?; @@ -187,7 +182,7 @@ impl ValueToString for WithClientChunksAssetReference { async fn to_string(&self) -> Result { Ok(StringVc::cell(format!( "local asset {}", - self.asset.path().to_string().await? + self.asset.ident().to_string().await? ))) } } diff --git a/packages/next-swc/crates/next-core/src/next_config.rs b/packages/next-swc/crates/next-core/src/next_config.rs index 2b6ace3720314..d8c3cfb06004f 100644 --- a/packages/next-swc/crates/next-core/src/next_config.rs +++ b/packages/next-swc/crates/next-core/src/next_config.rs @@ -13,6 +13,7 @@ use turbopack::evaluate_context::node_evaluate_asset_context; use turbopack_core::{ asset::Asset, context::AssetContext, + ident::AssetIdentVc, reference_type::{EntryReferenceSubType, ReferenceType}, resolve::{ find_context_file, @@ -570,7 +571,7 @@ pub async fn load_next_config(execution_context: ExecutionContextVc) -> Result Result Result Result( diff --git a/packages/next-swc/crates/next-core/src/next_server/resolve.rs b/packages/next-swc/crates/next-core/src/next_server/resolve.rs index 6c764bbd85ade..86161c5e64dad 100644 --- a/packages/next-swc/crates/next-core/src/next_server/resolve.rs +++ b/packages/next-swc/crates/next-core/src/next_server/resolve.rs @@ -46,7 +46,7 @@ async fn is_node_resolveable( return Ok(BoolVc::cell(false)); }; - if node_asset.path().resolve().await? != expected.resolve().await? { + if node_asset.ident().path().resolve().await? != expected.resolve().await? { // node.js resolves to a different file return Ok(BoolVc::cell(false)); } diff --git a/packages/next-swc/crates/next-core/src/page_loader.rs b/packages/next-swc/crates/next-core/src/page_loader.rs index 92326e65a4723..56c86298e1073 100644 --- a/packages/next-swc/crates/next-core/src/page_loader.rs +++ b/packages/next-swc/crates/next-core/src/page_loader.rs @@ -6,8 +6,9 @@ use turbo_tasks::primitives::StringVc; use turbo_tasks_fs::{rope::RopeBuilder, File, FileContent, FileSystemPathVc}; use turbopack_core::{ asset::{Asset, AssetContentVc, AssetVc}, - chunk::{ChunkGroupVc, ChunkReferenceVc, ChunkingContextVc, ChunksVc}, + chunk::{Chunk, ChunkGroupVc, ChunkReferenceVc, ChunkingContextVc, ChunksVc}, context::{AssetContext, AssetContextVc}, + ident::AssetIdentVc, reference::AssetReferencesVc, virtual_asset::VirtualAssetVc, }; @@ -70,7 +71,11 @@ impl PageLoaderAssetVc { let file = File::from(result.build()); - Ok(VirtualAssetVc::new(this.entry_asset.path().join("page-loader.ts"), file.into()).into()) + Ok(VirtualAssetVc::new( + this.entry_asset.ident().path().join("page-loader.ts"), + file.into(), + ) + .into()) } #[turbo_tasks::function] @@ -97,11 +102,12 @@ impl PageLoaderAssetVc { #[turbo_tasks::value_impl] impl Asset for PageLoaderAsset { #[turbo_tasks::function] - async fn path(&self) -> Result { - Ok(self - .server_root - .join("_next/static/chunks/pages") - .join(&get_asset_path_from_route(&self.pathname.await?, ".js"))) + async fn ident(&self) -> Result { + Ok(AssetIdentVc::from_path( + self.server_root + .join("_next/static/chunks/pages") + .join(&get_asset_path_from_route(&self.pathname.await?, ".js")), + )) } #[turbo_tasks::function] diff --git a/packages/next-swc/crates/next-core/src/page_source.rs b/packages/next-swc/crates/next-core/src/page_source.rs index 52974f1bce203..f3f13aa987dfa 100644 --- a/packages/next-swc/crates/next-core/src/page_source.rs +++ b/packages/next-swc/crates/next-core/src/page_source.rs @@ -659,19 +659,19 @@ impl SsrEntryVc { let virtual_asset = match ty { SsrType::AutoApi => unreachable!(), SsrType::Api => VirtualAssetVc::new( - this.entry_asset.path().join("server-api.tsx"), + this.entry_asset.ident().path().join("server-api.tsx"), next_js_file("entry/server-api.tsx").into(), ), SsrType::EdgeApi => VirtualAssetVc::new( - this.entry_asset.path().join("server-edge-api.tsx"), + this.entry_asset.ident().path().join("server-edge-api.tsx"), next_js_file("entry/server-edge-api.tsx").into(), ), SsrType::Data => VirtualAssetVc::new( - this.entry_asset.path().join("server-data.tsx"), + this.entry_asset.ident().path().join("server-data.tsx"), next_js_file("entry/server-data.tsx").into(), ), SsrType::Html => VirtualAssetVc::new( - this.entry_asset.path().join("server-renderer.tsx"), + this.entry_asset.ident().path().join("server-renderer.tsx"), next_js_file("entry/server-renderer.tsx").into(), ), }; diff --git a/packages/next-swc/crates/next-core/src/router.rs b/packages/next-swc/crates/next-core/src/router.rs index cdb49e6e09b22..b1de76441c1d4 100644 --- a/packages/next-swc/crates/next-core/src/router.rs +++ b/packages/next-swc/crates/next-core/src/router.rs @@ -1,6 +1,5 @@ -use std::collections::HashMap; - use anyhow::{bail, Result}; +use indexmap::IndexMap; use serde::Deserialize; use serde_json::json; use turbo_tasks::{ @@ -16,6 +15,7 @@ use turbopack_core::{ chunk::dev::DevChunkingContextVc, context::{AssetContext, AssetContextVc}, environment::{EnvironmentIntention::Middleware, ServerAddrVc}, + ident::AssetIdentVc, reference_type::{EcmaScriptModulesReferenceSubType, ReferenceType}, resolve::{find_context_file, FindContextFileResult}, source_asset::SourceAssetVc, @@ -236,7 +236,7 @@ async fn config_assets( ) .as_asset(); - let mut inner = HashMap::new(); + let mut inner = IndexMap::new(); inner.insert("MIDDLEWARE_CHUNK_GROUP".to_string(), manifest); inner.insert("MIDDLEWARE_CONFIG".to_string(), config_asset); Ok(InnerAssetsVc::cell(inner)) @@ -343,7 +343,7 @@ pub async fn route( router_asset, project_root, env, - project_root, + AssetIdentVc::from_path(project_root), context, intermediate_output_path, Some(next_config), diff --git a/packages/next-swc/crates/next-core/src/util.rs b/packages/next-swc/crates/next-core/src/util.rs index 1a60ba4f8a310..fd44b9e6233e0 100644 --- a/packages/next-swc/crates/next-core/src/util.rs +++ b/packages/next-swc/crates/next-core/src/util.rs @@ -6,6 +6,7 @@ use turbo_tasks_fs::FileSystemPathVc; use turbopack::condition::ContextCondition; use turbopack_core::{ asset::{Asset, AssetVc}, + ident::AssetIdentVc, issue::{Issue, IssueSeverity, IssueSeverityVc, IssueVc}, }; use turbopack_ecmascript::{ @@ -105,7 +106,7 @@ impl NextSourceConfigVc { /// An issue that occurred while resolving the React Refresh runtime module. #[turbo_tasks::value(shared)] pub struct NextSourceConfigParsingIssue { - path: FileSystemPathVc, + ident: AssetIdentVc, detail: StringVc, } @@ -128,7 +129,7 @@ impl Issue for NextSourceConfigParsingIssue { #[turbo_tasks::function] fn context(&self) -> FileSystemPathVc { - self.path + self.ident.path() } #[turbo_tasks::function] @@ -173,7 +174,7 @@ pub async fn parse_config_from_source(module_asset: AssetVc) -> Result NextSou let invalid_config = |detail: &str, value: &JsValue| { let (explainer, hints) = value.explain(2, 0); NextSourceConfigParsingIssue { - path: module_asset.path(), + ident: module_asset.ident(), detail: StringVc::cell(format!("{detail} Got {explainer}.{hints}")), } .cell() diff --git a/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.existsSync(__q____q____q____star__0__star__) is very dynamic-c19e79.txt b/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.existsSync(__q____q____q____star__0__star__) is very dynamic-c19e79.txt index 0acc69df7766a..2a3d74a7da29d 100644 --- a/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.existsSync(__q____q____q____star__0__star__) is very dynamic-c19e79.txt +++ b/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.existsSync(__q____q____q____star__0__star__) is very dynamic-c19e79.txt @@ -9,7 +9,7 @@ PlainIssue { source: Some( PlainIssueSource { asset: PlainAsset { - path: "node_modules/.pnpm/postcss@8.4.20/node_modules/postcss/lib/previous-map.js", + ident: "[project-with-next]/node_modules/.pnpm/postcss@8.4.20/node_modules/postcss/lib/previous-map.js", }, start: SourcePos { line: 87, @@ -22,4 +22,4 @@ PlainIssue { }, ), sub_issues: [], -} \ No newline at end of file +} diff --git a/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.readFileSync(__q____q____q____star__0__star__, __quo__utf-8__quo__) is very dynamic-58d7af.txt b/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.readFileSync(__q____q____q____star__0__star__, __quo__utf-8__quo__) is very dynamic-58d7af.txt index 866db710e5a72..ce511030f3b65 100644 --- a/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.readFileSync(__q____q____q____star__0__star__, __quo__utf-8__quo__) is very dynamic-58d7af.txt +++ b/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1004 fs.readFileSync(__q____q____q____star__0__star__, __quo__utf-8__quo__) is very dynamic-58d7af.txt @@ -9,7 +9,7 @@ PlainIssue { source: Some( PlainIssueSource { asset: PlainAsset { - path: "node_modules/.pnpm/postcss@8.4.20/node_modules/postcss/lib/previous-map.js", + ident: "[project-with-next]/node_modules/.pnpm/postcss@8.4.20/node_modules/postcss/lib/previous-map.js", }, start: SourcePos { line: 89, @@ -22,4 +22,4 @@ PlainIssue { }, ), sub_issues: [], -} \ No newline at end of file +} diff --git a/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1006 path.resolve(__q____q____q____star__0__star__) is very dynamic-667243.txt b/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1006 path.resolve(__q____q____q____star__0__star__) is very dynamic-667243.txt index 848737ac7abdc..7ffaf6bf482b4 100644 --- a/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1006 path.resolve(__q____q____q____star__0__star__) is very dynamic-667243.txt +++ b/packages/next-swc/crates/next-dev-tests/tests/integration/next/tailwind/basic/issues/lint TP1006 path.resolve(__q____q____q____star__0__star__) is very dynamic-667243.txt @@ -9,7 +9,7 @@ PlainIssue { source: Some( PlainIssueSource { asset: PlainAsset { - path: "node_modules/.pnpm/postcss@8.4.20/node_modules/postcss/lib/input.js", + ident: "[project-with-next]/node_modules/.pnpm/postcss@8.4.20/node_modules/postcss/lib/input.js", }, start: SourcePos { line: 43, @@ -22,4 +22,4 @@ PlainIssue { }, ), sub_issues: [], -} \ No newline at end of file +} diff --git a/packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/Error evaluating Node.js code-be8dbe.txt b/packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/Error evaluating Node.js code-28e1f2.txt similarity index 78% rename from packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/Error evaluating Node.js code-be8dbe.txt rename to packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/Error evaluating Node.js code-28e1f2.txt index 1810b3fe57cb9..4fd66e4be21b5 100644 --- a/packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/Error evaluating Node.js code-be8dbe.txt +++ b/packages/next-swc/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/issues/Error evaluating Node.js code-28e1f2.txt @@ -3,7 +3,7 @@ PlainIssue { context: "[project]/crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input", category: "build", title: "Error evaluating Node.js code", - description: "Error: > Couldn't find a `pages` directory. Please create one under the project root\n at Object.findPagesDir (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/lib/find-pages-dir.js:86:19)\n at DevServer.getRoutes (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/dev/next-dev-server.js:130:59)\n at new Server (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/base-server.js:108:47)\n at new NextNodeServer (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/next-server.js:69:9)\n at new DevServer (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/dev/next-dev-server.js:96:9)\n at Object.makeResolver (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/lib/route-resolver.js:39:23)\n at getResolveRoute (crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input/.next/build/router/chunks/router.js:173:109)\n at async Module.route (crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input/.next/build/router/chunks/router.js:179:36)\n at async Module.run (crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input/.next/build/router/chunks/[turbopack-node]_ipc_evaluate.ts._.js:142:39)\n", + description: "Error: > Couldn't find a `pages` directory. Please create one under the project root\n at Object.findPagesDir (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/lib/find-pages-dir.js:86:19)\n at DevServer.getRoutes (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/dev/next-dev-server.js:130:59)\n at new Server (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/base-server.js:108:47)\n at new NextNodeServer (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/next-server.js:69:9)\n at new DevServer (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/dev/next-dev-server.js:96:9)\n at Object.makeResolver (node_modules/.pnpm/next@13.1.7-canary.28_pjwopsidmaokadturxaafygjp4/node_modules/next/dist/server/lib/route-resolver.js:39:23)\n at getResolveRoute (crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input/.next/build/router/chunks/router_f8de3f.js:173:109)\n at async Module.route (crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input/.next/build/router/chunks/router_f8de3f.js:179:36)\n at async Module.run (crates/next-dev-tests/tests/integration/turbopack/basic/comptime/input/.next/build/router/chunks/[turbopack-node]_ipc_evaluate.ts._.js:142:39)\n", detail: "", documentation_link: "", source: None, diff --git a/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies-context/issues/lint TP1002 require([__quo__.__b__quo__]) is very dynamic-8bc115.txt b/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies-context/issues/lint TP1002 require([__quo__.__b__quo__]) is very dynamic-8bc115.txt index 9f61ddd73dd8d..fedb9cdda6f6f 100644 --- a/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies-context/issues/lint TP1002 require([__quo__.__b__quo__]) is very dynamic-8bc115.txt +++ b/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies-context/issues/lint TP1002 require([__quo__.__b__quo__]) is very dynamic-8bc115.txt @@ -9,7 +9,7 @@ PlainIssue { source: Some( PlainIssueSource { asset: PlainAsset { - path: "crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies-context/input/index.js", + ident: "[project-with-next]/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies-context/input/index.js", }, start: SourcePos { line: 13, @@ -22,4 +22,4 @@ PlainIssue { }, ), sub_issues: [], -} \ No newline at end of file +} diff --git a/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies/issues/lint TP1002 require([__quo__.__c__quo__]) is very dynamic-80ea5a.txt b/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies/issues/lint TP1002 require([__quo__.__c__quo__]) is very dynamic-80ea5a.txt index 2340dffe7ab21..981db21b950d5 100644 --- a/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies/issues/lint TP1002 require([__quo__.__c__quo__]) is very dynamic-80ea5a.txt +++ b/packages/next-swc/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies/issues/lint TP1002 require([__quo__.__c__quo__]) is very dynamic-80ea5a.txt @@ -9,7 +9,7 @@ PlainIssue { source: Some( PlainIssueSource { asset: PlainAsset { - path: "crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies/input/index.js", + ident: "[project-with-next]/crates/next-dev-tests/tests/integration/webpack/chunks/__skipped__/weak-dependencies/input/index.js", }, start: SourcePos { line: 5, @@ -22,4 +22,4 @@ PlainIssue { }, ), sub_issues: [], -} \ No newline at end of file +}