From f64c4259506b54c0f92b519a5b2e640dc0130065 Mon Sep 17 00:00:00 2001 From: eps1lon Date: Sat, 26 Jul 2025 14:35:44 +0200 Subject: [PATCH] [sourcemaps] Fix sourcemapping in Redbox on Windows --- crates/napi/src/next_api/project.rs | 39 ++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/crates/napi/src/next_api/project.rs b/crates/napi/src/next_api/project.rs index 63e4560d60ce..d8bf9a78ba33 100644 --- a/crates/napi/src/next_api/project.rs +++ b/crates/napi/src/next_api/project.rs @@ -41,7 +41,7 @@ use turbo_tasks::{ use turbo_tasks_backend::{BackingStorage, db_invalidation::invalidation_reasons}; use turbo_tasks_fs::{ DiskFileSystem, FileContent, FileSystem, FileSystemPath, get_relative_path_to, - util::uri_from_file, + util::{sys_to_unix, uri_from_file}, }; use turbopack_core::{ PROJECT_FILESYSTEM_NAME, SOURCE_URL_PROTOCOL, @@ -1441,12 +1441,17 @@ pub struct OptionStackFrame(Option); #[turbo_tasks::function] pub async fn get_source_map_rope( container: Vc, - file_path: RcStr, + source_url: RcStr, ) -> Result> { - let (file, module) = match Url::parse(&file_path) { + let (file_path_sys, module) = match Url::parse(&source_url) { Ok(url) => match url.scheme() { "file" => { - let path = urlencoding::decode(url.path())?.to_string(); + let path = match url.to_file_path() { + Ok(path) => path.to_string_lossy().into(), + Err(error) => { + bail!("Failed to convert file URL to file path: {error:?}"); + } + }; let module = url.query_pairs().find(|(k, _)| k == "id"); ( path, @@ -1458,23 +1463,29 @@ pub async fn get_source_map_rope( } _ => bail!("Unknown url scheme '{}'", url.scheme()), }, - Err(_) => (file_path.to_string(), None), + Err(_) => (source_url.to_string(), None), }; - let Some(chunk_base) = - file.strip_prefix(container.project().dist_dir_absolute().await?.as_str()) - else { - // File doesn't exist within the dist dir - return Ok(OptionStringifiedSourceMap::none()); - }; + let chunk_base_unix = + match file_path_sys.strip_prefix(container.project().dist_dir_absolute().await?.as_str()) { + Some(relative_path) => sys_to_unix(relative_path), + None => { + // File doesn't exist within the dist dir + return Ok(OptionStringifiedSourceMap::none()); + } + }; - let server_path = container.project().node_root().await?.join(chunk_base)?; + let server_path = container + .project() + .node_root() + .await? + .join(&chunk_base_unix)?; let client_path = container .project() .client_relative_path() .await? - .join(chunk_base)?; + .join(&chunk_base_unix)?; let mut map = container.get_source_map(server_path, module.clone()); @@ -1485,7 +1496,7 @@ pub async fn get_source_map_rope( // chunks. map = container.get_source_map(client_path, module); if map.await?.is_none() { - bail!("chunk/module '{}' is missing a sourcemap", file_path); + bail!("chunk/module '{}' is missing a sourcemap", source_url); } }