63 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| const ansiEscapes = require('ansi-escapes');
 | |
| const cliCursor = require('cli-cursor');
 | |
| const wrapAnsi = require('wrap-ansi');
 | |
| 
 | |
| const getWidth = stream => {
 | |
| 	const columns = stream.columns;
 | |
| 
 | |
| 	if (!columns) {
 | |
| 		return 80;
 | |
| 	}
 | |
| 
 | |
| 	// Windows appears to wrap a character early
 | |
| 	// I hate Windows so much
 | |
| 	if (process.platform === 'win32') {
 | |
| 		return columns - 1;
 | |
| 	}
 | |
| 
 | |
| 	return columns;
 | |
| };
 | |
| 
 | |
| const main = (stream, options) => {
 | |
| 	options = Object.assign({
 | |
| 		showCursor: false
 | |
| 	}, options);
 | |
| 
 | |
| 	let prevLineCount = 0;
 | |
| 
 | |
| 	const render = function () {
 | |
| 		if (!options.showCursor) {
 | |
| 			cliCursor.hide();
 | |
| 		}
 | |
| 
 | |
| 		let out = [].join.call(arguments, ' ') + '\n';
 | |
| 		out = wrapAnsi(out, getWidth(stream), {
 | |
| 			trim: false,
 | |
| 			hard: true,
 | |
| 			wordWrap: false
 | |
| 		});
 | |
| 		stream.write(ansiEscapes.eraseLines(prevLineCount) + out);
 | |
| 		prevLineCount = out.split('\n').length;
 | |
| 	};
 | |
| 
 | |
| 	render.clear = () => {
 | |
| 		stream.write(ansiEscapes.eraseLines(prevLineCount));
 | |
| 		prevLineCount = 0;
 | |
| 	};
 | |
| 
 | |
| 	render.done = () => {
 | |
| 		prevLineCount = 0;
 | |
| 
 | |
| 		if (!options.showCursor) {
 | |
| 			cliCursor.show();
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	return render;
 | |
| };
 | |
| 
 | |
| module.exports = main(process.stdout);
 | |
| module.exports.stderr = main(process.stderr);
 | |
| module.exports.create = main;
 |