Skip to content

Commit 9d5acfb

Browse files
committed
fix(turbopack): keep the original sourcemap after source transform
1 parent 257c3f8 commit 9d5acfb

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 {
@@ -193,7 +198,7 @@ pub async fn process_css_with_placeholder(
193198

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

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

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

0 commit comments

Comments
 (0)