xbp_cli/utils/
node_toolchain.rs1use 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}