From dcfcea04f4e2b29e42e867b827ea30deb99a284d Mon Sep 17 00:00:00 2001 From: inottn Date: Wed, 16 Oct 2024 15:55:26 +0800 Subject: [PATCH] fix: should not panic when passing `test` option to SourceMapDevToolPlugin (#8136) fix: panic when passing `test` option to SourceMapDevToolPlugin --- .../src/options/raw_devtool.rs | 7 ++++--- .../src/source_map_dev_tool_plugin.rs | 14 ++++++++++---- .../source-map-dev-tool-plugin/rspack.config.js | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/crates/rspack_binding_options/src/options/raw_devtool.rs b/crates/rspack_binding_options/src/options/raw_devtool.rs index 5f72d67dc57..1112f2d8250 100644 --- a/crates/rspack_binding_options/src/options/raw_devtool.rs +++ b/crates/rspack_binding_options/src/options/raw_devtool.rs @@ -9,7 +9,6 @@ use rspack_plugin_devtool::{ Append, EvalDevToolModulePluginOptions, ModuleFilenameTemplate, ModuleFilenameTemplateFnCtx, SourceMapDevToolPluginOptions, TestFn, }; -use tokio::runtime::Handle; type RawAppend = Either3>; @@ -95,8 +94,10 @@ fn normalize_raw_module_filename_template( } fn normalize_raw_test(raw: ThreadsafeFunction) -> TestFn { - let handle = Handle::current(); - Box::new(move |ctx| handle.block_on(raw.call(ctx))) + Box::new(move |ctx| { + let raw = raw.clone(); + Box::pin(async move { raw.call(ctx).await }) + }) } #[napi(object, object_to_js = false)] diff --git a/crates/rspack_plugin_devtool/src/source_map_dev_tool_plugin.rs b/crates/rspack_plugin_devtool/src/source_map_dev_tool_plugin.rs index ffee6e3de68..ae6ef30eea6 100644 --- a/crates/rspack_plugin_devtool/src/source_map_dev_tool_plugin.rs +++ b/crates/rspack_plugin_devtool/src/source_map_dev_tool_plugin.rs @@ -46,7 +46,7 @@ pub enum Append { Disabled, } -pub type TestFn = Box Result + Sync + Send>; +pub type TestFn = Box BoxFuture<'static, Result> + Sync + Send>; #[derive(Derivative)] #[derivative(Debug)] @@ -173,11 +173,11 @@ impl SourceMapDevToolPlugin { let output_options = &compilation.options.output; let map_options = MapOptions::new(self.columns); - let mut mapped_sources = raw_assets + let futures = raw_assets .into_par_iter() - .filter_map(|(file, asset)| { + .map(|(file, asset)| async { let is_match = match &self.test { - Some(test) => match test(file.to_owned()) { + Some(test) => match test(file.to_owned()).await { Ok(val) => val, Err(e) => return Some(Err(e)), }, @@ -193,6 +193,12 @@ impl SourceMapDevToolPlugin { }; source.map(Ok) }) + .collect::>(); + + let mut mapped_sources = join_all(futures) + .await + .into_iter() + .flatten() .collect::>>()?; let source_map_modules = mapped_sources diff --git a/packages/rspack-test-tools/tests/configCases/plugins/source-map-dev-tool-plugin/rspack.config.js b/packages/rspack-test-tools/tests/configCases/plugins/source-map-dev-tool-plugin/rspack.config.js index ecc18ea6d1e..9dc745b4f53 100644 --- a/packages/rspack-test-tools/tests/configCases/plugins/source-map-dev-tool-plugin/rspack.config.js +++ b/packages/rspack-test-tools/tests/configCases/plugins/source-map-dev-tool-plugin/rspack.config.js @@ -14,6 +14,7 @@ module.exports = { }, plugins: [ new rspack.SourceMapDevToolPlugin({ + test: /\.js/, filename: "[file].map", sourceRoot: path.join(__dirname, "folder") + "/" }),