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.
		
		
		
		
			
				
					48 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					48 lines
				
				1.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const path = require('path');
							 | 
						||
| 
								 | 
							
								const which = require('which');
							 | 
						||
| 
								 | 
							
								const pathKey = require('path-key')();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function resolveCommandAttempt(parsed, withoutPathExt) {
							 | 
						||
| 
								 | 
							
								    const cwd = process.cwd();
							 | 
						||
| 
								 | 
							
								    const hasCustomCwd = parsed.options.cwd != null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 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 (hasCustomCwd) {
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            process.chdir(parsed.options.cwd);
							 | 
						||
| 
								 | 
							
								        } catch (err) {
							 | 
						||
| 
								 | 
							
								            /* Empty */
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let resolved;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								        resolved = which.sync(parsed.command, {
							 | 
						||
| 
								 | 
							
								            path: (parsed.options.env || process.env)[pathKey],
							 | 
						||
| 
								 | 
							
								            pathExt: withoutPathExt ? path.delimiter : undefined,
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								        /* Empty */
							 | 
						||
| 
								 | 
							
								    } finally {
							 | 
						||
| 
								 | 
							
								        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;
							 |