rspack_plugin_javascript 0.100.7

rspack javascript plugin
Documentation
use rspack_core::ImportAttributes;
use swc_experimental_ecma_ast::{Bool, Expr, Lit, ObjectLit, Regex, Str};

pub fn get_value_by_obj_prop<'a>(obj: &'a ObjectLit<'a>, field: &'a str) -> Option<&'a Expr<'a>> {
  obj.props.iter().find_map(|p| {
    let prop = p.as_prop()?;
    let kv = prop.as_key_value()?;
    let matched = kv.key.as_ident().is_some_and(|key| key.sym == field)
      || kv
        .key
        .as_str()
        .is_some_and(|key| key.value.as_str() == Some(field));
    matched.then_some(&kv.value)
  })
}

pub fn get_literal_str_by_obj_prop<'a>(
  obj: &'a ObjectLit<'a>,
  field: &'a str,
) -> Option<&'a Str<'a>> {
  let lit = get_value_by_obj_prop(obj, field).and_then(|e| e.as_lit())?;
  match lit {
    Lit::Str(str) => Some(str),
    _ => None,
  }
}

pub fn get_bool_by_obj_prop<'a>(obj: &'a ObjectLit<'a>, field: &'a str) -> Option<&'a Bool> {
  let lit = get_value_by_obj_prop(obj, field).and_then(|e| e.as_lit())?;
  match lit {
    Lit::Bool(bool) => Some(bool),
    _ => None,
  }
}

pub fn get_regex_by_obj_prop<'a>(obj: &'a ObjectLit<'a>, field: &'a str) -> Option<&'a Regex<'a>> {
  let lit = get_value_by_obj_prop(obj, field).and_then(|e| e.as_lit())?;
  match lit {
    Lit::Regex(regexp) => Some(regexp),
    _ => None,
  }
}

pub fn get_attributes(obj: &ObjectLit<'_>) -> ImportAttributes {
  obj
    .props
    .iter()
    .filter_map(|p| {
      p.as_prop().and_then(|p| p.as_key_value()).and_then(|kv| {
        kv.key
          .as_ident()
          .map(|k| k.sym.as_str())
          .or_else(|| kv.key.as_str().and_then(|k| k.value.as_str()))
          .map(|s| s.to_string())
          .zip(kv.value.as_lit().and_then(|lit| match lit {
            Lit::Str(s) => Some(s.value.to_string_lossy().to_string()),
            _ => None,
          }))
      })
    })
    .collect()
}