diff --git a/crates/node_binding/napi-binding.d.ts b/crates/node_binding/napi-binding.d.ts index bdc3a3ff8484..9119898c0d3a 100644 --- a/crates/node_binding/napi-binding.d.ts +++ b/crates/node_binding/napi-binding.d.ts @@ -1507,7 +1507,7 @@ export interface KnownAssetInfo { isOverSizeLimit?: boolean } -export declare function loadBrowserslist(input: string | undefined | null, context: string): Array | null +export declare function loadBrowserslist(input: string | undefined | null, context: string): Array export declare function minify(source: string, options: string): Promise diff --git a/crates/rspack/src/builder/browserslist_target.rs b/crates/rspack/src/builder/browserslist_target.rs index f8b78f22c134..17a33174df11 100644 --- a/crates/rspack/src/builder/browserslist_target.rs +++ b/crates/rspack/src/builder/browserslist_target.rs @@ -349,8 +349,7 @@ mod tests { .to_string(); // Example: Load browsers list, pass query string or None for default config - let browsers = - load_browserslist(Some("last 2 versions, not dead"), &context).unwrap_or_default(); + let browsers = load_browserslist(Some("last 2 versions, not dead"), &context).unwrap(); println!("browsers: {browsers:?}"); @@ -359,6 +358,21 @@ mod tests { println!("prop: {properties:#?}") } + #[test] + fn test_unsupported_node_version() { + let context = std::env::current_dir() + .unwrap() + .to_str() + .unwrap() + .to_string(); + + // Example: Load browsers list, pass query string or None for default config + let browsers_error = load_browserslist(Some("node 30.6.0"), &context).unwrap_err(); + assert_eq!( + browsers_error.to_string(), + "missing config for Browserslist environment 'node 30.6.0'" + ); + } #[test] fn test_browserslist_targets_snapshots() { diff --git a/crates/rspack/src/builder/mod.rs b/crates/rspack/src/builder/mod.rs index 707ecf6b7ace..8ea44356fb82 100644 --- a/crates/rspack/src/builder/mod.rs +++ b/crates/rspack/src/builder/mod.rs @@ -898,8 +898,7 @@ impl CompilerOptionsBuilder { }); let target = f!(self.target.take(), || { - let use_browserlist = - rspack_browserslist::load_browserslist(None, context.as_str()).is_some(); + let use_browserlist = rspack_browserslist::load_browserslist(None, context.as_str()).is_ok(); // If it's not able to find config with regard to context, then `browserslist_rs` will fallback to default query, // making it always a non-empty value. diff --git a/crates/rspack/tests/snapshots/defaults__default_options.snap b/crates/rspack/tests/snapshots/defaults__default_options.snap index 69d8c0cf9aa7..944fb6a81548 100644 --- a/crates/rspack/tests/snapshots/defaults__default_options.snap +++ b/crates/rspack/tests/snapshots/defaults__default_options.snap @@ -97,22 +97,22 @@ CompilerOptions { script_type: "", environment: Environment { const: Some( - false, + true, ), arrow_function: Some( - false, + true, ), node_prefix_for_core_modules: Some( - false, + true, ), async_function: Some( - false, + true, ), big_int_literal: Some( - false, + true, ), destructuring: Some( - false, + true, ), document: Some( true, @@ -121,19 +121,17 @@ CompilerOptions { false, ), for_of: Some( - false, - ), - global_this: Some( - false, + true, ), + global_this: None, module: Some( false, ), optional_chaining: Some( - false, + true, ), template_literal: Some( - false, + true, ), dynamic_import_in_worker: Some( false, diff --git a/crates/rspack_binding_api/src/browserslist.rs b/crates/rspack_binding_api/src/browserslist.rs index 61e7930c6b23..cd87cb452ec4 100644 --- a/crates/rspack_binding_api/src/browserslist.rs +++ b/crates/rspack_binding_api/src/browserslist.rs @@ -1,4 +1,8 @@ #[napi] -pub fn load_browserslist(input: Option, context: String) -> Option> { +pub fn load_browserslist( + input: Option, + context: String, +) -> Result, napi::Error> { rspack_browserslist::load_browserslist(input.as_deref(), context.as_str()) + .map_err(|e| napi::Error::from_reason(format!("Failed to load browserslist: {}", e))) } diff --git a/crates/rspack_browserslist/src/lib.rs b/crates/rspack_browserslist/src/lib.rs index 7fddcce28580..695ea52c2911 100644 --- a/crates/rspack_browserslist/src/lib.rs +++ b/crates/rspack_browserslist/src/lib.rs @@ -1,5 +1,5 @@ mod lightningcss; mod load_config; - +pub use browserslist::Error; pub use lightningcss::browserslist_to_lightningcss_targets; pub use load_config::load_browserslist; diff --git a/crates/rspack_browserslist/src/load_config.rs b/crates/rspack_browserslist/src/load_config.rs index 5f55e5fe0f67..8496c16fc2c6 100644 --- a/crates/rspack_browserslist/src/load_config.rs +++ b/crates/rspack_browserslist/src/load_config.rs @@ -1,4 +1,4 @@ -use browserslist::Opts; +use browserslist::{Error, Opts}; /// Configuration parsed from input string and context directory #[derive(Debug, Default)] @@ -69,7 +69,7 @@ pub fn parse<'a>(input: Option<&str>, context: &'a str) -> BrowserslistHandlerCo } /// Loads the browsers list based on the input and context. -pub fn load_browserslist(input: Option<&str>, context: &str) -> Option> { +pub fn load_browserslist(input: Option<&str>, context: &str) -> Result, Error> { let BrowserslistHandlerConfig { config_path, env, @@ -77,8 +77,12 @@ pub fn load_browserslist(input: Option<&str>, context: &str) -> Option, context: &str) -> Option Some(browsers.into_iter().map(|d| d.to_string()).collect()), - Err(_) => None, + Ok(browsers) => Ok(browsers.into_iter().map(|d| d.to_string()).collect()), + Err(err) => Err(err), } } diff --git a/tests/rspack-test/configCases/errors/wrong-browserslist/errors.js b/tests/rspack-test/configCases/errors/wrong-browserslist/errors.js new file mode 100644 index 000000000000..19dbbfdeef8a --- /dev/null +++ b/tests/rspack-test/configCases/errors/wrong-browserslist/errors.js @@ -0,0 +1,2 @@ +module.exports = [[/Failed to load browserslist: unknown Node.js version: 32.8.0/]] + diff --git a/tests/rspack-test/configCases/errors/wrong-browserslist/index.js b/tests/rspack-test/configCases/errors/wrong-browserslist/index.js new file mode 100644 index 000000000000..8b1a393741c9 --- /dev/null +++ b/tests/rspack-test/configCases/errors/wrong-browserslist/index.js @@ -0,0 +1 @@ +// empty diff --git a/tests/rspack-test/configCases/errors/wrong-browserslist/package.json b/tests/rspack-test/configCases/errors/wrong-browserslist/package.json new file mode 100644 index 000000000000..79811a7ffc5b --- /dev/null +++ b/tests/rspack-test/configCases/errors/wrong-browserslist/package.json @@ -0,0 +1,5 @@ +{ + "browserslist": [ + "node 32.8.0" + ] +} \ No newline at end of file diff --git a/tests/rspack-test/configCases/errors/wrong-browserslist/rspack.config.js b/tests/rspack-test/configCases/errors/wrong-browserslist/rspack.config.js new file mode 100644 index 000000000000..c9457c724ae7 --- /dev/null +++ b/tests/rspack-test/configCases/errors/wrong-browserslist/rspack.config.js @@ -0,0 +1,7 @@ +module.exports = { + context: __dirname, + entry: { + main: './index.js' + }, + target:['browserslist'] +}