Skip to content

Commit a836ee5

Browse files
committed
fix(core): throw error when passing unsupported Node.js version in browserslist query
1 parent beafb11 commit a836ee5

File tree

10 files changed

+49
-13
lines changed

10 files changed

+49
-13
lines changed

crates/node_binding/napi-binding.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1507,7 +1507,7 @@ export interface KnownAssetInfo {
15071507
isOverSizeLimit?: boolean
15081508
}
15091509

1510-
export declare function loadBrowserslist(input: string | undefined | null, context: string): Array<string> | null
1510+
export declare function loadBrowserslist(input: string | undefined | null, context: string): Array<string>
15111511

15121512
export declare function minify(source: string, options: string): Promise<TransformOutput>
15131513

crates/rspack/src/builder/browserslist_target.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,7 @@ mod tests {
349349
.to_string();
350350

351351
// Example: Load browsers list, pass query string or None for default config
352-
let browsers =
353-
load_browserslist(Some("last 2 versions, not dead"), &context).unwrap_or_default();
352+
let browsers = load_browserslist(Some("last 2 versions, not dead"), &context).unwrap();
354353

355354
println!("browsers: {browsers:?}");
356355

@@ -359,6 +358,21 @@ mod tests {
359358

360359
println!("prop: {properties:#?}")
361360
}
361+
#[test]
362+
fn test_unsupported_node_version() {
363+
let context = std::env::current_dir()
364+
.unwrap()
365+
.to_str()
366+
.unwrap()
367+
.to_string();
368+
369+
// Example: Load browsers list, pass query string or None for default config
370+
let browsers_error = load_browserslist(Some("node 30.6.0"), &context).unwrap_err();
371+
assert_eq!(
372+
browsers_error.to_string(),
373+
"missing config for Browserslist environment 'node 30.6.0'"
374+
);
375+
}
362376

363377
#[test]
364378
fn test_browserslist_targets_snapshots() {

crates/rspack/src/builder/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -898,8 +898,7 @@ impl CompilerOptionsBuilder {
898898
});
899899

900900
let target = f!(self.target.take(), || {
901-
let use_browserlist =
902-
rspack_browserslist::load_browserslist(None, context.as_str()).is_some();
901+
let use_browserlist = rspack_browserslist::load_browserslist(None, context.as_str()).is_ok();
903902

904903
// If it's not able to find config with regard to context, then `browserslist_rs` will fallback to default query,
905904
// making it always a non-empty value.
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
#[napi]
2-
pub fn load_browserslist(input: Option<String>, context: String) -> Option<Vec<String>> {
2+
pub fn load_browserslist(
3+
input: Option<String>,
4+
context: String,
5+
) -> Result<Vec<String>, napi::Error> {
36
rspack_browserslist::load_browserslist(input.as_deref(), context.as_str())
7+
.map_err(|e| napi::Error::from_reason(format!("Failed to load browserslist: {}", e)))
48
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
mod lightningcss;
22
mod load_config;
3-
3+
pub use browserslist::Error;
44
pub use lightningcss::browserslist_to_lightningcss_targets;
55
pub use load_config::load_browserslist;

crates/rspack_browserslist/src/load_config.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use browserslist::Opts;
1+
use browserslist::{Error, Opts};
22

33
/// Configuration parsed from input string and context directory
44
#[derive(Debug, Default)]
@@ -69,16 +69,20 @@ pub fn parse<'a>(input: Option<&str>, context: &'a str) -> BrowserslistHandlerCo
6969
}
7070

7171
/// Loads the browsers list based on the input and context.
72-
pub fn load_browserslist(input: Option<&str>, context: &str) -> Option<Vec<String>> {
72+
pub fn load_browserslist(input: Option<&str>, context: &str) -> Result<Vec<String>, Error> {
73+
dbg!(context);
7374
let BrowserslistHandlerConfig {
7475
config_path,
7576
env,
7677
env_or_query,
7778
query,
7879
context,
7980
} = parse(input, context);
80-
81-
let mut opts = Opts::default();
81+
// don't support unknown Node.js version, align with babel
82+
let mut opts = Opts {
83+
throw_on_missing: true,
84+
..Default::default()
85+
};
8286
if let Some(config) = config_path {
8387
opts.config = Some(config);
8488
} else {
@@ -122,7 +126,7 @@ pub fn load_browserslist(input: Option<&str>, context: &str) -> Option<Vec<Strin
122126
browserslist::execute(&opts)
123127
}
124128
} {
125-
Ok(browsers) => Some(browsers.into_iter().map(|d| d.to_string()).collect()),
126-
Err(_) => None,
129+
Ok(browsers) => Ok(browsers.into_iter().map(|d| d.to_string()).collect()),
130+
Err(err) => Err(err),
127131
}
128132
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module.exports = [[/Failed to load browserslist: unknown Node.js version: 32.8.0/]]
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"browserslist": [
3+
"node 32.8.0"
4+
]
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module.exports = {
2+
context: __dirname,
3+
entry: {
4+
main: './index.js'
5+
},
6+
target:['browserslist']
7+
}

0 commit comments

Comments
 (0)