Spaces:
Running
Running
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) | |
} | |
}) | |