You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							82 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							82 lines
						
					
					
						
							1.9 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
const readline = require('readline'); | 
						|
 | 
						|
const _require = require('../util'), | 
						|
      action = _require.action; | 
						|
 | 
						|
const EventEmitter = require('events'); | 
						|
 | 
						|
const _require2 = require('sisteransi'), | 
						|
      beep = _require2.beep, | 
						|
      cursor = _require2.cursor; | 
						|
 | 
						|
const color = require('kleur'); | 
						|
/** | 
						|
 * Base prompt skeleton | 
						|
 * @param {Stream} [opts.stdin] The Readable stream to listen to | 
						|
 * @param {Stream} [opts.stdout] The Writable stream to write readline data to | 
						|
 */ | 
						|
 | 
						|
 | 
						|
class Prompt extends EventEmitter { | 
						|
  constructor(opts = {}) { | 
						|
    super(); | 
						|
    this.firstRender = true; | 
						|
    this.in = opts.stdin || process.stdin; | 
						|
    this.out = opts.stdout || process.stdout; | 
						|
 | 
						|
    this.onRender = (opts.onRender || (() => void 0)).bind(this); | 
						|
 | 
						|
    const rl = readline.createInterface({ | 
						|
      input: this.in, | 
						|
      escapeCodeTimeout: 50 | 
						|
    }); | 
						|
    readline.emitKeypressEvents(this.in, rl); | 
						|
    if (this.in.isTTY) this.in.setRawMode(true); | 
						|
    const isSelect = ['SelectPrompt', 'MultiselectPrompt'].indexOf(this.constructor.name) > -1; | 
						|
 | 
						|
    const keypress = (str, key) => { | 
						|
      let a = action(key, isSelect); | 
						|
 | 
						|
      if (a === false) { | 
						|
        this._ && this._(str, key); | 
						|
      } else if (typeof this[a] === 'function') { | 
						|
        this[a](key); | 
						|
      } else { | 
						|
        this.bell(); | 
						|
      } | 
						|
    }; | 
						|
 | 
						|
    this.close = () => { | 
						|
      this.out.write(cursor.show); | 
						|
      this.in.removeListener('keypress', keypress); | 
						|
      if (this.in.isTTY) this.in.setRawMode(false); | 
						|
      rl.close(); | 
						|
      this.emit(this.aborted ? 'abort' : this.exited ? 'exit' : 'submit', this.value); | 
						|
      this.closed = true; | 
						|
    }; | 
						|
 | 
						|
    this.in.on('keypress', keypress); | 
						|
  } | 
						|
 | 
						|
  fire() { | 
						|
    this.emit('state', { | 
						|
      value: this.value, | 
						|
      aborted: !!this.aborted, | 
						|
      exited: !!this.exited | 
						|
    }); | 
						|
  } | 
						|
 | 
						|
  bell() { | 
						|
    this.out.write(beep); | 
						|
  } | 
						|
 | 
						|
  render() { | 
						|
    this.onRender(color); | 
						|
    if (this.firstRender) this.firstRender = false; | 
						|
  } | 
						|
 | 
						|
} | 
						|
 | 
						|
module.exports = Prompt; |