Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions crates/node_binding/napi-binding.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2489,6 +2489,8 @@ export interface RawModuleRule {
rules?: Array<RawModuleRule>
/** Specifies the category of the loader. No value means normal loader. */
enforce?: 'pre' | 'post'
/** Whether to extract source maps from the module. */
extractSourceMap?: boolean
}

/**
Expand Down
28 changes: 28 additions & 0 deletions crates/rspack/tests/snapshots/defaults__default_options.snap
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -768,7 +770,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -805,7 +809,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -895,7 +901,9 @@ CompilerOptions {
},
),
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -994,7 +1002,9 @@ CompilerOptions {
},
),
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1026,7 +1036,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1067,7 +1079,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1171,7 +1185,9 @@ CompilerOptions {
},
),
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1227,7 +1243,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1257,7 +1275,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
],
),
Expand All @@ -1271,7 +1291,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1310,7 +1332,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
],
),
Expand All @@ -1323,7 +1347,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
ModuleRule {
rspack_resource: None,
Expand Down Expand Up @@ -1353,7 +1379,9 @@ CompilerOptions {
generator: None,
resolve: None,
enforce: Normal,
extract_source_map: None,
},
extract_source_map: None,
},
],
parser: Some(
Expand Down
4 changes: 4 additions & 0 deletions crates/rspack_binding_api/src/raw_options/raw_module/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ pub struct RawModuleRule {
/// Specifies the category of the loader. No value means normal loader.
#[napi(ts_type = "'pre' | 'post'")]
pub enforce: Option<String>,
/// Whether to extract source maps from the module.
pub extract_source_map: Option<bool>,
}

#[derive(Debug, Default)]
Expand Down Expand Up @@ -970,7 +972,9 @@ impl TryFrom<RawModuleRule> for ModuleRule {
resolve: value.resolve.map(|raw| raw.try_into()).transpose()?,
side_effects: value.side_effects,
enforce,
extract_source_map: value.extract_source_map,
},
extract_source_map: value.extract_source_map,
})
}
}
Expand Down
1 change: 1 addition & 0 deletions crates/rspack_core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ swc_core = { workspace = true, features = [
swc_node_comments = { workspace = true }
tokio = { workspace = true, features = ["rt", "macros"] }
tracing = { workspace = true }
urlencoding = { workspace = true }
ustr = { workspace = true }
winnow = { workspace = true }

Expand Down
55 changes: 48 additions & 7 deletions crates/rspack_core/src/loader/rspack_loader.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
use std::sync::Mutex;
use std::sync::{Arc, Mutex};

use rspack_error::Result;
use rspack_error::{Diagnostic, Result};
use rspack_fs::ReadableFileSystem;
use rspack_loader_runner::{Content, LoaderContext, LoaderRunnerPlugin, ResourceData};
use rspack_sources::SourceMap;

use crate::{RunnerContext, SharedPluginDriver};
use crate::{RunnerContext, SharedPluginDriver, utils::extract_source_map};

pub struct RspackLoaderRunnerPlugin {
pub plugin_driver: SharedPluginDriver,
pub current_loader: Mutex<Option<String>>,
pub extract_source_map: Option<bool>,
}

#[async_trait::async_trait]
Expand All @@ -27,17 +30,55 @@ impl LoaderRunnerPlugin for RspackLoaderRunnerPlugin {
.await
}

async fn process_resource(&self, resource_data: &ResourceData) -> Result<Option<Content>> {
async fn process_resource(
&self,
resource_data: &ResourceData,
fs: Arc<dyn ReadableFileSystem>,
) -> Result<Option<(Content, Option<SourceMap>)>> {
// First try the plugin's read_resource hook
let result = self
.plugin_driver
.normal_module_hooks
.read_resource
.call(resource_data)
.call(resource_data, &fs)
.await?;
if result.is_some() {
return Ok(result);

if let Some(content) = result {
if let Some(true) = self.extract_source_map {
// Try to extract source map from the content
let extract_result = match &content {
Content::String(s) => extract_source_map(fs, s, resource_data.resource()).await,
Content::Buffer(b) => {
extract_source_map(fs, &String::from_utf8_lossy(b), resource_data.resource()).await
}
};

match extract_result {
Ok(extract_result) => {
// Return the content with source map extracted
// The source map will be available through the loader context
return Ok(Some((
Content::String(extract_result.source),
extract_result.source_map,
)));
}
Err(e) => {
// If extraction fails, return original content
// Log the error as a warning
self
.plugin_driver
.diagnostics
.lock()
.expect("should get lock")
.push(Diagnostic::warn("extractSourceMap".into(), e));
return Ok(Some((content, None)));
}
}
}
return Ok(Some((content, None)));
}

// If no plugin handled it, return None so the default logic can handle it
Ok(None)
}

Expand Down
9 changes: 8 additions & 1 deletion crates/rspack_core/src/normal_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use rspack_cacheable::{
};
use rspack_collections::{Identifiable, IdentifierMap, IdentifierSet};
use rspack_error::{Diagnosable, Diagnostic, Result, error};
use rspack_fs::ReadableFileSystem;
use rspack_hash::{RspackHash, RspackHashDigest};
use rspack_hook::define_hook;
use rspack_loader_runner::{AdditionalData, Content, LoaderContext, ResourceData, run_loaders};
Expand Down Expand Up @@ -77,7 +78,7 @@ impl ModuleIssuer {
}
}

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

#[allow(unused)]
debug_id: usize,
Expand Down Expand Up @@ -182,6 +185,7 @@ impl NormalModule {
resolve_options: Option<Arc<Resolve>>,
loaders: Vec<BoxLoader>,
context: Option<Context>,
extract_source_map: Option<bool>,
) -> Self {
let module_type = module_type.into();
let id = Self::create_id(&module_type, layer.as_ref(), &request);
Expand All @@ -204,6 +208,7 @@ impl NormalModule {
loaders,
source: None,
debug_id: DEBUG_ID.fetch_add(1, Ordering::Relaxed),
extract_source_map,

cached_source_sizes: DashMap::default(),
diagnostics: Default::default(),
Expand Down Expand Up @@ -399,6 +404,7 @@ impl Module for NormalModule {
let plugin = Arc::new(RspackLoaderRunnerPlugin {
plugin_driver: build_context.plugin_driver.clone(),
current_loader: Default::default(),
extract_source_map: self.extract_source_map,
});

let (mut loader_result, err) = run_loaders(
Expand Down Expand Up @@ -453,6 +459,7 @@ impl Module for NormalModule {
optimization_bailouts: vec![],
});
};

build_context
.plugin_driver
.normal_module_hooks
Expand Down
13 changes: 13 additions & 0 deletions crates/rspack_core/src/normal_module_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,7 @@ impl NormalModuleFactory {
resolved_generator_options,
);
let resolved_side_effects = self.calculate_side_effects(&resolved_module_rules);
let resolved_extract_source_map = self.calculate_extract_source_map(&resolved_module_rules);
let mut resolved_parser_and_generator = self
.plugin_driver
.registered_parser_and_generator_builder
Expand Down Expand Up @@ -573,6 +574,7 @@ impl NormalModuleFactory {
resolved_resolve_options,
loaders,
create_data.context.clone().map(|x| x.into()),
resolved_extract_source_map,
)
.boxed()
};
Expand Down Expand Up @@ -636,6 +638,17 @@ impl NormalModuleFactory {
side_effect_res
}

fn calculate_extract_source_map(&self, module_rules: &[&ModuleRuleEffect]) -> Option<bool> {
let mut extract_source_map_res = None;
// extract_source_map from module rule has higher priority
for rule in module_rules.iter() {
if rule.extract_source_map.is_some() {
extract_source_map_res = rule.extract_source_map;
}
}
extract_source_map_res
}

fn calculate_parser_and_generator_options(
&self,
module_rules: &[&ModuleRuleEffect],
Expand Down
2 changes: 2 additions & 0 deletions crates/rspack_core/src/options/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1017,6 +1017,7 @@ pub struct ModuleRule {
pub one_of: Option<Vec<ModuleRule>>,
pub rules: Option<Vec<ModuleRule>>,
pub effect: ModuleRuleEffect,
pub extract_source_map: Option<bool>,
}

#[derive(Debug, Default)]
Expand All @@ -1030,6 +1031,7 @@ pub struct ModuleRuleEffect {
pub generator: Option<GeneratorOptions>,
pub resolve: Option<Resolve>,
pub enforce: ModuleRuleEnforce,
pub extract_source_map: Option<bool>,
}

pub enum ModuleRuleUse {
Expand Down
Loading
Loading