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 ) }