nvexeca
Version:
nvm + execa = nvexeca
89 lines (56 loc) • 1.31 kB
JavaScript
import{execa}from"execa";
import getNode from"get-node";
import{npmRunPathEnv}from"npm-run-path";
import{copyBinaries}from"./copy/main.js";
import{getOpts}from"./options.js";
const nvexeca=async(versionRange,command,args,opts)=>{
const{
args:argsA,
dry,
getNodeOpts,
execaOptions
}=getOpts({versionRange,command,args,opts});
const[{path:nodePath,version},execaOptionsA]=await Promise.all([
getNode(versionRange,getNodeOpts),
copyBinaries(execaOptions)]
);
const commandA=getCommand(nodePath,command);
const execaOptionsB=getExecaOptions(nodePath,execaOptionsA);
const childProcess=startProcess({
command:commandA,
args:argsA,
execaOptions:execaOptionsB,
dry
});
return{
childProcess,
version,
versionRange,
command:commandA,
args:argsA,
execaOptions:execaOptionsB
}
};
export default nvexeca;
const getCommand=(nodePath,command)=>
command==="node"?nodePath:command;
const getExecaOptions=(nodePath,execaOptions)=>({
...execaOptions,
...getEnv(nodePath,execaOptions),
nodePath,
preferLocal:true
});
const getEnv=(nodePath,{extendEnv=true,env})=>({
extendEnv:extendEnv||env===undefined,
env:npmRunPathEnv({
env:env??{},
execPath:nodePath,
preferLocal:false
})
});
const startProcess=({command,args,execaOptions,dry})=>{
if(dry){
return
}
return execa(command,args,execaOptions)
};