UNPKG

cortex

Version:

Cortex is an npm-like package manager for browsers.

165 lines (126 loc) 3.44 kB
'use strict'; var adduser = exports; var asks = require('asks'); var mix = require('mix2'); var REGEX_IS_EMAIL = /^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i; var PROMPT_SCHEMAS = [{ name: 'username', type: 'input', message: 'username', validate: function(username) { var done = this.async(); if (username.toLowerCase() !== username) { return done('username must be lowercase.'); } if (~encodeURIComponent(username).indexOf("%")) { return done('username cannot contain any non-urlsafe characters.') } done(true); } }, { name: 'password', type: 'password', message: 'password', validate: function(password) { var done = this.async(); if (!password) { return done('password is required'); } done(true); } }, { name: 'email', type: 'input', message: 'email', validate: function(email) { var done = this.async(); if (!email) { return done('email is required'); } if (!REGEX_IS_EMAIL.test(email)) { return done('invalid email.') } done(true); } }]; function simple_clone(obj) { var ret = {}; var key; for (key in obj) { ret[key] = obj[key]; } return ret; } // 1. new user // username: // password: // 2. change password // password: // @param {Object} options // - username: {string=} // - password: {string=} adduser.run = function(options, callback) { // If the command 'adduser' is called from the restful service, username and password must be specified if (options._http) { if (!options.username || !options.password) { return callback('username or password is not specified.'); } } var schemas = []; var defaults = {}; var skipped = {}; var profile = this.profile; PROMPT_SCHEMAS.forEach(function(schema) { var key = schema.name; // get the existing user info from config var saved = profile.get(key); if (saved) { schema.default = saved; } // store the saved defaults[key] = saved; // If process.argv already contains a certain key, skip it if (options[key]) { skipped[key] = options[key]; return; } schema = simple_clone(schema); schemas.push(schema); }); var self = this; asks.prompt(schemas, function(result) { mix(result, skipped, false); // if the username to add is different from the current username, `signup` if ( options.signup || result.username !== defaults.username || result.password !== defaults.password ) { result.signup = true; } self.add(result, callback); }); }; // @param {Object} options // - username // - email // - password // - signup adduser.add = function(options, callback) { var neuropil = this.neuropil; this.logger.info('{{cyan Connecting}} ...'); var self = this; neuropil.adduser(options, function(err, res, json) { if (err) { return callback(err, res, json); } var profile = self.profile; PROMPT_SCHEMAS.forEach(function(schema) { var key = schema.name; profile.set(key, options[key]); }); // encrypt and hash password and username profile.encrypt(true); callback(err, res, json); }); };