88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | const color = require('kleur'); | ||
|  | const Prompt = require('./prompt'); | ||
|  | const { style } = require('../util'); | ||
|  | const { erase, cursor } = require('sisteransi'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * 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; |