use oxc_ast::ast::{Argument, AssignmentTarget, CallExpression, Expression};
use oxc_syntax::precedence::Precedence;
use crate::{
Codegen, Context,
binary_expr_visitor::BinaryishOperator,
r#gen::{Gen, GenExpr},
};
pub fn try_print_require_call(p: &mut Codegen<'_>, call: &CallExpression<'_>) -> bool {
if !p.options.minify {
return false;
}
let Some(str_lit) = call.common_js_require() else {
return false;
};
p.print_ascii_byte(b'(');
p.print_string_literal(str_lit, false);
p.add_source_mapping_end(call.span);
p.print_ascii_byte(b')');
true
}
pub fn try_print_define_property_call(
p: &mut Codegen<'_>,
call: &CallExpression<'_>,
ctx: Context,
) -> bool {
if !p.options.minify {
return false;
}
let Some(Argument::StringLiteral(name)) = call.arguments.get(1) else {
return false;
};
if !call.callee.is_specific_member_access("Object", "defineProperty")
&& !call.callee.is_specific_member_access("Reflect", "defineProperty")
{
return false;
}
p.print_ascii_byte(b'(');
for (i, arg) in call.arguments.iter().enumerate() {
if i != 0 {
p.print_comma();
p.print_soft_space();
}
if i == 1 {
p.print_string_literal(name, false);
} else {
arg.print(p, ctx);
}
}
p.add_source_mapping_end(call.span);
p.print_ascii_byte(b')');
true
}
pub fn try_print_exports_computed_target(
p: &mut Codegen<'_>,
target: &AssignmentTarget<'_>,
ctx: Context,
) -> bool {
if !p.options.minify {
return false;
}
let AssignmentTarget::ComputedMemberExpression(member) = target else {
return false;
};
let Expression::StringLiteral(key) = &member.expression else {
return false;
};
if !member.object.is_specific_id("exports")
&& !member.object.is_specific_member_access("module", "exports")
{
return false;
}
member.object.print_expr(p, Precedence::Postfix, ctx.intersection(Context::FORBID_CALL));
if member.optional {
p.print_str("?.");
}
p.print_ascii_byte(b'[');
p.print_string_literal(key, false);
p.print_ascii_byte(b']');
true
}
#[inline]
pub fn try_print_equality_string(
p: &mut Codegen,
operator: BinaryishOperator,
operand: &Expression,
) -> bool {
if !p.options.minify {
return false;
}
let BinaryishOperator::Binary(op) = operator else {
return false;
};
if !op.is_equality() {
return false;
}
let Expression::StringLiteral(str_lit) = operand else {
return false;
};
if !matches!(str_lit.value.as_str(), "default" | "__esModule") {
return false;
}
p.print_string_literal(str_lit, false);
true
}