| 'use strict'; | 
|   | 
| const isTerm = process.env.TERM_PROGRAM === 'Apple_Terminal'; | 
| const colors = require('ansi-colors'); | 
| const utils = require('./utils'); | 
| const ansi = module.exports = exports; | 
| const ESC = '\u001b['; | 
| const BEL = '\u0007'; | 
| let hidden = false; | 
|   | 
| const code = ansi.code = { | 
|   bell: BEL, | 
|   beep: BEL, | 
|   beginning: `${ESC}G`, | 
|   down: `${ESC}J`, | 
|   esc: ESC, | 
|   getPosition: `${ESC}6n`, | 
|   hide: `${ESC}?25l`, | 
|   line: `${ESC}2K`, | 
|   lineEnd: `${ESC}K`, | 
|   lineStart: `${ESC}1K`, | 
|   restorePosition: ESC + (isTerm ? '8' : 'u'), | 
|   savePosition: ESC + (isTerm ? '7' : 's'), | 
|   screen: `${ESC}2J`, | 
|   show: `${ESC}?25h`, | 
|   up: `${ESC}1J` | 
| }; | 
|   | 
| const cursor = ansi.cursor = { | 
|   get hidden() { | 
|     return hidden; | 
|   }, | 
|   | 
|   hide() { | 
|     hidden = true; | 
|     return code.hide; | 
|   }, | 
|   show() { | 
|     hidden = false; | 
|     return code.show; | 
|   }, | 
|   | 
|   forward: (count = 1) => `${ESC}${count}C`, | 
|   backward: (count = 1) => `${ESC}${count}D`, | 
|   nextLine: (count = 1) => `${ESC}E`.repeat(count), | 
|   prevLine: (count = 1) => `${ESC}F`.repeat(count), | 
|   | 
|   up: (count = 1) => count ? `${ESC}${count}A` : '', | 
|   down: (count = 1) => count ? `${ESC}${count}B` : '', | 
|   right: (count = 1) => count ? `${ESC}${count}C` : '', | 
|   left: (count = 1) => count ? `${ESC}${count}D` : '', | 
|   | 
|   to(x, y) { | 
|     return y ? `${ESC}${y + 1};${x + 1}H` : `${ESC}${x + 1}G`; | 
|   }, | 
|   | 
|   move(x = 0, y = 0) { | 
|     let res = ''; | 
|     res += (x < 0) ? cursor.left(-x) : (x > 0) ? cursor.right(x) : ''; | 
|     res += (y < 0) ? cursor.up(-y) : (y > 0) ? cursor.down(y) : ''; | 
|     return res; | 
|   }, | 
|   | 
|   restore(state = {}) { | 
|     let { after, cursor, initial, input, prompt, size, value } = state; | 
|     initial = utils.isPrimitive(initial) ? String(initial) : ''; | 
|     input = utils.isPrimitive(input) ? String(input) : ''; | 
|     value = utils.isPrimitive(value) ? String(value) : ''; | 
|   | 
|     if (size) { | 
|       let codes = ansi.cursor.up(size) + ansi.cursor.to(prompt.length); | 
|       let diff = input.length - cursor; | 
|       if (diff > 0) { | 
|         codes += ansi.cursor.left(diff); | 
|       } | 
|       return codes; | 
|     } | 
|   | 
|     if (value || after) { | 
|       let pos = (!input && !!initial) ? -initial.length : -input.length + cursor; | 
|       if (after) pos -= after.length; | 
|       if (input === '' && initial && !prompt.includes(initial)) { | 
|         pos += initial.length; | 
|       } | 
|       return ansi.cursor.move(pos); | 
|     } | 
|   } | 
| }; | 
|   | 
| const erase = ansi.erase = { | 
|   screen: code.screen, | 
|   up: code.up, | 
|   down: code.down, | 
|   line: code.line, | 
|   lineEnd: code.lineEnd, | 
|   lineStart: code.lineStart, | 
|   lines(n) { | 
|     let str = ''; | 
|     for (let i = 0; i < n; i++) { | 
|       str += ansi.erase.line + (i < n - 1 ? ansi.cursor.up(1) : ''); | 
|     } | 
|     if (n) str += ansi.code.beginning; | 
|     return str; | 
|   } | 
| }; | 
|   | 
| ansi.clear = (input = '', columns = process.stdout.columns) => { | 
|   if (!columns) return erase.line + cursor.to(0); | 
|   let width = str => [...colors.unstyle(str)].length; | 
|   let lines = input.split(/\r?\n/); | 
|   let rows = 0; | 
|   for (let line of lines) { | 
|     rows += 1 + Math.floor(Math.max(width(line) - 1, 0) / columns); | 
|   } | 
|   return (erase.line + cursor.prevLine()).repeat(rows - 1) + erase.line + cursor.to(0); | 
| }; |