diff options
Diffstat (limited to 'lib/utils/read-user-info.js')
-rw-r--r-- | lib/utils/read-user-info.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/utils/read-user-info.js b/lib/utils/read-user-info.js new file mode 100644 index 000000000..359432cf7 --- /dev/null +++ b/lib/utils/read-user-info.js @@ -0,0 +1,66 @@ +'use strict' +const Bluebird = require('bluebird') +const readAsync = Bluebird.promisify(require('read')) +const userValidate = require('npm-user-validate') +const log = require('npmlog') + +exports.otp = readOTP +exports.password = readPassword +exports.username = readUsername +exports.email = readEmail + +function read (opts) { + return Bluebird.try(() => { + log.clearProgress() + return readAsync(opts) + }).finally(() => { + log.showProgress() + }) +} + +function readOTP (msg, otp, isRetry) { + if (!msg) msg = 'Enter OTP: ' + if (isRetry && otp && /^[\d ]+$|^[A-Fa-f0-9]{64,64}$/.test(otp)) return otp.replace(/\s+/g, '') + + return read({prompt: msg, default: otp || ''}) + .then((otp) => readOTP(msg, otp, true)) +} + +function readPassword (msg, password, isRetry) { + if (!msg) msg = 'npm password: ' + if (isRetry && password) return password + + return read({prompt: msg, silent: true, default: password || ''}) + .then((password) => readPassword(msg, password, true)) +} + +function readUsername (msg, username, opts, isRetry) { + if (!msg) msg = 'npm username: ' + if (isRetry && username) { + const error = userValidate.username(username) + if (error) { + opts.log && opts.log.warn(error.message) + } else { + return Promise.resolve(username.trim()) + } + } + + return read({prompt: msg, default: username || ''}) + .then((username) => readUsername(msg, username, opts, true)) +} + +function readEmail (msg, email, opts, isRetry) { + if (!msg) msg = 'email (this IS public): ' + if (isRetry && email) { + const error = userValidate.email(email) + if (error) { + opts.log && opts.log.warn(error.message) + } else { + return email.trim() + } + } + + return read({prompt: msg, default: email || ''}) + .then((username) => readEmail(msg, username, opts, true)) +} + |