You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.2 KiB
62 lines
1.2 KiB
'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;
|
|
|