Skip to main content

stylex_transform/shared/utils/ast/
helpers.rs

1use stylex_enums::top_level_expression::TopLevelExpressionKind;
2use stylex_structures::top_level_expression::TopLevelExpression;
3use swc_core::ecma::ast::{ExportSpecifier, Expr, ModuleExportName, PropName, PropOrSpread};
4
5use crate::shared::structures::state_manager::StateManager;
6
7pub(crate) fn is_variable_named_exported(
8  TopLevelExpression(kind, _, variable_name): &TopLevelExpression,
9  state: &StateManager,
10) -> bool {
11  if matches!(kind, TopLevelExpressionKind::NamedExport) {
12    return true;
13  }
14
15  let Some(var_name) = variable_name else {
16    return false;
17  };
18
19  for named_export in &state.named_exports {
20    for specifier in &named_export.specifiers {
21      if let ExportSpecifier::Named(named_specifier) = specifier
22        && matches!(&named_specifier.orig, ModuleExportName::Ident(ident) if ident.sym == *var_name)
23      {
24        return named_export.src.is_none() && named_specifier.exported.is_none();
25      }
26    }
27  }
28  false
29}
30
31pub fn get_property_by_key<'a>(expr: &'a Expr, key: &str) -> Option<&'a Expr> {
32  match expr {
33    Expr::Object(obj) => {
34      for prop in &obj.props {
35        if let PropOrSpread::Prop(prop) = prop
36          && let Some(kv) = prop.as_key_value()
37        {
38          let k = match &kv.key {
39            PropName::Ident(id) => Some(id.sym.as_ref()),
40            PropName::Str(s) => s.value.as_str(),
41            _ => None,
42          };
43          if k == Some(key) {
44            return Some(&kv.value);
45          }
46        }
47      }
48      None
49    },
50    _ => None,
51  }
52}