You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
'use strict'; |
|
|
|
const path = require('path'); |
|
const which = require('which'); |
|
const getPathKey = require('path-key'); |
|
|
|
function resolveCommandAttempt(parsed, withoutPathExt) { |
|
const env = parsed.options.env || process.env; |
|
const cwd = process.cwd(); |
|
const hasCustomCwd = parsed.options.cwd != null; |
|
// Worker threads do not have process.chdir() |
|
const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled; |
|
|
|
// If a custom `cwd` was specified, we need to change the process cwd |
|
// because `which` will do stat calls but does not support a custom cwd |
|
if (shouldSwitchCwd) { |
|
try { |
|
process.chdir(parsed.options.cwd); |
|
} catch (err) { |
|
/* Empty */ |
|
} |
|
} |
|
|
|
let resolved; |
|
|
|
try { |
|
resolved = which.sync(parsed.command, { |
|
path: env[getPathKey({ env })], |
|
pathExt: withoutPathExt ? path.delimiter : undefined, |
|
}); |
|
} catch (e) { |
|
/* Empty */ |
|
} finally { |
|
if (shouldSwitchCwd) { |
|
process.chdir(cwd); |
|
} |
|
} |
|
|
|
// If we successfully resolved, ensure that an absolute path is returned |
|
// Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it |
|
if (resolved) { |
|
resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); |
|
} |
|
|
|
return resolved; |
|
} |
|
|
|
function resolveCommand(parsed) { |
|
return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); |
|
} |
|
|
|
module.exports = resolveCommand;
|
|
|