4 var readline = require('readline')
5 var Mute = require('mute-stream')
7 function read (opts, cb) {
9 throw new Error('read() no longer accepts a char number limit')
12 if (typeof opts.default !== 'undefined' &&
13 typeof opts.default !== 'string' &&
14 typeof opts.default !== 'number') {
15 throw new Error('default value must be string or number')
18 var input = opts.input || process.stdin
19 var output = opts.output || process.stdout
20 var prompt = (opts.prompt || '').trim() + ' '
21 var silent = opts.silent
23 var timeout = opts.timeout
25 var def = opts.default || ''
28 prompt += '(<default hidden>) '
29 } else if (opts.edit) {
32 prompt += '(' + def + ') '
35 var terminal = !!(opts.terminal || output.isTTY)
37 var m = new Mute({ replace: opts.replace, prompt: prompt })
38 m.pipe(output, {end: false})
40 var rlOpts = { input: input, output: output, terminal: terminal }
42 if (process.version.match(/^v0\.6/)) {
43 var rl = readline.createInterface(rlOpts.input, rlOpts.output)
45 var rl = readline.createInterface(rlOpts)
56 rl.cursor = def.length
62 rl.on('error', onError)
64 rl.on('SIGINT', function () {
66 onError(new Error('canceled'))
71 timer = setTimeout(function () {
72 onError(new Error('timed out'))
80 if (process.version.match(/^v0\.6/)) {
81 rl.input.removeAllListeners('data')
82 rl.input.removeAllListeners('keypress')
91 function onError (er) {
97 function onLine (line) {
99 if (silent && terminal) {
104 // truncate the \n at the end.
105 line = line.replace(/\r?\n$/, '')
106 var isDefault = !!(editDef && line === def)
111 cb(null, line, isDefault)