From 6284f84f58b60fdfd837efd48f3abcc0f9bfbf14 Mon Sep 17 00:00:00 2001 From: Boshen <1430279+Boshen@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:32:50 +0000 Subject: [PATCH] refactor(transformer): use `Browserslist::Version` (#7028) --- Cargo.lock | 8 +- Cargo.toml | 2 +- crates/oxc_transformer/src/env/data/babel.rs | 2 +- crates/oxc_transformer/src/env/mod.rs | 2 +- crates/oxc_transformer/src/env/targets/mod.rs | 13 +- .../src/env/targets/version.rs | 125 ------------------ 6 files changed, 13 insertions(+), 139 deletions(-) delete mode 100644 crates/oxc_transformer/src/env/targets/version.rs diff --git a/Cargo.lock b/Cargo.lock index a0da98b2c..4fe54bce3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1047,7 +1047,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -1405,9 +1405,9 @@ dependencies = [ [[package]] name = "oxc-browserslist" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b5ad390a7cf69d5f574ea41eada88a7c0947272647703fe1ec6ce23bfe1714" +checksum = "d240f6572a29895f324ad834a42a0c4bad0739269a08d0181ad7d6db7537e0d1" dependencies = [ "js-sys", "nom", @@ -3505,7 +3505,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6897c685d..51a27aa6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -167,7 +167,7 @@ nonmax = "0.5.5" num-bigint = "0.4.6" num-traits = "0.2.19" once_cell = "1.20.2" -oxc-browserslist = "1.0.3" +oxc-browserslist = "1.1.0" oxc_resolver = "2.0.0" petgraph = "0.6.5" phf = "0.11.2" diff --git a/crates/oxc_transformer/src/env/data/babel.rs b/crates/oxc_transformer/src/env/data/babel.rs index ce1719352..5facd3cb8 100644 --- a/crates/oxc_transformer/src/env/data/babel.rs +++ b/crates/oxc_transformer/src/env/data/babel.rs @@ -2,7 +2,7 @@ use std::sync::OnceLock; use rustc_hash::FxHashMap; -use crate::env::targets::{version::Version, Targets}; +use crate::env::{Targets, Version}; /// Reference: fn features() -> &'static FxHashMap { diff --git a/crates/oxc_transformer/src/env/mod.rs b/crates/oxc_transformer/src/env/mod.rs index 70808ff1e..143b108f5 100644 --- a/crates/oxc_transformer/src/env/mod.rs +++ b/crates/oxc_transformer/src/env/mod.rs @@ -4,4 +4,4 @@ mod targets; pub use data::can_enable_plugin; pub use options::EnvOptions; -pub use targets::Targets; +pub use targets::{Targets, Version}; diff --git a/crates/oxc_transformer/src/env/targets/mod.rs b/crates/oxc_transformer/src/env/targets/mod.rs index a7ba28cb1..4a52cb81f 100644 --- a/crates/oxc_transformer/src/env/targets/mod.rs +++ b/crates/oxc_transformer/src/env/targets/mod.rs @@ -5,17 +5,16 @@ //! //! This file is copied from -use std::{ops::Deref, str::FromStr}; +use std::ops::Deref; use oxc_diagnostics::Error; use rustc_hash::FxHashMap; use serde::Deserialize; pub mod query; -pub mod version; +pub use browserslist::Version; pub use query::Query; -pub use version::Version; /// A map of browser names to data for feature support in browser. /// @@ -150,13 +149,13 @@ impl TryFrom for Targets { let BabelTargetsValue::String(v) = v else { return Err(Error::msg(format!("{v:?} is not a string for {k}."))); }; - match Version::from_str(&v) { + match Version::parse(&v) { Ok(v) => { new_map.insert(k, v); } - Err(()) => { + Err(err) => { return Err(oxc_diagnostics::Error::msg(format!( - "Failed to parse `{v}` for `{k}`" + "Failed to parse `{v}` for `{k}`\n{err:?}" ))) } } @@ -169,7 +168,7 @@ impl TryFrom for Targets { #[cfg(test)] mod tests { - use crate::env::{targets::version::Version, Targets}; + use crate::env::{targets::Version, Targets}; #[test] fn should_enable_android_falls_back_to_chrome() { diff --git a/crates/oxc_transformer/src/env/targets/version.rs b/crates/oxc_transformer/src/env/targets/version.rs deleted file mode 100644 index 9ce832368..000000000 --- a/crates/oxc_transformer/src/env/targets/version.rs +++ /dev/null @@ -1,125 +0,0 @@ -//! Module for browser versions -//! -//! This file is copied from - -use std::{cmp, cmp::Ordering, fmt, str::FromStr}; - -use serde::{de, de::Visitor, Deserialize, Deserializer, Serialize}; - -/// A version of a browser. -/// -/// This is similar to semver, but this assumes a production build. (No tag like -/// `alpha`) -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)] -pub struct Version { - /// `a` in `a.b.c` - pub major: u32, - /// `b` in `a.b.c` - pub minor: u32, - /// `c` in `a.b.c` - pub patch: u32, -} - -#[allow(clippy::cast_possible_truncation)] -impl FromStr for Version { - type Err = (); - - fn from_str(v: &str) -> Result { - let mut parts = v.split('.'); - // safari tp - let major = parts.next().unwrap().parse::().map_err(|_| ())?; - let minor = parts.next().unwrap_or("0").parse::().unwrap(); - let patch = parts.next().unwrap_or("0").parse::().unwrap(); - Ok(Version { major, minor, patch }) - } -} - -impl cmp::PartialOrd for Version { - fn partial_cmp(&self, other: &Version) -> Option { - Some(self.cmp(other)) - } -} - -impl cmp::Ord for Version { - fn cmp(&self, other: &Version) -> Ordering { - match self.major.cmp(&other.major) { - Ordering::Equal => {} - r => return r, - } - - match self.minor.cmp(&other.minor) { - Ordering::Equal => {} - r => return r, - } - - match self.patch.cmp(&other.patch) { - Ordering::Equal => {} - r => return r, - } - - Ordering::Equal - } -} - -struct SerdeVisitor; - -#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] -impl<'de> Visitor<'de> for SerdeVisitor { - type Value = Version; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a browser version") - } - - fn visit_i64(self, v: i64) -> Result - where - E: de::Error, - { - Ok(Version { major: v as _, minor: 0, patch: 0 }) - } - - fn visit_u64(self, v: u64) -> Result - where - E: de::Error, - { - Ok(Version { major: v as _, minor: 0, patch: 0 }) - } - - fn visit_f64(self, v: f64) -> Result - where - E: de::Error, - { - Ok(Version { major: v.floor() as _, minor: v.fract() as _, patch: 0 }) - } - - fn visit_str(self, v: &str) -> Result - where - E: de::Error, - { - v.parse().map_err(|()| de::Error::invalid_type(de::Unexpected::Str(v), &self)) - } - - #[inline] - fn visit_borrowed_str(self, v: &'de str) -> Result - where - E: de::Error, - { - self.visit_str(v) - } - - fn visit_string(self, v: String) -> Result - where - E: de::Error, - { - self.visit_str(&v) - } -} - -impl<'de> Deserialize<'de> for Version { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - deserializer.deserialize_any(SerdeVisitor) - } -}