Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 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 @@ -2488,6 +2488,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 @@ -493,6 +493,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 @@ -568,6 +569,7 @@ impl NormalModuleFactory {
resolved_resolve_options,
loaders,
create_data.context.clone().map(|x| x.into()),
resolved_extract_source_map,
)
.boxed()
};
Expand Down Expand Up @@ -631,6 +633,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