Skip to main content

xbp_cli/utils/
node_toolchain.rs

1use std::path::{Path, PathBuf};
2
3pub fn find_node_toolchain_root(start: &Path) -> Option<PathBuf> {
4    for candidate in start.ancestors() {
5        if candidate.join(".nvmrc").is_file()
6            && candidate.join("scripts/run-with-nvm.mjs").is_file()
7        {
8            return Some(candidate.to_path_buf());
9        }
10    }
11
12    None
13}
14
15pub fn node_toolchain_wrapper_path(start: &Path) -> Option<PathBuf> {
16    find_node_toolchain_root(start).map(|root| root.join("scripts/run-with-nvm.mjs"))
17}
18
19pub fn is_node_toolchain_command(command: &str) -> bool {
20    let normalized = command.trim();
21    if normalized.is_empty() {
22        return false;
23    }
24
25    if normalized.contains("cargo ") || normalized == "cargo" {
26        return false;
27    }
28
29    normalized.contains("pnpm")
30        || normalized.contains("node ")
31        || normalized == "node"
32        || normalized.contains("npm ")
33        || normalized == "npm"
34        || normalized.contains("npx ")
35        || normalized == "npx"
36        || normalized.contains("wrangler")
37        || normalized.contains("vite")
38        || normalized.contains("tsc")
39        || normalized.contains("vitest")
40        || normalized.contains("biome")
41        || normalized.contains("next")
42        || normalized.contains("turbo")
43        || normalized.contains("bun ")
44        || normalized == "bun"
45}