Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/node_binding/napi-binding.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1507,7 +1507,7 @@ export interface KnownAssetInfo {
isOverSizeLimit?: boolean
}

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

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

Expand Down
18 changes: 16 additions & 2 deletions crates/rspack/src/builder/browserslist_target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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:?}");

Expand All @@ -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() {
Expand Down
3 changes: 1 addition & 2 deletions crates/rspack/src/builder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
22 changes: 10 additions & 12 deletions crates/rspack/tests/snapshots/defaults__default_options.snap
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
6 changes: 5 additions & 1 deletion crates/rspack_binding_api/src/browserslist.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
#[napi]
pub fn load_browserslist(input: Option<String>, context: String) -> Option<Vec<String>> {
pub fn load_browserslist(
input: Option<String>,
context: String,
) -> Result<Vec<String>, 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)))
}
2 changes: 1 addition & 1 deletion crates/rspack_browserslist/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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;
16 changes: 10 additions & 6 deletions crates/rspack_browserslist/src/load_config.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use browserslist::Opts;
use browserslist::{Error, Opts};

/// Configuration parsed from input string and context directory
#[derive(Debug, Default)]
Expand Down Expand Up @@ -69,16 +69,20 @@ 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<Vec<String>> {
pub fn load_browserslist(input: Option<&str>, context: &str) -> Result<Vec<String>, Error> {
let BrowserslistHandlerConfig {
config_path,
env,
env_or_query,
query,
context,
} = parse(input, context);

let mut opts = Opts::default();
// don't support unknown Node.js version, align with babel
let mut opts = Opts {
throw_on_missing: true,
ignore_unknown_versions: false,
..Default::default()
};
if let Some(config) = config_path {
opts.config = Some(config);
} else {
Expand Down Expand Up @@ -122,7 +126,7 @@ pub fn load_browserslist(input: Option<&str>, context: &str) -> Option<Vec<Strin
browserslist::execute(&opts)
}
} {
Ok(browsers) => 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),
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module.exports = [[/Failed to load browserslist: unknown Node.js version: 32.8.0/]]

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// empty
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"browserslist": [
"node 32.8.0"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = {
context: __dirname,
entry: {
main: './index.js'
},
target:['browserslist']
}
Loading