// Simplified version of: // https://github.com/0x00A/prompt-sync/blob/master/index.js 'use strict'; var fs = require('fs'); var term = 13; // carriage return function create() { return prompt; function prompt(ask, value, opts) { var insert = 0, savedinsert = 0, res, i, savedstr; opts = opts || {}; if (Object(ask) === ask) { opts = ask; ask = opts.ask; } else if (Object(value) === value) { opts = value; value = opts.value; } ask = ask || ''; var echo = opts.echo; var masked = 'echo' in opts; var fd = (process.platform === 'win32') ? process.stdin.fd : fs.openSync('/dev/tty', 'rs'); var wasRaw = process.stdin.isRaw; if (!wasRaw) { process.stdin.setRawMode(true); } var buf = new Buffer(3); var str = '', character, read; savedstr = ''; if (ask) { process.stdout.write(ask); } var cycle = 0; var prevComplete; while (true) { read = fs.readSync(fd, buf, 0, 3); if (read > 1) { // received a control sequence if (buf.toString()) { str = str + buf.toString(); str = str.replace(/\0/g, ''); insert = str.length; process.stdout.write('\u001b[2K\u001b[0G'+ ask + str); process.stdout.write('\u001b[' + (insert+ask.length+1) + 'G'); buf = new Buffer(3); } continue; // any other 3 character sequence is ignored } // if it is not a control character seq, assume only one character is read character = buf[read-1]; // catch a ^C and return null if (character == 3){ process.stdout.write('^C\n'); fs.closeSync(fd); process.exit(130); process.stdin.setRawMode(wasRaw); return null; } // catch the terminating character if (character == term) { fs.closeSync(fd); break; } if (character == 127 || (process.platform == 'win32' && character == 8)) { //backspace if (!insert) continue; str = str.slice(0, insert-1) + str.slice(insert); insert--; process.stdout.write('\u001b[2D'); } else { if ((character < 32 ) || (character > 126)) continue; str = str.slice(0, insert) + String.fromCharCode(character) + str.slice(insert); insert++; }; if (masked) { process.stdout.write('\u001b[2K\u001b[0G' + ask + Array(str.length+1).join(echo)); } else { process.stdout.write('\u001b[s'); if (insert == str.length) { process.stdout.write('\u001b[2K\u001b[0G'+ ask + str); } else { if (ask) { process.stdout.write('\u001b[2K\u001b[0G'+ ask + str); } else { process.stdout.write('\u001b[2K\u001b[0G'+ str + '\u001b[' + (str.length - insert) + 'D'); } } process.stdout.write('\u001b[u'); process.stdout.write('\u001b[1C'); } } process.stdout.write('\n') process.stdin.setRawMode(wasRaw); return str || value || ''; }; }; module.exports = create;