use swc_common::{util::take::Take, Mark, SyntaxContext};
use swc_ecma_ast::{Expr, ExprStmt, Module, ModuleItem, Pass, Program, Stmt};
use swc_ecma_compat_es2015::{arrow, template_literal};
use swc_ecma_compat_es2022::optional_chaining_impl::{optional_chaining_impl, Config};
use swc_ecma_transformer::Options;
use swc_ecma_transforms_base::fixer::fixer;
use swc_ecma_transforms_base::hygiene::hygiene;
use swc_ecma_visit::visit_mut_pass;
pub fn transform_worklet(module: Module) -> Module {
let unresolved_mark = Mark::new();
let mut env_opts = Options::default();
env_opts.unresolved_ctxt = SyntaxContext::empty().apply_mark(unresolved_mark);
env_opts.env.es2015.shorthand = true;
env_opts.env.es2020.nullish_coalescing = true;
let mut pass = (
visit_mut_pass(optional_chaining_impl(Config::default(), unresolved_mark)),
arrow(unresolved_mark),
template_literal(swc_ecma_compat_es2015::template_literal::Config {
mutable_template: true,
..Default::default()
}),
env_opts.into_pass(),
hygiene(),
fixer(None),
);
let mut program = Program::Module(module);
pass.process(&mut program);
let Program::Module(mut module) = program else {
unreachable!("transform_worklet: pass swapped Program kind")
};
if let Some(ModuleItem::Stmt(Stmt::Expr(ExprStmt { expr, .. }))) = module.body.first_mut() {
if let Expr::Paren(paren) = expr.as_mut() {
*expr = paren.expr.take();
}
}
module
}