UNPKG

get-node

Version:

Download a specific version of Node.js

96 lines (68 loc) 1.99 kB
import{basename}from"node:path"; import{version as processVersion}from"node:process"; import nodeVersionAlias from"node-version-alias"; import preferredNodeVersion,{ NODE_VERSION_FILES}from "preferred-node-version"; import semver from"semver"; export const DEFAULT_VERSION_RANGE="latest"; export const validateVersionRange=(versionRange)=>{ if(typeof versionRange!=="string"){ throw new TypeError(`Node version range must be a string: ${versionRange}`) } if(!isVersionRange(versionRange)){ throw new TypeError(`Not a valid Node version range: ${versionRange}`) } }; const isVersionRange=(versionRange)=> ALIASES.has(versionRange)|| isVersionFile(versionRange)|| semver.validRange(versionRange)!==null; const ALIASES=new Set(["latest","lts","global","local"]); export const getVersion=async({ versionRange, preferredNodeOpts, nodeVersionAliasOpts })=>{ const version=await resolveVersion({ versionRange, preferredNodeOpts, nodeVersionAliasOpts }); checkVersion(version); return version }; const resolveVersion=({ versionRange, preferredNodeOpts, nodeVersionAliasOpts })=>{ if(versionRange==="global"){ return getPreferredVersion({...preferredNodeOpts,global:true}) } if(versionRange==="local"){ return getPreferredVersion(preferredNodeOpts) } if(isVersionFile(versionRange)){ return getPreferredVersion({...preferredNodeOpts,files:[versionRange]}) } return nodeVersionAlias(versionRange,nodeVersionAliasOpts) }; const isVersionFile=(versionRange)=> NODE_VERSION_FILES_SET.has(basename(versionRange)); const NODE_VERSION_FILES_SET=new Set(NODE_VERSION_FILES); const getPreferredVersion=async(preferredNodeOpts)=>{ const{version}=await preferredNodeVersion(preferredNodeOpts); if(version===undefined){ return processVersion.replace("v","") } return version }; const checkVersion=(version)=>{ if(semver.lt(version,MINIMUM_VERSION)){ throw new Error( `Unsupported Node.js version: ${version}. Must be >= ${MINIMUM_VERSION}.` ) } }; const MINIMUM_VERSION="0.8.6";