use oxc_ast::ast::Program;
use crate::config::{
ImportedCall, command_in_call_dir, command_line_call, file_call_options, imported_calls_in, literal_command,
};
use crate::model::Import;
const MODULES: &[&str] = &["child_process", "node:child_process"];
const FILE_NAME: &str = "file.js";
pub(crate) fn child_process_commands(program: &Program<'_>, imports: &[Import]) -> Vec<String> {
if !imports
.iter()
.any(|import| MODULES.contains(&import.specifier.as_str()))
{
return Vec::new();
}
let mut commands: Vec<String> = Vec::new();
for command in imported_calls_in(program, FILE_NAME, MODULES, &[], true)
.iter()
.filter_map(command)
{
if !commands.contains(&command) {
commands.push(command);
}
}
commands
}
fn command(call: &ImportedCall) -> Option<String> {
if call.template.is_some() {
return None;
}
let arguments = &call.arguments;
match call.export.as_str() {
"exec" | "execSync" => command_line_call(arguments),
"spawn" | "spawnSync" | "execFile" | "execFileSync" => {
literal_command(arguments).map(|command| command_in_call_dir(command, file_call_options(arguments)))
}
_ => None,
}
}