57 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| var objectAssign = require('object-assign');
 | |
| var chalk = require('chalk');
 | |
| var lpadAlign = require('lpad-align');
 | |
| var Progress = require('progress');
 | |
| 
 | |
| module.exports = function (opts) {
 | |
| 	opts = opts || {};
 | |
| 	opts.stream = opts.stream || process.stderr;
 | |
| 	opts.indent = opts.indent || 2;
 | |
| 
 | |
| 	var words = [
 | |
| 		'fetch',
 | |
| 		'progress'
 | |
| 	];
 | |
| 
 | |
| 	var progress = chalk.cyan(lpadAlign('progress', words, opts.indent));
 | |
| 	var str = progress + ' : [:bar] :percent :etas';
 | |
| 
 | |
| 	var bar = new Progress(str, objectAssign({
 | |
| 		complete: '=',
 | |
| 		incomplete: ' ',
 | |
| 		width: 20,
 | |
| 		total: 0
 | |
| 	}, opts));
 | |
| 
 | |
| 	var streams = 0;
 | |
| 
 | |
| 	return function (res, url, cb) {
 | |
| 		if (!res.headers['content-length'] || !opts.stream.isTTY) {
 | |
| 			cb();
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		streams ++;
 | |
| 		bar.total += parseInt(res.headers['content-length'], 10);
 | |
| 
 | |
| 		var fetch = chalk.cyan(lpadAlign('fetch', words, opts.indent));
 | |
| 
 | |
| 		opts.stream.clearLine();
 | |
| 		opts.stream.cursorTo(0);
 | |
| 		opts.stream.write(fetch + ' : ' + url + '\n');
 | |
| 
 | |
| 		res.on('data', function (data) {
 | |
| 			bar.tick(data.length);
 | |
| 		});
 | |
| 
 | |
| 		res.on('end', function () {
 | |
| 			if (--streams === 0) {
 | |
| 				opts.stream.write('\n');
 | |
| 			}
 | |
| 
 | |
| 			cb();
 | |
| 		});
 | |
| 	};
 | |
| };
 |