heroku-cli-util
Advanced tools
Comparing version 2.0.1 to 3.0.0
38
cli.js
var console = require('./console'); | ||
var errors = require('./errors'); | ||
var config = require('./config'); | ||
var prompt = require('./prompt'); | ||
var errors = require('./errors'); | ||
var config = require('./config'); | ||
var prompt = require('./prompt'); | ||
exports.run = require('./run'); | ||
exports.log = console.log.bind(console); | ||
exports.formatDate = require('./date').formatDate; | ||
exports.error = errors.error; | ||
exports.warn = errors.warn; | ||
exports.columnify = require('./columnify'); | ||
exports.console = console; | ||
exports.prompt = prompt.prompt; | ||
exports.confirmApp = prompt.confirmApp; | ||
exports.preauth = require('./preauth'); | ||
exports.command = require('./command'); | ||
exports.defaultHost = config.defaultHost; | ||
exports.httpGitHost = config.httpGitHost; | ||
exports.gitHost = config.gitHost; | ||
exports.host = config.host; | ||
exports.run = require('./run'); | ||
exports.log = console.log.bind(console); | ||
exports.formatDate = require('./date').formatDate; | ||
exports.error = errors.error; | ||
exports.warn = errors.warn; | ||
exports.errorHandler = errors.errorHandler; | ||
exports.columnify = require('./columnify'); | ||
exports.console = console; | ||
exports.prompt = prompt.prompt; | ||
exports.confirmApp = prompt.confirmApp; | ||
exports.preauth = require('./preauth'); | ||
exports.command = require('./command'); | ||
exports.defaultHost = config.defaultHost; | ||
exports.httpGitHost = config.httpGitHost; | ||
exports.gitHost = config.gitHost; | ||
exports.host = config.host; |
'use strict'; | ||
let co = require('co'); | ||
@@ -15,4 +16,7 @@ let Heroku = require('heroku-client'); | ||
yield fn(context, heroku); | ||
}).catch(errors.handleErr(context)); | ||
}).catch(errors.errorHandler({ | ||
logPath: context.herokuDir + '/error.log', | ||
stackTrace: true, | ||
})); | ||
}; | ||
}; |
'use strict'; | ||
let console = require('./console'); | ||
let linewrap = require('linewrap'); | ||
function wrap (msg) { | ||
let linewrap = require('linewrap'); | ||
return linewrap(6, | ||
@@ -29,31 +30,46 @@ process.stderr.getWindowSize()[0], { | ||
function handleErr (context) { | ||
return function (err) { | ||
if (err.body) { | ||
// API error | ||
if (err.body.message) { | ||
error(err.body.message); | ||
} else if (err.body.error) { | ||
error(err.body.error); | ||
} | ||
} else { | ||
// Unhandled error | ||
if (err.message) { | ||
error(err.message); | ||
function getErrorMessage (err) { | ||
if (!err) { | ||
return "unspecified error"; | ||
} | ||
if (err.body) { | ||
// API error | ||
if (err.body.message) { | ||
return err.body.message; | ||
} else if (err.body.error) { | ||
return err.body.error; | ||
} | ||
} | ||
// Unhandled error | ||
if (err.message && err.code) { | ||
return `${err.code}: ${err.message}`; | ||
} else if (err.message) { | ||
return err.message; | ||
} | ||
return err; | ||
} | ||
function logtimestamp() { | ||
return new Date().toISOString() | ||
.replace(/T/, ' ') | ||
.replace(/-/g, '/') | ||
.replace(/\..+/, ''); | ||
} | ||
function logErr(err, logPath) { | ||
let fs = require('fs'); | ||
fs.appendFileSync(logPath, logtimestamp() + ' ' + err.stack + '\n'); | ||
error(`See ${logPath}` + logPath + ' for more info.'); | ||
} | ||
function errorHandler(options) { | ||
return function handleErr(err) { | ||
options = options || {}; | ||
error(getErrorMessage(err)); | ||
if (options.stackTrace && err.stack) { | ||
if (options.logPath) { | ||
logErr(err, options.logPath); | ||
} else { | ||
error(err); | ||
console.error(err.stack); | ||
} | ||
if (err.stack) { | ||
var logPath = context.herokuDir + '/error.log'; | ||
var fs = require('fs'); | ||
var log = function (line) { | ||
var d = new Date().toISOString() | ||
.replace(/T/, ' ') | ||
.replace(/-/g, '/') | ||
.replace(/\..+/, ''); | ||
fs.appendFileSync(logPath, d + ' ' + line + '\n'); | ||
}; | ||
log(err.stack); | ||
error(`See ${logPath}` + logPath + ' for more info.'); | ||
} | ||
} | ||
@@ -66,2 +82,2 @@ process.exit(1); | ||
module.exports.warn = warn; | ||
module.exports.handleErr = handleErr; | ||
module.exports.errorHandler = errorHandler; |
{ | ||
"name": "heroku-cli-util", | ||
"version": "2.0.1", | ||
"version": "3.0.0", | ||
"description": "Set of helpful CLI utilities", | ||
@@ -5,0 +5,0 @@ "main": "cli.js", |
@@ -7,3 +7,3 @@ 'use strict'; | ||
return new Promise(function (fulfill, reject) { | ||
prompt.prompt('Two-factor code').then(function (second_factor) { | ||
prompt.prompt('Two-factor code', {mask: true}).then(function (second_factor) { | ||
fulfill(heroku.request({ | ||
@@ -10,0 +10,0 @@ method: 'PUT', |
@@ -7,7 +7,61 @@ 'use strict'; | ||
function prompt (name) { | ||
function promptMasked (options) { | ||
return new Promise(function (fulfill, reject) { | ||
process.stdin.setEncoding('utf8'); | ||
process.stderr.write(options.prompt); | ||
process.stdin.resume(); | ||
process.stdin.setRawMode(true); | ||
let input = ''; | ||
process.stdin.on('data', function (c) { | ||
switch(c) { | ||
case "\u0004": | ||
case "\r": | ||
case "\n": | ||
if (input.length === 0) { return; } | ||
if (options.mask) { | ||
process.stderr.clearLine(); | ||
process.stderr.cursorTo(0); | ||
process.stderr.write(options.prompt + input.replace(/./g, '*')); | ||
} | ||
console.error(); | ||
process.stdin.setRawMode(false); | ||
process.stdin.pause(); | ||
fulfill(input); | ||
return; | ||
case "\u0003": | ||
// Ctrl-c | ||
reject(); | ||
return; | ||
default: | ||
if (c.charCodeAt(0) === 127) { | ||
// backspace | ||
input = input.substr(0, input.length-1); | ||
process.stderr.clearLine(); | ||
process.stderr.cursorTo(0); | ||
if (options.mask) { | ||
process.stderr.write(options.prompt + input); | ||
} else { | ||
process.stderr.write(options.prompt + input.replace(/./g, '*')); | ||
} | ||
return; | ||
} | ||
process.stderr.write(options.mask ? c : '*'); | ||
input += c; | ||
return; | ||
} | ||
}); | ||
}); | ||
} | ||
function prompt (name, options) { | ||
options = options || {}; | ||
options.prompt = name ? name + ': ' : '> '; | ||
if (options.mask || options.hide) { | ||
return promptMasked(options); | ||
} | ||
return new Promise(function (fulfill) { | ||
process.stdin.setEncoding('utf8'); | ||
process.stderr.write(options.prompt); | ||
process.stdin.resume(); | ||
process.stdin.setEncoding('utf8'); | ||
process.stderr.write(name ? name + ': ' : '> '); | ||
process.stdin.once('data', function (data) { | ||
@@ -14,0 +68,0 @@ process.stdin.pause(); |
@@ -21,3 +21,3 @@ # heroku-cli-util | ||
var h = require('heroku-cli-util'); | ||
h.prompt('email', function (_, email) { | ||
h.prompt('email', {}, function (_, email) { | ||
console.log(`your email is: ${email}`); | ||
@@ -31,3 +31,3 @@ }); | ||
var h = require('heroku-cli-util'); | ||
h.prompt('email').then(function (email) { | ||
h.prompt('email', {}).then(function (email) { | ||
console.log(`your email is: ${email}`); | ||
@@ -41,6 +41,11 @@ }); | ||
var h = require('heroku-cli-util'); | ||
var email = yield h.prompt('email'); | ||
var email = yield h.prompt('email', {}); | ||
console.log(`your email is: ${email}`); | ||
``` | ||
**Options** | ||
`mask: true`: mask input field after submitting. | ||
`hide: true`: mask characters while entering. | ||
## Confirm App | ||
@@ -47,0 +52,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
18231
460
158