1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import process from 'node:process';
- import ansiEscapes from 'ansi-escapes';
- import cliCursor from 'cli-cursor';
- import wrapAnsi from 'wrap-ansi';
- import sliceAnsi from 'slice-ansi';
- import stripAnsi from 'strip-ansi';
-
- const defaultTerminalHeight = 24;
-
- const getWidth = stream => {
- const {columns} = stream;
-
- if (!columns) {
- return 80;
- }
-
- return columns;
- };
-
- const fitToTerminalHeight = (stream, text) => {
- const terminalHeight = stream.rows || defaultTerminalHeight;
- const lines = text.split('\n');
-
- const toRemove = lines.length - terminalHeight;
- if (toRemove <= 0) {
- return text;
- }
-
- return sliceAnsi(
- text,
- stripAnsi(lines.slice(0, toRemove).join('\n')).length + 1,
- );
- };
-
- export function createLogUpdate(stream, {showCursor = false} = {}) {
- let previousLineCount = 0;
- let previousWidth = getWidth(stream);
- let previousOutput = '';
-
- const render = (...arguments_) => {
- if (!showCursor) {
- cliCursor.hide();
- }
-
- let output = arguments_.join(' ') + '\n';
- output = fitToTerminalHeight(stream, output);
- const width = getWidth(stream);
- if (output === previousOutput && previousWidth === width) {
- return;
- }
-
- previousOutput = output;
- previousWidth = width;
- output = wrapAnsi(output, width, {
- trim: false,
- hard: true,
- wordWrap: false,
- });
- stream.write(ansiEscapes.eraseLines(previousLineCount) + output);
- previousLineCount = output.split('\n').length;
- };
-
- render.clear = () => {
- stream.write(ansiEscapes.eraseLines(previousLineCount));
- previousOutput = '';
- previousWidth = getWidth(stream);
- previousLineCount = 0;
- };
-
- render.done = () => {
- previousOutput = '';
- previousWidth = getWidth(stream);
- previousLineCount = 0;
-
- if (!showCursor) {
- cliCursor.show();
- }
- };
-
- return render;
- }
-
- const logUpdate = createLogUpdate(process.stdout);
- export default logUpdate;
-
- export const logUpdateStderr = createLogUpdate(process.stderr);
|