UNPKG

@plugjs/plug

Version:
70 lines 2.54 kB
/* coverage ignore file */ import { runningTasks } from "../async.js"; import { $cyn, $gry, $plur, $t } from "./colors.js"; import { logOptions } from "./options.js"; /* ========================================================================== */ /* Clear the current line and set column to zero */ export const zapSpinner = '\u001b[0G\u001b[2K'; /* Disable word wrap (when running lotsa tasks) */ export const disableWrap = '\u001b[?7l'; /* Enable word wrap (after printing lotsa tasks) */ export const enableWrap = '\u001b[?7h'; /* ========================================================================== */ /* Initial value of log colors, and subscribe to changes */ let _output = logOptions.output; let _colors = logOptions.colors; let _format = logOptions.format; let _spinner = logOptions.spinner; let _taskLength = logOptions.taskLength; logOptions.on('changed', ({ output, colors, format, spinner, taskLength }) => { _output = output; _colors = colors; _format = format; _spinner = spinner; _taskLength = taskLength; setupSpinner(); }); /* ========================================================================== */ /* Spinner characters */ const _spins = [ $cyn('\u2809'), // ⠉ - 14 $cyn('\u2819'), // ⠙ - 145 $cyn('\u2818'), // ⠘ - 45 $cyn('\u2838'), // ⠸ - 456 $cyn('\u2830'), // ⠰ - 56 $cyn('\u2834'), // ⠴ - 356 $cyn('\u2824'), // ⠤ - 36 $cyn('\u2826'), // ⠦ - 236 $cyn('\u2806'), // ⠆ - 23 $cyn('\u2807'), // ⠇ - 123 $cyn('\u2803'), // ⠃ - 12 $cyn('\u280b'), // ⠋ - 124 ]; /* The index in our `_spins` */ let _nextSpin = 0; /* The interval running the spinner */ let _interval; /* Spin the spinner! */ function spin() { if (!_colors) return clearInterval(_interval); if (!_spinner) return clearInterval(_interval); const tasks = runningTasks(); if (!tasks.length) return; const pad = ''.padStart(_taskLength, ' '); const names = tasks.map((task) => $t(task)).join($gry(', ')); const task = $plur(tasks.length, 'task', 'tasks'); _nextSpin = (++_nextSpin) % _spins.length; _output.write(`${zapSpinner}${disableWrap}${pad} ${_spins[_nextSpin]} Running ${task}: ${$gry(names)}${enableWrap}`); } /* Start or stop the spinner */ export function setupSpinner() { if (_interval) clearInterval(_interval); if (_colors && _spinner && (_format === 'fancy')) { _interval = setInterval(spin, 150).unref(); } } //# sourceMappingURL=spinner.js.map