import { exec as execCb } from "node:child_process"; import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; import { env } from "node:process"; import { promisify } from "node:util"; const exec = promisify(execCb); /** * @param {string} progName * @returns {Promise} */ async function where(progName) { // Reject paths if (/[\\]/.test(progName)) return false; try { await exec(`where "${progName}"`); } catch { return false; } return true; } /** * @param {string} progName * @returns {Promise} */ export async function which(progName) { return os.type() === "Windows_NT" ? where(progName) : Promise.any( Array.from(new Set(env.PATH?.split(":"))).map((dir) => fs.access(path.join(dir, progName), fs.constants.X_OK) ) ).then( () => true, () => false ); }