UNPKG

jest-standard-reporter

Version:

Jest reporter that uses stdout for messages and stderr for errors

65 lines (57 loc) 1.78 kB
// word-wrap a string that contains ANSI escape sequences. // ANSI escape sequences do not add to the string length. const wrapAnsiString = (string, terminalWidth) => { if (terminalWidth === 0) { // if the terminal width is zero, don't bother word-wrapping return string; } const ANSI_REGEXP = /[\\u001b\\u009b]\[\d{1,2}m/g; const tokens = []; let lastIndex = 0; let match; while ((match = ANSI_REGEXP.exec(string))) { const ansi = match[0]; const index = match.index; if (index != lastIndex) { tokens.push(['string', string.slice(lastIndex, index)]); } tokens.push(['ansi', ansi]); lastIndex = index + ansi.length; } if (lastIndex != string.length - 1) { tokens.push(['string', string.slice(lastIndex, string.length)]); } let lastLineLength = 0; return tokens .reduce( (lines, [kind, token]) => { if (kind === 'string') { if (lastLineLength + token.length > terminalWidth) { while (token.length) { const chunk = token.slice(0, terminalWidth - lastLineLength); const remaining = token.slice( terminalWidth - lastLineLength, token.length ); lines[lines.length - 1] += chunk; lastLineLength += chunk.length; token = remaining; if (token.length) { lines.push(''); lastLineLength = 0; } } } else { lines[lines.length - 1] += token; lastLineLength += token.length; } } else { lines[lines.length - 1] += token; } return lines; }, [''] ) .join('\n'); }; module.exports = wrapAnsiString;