Skip to content

Commit aac3548

Browse files
authored
Merge branch 'main' into release/1.6.0-beta
2 parents cf18f88 + d31f2fa commit aac3548

File tree

33 files changed

+949
-69
lines changed

33 files changed

+949
-69
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/node_binding/napi-binding.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2488,6 +2488,8 @@ export interface RawModuleRule {
24882488
rules?: Array<RawModuleRule>
24892489
/** Specifies the category of the loader. No value means normal loader. */
24902490
enforce?: 'pre' | 'post'
2491+
/** Whether to extract source maps from the module. */
2492+
extractSourceMap?: boolean
24912493
}
24922494

24932495
/**

crates/rspack/tests/snapshots/defaults__default_options.snap

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,9 @@ CompilerOptions {
736736
generator: None,
737737
resolve: None,
738738
enforce: Normal,
739+
extract_source_map: None,
739740
},
741+
extract_source_map: None,
740742
},
741743
ModuleRule {
742744
rspack_resource: None,
@@ -768,7 +770,9 @@ CompilerOptions {
768770
generator: None,
769771
resolve: None,
770772
enforce: Normal,
773+
extract_source_map: None,
771774
},
775+
extract_source_map: None,
772776
},
773777
ModuleRule {
774778
rspack_resource: None,
@@ -805,7 +809,9 @@ CompilerOptions {
805809
generator: None,
806810
resolve: None,
807811
enforce: Normal,
812+
extract_source_map: None,
808813
},
814+
extract_source_map: None,
809815
},
810816
ModuleRule {
811817
rspack_resource: None,
@@ -895,7 +901,9 @@ CompilerOptions {
895901
},
896902
),
897903
enforce: Normal,
904+
extract_source_map: None,
898905
},
906+
extract_source_map: None,
899907
},
900908
ModuleRule {
901909
rspack_resource: None,
@@ -994,7 +1002,9 @@ CompilerOptions {
9941002
},
9951003
),
9961004
enforce: Normal,
1005+
extract_source_map: None,
9971006
},
1007+
extract_source_map: None,
9981008
},
9991009
ModuleRule {
10001010
rspack_resource: None,
@@ -1026,7 +1036,9 @@ CompilerOptions {
10261036
generator: None,
10271037
resolve: None,
10281038
enforce: Normal,
1039+
extract_source_map: None,
10291040
},
1041+
extract_source_map: None,
10301042
},
10311043
ModuleRule {
10321044
rspack_resource: None,
@@ -1067,7 +1079,9 @@ CompilerOptions {
10671079
generator: None,
10681080
resolve: None,
10691081
enforce: Normal,
1082+
extract_source_map: None,
10701083
},
1084+
extract_source_map: None,
10711085
},
10721086
ModuleRule {
10731087
rspack_resource: None,
@@ -1171,7 +1185,9 @@ CompilerOptions {
11711185
},
11721186
),
11731187
enforce: Normal,
1188+
extract_source_map: None,
11741189
},
1190+
extract_source_map: None,
11751191
},
11761192
ModuleRule {
11771193
rspack_resource: None,
@@ -1227,7 +1243,9 @@ CompilerOptions {
12271243
generator: None,
12281244
resolve: None,
12291245
enforce: Normal,
1246+
extract_source_map: None,
12301247
},
1248+
extract_source_map: None,
12311249
},
12321250
ModuleRule {
12331251
rspack_resource: None,
@@ -1257,7 +1275,9 @@ CompilerOptions {
12571275
generator: None,
12581276
resolve: None,
12591277
enforce: Normal,
1278+
extract_source_map: None,
12601279
},
1280+
extract_source_map: None,
12611281
},
12621282
],
12631283
),
@@ -1271,7 +1291,9 @@ CompilerOptions {
12711291
generator: None,
12721292
resolve: None,
12731293
enforce: Normal,
1294+
extract_source_map: None,
12741295
},
1296+
extract_source_map: None,
12751297
},
12761298
ModuleRule {
12771299
rspack_resource: None,
@@ -1310,7 +1332,9 @@ CompilerOptions {
13101332
generator: None,
13111333
resolve: None,
13121334
enforce: Normal,
1335+
extract_source_map: None,
13131336
},
1337+
extract_source_map: None,
13141338
},
13151339
],
13161340
),
@@ -1323,7 +1347,9 @@ CompilerOptions {
13231347
generator: None,
13241348
resolve: None,
13251349
enforce: Normal,
1350+
extract_source_map: None,
13261351
},
1352+
extract_source_map: None,
13271353
},
13281354
ModuleRule {
13291355
rspack_resource: None,
@@ -1353,7 +1379,9 @@ CompilerOptions {
13531379
generator: None,
13541380
resolve: None,
13551381
enforce: Normal,
1382+
extract_source_map: None,
13561383
},
1384+
extract_source_map: None,
13571385
},
13581386
],
13591387
parser: Some(

crates/rspack_binding_api/src/raw_options/raw_module/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ pub struct RawModuleRule {
176176
/// Specifies the category of the loader. No value means normal loader.
177177
#[napi(ts_type = "'pre' | 'post'")]
178178
pub enforce: Option<String>,
179+
/// Whether to extract source maps from the module.
180+
pub extract_source_map: Option<bool>,
179181
}
180182

181183
#[derive(Debug, Default)]
@@ -970,7 +972,9 @@ impl TryFrom<RawModuleRule> for ModuleRule {
970972
resolve: value.resolve.map(|raw| raw.try_into()).transpose()?,
971973
side_effects: value.side_effects,
972974
enforce,
975+
extract_source_map: value.extract_source_map,
973976
},
977+
extract_source_map: value.extract_source_map,
974978
})
975979
}
976980
}

crates/rspack_core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ swc_core = { workspace = true, features = [
7777
swc_node_comments = { workspace = true }
7878
tokio = { workspace = true, features = ["rt", "macros"] }
7979
tracing = { workspace = true }
80+
urlencoding = { workspace = true }
8081
ustr = { workspace = true }
8182
winnow = { workspace = true }
8283

crates/rspack_core/src/loader/rspack_loader.rs

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
use std::sync::Mutex;
1+
use std::sync::{Arc, Mutex};
22

3-
use rspack_error::Result;
3+
use rspack_error::{Diagnostic, Result};
4+
use rspack_fs::ReadableFileSystem;
45
use rspack_loader_runner::{Content, LoaderContext, LoaderRunnerPlugin, ResourceData};
6+
use rspack_sources::SourceMap;
7+
use rustc_hash::FxHashSet as HashSet;
58

6-
use crate::{RunnerContext, SharedPluginDriver};
9+
use crate::{RunnerContext, SharedPluginDriver, utils::extract_source_map};
710

811
pub struct RspackLoaderRunnerPlugin {
912
pub plugin_driver: SharedPluginDriver,
1013
pub current_loader: Mutex<Option<String>>,
14+
pub extract_source_map: Option<bool>,
1115
}
1216

1317
#[async_trait::async_trait]
@@ -27,17 +31,62 @@ impl LoaderRunnerPlugin for RspackLoaderRunnerPlugin {
2731
.await
2832
}
2933

30-
async fn process_resource(&self, resource_data: &ResourceData) -> Result<Option<Content>> {
34+
async fn process_resource(
35+
&self,
36+
resource_data: &ResourceData,
37+
fs: Arc<dyn ReadableFileSystem>,
38+
) -> Result<Option<(Content, Option<SourceMap>, HashSet<std::path::PathBuf>)>> {
39+
// First try the plugin's read_resource hook
3140
let result = self
3241
.plugin_driver
3342
.normal_module_hooks
3443
.read_resource
35-
.call(resource_data)
44+
.call(resource_data, &fs)
3645
.await?;
37-
if result.is_some() {
38-
return Ok(result);
46+
47+
if let Some(content) = result {
48+
if let Some(true) = self.extract_source_map {
49+
// Try to extract source map from the content
50+
let extract_result = match &content {
51+
Content::String(s) => extract_source_map(fs, s, resource_data.resource()).await,
52+
Content::Buffer(b) => {
53+
extract_source_map(fs, &String::from_utf8_lossy(b), resource_data.resource()).await
54+
}
55+
};
56+
57+
match extract_result {
58+
Ok(extract_result) => {
59+
// Convert file dependencies to FxHashSet for consistency
60+
let file_deps = extract_result
61+
.file_dependencies
62+
.map(|deps| deps.into_iter().collect::<HashSet<_>>())
63+
.unwrap_or_default();
64+
65+
// Return the content with source map extracted and file dependencies
66+
return Ok(Some((
67+
Content::String(extract_result.source),
68+
extract_result.source_map,
69+
file_deps,
70+
)));
71+
}
72+
Err(e) => {
73+
// If extraction fails, return original content with empty dependencies
74+
// Log the error as a warning
75+
self
76+
.plugin_driver
77+
.diagnostics
78+
.lock()
79+
.expect("should get lock")
80+
.push(Diagnostic::warn("extractSourceMap".into(), e));
81+
return Ok(Some((content, None, HashSet::default())));
82+
}
83+
}
84+
}
85+
// Return original content with empty dependencies when extract_source_map is disabled
86+
return Ok(Some((content, None, HashSet::default())));
3987
}
4088

89+
// If no plugin handled it, return None so the default logic can handle it
4190
Ok(None)
4291
}
4392

crates/rspack_core/src/normal_module.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use rspack_cacheable::{
1616
};
1717
use rspack_collections::{Identifiable, IdentifierMap, IdentifierSet};
1818
use rspack_error::{Diagnosable, Diagnostic, Result, error};
19+
use rspack_fs::ReadableFileSystem;
1920
use rspack_hash::{RspackHash, RspackHashDigest};
2021
use rspack_hook::define_hook;
2122
use rspack_loader_runner::{AdditionalData, Content, LoaderContext, ResourceData, run_loaders};
@@ -77,7 +78,7 @@ impl ModuleIssuer {
7778
}
7879
}
7980

80-
define_hook!(NormalModuleReadResource: SeriesBail(resource_data: &ResourceData) -> Content,tracing=false);
81+
define_hook!(NormalModuleReadResource: SeriesBail(resource_data: &ResourceData, fs: &Arc<dyn ReadableFileSystem>) -> Content,tracing=false);
8182
define_hook!(NormalModuleLoader: Series(loader_context: &mut LoaderContext<RunnerContext>),tracing=false);
8283
define_hook!(NormalModuleLoaderShouldYield: SeriesBail(loader_context: &LoaderContext<RunnerContext>) -> bool,tracing=false);
8384
define_hook!(NormalModuleLoaderStartYielding: Series(loader_context: &mut LoaderContext<RunnerContext>),tracing=false);
@@ -134,6 +135,8 @@ pub struct NormalModule {
134135
parser_options: Option<ParserOptions>,
135136
/// Generator options derived from [Rule.generator]
136137
generator_options: Option<GeneratorOptions>,
138+
/// enable/disable extracting source map
139+
extract_source_map: Option<bool>,
137140

138141
#[allow(unused)]
139142
debug_id: usize,
@@ -182,6 +185,7 @@ impl NormalModule {
182185
resolve_options: Option<Arc<Resolve>>,
183186
loaders: Vec<BoxLoader>,
184187
context: Option<Context>,
188+
extract_source_map: Option<bool>,
185189
) -> Self {
186190
let module_type = module_type.into();
187191
let id = Self::create_id(&module_type, layer.as_ref(), &request);
@@ -204,6 +208,7 @@ impl NormalModule {
204208
loaders,
205209
source: None,
206210
debug_id: DEBUG_ID.fetch_add(1, Ordering::Relaxed),
211+
extract_source_map,
207212

208213
cached_source_sizes: DashMap::default(),
209214
diagnostics: Default::default(),
@@ -399,6 +404,7 @@ impl Module for NormalModule {
399404
let plugin = Arc::new(RspackLoaderRunnerPlugin {
400405
plugin_driver: build_context.plugin_driver.clone(),
401406
current_loader: Default::default(),
407+
extract_source_map: self.extract_source_map,
402408
});
403409

404410
let (mut loader_result, err) = run_loaders(
@@ -453,6 +459,7 @@ impl Module for NormalModule {
453459
optimization_bailouts: vec![],
454460
});
455461
};
462+
456463
build_context
457464
.plugin_driver
458465
.normal_module_hooks

crates/rspack_core/src/normal_module_factory.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ impl NormalModuleFactory {
493493
resolved_generator_options,
494494
);
495495
let resolved_side_effects = self.calculate_side_effects(&resolved_module_rules);
496+
let resolved_extract_source_map = self.calculate_extract_source_map(&resolved_module_rules);
496497
let mut resolved_parser_and_generator = self
497498
.plugin_driver
498499
.registered_parser_and_generator_builder
@@ -568,6 +569,7 @@ impl NormalModuleFactory {
568569
resolved_resolve_options,
569570
loaders,
570571
create_data.context.clone().map(|x| x.into()),
572+
resolved_extract_source_map,
571573
)
572574
.boxed()
573575
};
@@ -631,6 +633,17 @@ impl NormalModuleFactory {
631633
side_effect_res
632634
}
633635

636+
fn calculate_extract_source_map(&self, module_rules: &[&ModuleRuleEffect]) -> Option<bool> {
637+
let mut extract_source_map_res = None;
638+
// extract_source_map from module rule has higher priority
639+
for rule in module_rules.iter() {
640+
if rule.extract_source_map.is_some() {
641+
extract_source_map_res = rule.extract_source_map;
642+
}
643+
}
644+
extract_source_map_res
645+
}
646+
634647
fn calculate_parser_and_generator_options(
635648
&self,
636649
module_rules: &[&ModuleRuleEffect],

crates/rspack_core/src/options/module.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,7 @@ pub struct ModuleRule {
10171017
pub one_of: Option<Vec<ModuleRule>>,
10181018
pub rules: Option<Vec<ModuleRule>>,
10191019
pub effect: ModuleRuleEffect,
1020+
pub extract_source_map: Option<bool>,
10201021
}
10211022

10221023
#[derive(Debug, Default)]
@@ -1030,6 +1031,7 @@ pub struct ModuleRuleEffect {
10301031
pub generator: Option<GeneratorOptions>,
10311032
pub resolve: Option<Resolve>,
10321033
pub enforce: ModuleRuleEnforce,
1034+
pub extract_source_map: Option<bool>,
10331035
}
10341036

10351037
pub enum ModuleRuleUse {

0 commit comments

Comments
 (0)