Skip to content

Commit 504bfbd

Browse files
authored
fix(turbopack): keep the original sourcemap of styles after source transform (#79700)
## Why The original sourcemap be lost after source transform. For example, a`xyz.sass` file processed by sass-loader, return a `xyz.sass.css`, the output css chunk only contains the sourcemap of `xyz.sass.css` produced by lightningcss, `xyz.sass` associated sourcemap been lost. ## How Extend lightningcss generated sourcemap with the original sourcemap, see: https://github.com/parcel-bundler/lightningcss/blob/f2dc67c4d3fe92f26693c02366db1e60cae0db27/napi/src/lib.rs#L776 ## Related issue utooland/utoo#1915
1 parent 1aba8ed commit 504bfbd

File tree

3 files changed

+68
-23
lines changed

3 files changed

+68
-23
lines changed

test/e2e/app-dir/scss/compilation-and-prefixing/compilation-and-prefixing.test.ts

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,45 @@ describe.each([
8787
if (process.env.IS_TURBOPACK_TEST) {
8888
if (dependencies.sass) {
8989
expect(sourceMapContentParsed).toMatchInlineSnapshot(`
90-
{
91-
"mappings": "AAAA,iCAAiC",
92-
"names": [],
93-
"sourcesContent": [
94-
".redText ::placeholder{color:red}.flex-parsing{flex:0 0 calc(50% - var(--vertical-gutter))}",
95-
],
96-
"version": 3,
97-
}
90+
{
91+
"mappings": "AAEE,iCAKF",
92+
"names": [],
93+
"sourcesContent": [
94+
"$var: red;
95+
.redText {
96+
::placeholder {
97+
color: $var;
98+
}
99+
}
100+
101+
.flex-parsing {
102+
flex: 0 0 calc(50% - var(--vertical-gutter));
103+
}
104+
",
105+
],
106+
"version": 3,
107+
}
98108
`)
99109
} else {
100110
expect(sourceMapContentParsed).toMatchInlineSnapshot(`
101-
{
102-
"mappings": "AAAA,iCAAiC",
103-
"names": [],
104-
"sourcesContent": [
105-
".redText ::placeholder{color:red}.flex-parsing{flex:0 0 calc(50% - var(--vertical-gutter))}",
106-
],
107-
"version": 3,
108-
}
111+
{
112+
"mappings": "AAEE,iCAKF",
113+
"names": [],
114+
"sourcesContent": [
115+
"$var: red;
116+
.redText {
117+
::placeholder {
118+
color: $var;
119+
}
120+
}
121+
122+
.flex-parsing {
123+
flex: 0 0 calc(50% - var(--vertical-gutter));
124+
}
125+
",
126+
],
127+
"version": 3,
128+
}
109129
`)
110130
}
111131
} else {

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::{
@@ -91,14 +92,24 @@ impl ProcessCss for CssModuleAsset {
9192
}
9293

9394
#[turbo_tasks::function]
94-
fn finalize_css(
95+
async fn finalize_css(
9596
self: Vc<Self>,
9697
chunking_context: Vc<Box<dyn ChunkingContext>>,
9798
minify_type: MinifyType,
98-
) -> Vc<FinalCssResult> {
99+
) -> Result<Vc<FinalCssResult>> {
99100
let process_result = self.get_css_with_placeholder();
100101

101-
finalize_css(process_result, chunking_context, minify_type)
102+
let origin_source_map =
103+
match ResolvedVc::try_sidecast::<Box<dyn GenerateSourceMap>>(self.await?.source) {
104+
Some(gsm) => gsm.generate_source_map(),
105+
None => Vc::cell(None),
106+
};
107+
Ok(finalize_css(
108+
process_result,
109+
chunking_context,
110+
minify_type,
111+
origin_source_map,
112+
))
102113
}
103114
}
104115

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

Lines changed: 18 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,15 @@ 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 = if let Some(rope) = &*origin_source_map.await? {
270+
Some(parcel_sourcemap::SourceMap::from_json("", &rope.to_str()?)?)
271+
} else {
272+
None
273+
};
274+
275+
let (result, srcmap) =
276+
stylesheet.to_css(&code, minify_type, true, true, origin_source_map)?;
263277

264278
Ok(FinalCssResult::Ok {
265279
output_code: result.code,

0 commit comments

Comments
 (0)