stylex_transform/shared/utils/ast/
helpers.rs1use 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}