|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 'use strict';
-
- const readline = require('readline');
- const { action } = require('../util');
- const EventEmitter = require('events');
- const { beep, cursor } = require('sisteransi');
- 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;
|