Skip to content

Commit 8cd9638

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

File tree

11 files changed

+59
-25
lines changed

11 files changed

+59
-25
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.

crates/rspack/tests/snapshots/defaults__default_options.snap

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,22 +97,22 @@ CompilerOptions {
9797
script_type: "",
9898
environment: Environment {
9999
const: Some(
100-
false,
100+
true,
101101
),
102102
arrow_function: Some(
103-
false,
103+
true,
104104
),
105105
node_prefix_for_core_modules: Some(
106-
false,
106+
true,
107107
),
108108
async_function: Some(
109-
false,
109+
true,
110110
),
111111
big_int_literal: Some(
112-
false,
112+
true,
113113
),
114114
destructuring: Some(
115-
false,
115+
true,
116116
),
117117
document: Some(
118118
true,
@@ -121,19 +121,17 @@ CompilerOptions {
121121
false,
122122
),
123123
for_of: Some(
124-
false,
125-
),
126-
global_this: Some(
127-
false,
124+
true,
128125
),
126+
global_this: None,
129127
module: Some(
130128
false,
131129
),
132130
optional_chaining: Some(
133-
false,
131+
true,
134132
),
135133
template_literal: Some(
136-
false,
134+
true,
137135
),
138136
dynamic_import_in_worker: Some(
139137
false,
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> {
7373
let BrowserslistHandlerConfig {
7474
config_path,
7575
env,
7676
env_or_query,
7777
query,
7878
context,
7979
} = parse(input, context);
80-
81-
let mut opts = Opts::default();
80+
// don't support unknown Node.js version, align with babel
81+
let mut opts = Opts {
82+
throw_on_missing: true,
83+
ignore_unknown_versions: false,
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+
}

0 commit comments

Comments
 (0)