UNPKG

get-node

Version:

Download a specific version of Node.js

83 lines (60 loc) 1.71 kB
import{createWriteStream}from"node:fs"; import{unlink}from"node:fs/promises"; import{delimiter,normalize}from"node:path"; import{env}from"node:process"; import{pipeline}from"node:stream/promises"; import{execa}from"execa"; import memoize from"memoize"; import pathKey from"path-key"; import semver from"semver"; import{fetchNodeUrl,promiseOrFetchError,writeNodeBinary}from"../fetch.js"; export const shouldUse7z=(version)=>versionHas7z(version)&&has7zBinary(); const versionHas7z=(version)=>semver.satisfies(version,P7Z_VERSION_RANGE); const P7Z_VERSION_RANGE="^4.5.0 || >=6.2.1"; const mHas7zBinary=async()=>{ const{failed}=await execa("7z",{ reject:false, stdio:"ignore", env:getEnv() }); return!failed }; const has7zBinary=memoize(mHas7zBinary); export const download7z=async({version,tmpFile,arch,fetchOpts})=>{ const filepath=get7zFilepath(version,arch); const tmp7zFile=`${tmpFile}.7z`; const{response,checksumError}=await fetchNodeUrl( version, `${filepath}.7z`, fetchOpts ); await pipeline(response,createWriteStream(tmp7zFile)); const subprocess=execa( "7z", ["x","-so",`-i!${filepath}/node.exe`,tmp7zFile], { stdin:"ignore", stdout:["pipe",writeNodeBinary(tmpFile)], stderr:"ignore", buffer:false, env:getEnv() } ); try{ await promiseOrFetchError(subprocess,response) }finally{ await cleanup(tmp7zFile,subprocess) } return checksumError }; const get7zFilepath=(version,arch)=>`node-v${version}-win-${arch}`; const getEnv=()=>{ const path=`${env[PATH_KEY]}${delimiter}${P7Z_PATH}`; return{Path:path,PATH:path} }; const P7Z_PATH=normalize("/Program Files/7-Zip"); const PATH_KEY=pathKey(); const cleanup=async(tmp7zFile,subprocess)=>{ await unlink(tmp7zFile); subprocess.kill() };