Skip to content

Commit 987f9f5

Browse files
committed
fix(turbopack): keep the original sourcemap after source transform
1 parent e926dd4 commit 987f9f5

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

turbopack/crates/turbopack-css/src/asset.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use turbopack_core::{
1414
reference_type::ImportContext,
1515
resolve::origin::ResolveOrigin,
1616
source::Source,
17+
source_map::GenerateSourceMap,
1718
};
1819

1920
use crate::{
@@ -96,14 +97,24 @@ impl ProcessCss for CssModuleAsset {
9697
}
9798

9899
#[turbo_tasks::function]
99-
fn finalize_css(
100+
async fn finalize_css(
100101
self: Vc<Self>,
101102
chunking_context: Vc<Box<dyn ChunkingContext>>,
102103
minify_type: MinifyType,
103-
) -> Vc<FinalCssResult> {
104+
) -> Result<Vc<FinalCssResult>> {
104105
let process_result = self.get_css_with_placeholder();
105106

106-
finalize_css(process_result, chunking_context, minify_type)
107+
let origin_source_map =
108+
match ResolvedVc::try_sidecast::<Box<dyn GenerateSourceMap>>(self.await?.source) {
109+
Some(gsm) => gsm.generate_source_map(),
110+
None => Vc::cell(None),
111+
};
112+
Ok(finalize_css(
113+
process_result,
114+
chunking_context,
115+
minify_type,
116+
origin_source_map,
117+
))
107118
}
108119
}
109120

turbopack/crates/turbopack-css/src/process.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ impl StyleSheetLike<'_, '_> {
6666
minify_type: MinifyType,
6767
enable_srcmap: bool,
6868
handle_nesting: bool,
69+
mut origin_source_map: Option<parcel_sourcemap::SourceMap>,
6970
) -> Result<CssOutput> {
7071
let ss = &self.0;
7172
let mut srcmap = if enable_srcmap {
@@ -94,8 +95,12 @@ impl StyleSheetLike<'_, '_> {
9495
if let Some(srcmap) = &mut srcmap {
9596
debug_assert_eq!(ss.sources.len(), 1);
9697

97-
srcmap.add_sources(ss.sources.clone());
98-
srcmap.set_source_content(0, code)?;
98+
if let Some(origin_source_map) = origin_source_map.as_mut() {
99+
let _ = srcmap.extends(origin_source_map);
100+
} else {
101+
srcmap.add_sources(ss.sources.clone());
102+
srcmap.set_source_content(0, code)?;
103+
}
99104
}
100105

101106
let srcmap = match srcmap {
@@ -192,7 +197,7 @@ pub async fn process_css_with_placeholder(
192197

193198
// We use NoMinify because this is not a final css. We need to replace url references,
194199
// and we do final codegen with proper minification.
195-
let (result, _) = stylesheet.to_css(&code, MinifyType::NoMinify, false, false)?;
200+
let (result, _) = stylesheet.to_css(&code, MinifyType::NoMinify, false, false, None)?;
196201

197202
let exports = result.exports.map(|exports| {
198203
let mut exports = exports.into_iter().collect::<FxIndexMap<_, _>>();
@@ -221,6 +226,7 @@ pub async fn finalize_css(
221226
result: Vc<CssWithPlaceholderResult>,
222227
chunking_context: Vc<Box<dyn ChunkingContext>>,
223228
minify_type: MinifyType,
229+
origin_source_map: Vc<OptionStringifiedSourceMap>,
224230
) -> Result<Vc<FinalCssResult>> {
225231
let result = result.await?;
226232
match &*result {
@@ -258,7 +264,21 @@ pub async fn finalize_css(
258264
FileContent::Content(v) => v.content().to_str()?,
259265
_ => bail!("this case should be filtered out while parsing"),
260266
};
261-
let (result, srcmap) = stylesheet.to_css(&code, minify_type, true, true)?;
267+
268+
let origin_source_map = origin_source_map.await?.as_ref().map(|rope| rope.clone());
269+
270+
let origin_source_map = origin_source_map.as_ref().and_then(|rope| {
271+
rope.to_str().ok().and_then(|cow| {
272+
if cow.is_empty() {
273+
None
274+
} else {
275+
parcel_sourcemap::SourceMap::from_json("", &cow).ok()
276+
}
277+
})
278+
});
279+
280+
let (result, srcmap) =
281+
stylesheet.to_css(&code, minify_type, true, true, origin_source_map)?;
262282

263283
Ok(FinalCssResult::Ok {
264284
output_code: result.code,

0 commit comments

Comments
 (0)