| 'use strict'; | |
| /** | |
| * `confirm` type prompt | |
| */ | |
| var _ = require('lodash'); | |
| var chalk = require('chalk'); | |
| var { take, takeUntil } = require('rxjs/operators'); | |
| var Base = require('./base'); | |
| var observe = require('../utils/events'); | |
| class ConfirmPrompt extends Base { | |
| constructor(questions, rl, answers) { | |
| super(questions, rl, answers); | |
| var rawDefault = true; | |
| _.extend(this.opt, { | |
| filter: function(input) { | |
| var value = rawDefault; | |
| if (input != null && input !== '') { | |
| value = /^y(es)?/i.test(input); | |
| } | |
| return value; | |
| } | |
| }); | |
| if (_.isBoolean(this.opt.default)) { | |
| rawDefault = this.opt.default; | |
| } | |
| this.opt.default = rawDefault ? 'Y/n' : 'y/N'; | |
| return this; | |
| } | |
| /** | |
| * Start the Inquiry session | |
| * @param {Function} cb Callback when prompt is done | |
| * @return {this} | |
| */ | |
| _run(cb) { | |
| this.done = cb; | |
| // Once user confirm (enter key) | |
| var 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) { | |
| var 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'; | |
| var 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; |