Skip to content

Commit

Permalink
Decoupling semantic_handler
Browse files Browse the repository at this point in the history
  • Loading branch information
ityuany committed Dec 24, 2024
1 parent 5ce3d92 commit 850142c
Showing 1 changed file with 64 additions and 114 deletions.
178 changes: 64 additions & 114 deletions crates/check_browser_supported/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@ mod macros;
mod operators;
mod statements;

use std::path::Path;
use std::{collections::HashMap, path::Path};

use browserslist::{resolve, Distrib, Opts};
pub use compat::{CompatBox, CompatHandler};

use anyhow::Result;
use log::debug;
use napi::Error;
use napi_derive::napi;

use oxc_allocator::Allocator;
Expand All @@ -23,17 +22,6 @@ use utils::{
glob_by_semantic, source_type_from_path, GlobErrorHandler, GlobSuccessHandler,
};

fn get_version_list<'a>(
browser_list: &'a Vec<Distrib>,
name: &str,
) -> Vec<&'a str> {
browser_list
.iter()
.filter(|x| x.name() == name)
.map(|x| x.version())
.collect()
}

macro_rules! enabled_debug {
($($body:tt)*) => {
if log::log_enabled!(log::Level::Debug) {
Expand All @@ -53,56 +41,65 @@ pub struct Target {
pub deno: Option<String>,
}

pub fn check_browser_supported_with_source_code(
target: Target,
source_code: String,
file_path: String,
) -> Result<Vec<CompatBox>> {
debug!("User-specified browser target: {:?}", target);

let chrome_queries = format!("chrome > {}", target.chrome);
struct BrowserVersions {
versions: HashMap<String, Vec<String>>,
}

let browser_list = resolve(&[chrome_queries], &Opts::default())
.map_err(|err| Error::new(napi::Status::GenericFailure, err.to_string()))?;
impl BrowserVersions {
fn new(target: Target) -> anyhow::Result<Self> {
let browser_list = Self::get_queries(target)?;
let mut versions = HashMap::new();
browser_list.into_iter().for_each(|distrib| {
versions
.entry(distrib.name().to_string())
.or_insert_with(Vec::new)
.push(distrib.version().to_string());
});
Ok(Self { versions })
}

let chrome_version_list = get_version_list(&browser_list, "chrome");
fn get_queries(target: Target) -> anyhow::Result<Vec<Distrib>> {
let mut queries = vec![format!("chrome > {}", target.chrome)];
if let Some(firefox) = &target.firefox {
queries.push(format!("firefox > {}", firefox));
}

enabled_debug! {
for version in chrome_version_list.iter() {
debug!("Resolved Chrome version: {}", version);
if let Some(safari) = &target.safari {
queries.push(format!("safari > {}", safari));
}
}

let firefox_version_list = get_version_list(&browser_list, "firefox");
enabled_debug! {
for version in firefox_version_list.iter() {
debug!("Resolved Firefox versions: {:?}", version);
if let Some(edge) = &target.edge {
queries.push(format!("edge > {}", edge));
}
}

let edge_version_list = get_version_list(&browser_list, "edge");
if let Some(node) = &target.node {
queries.push(format!("node > {}", node));
}

enabled_debug! {
for version in edge_version_list.iter() {
debug!("Resolved Edge versions: {:?}", version);
if let Some(deno) = &target.deno {
queries.push(format!("deno > {}", deno));
}
}

let safari_version_list = get_version_list(&browser_list, "safari");
let browser_list = resolve(&queries, &Opts::default())?;

enabled_debug! {
for version in safari_version_list.iter() {
debug!("Resolved Safari versions: {:?}", version);
}
Ok(browser_list)
}

let node_version_list = get_version_list(&browser_list, "node");

enabled_debug! {
for version in node_version_list.iter() {
debug!("Resolved Node versions: {:?}", version);
}
pub fn contains_version(&self, browser: &str, version: &str) -> bool {
self
.versions
.get(browser)
.map(|versions| versions.contains(&version.to_string()))
.unwrap_or(false) // 如果浏览器不在列表中,默认返回 true
}
}

pub fn check_browser_supported_with_source_code(
target: Target,
source_code: String,
file_path: String,
) -> Result<Vec<CompatBox>> {
let versions = BrowserVersions::new(target)?;

let compat_handlers: Vec<Box<dyn CompatHandler>> = vec![
classes::setup(),
Expand All @@ -116,19 +113,21 @@ pub fn check_browser_supported_with_source_code(
.filter(|item| {
let compat = item.get_compat();
let compat_support = &compat.support;
return browser_list.iter().any(|x| match x.name() {
"chrome" => chrome_version_list.contains(&compat_support.chrome.as_str()),
"firefox" => {
firefox_version_list.contains(&compat_support.firefox.as_str())
}
"edge" => edge_version_list.contains(&compat_support.edge.as_str()),
"safari" => safari_version_list.contains(&compat_support.safari.as_str()),
"node" => node_version_list.contains(&compat_support.node.as_str()),
_ => true,
});
versions.contains_version("chrome", &compat_support.chrome)
|| versions.contains_version("firefox", &compat_support.firefox)
|| versions.contains_version("safari", &compat_support.safari)
|| versions.contains_version("edge", &compat_support.edge)
|| versions.contains_version("node", &compat_support.node)
})
.collect();

for compat_handler in compat_handlers.iter() {
println!(
"Compat handler: {:?}",
compat_handler.get_compat().name.clone()
);
}

enabled_debug! {
for compat_handler in compat_handlers.iter() {
debug!(
Expand Down Expand Up @@ -190,51 +189,7 @@ pub fn check_browser_supported(
target: Target,
args: utils::GlobArgs,
) -> Result<Vec<CompatBox>> {
debug!("User-specified browser target: {:?}", target);

let chrome_queries = format!("chrome > {}", target.chrome);

let browser_list = resolve(&[chrome_queries], &Opts::default())
.map_err(|err| Error::new(napi::Status::GenericFailure, err.to_string()))?;

let chrome_version_list = get_version_list(&browser_list, "chrome");

enabled_debug! {
for version in chrome_version_list.iter() {
debug!("Resolved Chrome version: {}", version);
}
}

let firefox_version_list = get_version_list(&browser_list, "firefox");
enabled_debug! {
for version in firefox_version_list.iter() {
debug!("Resolved Firefox versions: {:?}", version);
}
}

let edge_version_list = get_version_list(&browser_list, "edge");

enabled_debug! {
for version in edge_version_list.iter() {
debug!("Resolved Edge versions: {:?}", version);
}
}

let safari_version_list = get_version_list(&browser_list, "safari");

enabled_debug! {
for version in safari_version_list.iter() {
debug!("Resolved Safari versions: {:?}", version);
}
}

let node_version_list = get_version_list(&browser_list, "node");

enabled_debug! {
for version in node_version_list.iter() {
debug!("Resolved Node versions: {:?}", version);
}
}
let versions = BrowserVersions::new(target)?;

let compat_handlers: Vec<Box<dyn CompatHandler>> = vec![
classes::setup(),
Expand All @@ -248,16 +203,11 @@ pub fn check_browser_supported(
.filter(|item| {
let compat = item.get_compat();
let compat_support = &compat.support;
return browser_list.iter().any(|x| match x.name() {
"chrome" => chrome_version_list.contains(&compat_support.chrome.as_str()),
"firefox" => {
firefox_version_list.contains(&compat_support.firefox.as_str())
}
"edge" => edge_version_list.contains(&compat_support.edge.as_str()),
"safari" => safari_version_list.contains(&compat_support.safari.as_str()),
"node" => node_version_list.contains(&compat_support.node.as_str()),
_ => true,
});
versions.contains_version("chrome", &compat_support.chrome)
|| versions.contains_version("firefox", &compat_support.firefox)
|| versions.contains_version("safari", &compat_support.safari)
|| versions.contains_version("edge", &compat_support.edge)
|| versions.contains_version("node", &compat_support.node)
})
.collect();

Expand Down

0 comments on commit 850142c

Please sign in to comment.