87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | 
 | ||
|  | const color = require('kleur'); | ||
|  | 
 | ||
|  | const Prompt = require('./prompt'); | ||
|  | 
 | ||
|  | const _require = require('../util'), | ||
|  |       style = _require.style; | ||
|  | 
 | ||
|  | const _require2 = require('sisteransi'), | ||
|  |       erase = _require2.erase, | ||
|  |       cursor = _require2.cursor; | ||
|  | /** | ||
|  |  * ConfirmPrompt Base Element | ||
|  |  * @param {Object} opts Options | ||
|  |  * @param {String} opts.message Message | ||
|  |  * @param {Boolean} [opts.initial] Default value (true/false) | ||
|  |  * @param {Stream} [opts.stdin] The Readable stream to listen to | ||
|  |  * @param {Stream} [opts.stdout] The Writable stream to write readline data to | ||
|  |  * @param {String} [opts.yes] The "Yes" label | ||
|  |  * @param {String} [opts.yesOption] The "Yes" option when choosing between yes/no | ||
|  |  * @param {String} [opts.no] The "No" label | ||
|  |  * @param {String} [opts.noOption] The "No" option when choosing between yes/no | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | class ConfirmPrompt extends Prompt { | ||
|  |   constructor(opts = {}) { | ||
|  |     super(opts); | ||
|  |     this.msg = opts.message; | ||
|  |     this.value = opts.initial; | ||
|  |     this.initialValue = !!opts.initial; | ||
|  |     this.yesMsg = opts.yes || 'yes'; | ||
|  |     this.yesOption = opts.yesOption || '(Y/n)'; | ||
|  |     this.noMsg = opts.no || 'no'; | ||
|  |     this.noOption = opts.noOption || '(y/N)'; | ||
|  |     this.render(); | ||
|  |   } | ||
|  | 
 | ||
|  |   reset() { | ||
|  |     this.value = this.initialValue; | ||
|  |     this.fire(); | ||
|  |     this.render(); | ||
|  |   } | ||
|  | 
 | ||
|  |   abort() { | ||
|  |     this.done = this.aborted = true; | ||
|  |     this.fire(); | ||
|  |     this.render(); | ||
|  |     this.out.write('\n'); | ||
|  |     this.close(); | ||
|  |   } | ||
|  | 
 | ||
|  |   submit() { | ||
|  |     this.value = this.value || false; | ||
|  |     this.done = true; | ||
|  |     this.aborted = false; | ||
|  |     this.fire(); | ||
|  |     this.render(); | ||
|  |     this.out.write('\n'); | ||
|  |     this.close(); | ||
|  |   } | ||
|  | 
 | ||
|  |   _(c, key) { | ||
|  |     if (c.toLowerCase() === 'y') { | ||
|  |       this.value = true; | ||
|  |       return this.submit(); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (c.toLowerCase() === 'n') { | ||
|  |       this.value = false; | ||
|  |       return this.submit(); | ||
|  |     } | ||
|  | 
 | ||
|  |     return this.bell(); | ||
|  |   } | ||
|  | 
 | ||
|  |   render() { | ||
|  |     if (this.closed) return; | ||
|  |     if (this.firstRender) this.out.write(cursor.hide); | ||
|  |     super.render(); | ||
|  |     this.out.write(erase.line + cursor.to(0) + [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(this.done), this.done ? this.value ? this.yesMsg : this.noMsg : color.gray(this.initialValue ? this.yesOption : this.noOption)].join(' ')); | ||
|  |   } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = ConfirmPrompt; |