idt/downloaders/
npm.rs

1use std::path::Path;
2use std::path::PathBuf;
3
4/// Downloads and installs Node.js packages using npm.
5///
6/// # Errors
7/// - Executing the `npm` command fails or returns a non-zero exit status.
8/// - A filesystem operation (create/read/write/remove) fails.
9pub fn run(dev_tools_dir: &Path, tool: &str, packages: &[&str]) -> color_eyre::Result<PathBuf> {
10    let dev_tools_repo_dir = dev_tools_dir.join(tool);
11
12    std::fs::create_dir_all(&dev_tools_repo_dir)?;
13
14    let mut cmd_args = vec!["install"];
15    if cfg!(debug_assertions) {
16        cmd_args.push("--silent");
17    }
18    let dev_tools_repo_dir_bind = dev_tools_repo_dir.to_string_lossy();
19    cmd_args.extend_from_slice(&["--prefix", &dev_tools_repo_dir_bind]);
20    cmd_args.extend_from_slice(packages);
21
22    ytil_cmd::silent_cmd("npm").args(cmd_args).status()?.exit_ok()?;
23
24    Ok(dev_tools_repo_dir.join("node_modules").join(".bin"))
25}