omena-bridge 0.2.0

CME-coupled bridge crate for Omena semantic graph inputs
Documentation
use oxc_ast::ast::{AssignmentTarget, BindingPattern, Expression, PropertyKey};

pub(super) fn skip_parens_and_ts<'a>(expression: &'a Expression<'a>) -> &'a Expression<'a> {
    match expression {
        Expression::ParenthesizedExpression(expression) => {
            skip_parens_and_ts(&expression.expression)
        }
        Expression::TSAsExpression(expression) => skip_parens_and_ts(&expression.expression),
        Expression::TSSatisfiesExpression(expression) => skip_parens_and_ts(&expression.expression),
        _ => expression,
    }
}

pub(super) fn property_key_text<'a>(key: &'a PropertyKey<'a>) -> Option<&'a str> {
    match key {
        PropertyKey::StaticIdentifier(identifier) => Some(identifier.name.as_str()),
        PropertyKey::StringLiteral(literal) => Some(literal.value.as_str()),
        _ => None,
    }
}

pub(super) fn binding_pattern_identifier_name<'a>(
    pattern: &'a BindingPattern<'a>,
) -> Option<&'a str> {
    match pattern {
        BindingPattern::BindingIdentifier(identifier) => Some(identifier.name.as_str()),
        _ => None,
    }
}

pub(super) fn expression_identifier_name<'a>(expression: &'a Expression<'a>) -> Option<&'a str> {
    match skip_parens_and_ts(expression) {
        Expression::Identifier(identifier) => Some(identifier.name.as_str()),
        _ => None,
    }
}

pub(super) fn is_module_exports_target(target: &AssignmentTarget<'_>) -> bool {
    let AssignmentTarget::StaticMemberExpression(member) = target else {
        return false;
    };
    expression_identifier_name(&member.object) == Some("module")
        && member.property.name.as_str() == "exports"
}