1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 'use strict';
- /**
- * `confirm` type prompt
- */
- const chalk = require('chalk');
- const { take, takeUntil } = require('rxjs/operators');
- const Base = require('./base');
- const observe = require('../utils/events');
- class ConfirmPrompt extends Base {
- constructor(questions, rl, answers) {
- super(questions, rl, answers);
- let rawDefault = true;
- Object.assign(this.opt, {
- filter(input) {
- let value = rawDefault;
- if (input != null && input !== '') {
- value = /^y(es)?/i.test(input);
- }
- return value;
- },
- });
- if (this.opt.default != null) {
- rawDefault = Boolean(this.opt.default);
- }
- this.opt.default = rawDefault ? 'Y/n' : 'y/N';
- }
- /**
- * Start the Inquiry session
- * @param {Function} cb Callback when prompt is done
- * @return {this}
- */
- _run(cb) {
- this.done = cb;
- // Once user confirm (enter key)
- const events = observe(this.rl);
- events.keypress.pipe(takeUntil(events.line)).forEach(this.onKeypress.bind(this));
- events.line.pipe(take(1)).forEach(this.onEnd.bind(this));
- // Init
- this.render();
- return this;
- }
- /**
- * Render the prompt to screen
- * @return {ConfirmPrompt} self
- */
- render(answer) {
- let message = this.getQuestion();
- if (typeof answer === 'boolean') {
- message += chalk.cyan(answer ? 'Yes' : 'No');
- } else {
- message += this.rl.line;
- }
- this.screen.render(message);
- return this;
- }
- /**
- * When user press `enter` key
- */
- onEnd(input) {
- this.status = 'answered';
- const output = this.opt.filter(input);
- this.render(output);
- this.screen.done();
- this.done(output);
- }
- /**
- * When user press a key
- */
- onKeypress() {
- this.render();
- }
- }
- module.exports = ConfirmPrompt;
|