├── .gitignore ├── Makefile ├── Readme.md ├── examples ├── confirm.js ├── password.js └── prompt.js ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test.js 3 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | test: 3 | @./node_modules/.bin/mocha \ 4 | --require should \ 5 | --reporter spec \ 6 | --slow 2s \ 7 | --harmony \ 8 | --bail 9 | 10 | .PHONY: test 11 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # co-prompt 3 | 4 | Sane terminal user-input for nodejs that return thunks for [co](https://github.com/visionmedia/co). 5 | 6 | ## Installation 7 | 8 | ``` 9 | $ npm install co-prompt 10 | ``` 11 | 12 | ## Examples 13 | 14 | ```js 15 | var name = yield prompt('username: '); 16 | var pass = yield password('password: '); 17 | var desc = yield multiline('description: '); 18 | var ok = yield confirm('are you sure? '); 19 | ``` 20 | 21 | ## API 22 | 23 | ### prompt(msg) 24 | 25 | Prompt for user input with `msg`. 26 | 27 | ### prompt.password(msg, [mask]) 28 | 29 | Prompt for password input with `msg` and optional `mask` 30 | defaulting to "*". 31 | 32 | ### prompt.multiline(msg) 33 | 34 | Prompt for multi-line input with `msg`. 35 | 36 | ### prompt.confirm(msg) 37 | 38 | Prompt for confirmation with `msg`. 39 | 40 | ## License 41 | 42 | MIT 43 | 44 | -------------------------------------------------------------------------------- /examples/confirm.js: -------------------------------------------------------------------------------- 1 | 2 | var co = require('co'); 3 | var prompt = require('..'); 4 | var confirm = prompt.confirm; 5 | 6 | co(function *(){ 7 | var ok = yield confirm('are you sure? '); 8 | console.log('answer: %s', ok); 9 | process.stdin.pause(); 10 | })(); 11 | -------------------------------------------------------------------------------- /examples/password.js: -------------------------------------------------------------------------------- 1 | 2 | var co = require('co'); 3 | var prompt = require('..'); 4 | var password = prompt.password; 5 | 6 | co(function *(){ 7 | var user = yield prompt('username: '); 8 | var pass = yield password('password: '); 9 | //var pass = yield password('password: ', '-'); 10 | console.log('user: %s', user); 11 | console.log('pass: %s', pass); 12 | process.stdin.pause(); 13 | })(); 14 | -------------------------------------------------------------------------------- /examples/prompt.js: -------------------------------------------------------------------------------- 1 | 2 | var co = require('co'); 3 | var prompt = require('..'); 4 | var multiline = prompt.multiline; 5 | 6 | co(function *(){ 7 | var first = yield prompt('first name: '); 8 | var last = yield prompt('last name: '); 9 | console.log('hello %s %s\n', first, last); 10 | 11 | var desc = yield multiline('description:'); 12 | console.log('you describe yourself as:'); 13 | console.log(desc); 14 | 15 | process.stdin.pause(); 16 | })(); 17 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var keypress = require('keypress'); 7 | 8 | /** 9 | * Expose `prompt`. 10 | */ 11 | 12 | exports = module.exports = prompt; 13 | 14 | /** 15 | * Prompt for user input. 16 | */ 17 | 18 | function prompt(msg){ 19 | return function(done){ 20 | process.stdout.write(msg); 21 | process.stdin.setEncoding('utf8'); 22 | process.stdin.once('data', function(val){ 23 | done(null, val.trim()); 24 | }).resume(); 25 | } 26 | } 27 | 28 | /** 29 | * Prompt for multi-line user input. 30 | */ 31 | 32 | exports.multiline = function(msg){ 33 | return function(done){ 34 | var buf = []; 35 | console.log(msg); 36 | process.stdin.setEncoding('utf8'); 37 | process.stdin.on('data', function(val){ 38 | if ('\n' == val || '\r\n' == val) { 39 | process.stdin.removeAllListeners('data'); 40 | done(null, buf.join('\n')); 41 | } else { 42 | buf.push(val.trimRight()); 43 | } 44 | }).resume(); 45 | } 46 | }; 47 | 48 | /** 49 | * Prompt for confirmation. 50 | */ 51 | 52 | exports.confirm = function(msg){ 53 | return function(done){ 54 | prompt(msg)(function(err, val){ 55 | if (err) return done(err); 56 | done(null, bool(val)); 57 | }); 58 | } 59 | }; 60 | 61 | /** 62 | * Prompt for password with optional mask. 63 | */ 64 | 65 | exports.password = function(msg, mask){ 66 | mask = null == mask ? '*' : mask; 67 | return function(done){ 68 | var buf = ''; 69 | 70 | keypress(process.stdin); 71 | process.stdin.setRawMode(true); 72 | process.stdout.write(msg); 73 | 74 | process.stdin.on('keypress', function(c, key){ 75 | if (key && 'return' == key.name) { 76 | console.log(); 77 | process.stdin.pause(); 78 | process.stdin.removeAllListeners('keypress'); 79 | process.stdin.setRawMode(false); 80 | if (!buf.trim().length) return exports.password(msg, mask)(done); 81 | done(null, buf); 82 | return; 83 | } 84 | 85 | if (key && key.ctrl && 'c' == key.name) { 86 | console.log('%s', buf); 87 | process.exit(); 88 | } 89 | 90 | process.stdout.write(mask); 91 | buf += c; 92 | }).resume(); 93 | } 94 | }; 95 | 96 | /** 97 | * Parse a boolean `str`. 98 | * 99 | * @param {String} str 100 | * @return {Boolean} 101 | * @api private 102 | */ 103 | 104 | function bool(str) { 105 | return /^y|yes|ok|true$/i.test(str); 106 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "co-prompt", 3 | "version": "1.0.0", 4 | "description": "simple terminal user input 'co'", 5 | "keywords": [ 6 | "terminal", 7 | "console", 8 | "prompt", 9 | "confirm", 10 | "password", 11 | "mask", 12 | "co" 13 | ], 14 | "devDependencies": { 15 | "should": "~1.2.2", 16 | "mocha": "~1.10.0", 17 | "co": "2.1.0" 18 | }, 19 | "license": "MIT", 20 | "dependencies": { 21 | "keypress": "~0.2.1" 22 | }, 23 | "repository": { 24 | "type": "git", 25 | "url": "https://github.com/visionmedia/co-prompt.git" 26 | } 27 | } 28 | --------------------------------------------------------------------------------