use super::super::{Printer, is_string_literal};
use crate::ast;
pub(super) fn is_module_path_no_break(
call: &ast::CallExpression<'_>,
printer: &Printer<'_>,
) -> bool {
if call.arguments.len() != 1 || !is_string_literal(call.arguments[0]) {
return false;
}
if let ast::ExpressionKind::MemberExpression(member) = &call.callee.kind
&& !member.computed
&& !member.optional
&& let ast::ExpressionKind::Identifier(resolve_id) = &member.property.kind
&& printer.with_ident_name(resolve_id, |s| s == "resolve")
&& let ast::ExpressionKind::Identifier(require_id) = &member.object.kind
&& printer.with_ident_name(require_id, |s| s == "require")
{
return true;
}
false
}
pub(super) fn get_module_path_chain_break<'a>(
call: &'a ast::CallExpression<'a>,
printer: &Printer<'_>,
) -> Option<(&'a ast::Expression<'a>, &'a ast::Identifier<'a>)> {
if call.arguments.len() != 1 || !is_string_literal(call.arguments[0]) {
return None;
}
let ast::ExpressionKind::MemberExpression(member) = &call.callee.kind else {
return None;
};
if member.computed || member.optional {
return None;
}
let ast::ExpressionKind::Identifier(method_name) = &member.property.kind else {
return None;
};
let (is_paths, is_resolve) =
printer.with_ident_name(method_name, |m| (m == "paths", m == "resolve"));
if is_paths {
if let ast::ExpressionKind::MemberExpression(obj_member) = &member.object.kind
&& !obj_member.computed
&& !obj_member.optional
&& let ast::ExpressionKind::Identifier(resolve_id) = &obj_member.property.kind
&& printer.with_ident_name(resolve_id, |s| s == "resolve")
&& let ast::ExpressionKind::Identifier(require_id) = &obj_member.object.kind
&& printer.with_ident_name(require_id, |s| s == "require")
{
return Some((member.object, method_name));
}
}
if is_resolve && let ast::ExpressionKind::MetaProperty(meta) = &member.object.kind {
let is_import_meta = printer.with_ident_name(&meta.meta, |m| m == "import")
&& printer.with_ident_name(&meta.property, |p| p == "meta");
if is_import_meta {
return Some((member.object, method_name));
}
}
None
}