Skip to content

Commit e147092

Browse files
authored
fix: not changed related source-map when rename asset (#11293)
1 parent 9caa0eb commit e147092

File tree

6 files changed

+91
-36
lines changed

6 files changed

+91
-36
lines changed

crates/rspack_core/src/compiler/compilation.rs

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ pub struct Compilation {
225225
pub entrypoints: IndexMap<String, ChunkGroupUkey>,
226226
pub async_entrypoints: Vec<ChunkGroupUkey>,
227227
assets: CompilationAssets,
228+
assets_related_in: HashMap<String, HashSet<String>>,
228229
pub emitted_assets: DashSet<String, BuildHasherDefault<FxHasher>>,
229230
diagnostics: Vec<Diagnostic>,
230231
logging: CompilationLogging,
@@ -364,6 +365,7 @@ impl Compilation {
364365
entrypoints: Default::default(),
365366
async_entrypoints: Default::default(),
366367
assets: Default::default(),
368+
assets_related_in: Default::default(),
367369
emitted_assets: Default::default(),
368370
diagnostics: Default::default(),
369371
logging: Default::default(),
@@ -725,6 +727,26 @@ impl Compilation {
725727
Ok(())
726728
}
727729

730+
fn set_asset_info(
731+
&mut self,
732+
name: &str,
733+
new_info: Option<&AssetInfo>,
734+
old_info: Option<&AssetInfo>,
735+
) {
736+
if let Some(old_info) = old_info
737+
&& let Some(source_map) = &old_info.related.source_map
738+
&& let Some(entry) = self.assets_related_in.get_mut(source_map)
739+
{
740+
entry.remove(name);
741+
}
742+
if let Some(new_info) = new_info
743+
&& let Some(source_map) = new_info.related.source_map.clone()
744+
{
745+
let entry = self.assets_related_in.entry(source_map).or_default();
746+
entry.insert(name.to_string());
747+
}
748+
}
749+
728750
pub fn update_asset(
729751
&mut self,
730752
filename: &str,
@@ -735,18 +757,22 @@ impl Compilation {
735757
) -> Result<()> {
736758
let assets = &mut self.assets;
737759

738-
let (new_source, new_info) = match assets.remove(filename) {
760+
let (old_info, new_source, new_info) = match assets.remove(filename) {
739761
Some(CompilationAsset {
740762
source: Some(source),
741-
info,
742-
}) => updater(source, info)?,
763+
info: old_info,
764+
}) => {
765+
let (new_source, new_info) = updater(source, old_info.clone())?;
766+
(old_info, new_source, new_info)
767+
}
743768
_ => {
744769
return Err(error!(
745770
"Called Compilation.updateAsset for not existing filename {filename}"
746771
));
747772
}
748773
};
749-
self.emit_asset(
774+
self.set_asset_info(filename, Some(&new_info), Some(&old_info));
775+
self.assets.insert(
750776
filename.to_owned(),
751777
CompilationAsset {
752778
source: Some(new_source),
@@ -777,18 +803,23 @@ impl Compilation {
777803
)
778804
.into(),
779805
);
806+
self.set_asset_info(&filename, Some(asset.get_info()), None);
780807
self.assets.insert(filename, asset);
781808
return;
782809
}
810+
self.set_asset_info(&filename, Some(asset.get_info()), Some(original.get_info()));
783811
original.info = asset.info;
784812
self.assets.insert(filename, original);
785813
} else {
814+
self.set_asset_info(&filename, Some(asset.get_info()), None);
786815
self.assets.insert(filename, asset);
787816
}
788817
}
789818

790819
pub fn delete_asset(&mut self, filename: &str) {
791820
if let Some(asset) = self.assets.remove(filename) {
821+
self.set_asset_info(filename, None, Some(asset.get_info()));
822+
792823
if let Some(source_map) = &asset.info.related.source_map {
793824
self.delete_asset(source_map);
794825
}
@@ -801,7 +832,19 @@ impl Compilation {
801832

802833
pub fn rename_asset(&mut self, filename: &str, new_name: String) {
803834
if let Some(asset) = self.assets.remove(filename) {
835+
// Update related in all other assets
836+
if let Some(related_in_info) = self.assets_related_in.get(filename) {
837+
for name in related_in_info {
838+
if let Some(asset) = self.assets.get_mut(name) {
839+
asset.get_info_mut().related.source_map = Some(new_name.to_string());
840+
}
841+
}
842+
}
843+
self.set_asset_info(filename, None, Some(asset.get_info()));
844+
self.set_asset_info(&new_name, Some(asset.get_info()), None);
845+
804846
self.assets.insert(new_name.clone(), asset);
847+
805848
self.chunk_by_ukey.iter_mut().for_each(|(_, chunk)| {
806849
if chunk.remove_file(filename) {
807850
chunk.add_file(new_name.clone());

crates/rspack_plugin_real_content_hash/src/lib.rs

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ async fn inner_impl(compilation: &mut Compilation) -> Result<()> {
260260
logger.time_end(start);
261261

262262
let start = logger.time("update assets");
263-
let mut rename_tasks = vec![];
264263
for (name, new_source, new_name) in updates {
265264
compilation.update_asset(&name, |_, old_info| {
266265
let new_hashes: HashSet<_> = old_info
@@ -280,36 +279,10 @@ async fn inner_impl(compilation: &mut Compilation) -> Result<()> {
280279
))
281280
})?;
282281
if let Some(new_name) = new_name {
283-
rename_tasks.push((name, new_name));
282+
compilation.rename_asset(&name, new_name);
284283
}
285284
}
286285

287-
let assets = compilation.assets_mut();
288-
rename_tasks.retain(|(filename, new_name)| {
289-
if let Some(asset) = assets.remove(filename) {
290-
assets.insert(new_name.clone(), asset);
291-
true
292-
} else {
293-
false
294-
}
295-
});
296-
297-
compilation
298-
.chunk_by_ukey
299-
.values_mut()
300-
.par_bridge()
301-
.for_each(|chunk| {
302-
for (filename, new_name) in rename_tasks.iter() {
303-
if chunk.remove_file(filename) {
304-
chunk.add_file(new_name.clone());
305-
}
306-
307-
if chunk.remove_auxiliary_file(filename) {
308-
chunk.add_auxiliary_file(new_name.clone());
309-
}
310-
}
311-
});
312-
313286
logger.time_end(start);
314287

315288
Ok(())
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const value = new URL("./file.txt", import.meta.url);
2+
3+
console.log(value);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Plugin {
2+
/**
3+
* @param {import('@rspack/core').Compiler} compiler
4+
*/
5+
apply(compiler) {
6+
compiler.hooks.afterEmit.tap("Test", compilation => {
7+
const assets = compilation.getAssets();
8+
for (const asset of assets) {
9+
const sourceMap = asset.info.related?.sourceMap;
10+
if (sourceMap) {
11+
expect(sourceMap).toBe(`${asset.name}.map`);
12+
}
13+
}
14+
});
15+
}
16+
}
17+
18+
/**@type {import('@rspack/core').Configuration}*/
19+
module.exports = {
20+
context: __dirname,
21+
output: {
22+
filename: "[name].[contenthash].js"
23+
},
24+
devtool: "source-map",
25+
plugins: [new Plugin()],
26+
module: {
27+
generator: {
28+
asset: {
29+
filename: "assets/[name].[contenthash][ext]"
30+
}
31+
},
32+
rules: [
33+
{
34+
test: /file\.txt$/,
35+
type: "asset/resource"
36+
},
37+
]
38+
}
39+
};

packages/rspack-test-tools/tests/configCases/asset/rename-asset/rspack.config.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
const path = require("path");
2-
const assert = require("assert").strict;
3-
const pluginName = "plugin";
4-
51
class Plugin {
62
apply(compiler) {
73
compiler.hooks.compilation.tap("Test", compilation => {

0 commit comments

Comments
 (0)