monorepo-run
Version:
Run scripts in monorepo with colors, streaming and separated panes
59 lines (49 loc) • 1.61 kB
JavaScript
const ansiEscapes = require('ansi-escapes')
const ESC = '\u001B['
const escapeSeqReg = /[-/\\^$*+?.()|[\]{}]/g
exports.escapeAnsiEscapeSeq = (s) => {
return s.replace(escapeSeqReg, '\\$&')
}
const ansiEscapeSeqsReg = new RegExp([
ansiEscapes.clearScreen,
ansiEscapes.eraseLine,
ansiEscapes.eraseStartLine,
ansiEscapes.eraseEndLine,
`${ESC}0K`,
`${ESC}0J`,
...(genSeq(ansiEscapes.cursorTo, 0, 10)),
...(genSeq2(ansiEscapes.cursorTo, 0, 10, 0, 10)),
...(genSeq(ansiEscapes.cursorMove, -10, 10)),
...(genSeq2(ansiEscapes.cursorMove, -10, 10, -10, 10)),
...(genSeq(ansiEscapes.cursorUp, -10, 10)),
...(genSeq(ansiEscapes.cursorDown, -10, 10)),
...(genSeq(ansiEscapes.cursorForward, -10, 10)),
...(genSeq(ansiEscapes.cursorBackward, -10, 10)),
].map(e => `(${exports.escapeAnsiEscapeSeq(e)})`).join('|'), 'g')
exports.stripAnsiEscapeSeqs = (s) => s.replace(ansiEscapeSeqsReg, '')
const eraseLineEscapeSeqsReg = new RegExp([
ansiEscapes.eraseLine,
ansiEscapes.eraseStartLine,
ansiEscapes.eraseEndLine,
`${ESC}0K`,
...(genSeq(ansiEscapes.cursorTo, 0, 10)),
].map(e => `(${exports.escapeAnsiEscapeSeq(e)})`).join('|'), 'g')
exports.countEraseLineEscapeSeqs = (str) => {
return ((str || '').match(eraseLineEscapeSeqsReg) || []).length
}
function genSeq (fn, from, to) {
const result = []
for (let i = from; i <= to; i++) {
result.push(fn(i))
}
return result
}
function genSeq2 (fn, from, to, from2, to2) {
const result = []
for (let i = from; i <= to; i++) {
for (let j = from2; j <= to2; j++) {
result.push(fn(i, j))
}
}
return result
}