diff options
author | Minteck <contact@minteck.org> | 2021-12-21 16:50:49 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2021-12-21 16:50:49 +0100 |
commit | 20204baf1807825af4798ad03bfb329e4da05bc5 (patch) | |
tree | 1568515fa1e4592206ed5d2327b39e6b443cbd03 /node_modules/read/lib/read.js | |
download | bingoloto-remote-20204baf1807825af4798ad03bfb329e4da05bc5.tar.gz bingoloto-remote-20204baf1807825af4798ad03bfb329e4da05bc5.tar.bz2 bingoloto-remote-20204baf1807825af4798ad03bfb329e4da05bc5.zip |
Commit
Diffstat (limited to 'node_modules/read/lib/read.js')
-rw-r--r-- | node_modules/read/lib/read.js | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/node_modules/read/lib/read.js b/node_modules/read/lib/read.js new file mode 100644 index 0000000..a93d1b3 --- /dev/null +++ b/node_modules/read/lib/read.js @@ -0,0 +1,113 @@ + +module.exports = read + +var readline = require('readline') +var Mute = require('mute-stream') + +function read (opts, cb) { + if (opts.num) { + throw new Error('read() no longer accepts a char number limit') + } + + if (typeof opts.default !== 'undefined' && + typeof opts.default !== 'string' && + typeof opts.default !== 'number') { + throw new Error('default value must be string or number') + } + + var input = opts.input || process.stdin + var output = opts.output || process.stdout + var prompt = (opts.prompt || '').trim() + ' ' + var silent = opts.silent + var editDef = false + var timeout = opts.timeout + + var def = opts.default || '' + if (def) { + if (silent) { + prompt += '(<default hidden>) ' + } else if (opts.edit) { + editDef = true + } else { + prompt += '(' + def + ') ' + } + } + var terminal = !!(opts.terminal || output.isTTY) + + var m = new Mute({ replace: opts.replace, prompt: prompt }) + m.pipe(output, {end: false}) + output = m + var rlOpts = { input: input, output: output, terminal: terminal } + + if (process.version.match(/^v0\.6/)) { + var rl = readline.createInterface(rlOpts.input, rlOpts.output) + } else { + var rl = readline.createInterface(rlOpts) + } + + + output.unmute() + rl.setPrompt(prompt) + rl.prompt() + if (silent) { + output.mute() + } else if (editDef) { + rl.line = def + rl.cursor = def.length + rl._refreshLine() + } + + var called = false + rl.on('line', onLine) + rl.on('error', onError) + + rl.on('SIGINT', function () { + rl.close() + onError(new Error('canceled')) + }) + + var timer + if (timeout) { + timer = setTimeout(function () { + onError(new Error('timed out')) + }, timeout) + } + + function done () { + called = true + rl.close() + + if (process.version.match(/^v0\.6/)) { + rl.input.removeAllListeners('data') + rl.input.removeAllListeners('keypress') + rl.input.pause() + } + + clearTimeout(timer) + output.mute() + output.end() + } + + function onError (er) { + if (called) return + done() + return cb(er) + } + + function onLine (line) { + if (called) return + if (silent && terminal) { + output.unmute() + output.write('\r\n') + } + done() + // truncate the \n at the end. + line = line.replace(/\r?\n$/, '') + var isDefault = !!(editDef && line === def) + if (def && !line) { + isDefault = true + line = def + } + cb(null, line, isDefault) + } +} |