farmfe_plugin_resolve 2.0.1

Resolve plugin of farm.
use farmfe_core::{common::PackageJsonInfo, farm_profile_function, serde_json::Value};
use farmfe_utils::relative;

use crate::resolver::utils::get_field_value_from_package_json_info;

pub enum BrowserMapResult {
  Str(String),
  External,
}

#[derive(Clone)]
pub enum BrowserMapType {
  Source(String),
  ResolvedPath(String),
}

impl ToString for BrowserMapType {
  fn to_string(&self) -> String {
    match self {
      BrowserMapType::Source(s) => s.clone(),
      BrowserMapType::ResolvedPath(s) => s.clone(),
    }
  }
}

pub fn try_browser_map(
  package_json_info: &PackageJsonInfo,
  browser_map_type: BrowserMapType,
) -> Option<BrowserMapResult> {
  farm_profile_function!("try_browser_replace".to_string());

  let sub_path = match browser_map_type {
    BrowserMapType::Source(source) => source,
    BrowserMapType::ResolvedPath(resolved_path) => {
      format!("./{}", relative(package_json_info.dir(), &resolved_path))
    }
  };

  let browser_field = get_field_value_from_package_json_info(package_json_info, "browser");
  if let Some(Value::Object(obj)) = browser_field {
    for (key, value) in obj {
      if key == sub_path || key == format!("{sub_path}.js") || key == format!("{sub_path}/index.js")
      {
        match value {
          Value::String(str) => return Some(BrowserMapResult::Str(str.clone())),
          Value::Bool(false) => return Some(BrowserMapResult::External),
          _ => {}
        }
      }
    }
  }

  None
}