You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					65 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					65 lines
				
				1.6 KiB
			| 
											3 years ago
										 | var readline = require('readline') | ||
|  | var Promise = require('any-promise') | ||
|  | var objectAssign = require('object-assign') | ||
|  | var Interface = readline.Interface | ||
|  | 
 | ||
|  | function wrapCompleter (completer) { | ||
|  |   if (completer.length === 2) return completer | ||
|  | 
 | ||
|  |   return function (line, cb) { | ||
|  |     var result = completer(line) | ||
|  | 
 | ||
|  |     if (typeof result.then !== 'function') { | ||
|  |       return cb(null, result) | ||
|  |     } | ||
|  | 
 | ||
|  |     result.catch(cb).then(function (result) { | ||
|  |       process.nextTick(function () { cb(null, result) }) | ||
|  |     }) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function InterfaceAsPromised (input, output, completer, terminal) { | ||
|  |   if (arguments.length === 1) { | ||
|  |     var options = input | ||
|  | 
 | ||
|  |     if (typeof options.completer === 'function') { | ||
|  |       options = objectAssign({}, options, { | ||
|  |         completer: wrapCompleter(options.completer) | ||
|  |       }) | ||
|  |     } | ||
|  | 
 | ||
|  |     Interface.call(this, options) | ||
|  |   } else { | ||
|  |     if (typeof completer === 'function') { | ||
|  |       completer = wrapCompleter(completer) | ||
|  |     } | ||
|  | 
 | ||
|  |     Interface.call(this, input, output, completer, terminal) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | InterfaceAsPromised.prototype = Object.create(Interface.prototype) | ||
|  | 
 | ||
|  | InterfaceAsPromised.prototype.question = function (question, callback) { | ||
|  |   if (typeof callback === 'function') { | ||
|  |     return Interface.prototype.question.call(this, question, callback) | ||
|  |   } | ||
|  | 
 | ||
|  |   var self = this | ||
|  |   return new Promise(function (resolve) { | ||
|  |     Interface.prototype.question.call(self, question, resolve) | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | objectAssign(exports, readline, { | ||
|  |   Interface: InterfaceAsPromised, | ||
|  |   createInterface: function (input, output, completer, terminal) { | ||
|  |     if (arguments.length === 1) { | ||
|  |       return new InterfaceAsPromised(input) | ||
|  |     } | ||
|  | 
 | ||
|  |     return new InterfaceAsPromised(input, output, completer, terminal) | ||
|  |   } | ||
|  | }) |