nve
Version:
Run any command on specific Node.js versions
72 lines (45 loc) • 1.53 kB
JavaScript
import{basename}from"node:path";
import{argv}from"node:process";
import{NODE_VERSION_FILES}from"preferred-node-version";
import semver from"semver";
import{parseOpts}from"./options.js";
export const parseInput=(yargs)=>{
const input=argv.slice(2);
const{opts,versionArg,command,args}=parseArgs(input);
const{opts:optsA,continueOpt,parallel}=parseOpts(opts,yargs);
if(versionArg===undefined){
throw new Error("Missing version.")
}
const versionRanges=versionArg.split(VERSION_DELIMITER);
return{versionRanges,command,args,opts:optsA,continueOpt,parallel}
};
const parseArgs=(input)=>{
const versionStart=getVersionStart(input);
const opts=input.slice(0,versionStart);
const[versionArg,command,...args]=input.slice(versionStart);
return{opts,versionArg,command,args}
};
const getVersionStart=(input)=>{
const versionStart=input.findIndex(isVersionArg);
if(versionStart!==-1){
return versionStart
}
if(isGenericFlags(input)){
return input.length
}
return 0
};
const isGenericFlags=(input)=>input.every(isGenericFlag);
const isGenericFlag=(arg)=>GENERIC_FLAGS.has(arg);
const GENERIC_FLAGS=new Set(["-h","--help","-v","--version"]);
const isVersionArg=(arg)=>arg.split(VERSION_DELIMITER).every(isVersion);
const isVersion=(value)=>
ALIASES.has(value)||
isVersionFile(value)||
semver.validRange(value)!==null;
const isVersionFile=(value)=>{
const filename=basename(value);
return NODE_VERSION_FILES.includes(filename)
};
const ALIASES=new Set(["latest","lts","global","local"]);
const VERSION_DELIMITER=",";