UNPKG

node-version-use

Version:

Cross-platform solution for using multiple versions of node. Useful for compatibility testing

133 lines (132 loc) 5.52 kB
import exit from 'exit-compat'; import fs from 'fs'; import getopts from 'getopts-compat'; import path from 'path'; import { createSession, figures, formatArguments } from 'spawn-term'; import url from 'url'; import { isCommand, runCommand } from './commands/index.js'; import run from './index.js'; const __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url)); const ERROR_CODE = 13; function getVersion() { const packagePath = path.join(__dirname, '..', '..', 'package.json'); const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8')); return packageJson.version; } function printHelp(name) { const version = getVersion(); console.log(`${name} v${version}`); console.log(''); console.log(`Usage: ${name} [options] <version> <command> [args...]`); console.log(` ${name} <subcommand> [args...]`); console.log(''); console.log('Run commands with specific Node.js versions'); console.log(''); console.log('Subcommands:'); console.log(' default [version] Set or display the global default Node version'); console.log(' local [version] Set or display the local Node version (.nvmrc)'); console.log(' install <version> Download and install a Node version'); console.log(' uninstall <version> Remove an installed Node version'); console.log(' list List installed Node versions'); console.log(' which Show which Node version would be used'); console.log(' setup Install/reinstall binaries to ~/.nvu/bin'); console.log(' teardown Remove binaries from ~/.nvu/bin'); console.log(''); console.log('Options:'); console.log(' -v, --version Print version number'); console.log(' -h, --help Print this help message'); console.log(' -r, --range Range type (major, minor, patch) with filters (lts, even, odd)'); console.log(' Default: major,even'); console.log(' -d, --desc Sort versions in descending order'); console.log(' -e, --expanded Use expanded version format'); console.log(' -s, --streaming Enable streaming output'); console.log(' --silent Suppress logging'); console.log(''); console.log('Examples:'); console.log(` ${name} 22 node --version Run with Node 22`); console.log(` ${name} 22,20,18 npm test Run with multiple versions`); console.log(` ${name} engines node --version Use version from package.json`); console.log(` ${name} default 20 Set global default to Node 20`); console.log(` ${name} local 18 Create .nvmrc with Node 18`); } export default ((argv, name)=>{ const options = getopts(argv, { alias: { range: 'r', desc: 'd', expanded: 'e', streaming: 's', silent: 'si', version: 'v', help: 'h' }, default: { range: 'major,even', interactive: true }, boolean: [ 'silent', 'desc', 'expanded', 'streaming', 'interactive', 'version', 'help' ], stopEarly: true }); if (options.version) { console.log(getVersion()); exit(0); return; } if (options.help) { printHelp(name); exit(0); return; } // Check if first argument is a subcommand const args = options._; if (args.length > 0 && isCommand(args[0])) { runCommand(args[0], args.slice(1)); return; } // define.option('-r, --range [range]', 'range type of major, minor, or patch with filters of lts, even, odd for version string expressions', 'major,even'); // define.option('-s, --silent', 'suppress logging', false); options.sort = options.desc ? -1 : 1; if (args.length === 0) { console.log(`Missing version expression. Example usage: ${name} version command arg1 arg2`); exit(ERROR_CODE); return; } if (args.length === 1) { console.log(`Missing command. Example usage: ${name} version command arg1 arg2`); exit(ERROR_CODE); return; } options.stdio = 'inherit'; // pass through stdio run(args[0], args[1], args.slice(2), options, (err, results)=>{ const useErr = err; if (useErr && !useErr.results) { console.log(useErr.message); exit(ERROR_CODE); return; } if (useErr) results = useErr.results; const safeResults = results || []; const errors = safeResults.filter((result)=>!!result.error); if (!options.silent) { if (!createSession) { console.log('\n======================'); safeResults.forEach((res)=>{ console.log(`${res.error ? figures.cross : figures.tick} ${res.version}${res.error ? ` Error: ${res.error.message}` : ''}`); }); console.log('\n----------------------'); console.log(`${name} ${formatArguments(args).join(' ')}`); console.log(`${figures.tick} ${safeResults.length - errors.length} succeeded`); if (errors.length) console.log(`${figures.cross} ${errors.length} failed`); } } exit(err || errors.length ? ERROR_CODE : 0); }); });