refactor AssetContext (vercel/turbo#465)

remove context_path from AssetContext
remove most with_* methods from AssetContext
add ResolveOrigin trait
use ResolveOrigin to pass along context path and context for resolving
ecmascript and css module assets implement ResolveOrigin

Noteable change: Many places use `origin_path` instead of `context_path` which means it points to the issuer module path instead of the issuer module directory.
This commit is contained in:
Tobias Koppers 2022-10-07 13:34:31 +02:00 committed by GitHub
parent e4f92b7206
commit e8359f7964
6 changed files with 23 additions and 18 deletions

View file

@ -87,7 +87,6 @@ pub fn get_client_asset_context(
let context: AssetContextVc = ModuleAssetContextVc::new(
TransitionsByNameVc::cell(HashMap::new()),
project_root,
environment,
module_options_context,
resolve_options_context,
@ -133,7 +132,8 @@ pub async fn get_client_runtime_entries(
RuntimeEntry::Ecmascript(HtmlRuntimeAssetVc::new().into()).cell(),
];
if enable_react_refresh {
runtime_entries.push(RuntimeEntry::Request(react_refresh_request(), project_root).cell())
runtime_entries
.push(RuntimeEntry::Request(react_refresh_request(), project_root.join("_")).cell())
};
Ok(RuntimeEntriesVc::cell(runtime_entries))

View file

@ -1,7 +1,10 @@
use anyhow::{bail, Result};
use turbo_tasks::ValueToString;
use turbo_tasks_fs::FileSystemPathVc;
use turbopack_core::{context::AssetContextVc, resolve::parse::RequestVc};
use turbopack_core::{
context::AssetContextVc,
resolve::{origin::PlainResolveOriginVc, parse::RequestVc},
};
use turbopack_ecmascript::{
chunk::{EcmascriptChunkPlaceableVc, EcmascriptChunkPlaceablesVc},
resolve::cjs_resolve,
@ -25,8 +28,9 @@ impl RuntimeEntryVc {
RuntimeEntry::Request(r, path) => (r, path),
};
let context = context.with_context_path(path);
let assets = cjs_resolve(request, context).primary_assets().await?;
let assets = cjs_resolve(PlainResolveOriginVc::new(context, path).into(), request)
.primary_assets()
.await?;
let mut runtime_entries = Vec::with_capacity(assets.len());
for asset in &assets {

View file

@ -12,9 +12,8 @@ use turbopack::{
resolve_options_context::ResolveOptionsContextVc,
};
use turbopack_core::{
context::AssetContextVc,
issue::{Issue, IssueSeverity, IssueSeverityVc, IssueVc},
resolve::{parse::RequestVc, ResolveResult},
resolve::{origin::ResolveOriginVc, parse::RequestVc, ResolveResult},
};
#[turbo_tasks::function]
@ -57,8 +56,8 @@ pub async fn assert_can_resolve_react_refresh(
/// Resolves the React Refresh runtime module from the given [AssetContextVc].
#[turbo_tasks::function]
pub async fn resolve_react_refresh(context: AssetContextVc) -> Result<EcmascriptChunkPlaceableVc> {
match &*cjs_resolve(react_refresh_request(), context).await? {
pub async fn resolve_react_refresh(origin: ResolveOriginVc) -> Result<EcmascriptChunkPlaceableVc> {
match &*cjs_resolve(origin, react_refresh_request()).await? {
ResolveResult::Single(asset, _) => {
if let Some(placeable) = EcmascriptChunkPlaceableVc::resolve_from(asset).await? {
Ok(placeable)

View file

@ -140,7 +140,7 @@ fn get_intermediate_module(
embed_file!("server_renderer.js").into(),
)
.into(),
context.with_context_path(entry_asset.path()),
context,
Value::new(ModuleAssetType::Ecmascript),
EcmascriptInputTransformsVc::cell(vec![EcmascriptInputTransform::React { refresh: false }]),
context.environment(),

View file

@ -79,7 +79,6 @@ pub async fn create_server_rendered_source(
transitions.insert("next-client".to_string(), next_client_transition);
let context: AssetContextVc = ModuleAssetContextVc::new(
TransitionsByNameVc::cell(transitions),
project_path,
EnvironmentVc::new(
Value::new(ExecutionEnvironment::NodeJsLambda(
NodeJsEnvironment {
@ -111,6 +110,7 @@ pub async fn create_server_rendered_source(
vec![ProcessEnvAssetVc::new(project_path, env).as_ecmascript_chunk_placeable()];
Ok(create_server_rendered_source_for_directory(
project_path,
context,
pages_dir,
EcmascriptChunkPlaceablesVc::cell(server_runtime_entries),
@ -124,6 +124,7 @@ pub async fn create_server_rendered_source(
/// Handles a single page file in the pages directory
#[turbo_tasks::function]
async fn create_server_rendered_source_for_file(
context_path: FileSystemPathVc,
context: AssetContextVc,
page_file: FileSystemPathVc,
runtime_entries: EcmascriptChunkPlaceablesVc,
@ -131,11 +132,8 @@ async fn create_server_rendered_source_for_file(
server_path: FileSystemPathVc,
intermediate_output_path: FileSystemPathVc,
) -> Result<AssetGraphContentSourceVc> {
let context_path = context.context_path();
let source_asset = SourceAssetVc::new(page_file).into();
let entry_asset = context
.with_context_path(page_file.parent())
.process(source_asset);
let entry_asset = context.process(source_asset);
let chunking_context = DevChunkingContextVc::new(
context_path,
@ -165,6 +163,7 @@ async fn create_server_rendered_source_for_file(
/// [create_server_rendered_source_for_file] method for files.
#[turbo_tasks::function]
async fn create_server_rendered_source_for_directory(
context_path: FileSystemPathVc,
context: AssetContextVc,
input_dir: FileSystemPathVc,
runtime_entries: EcmascriptChunkPlaceablesVc,
@ -193,6 +192,7 @@ async fn create_server_rendered_source_for_directory(
};
sources.push(
create_server_rendered_source_for_file(
context_path,
context,
*file,
runtime_entries,
@ -210,6 +210,7 @@ async fn create_server_rendered_source_for_directory(
DirectoryEntry::Directory(dir) => {
sources.push(
create_server_rendered_source_for_directory(
context_path,
context,
*dir,
runtime_entries,

View file

@ -7,7 +7,7 @@ use turbo_tasks_fs::FileSystemPathVc;
use turbopack::ecmascript::EcmascriptModuleAssetVc;
use turbopack_core::{
chunk::{ChunkGroupVc, ChunkableAssetVc},
resolve::parse::RequestVc,
resolve::{origin::PlainResolveOriginVc, parse::RequestVc},
};
use turbopack_dev_server::{
html::DevHtmlAsset,
@ -32,10 +32,11 @@ pub async fn create_web_entry_source(
let runtime_entries =
get_resolved_client_runtime_entries(project_root, env, browserslist_query);
let origin = PlainResolveOriginVc::new(context, project_root.join("_")).as_resolve_origin();
let chunks: Vec<_> = stream::iter(entry_requests)
.then(|r| {
context
.resolve_asset(context.context_path(), r, context.resolve_options())
origin
.resolve_asset(r, origin.resolve_options())
.primary_assets()
.into_future()
})