From e71ce1d69615412a6cf8e9550e9a27f6260e75a6 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Tue, 2 Jul 2024 17:10:45 -0700 Subject: [PATCH 1/3] Turbopack + Relay: correctly implement artifact_directory to fix multi-project test Previously, if `artifact_directory` were set, artifacts would be resolved at a fixed location relative to each file. This correctly resolves them from the project root. Test Plan: With vercel/next.js#67403, `TURBOPACK_BUILD=1 TURBOPACK=1 pnpm test-dev test/integration/relay-graphql-swc-multi-project/test/index.test.js` --- .../src/transform/relay.rs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/crates/turbopack-ecmascript-plugins/src/transform/relay.rs b/crates/turbopack-ecmascript-plugins/src/transform/relay.rs index d8dae3fb3eff6..38d1c45f9dcab 100644 --- a/crates/turbopack-ecmascript-plugins/src/transform/relay.rs +++ b/crates/turbopack-ecmascript-plugins/src/transform/relay.rs @@ -12,6 +12,7 @@ use swc_core::{ }; use swc_relay::RelayLanguageConfig; use turbo_tasks::trace::TraceRawVcs; +use turbo_tasks_fs::FileSystemPath; use turbopack_ecmascript::{CustomTransformer, TransformContext}; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs)] @@ -33,10 +34,11 @@ pub enum RelayLanguage { #[derive(Debug)] pub struct RelayTransformer { config: swc_relay::Config, + project_path: FileSystemPath, } impl RelayTransformer { - pub fn new(config: &RelayConfig) -> Self { + pub fn new(config: &RelayConfig, project_path: &FileSystemPath) -> Self { let options = swc_relay::Config { artifact_directory: config.artifact_directory.as_ref().map(PathBuf::from), language: config.language.as_ref().map_or( @@ -49,7 +51,11 @@ impl RelayTransformer { ), ..Default::default() }; - Self { config: options } + + Self { + config: options, + project_path: project_path.clone(), + } } } @@ -59,14 +65,22 @@ impl CustomTransformer for RelayTransformer { async fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Result<()> { // If user supplied artifact_directory, it should be resolvable already. // Otherwise, supply default relative path (./__generated__) + let path_to_proj = PathBuf::from( + ctx.file_path + .parent() + .await? + .get_relative_path_to(&self.project_path) + .unwrap(), + ); + let (root, config) = if self.config.artifact_directory.is_some() { - (PathBuf::new(), None) + (path_to_proj, None) } else { let config = swc_relay::Config { artifact_directory: Some(PathBuf::from("__generated__")), ..self.config }; - (PathBuf::from("."), Some(config)) + (path_to_proj, Some(config)) }; let p = std::mem::replace(program, Program::Module(Module::dummy())); From 226e653acd860d56cfb71fad60c0a804f08133b2 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Tue, 2 Jul 2024 17:51:57 -0700 Subject: [PATCH 2/3] fixup! Turbopack + Relay: correctly implement artifact_directory to fix multi-project test --- crates/turbopack-ecmascript-plugins/src/transform/relay.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/turbopack-ecmascript-plugins/src/transform/relay.rs b/crates/turbopack-ecmascript-plugins/src/transform/relay.rs index 38d1c45f9dcab..f400e6431dbe5 100644 --- a/crates/turbopack-ecmascript-plugins/src/transform/relay.rs +++ b/crates/turbopack-ecmascript-plugins/src/transform/relay.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use anyhow::Result; +use anyhow::{Context, Result}; use async_trait::async_trait; use serde::{Deserialize, Serialize}; use swc_core::{ @@ -70,7 +70,7 @@ impl CustomTransformer for RelayTransformer { .parent() .await? .get_relative_path_to(&self.project_path) - .unwrap(), + .context("Expected relative path to relay artifact")?, ); let (root, config) = if self.config.artifact_directory.is_some() { From 1f18d7954d83b5bc6f4842d006d653db77c89484 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 3 Jul 2024 09:13:48 -0700 Subject: [PATCH 3/3] fixup! Turbopack + Relay: correctly implement artifact_directory to fix multi-project test --- .../src/transform/relay.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/turbopack-ecmascript-plugins/src/transform/relay.rs b/crates/turbopack-ecmascript-plugins/src/transform/relay.rs index f400e6431dbe5..83f59a10c5cf0 100644 --- a/crates/turbopack-ecmascript-plugins/src/transform/relay.rs +++ b/crates/turbopack-ecmascript-plugins/src/transform/relay.rs @@ -73,21 +73,20 @@ impl CustomTransformer for RelayTransformer { .context("Expected relative path to relay artifact")?, ); - let (root, config) = if self.config.artifact_directory.is_some() { - (path_to_proj, None) + let config = if self.config.artifact_directory.is_some() { + self.config.clone() } else { - let config = swc_relay::Config { + swc_relay::Config { artifact_directory: Some(PathBuf::from("__generated__")), ..self.config - }; - (path_to_proj, Some(config)) + } }; let p = std::mem::replace(program, Program::Module(Module::dummy())); *program = p.fold_with(&mut swc_relay::relay( - config.as_ref().unwrap_or(&self.config), + &config, FileName::Real(PathBuf::from(ctx.file_name_str)), - root, + path_to_proj, // [TODO]: pages_dir comes through next-swc-loader // https://github.com/vercel/next.js/blob/ea472e8058faea8ebdab2ef6d3aab257a1f0d11c/packages/next/src/build/webpack-config.ts#L792 None,