From ee0ed240275d8fc3ec59dca79919c5feea61ef9b Mon Sep 17 00:00:00 2001 From: Hana Date: Mon, 15 Jan 2024 16:08:04 +0800 Subject: [PATCH] fix: unregistered case handler should not panic (#5330) * fix: unregistered case handler should not panic * chore: add panic message --- crates/swc_plugin_import/src/lib.rs | 37 ++++++++++++------- .../builtin-swc-loader/issue-5329/errors.js | 1 + .../builtin-swc-loader/issue-5329/index.js | 5 +++ .../issue-5329/lib-entry.js | 2 + .../builtin-swc-loader/issue-5329/lib.js | 1 + .../issue-5329/webpack.config.js | 20 ++++++++++ .../custom-name-tpl-nopanic/fooBar/index.js | 1 + 7 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/errors.js create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/index.js create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib-entry.js create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib.js create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/webpack.config.js create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/plugin-import/src/custom-name-tpl-nopanic/fooBar/index.js diff --git a/crates/swc_plugin_import/src/lib.rs b/crates/swc_plugin_import/src/lib.rs index d691f6e7e05..c2fa4a161e7 100644 --- a/crates/swc_plugin_import/src/lib.rs +++ b/crates/swc_plugin_import/src/lib.rs @@ -8,7 +8,7 @@ use inflector::Inflector; use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet}; use serde::Deserialize; use swc_core::{ - common::{util::take::Take, BytePos, Span, SyntaxContext, DUMMY_SP}, + common::{errors::HANDLER, util::take::Take, BytePos, Span, SyntaxContext, DUMMY_SP}, ecma::{ ast::{ Ident, ImportDecl, ImportDefaultSpecifier, ImportNamedSpecifier, ImportSpecifier, Module, @@ -77,6 +77,9 @@ const CUSTOM_JS: &str = "CUSTOM_JS_NAME"; const CUSTOM_STYLE: &str = "CUSTOM_STYLE"; const CUSTOM_STYLE_NAME: &str = "CUSTOM_STYLE_NAME"; +/// Panic: +/// +/// Panics in sometimes if [swc_core::common::errors::HANDLER] is not provided. pub fn plugin_import(config: &Vec) -> impl Fold + '_ { let mut renderer = handlebars::Handlebars::new(); @@ -246,19 +249,17 @@ impl<'a> ImportPlugin<'a> { let path = if let Some(transform) = &config.custom_name { match transform { - CustomTransform::Fn(f) => f(name.clone()), - CustomTransform::Tpl(_) => Some( - self - .renderer - .render( - format!("{}{}", &config.library_name, CUSTOM_JS).as_str(), - &render_context(name.clone()), - ) - .unwrap(), - ), + CustomTransform::Fn(f) => Ok(f(name.clone())), + CustomTransform::Tpl(_) => self + .renderer + .render( + format!("{}{}", &config.library_name, CUSTOM_JS).as_str(), + &render_context(name.clone()), + ) + .map(Some), } } else { - Some(format!( + Ok(Some(format!( "{}/{}/{}", &config.library_name, config @@ -266,7 +267,17 @@ impl<'a> ImportPlugin<'a> { .as_ref() .unwrap_or(&"lib".to_string()), transformed_name - )) + ))) + }; + + let path = match path { + Ok(p) => p, + Err(e) => { + HANDLER.with(|handler| { + handler.err(&e.to_string()); + }); + None + } }; if path.is_none() { diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/errors.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/errors.js new file mode 100644 index 00000000000..2c8bd516dd4 --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/errors.js @@ -0,0 +1 @@ +module.exports = [[/Helper not defined: \"unregisteredCase\"/]]; diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/index.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/index.js new file mode 100644 index 00000000000..b3b2e5bf2fa --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/index.js @@ -0,0 +1,5 @@ +it("should throw error instead of panic", () => { + expect(() => require("./lib-entry")).toThrowError( + /Helper not defined: \"unregisteredCase\"/ + ); +}); diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib-entry.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib-entry.js new file mode 100644 index 00000000000..d5bb8cacc38 --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib-entry.js @@ -0,0 +1,2 @@ +import { FooBar } from "./lib"; +eval(FooBar); diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib.js new file mode 100644 index 00000000000..38b08af1d77 --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/lib.js @@ -0,0 +1 @@ +module.exports = ""; diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/webpack.config.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/webpack.config.js new file mode 100644 index 00000000000..dd895e23b11 --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-5329/webpack.config.js @@ -0,0 +1,20 @@ +module.exports = { + module: { + rules: [ + { + test: /\.js$/, + loader: "builtin:swc-loader", + options: { + rspackExperiments: { + import: [ + { + libraryName: "./lib", + customName: "./lib/{{ unregisteredCase member }}" + } + ] + } + } + } + ] + } +}; diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/plugin-import/src/custom-name-tpl-nopanic/fooBar/index.js b/packages/rspack/tests/configCases/builtin-swc-loader/plugin-import/src/custom-name-tpl-nopanic/fooBar/index.js new file mode 100644 index 00000000000..3711356b575 --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/plugin-import/src/custom-name-tpl-nopanic/fooBar/index.js @@ -0,0 +1 @@ +export default "FooBar";