Something went wrong. Try again.
source dump of claude code forked from oppi.li/claude-code
Something went wrong. Try again.
2.4 kB · 82 lines
TypeScript
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283import { execa } from 'execa'import { execSync_DEPRECATED } from './execSyncWrapper.js'
async function whichNodeAsync(command: string): Promise<string | null> { if (process.platform === 'win32') { // On Windows, use where.exe and return the first result const result = await execa(`where.exe ${command}`, { shell: true, stderr: 'ignore', reject: false, }) if (result.exitCode !== 0 || !result.stdout) { return null } // where.exe returns multiple paths separated by newlines, return the first return result.stdout.trim().split(/\r?\n/)[0] || null }
// On POSIX systems (macOS, Linux, WSL), use which // Cross-platform safe: Windows is handled above // eslint-disable-next-line custom-rules/no-cross-platform-process-issues const result = await execa(`which ${command}`, { shell: true, stderr: 'ignore', reject: false, }) if (result.exitCode !== 0 || !result.stdout) { return null } return result.stdout.trim()}
function whichNodeSync(command: string): string | null { if (process.platform === 'win32') { try { const result = execSync_DEPRECATED(`where.exe ${command}`, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], }) const output = result.toString().trim() return output.split(/\r?\n/)[0] || null } catch { return null } }
try { const result = execSync_DEPRECATED(`which ${command}`, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], }) return result.toString().trim() || null } catch { return null }}
const bunWhich = typeof Bun !== 'undefined' && typeof Bun.which === 'function' ? Bun.which : null
/** * Finds the full path to a command executable. * Uses Bun.which when running in Bun (fast, no process spawn), * otherwise spawns the platform-appropriate command. * * @param command - The command name to look up * @returns The full path to the command, or null if not found */export const which: (command: string) => Promise<string | null> = bunWhich ? async command => bunWhich(command) : whichNodeAsync
/** * Synchronous version of `which`. * * @param command - The command name to look up * @returns The full path to the command, or null if not found */export const whichSync: (command: string) => string | null = bunWhich ?? whichNodeSync