UNPKG

fetch-node-website

Version:
88 lines (58 loc) 1.53 kB
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() } };