fetch-node-website
Version:
Fetch releases on nodejs.org
88 lines (58 loc) • 1.53 kB
JavaScript
import{finished}from"node:stream/promises";
import{MultiBar}from"cli-progress";
import colorsOption from"colors-option";
import figures from"figures";
const{green}=colorsOption();
export const addProgress=async({response,progress,path,signal})=>{
if(!shouldShowProgress(progress,signal)){
return
}
const bar=startBar(path);
response.on("downloadProgress",({percent})=>{
bar.update(percent)
});
try{
await finished(response,{writable:false,signal})
}catch{}
stopBar(bar)
};
const shouldShowProgress=(progress,signal)=>
progress&&multibar.terminal.isTTY()&&!signal?.aborted;
const startBar=(path)=>{
const bar=multibar.create();
const prefix=getPrefix(path);
bar.start(1,0,{prefix});
return bar
};
const MULTIBAR_OPTS={
format:` ${green(figures.nodejs)} {prefix} {bar}`,
barCompleteChar:"\u2588",
barIncompleteChar:"\u2591",
stopOnComplete:true,
clearOnComplete:true,
hideCursor:true
};
const multibar=new MultiBar(MULTIBAR_OPTS);
const getPrefix=(path)=>{
const version=VERSION_TEXT_REGEXP.exec(path);
if(version!==null){
return`${VERSION_TEXT} ${version[1].padEnd(VERSION_PADDING)}`
}
if(INDEX_TEXT_REGEXP.test(path)){
return INDEX_TEXT
}
return DEFAULT_TEXT
};
const VERSION_TEXT_REGEXP=/^\/?v([\d.]+)\//u;
const INDEX_TEXT_REGEXP=/^\/?index.(json|tab)$/u;
const VERSION_PADDING=7;
const VERSION_TEXT="Node.js";
const INDEX_TEXT="List of Node.js versions";
const DEFAULT_TEXT="Node.js";
const stopBar=(bar)=>{
bar.stop();
multibar.remove(bar);
if(multibar.bars.length===0){
multibar.stop()
}
};