composr-cli
Version:
CompoSR | Command Line Interface
458 lines (397 loc) • 11.6 kB
JavaScript
;
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _commandLineArgs = require('command-line-args');
var _commandLineArgs2 = _interopRequireDefault(_commandLineArgs);
var _safe = require('colors/safe');
var _safe2 = _interopRequireDefault(_safe);
var _jsonfile = require('jsonfile');
var _jsonfile2 = _interopRequireDefault(_jsonfile);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _yamljs = require('yamljs');
var _yamljs2 = _interopRequireDefault(_yamljs);
var _prompt = require('prompt');
var _prompt2 = _interopRequireDefault(_prompt);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _simpleSpinner = require('simple-spinner');
var _simpleSpinner2 = _interopRequireDefault(_simpleSpinner);
var _login = require('./login');
var _login2 = _interopRequireDefault(_login);
var _writeCredentials = require('./writeCredentials');
var _writeCredentials2 = _interopRequireDefault(_writeCredentials);
var _status = require('./status');
var _status2 = _interopRequireDefault(_status);
var _publish = require('./publish');
var _publish2 = _interopRequireDefault(_publish);
var _build = require('./build');
var _build2 = _interopRequireDefault(_build);
var _print = require('./print');
var _print2 = _interopRequireDefault(_print);
var _cliUi = require('./generators/cli-ui');
var _cliUi2 = _interopRequireDefault(_cliUi);
var _bootstrap = require('./generators/bootstrap');
var _bootstrap2 = _interopRequireDefault(_bootstrap);
var _asciiArt = require('ascii-art');
var _asciiArt2 = _interopRequireDefault(_asciiArt);
var _unpublisher = require('./unpublisher');
var _unpublisher2 = _interopRequireDefault(_unpublisher);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
process.bin = process.title = 'composr-cli';
// Lib modules
/**
* [getUserHome description]
* @return {[type]} [description]
*/
var getUserHome = function getUserHome() {
return process.env[process.platform === 'win32' ? 'USERPROFILE' : 'HOME'];
};
// CONST
var USER_HOME_ROOT = getUserHome() + '/.composr';
_prompt2.default.message = _safe2.default.cyan('CompoSR');
_prompt2.default.delimiter = _safe2.default.green('><');
/**
* [init description]
* @return {[type]} [description]
*/
var init = function init(options) {
//spinner.start()
initRC(function (err, result) {
//spinner.stop()
if (err) _print2.default.error(err);
locateComposrJson(function (err, result) {
if (err) _print2.default.error(err);
_print2.default.ok('CompoSR ready to rock!');
});
});
};
/**
* PUBLISH
*/
var publish = function publish(options) {
//spinner.start()
initRC(function (err, result) {
if (err) _print2.default.error(err);
locateComposrJson(function (err, config) {
if (err) return _print2.default.error(err);
(0, _publish2.default)(config, options);
});
});
};
/**
* UNPUBLISH
*/
var unpublish = function unpublish(options) {
initRC(function (err, result) {
if (err) _print2.default.error(err);
locateComposrJson(function (err, config) {
if (err) return _print2.default.error(err);
(0, _unpublisher2.default)(config, options);
});
});
};
/**
* Build
*/
var build = function build() {
locateComposrJson(function (err, config) {
if (err) return _print2.default.error(err);
(0, _build2.default)(config, function (err, results) {
if (err) _print2.default.error(err);
});
});
};
/**
* Get environments status
*/
var getStatus = function getStatus(options) {
locateComposrJson(function (err, obj) {
if (err) return _print2.default.error(err);
if (obj.environments && Array.isArray(obj.environments)) {
var envStatus = obj.environments.map(function (env) {
var status_ = '/status';
var urlBase = env.urlBase.replace('{{module}}/v1.0/', 'composr');
if (urlBase.slice(-1) === '/') {
status_ = 'status';
}
return urlBase + status_;
});
(0, _status2.default)(envStatus, _simpleSpinner2.default);
} else {
_print2.default.info('Unable to find valid environments properties in your local composr.json');
}
});
};
/**
* [locateComposrJson description]i
* @param {Function} next [description]
* @return {[type]} [description]
*/
var locateComposrJson = function locateComposrJson(next) {
_jsonfile2.default.readFile(process.cwd() + '/composr.json', function (err, obj) {
if (!err) {
next(null, obj);
} else {
var schema = {
properties: {
name: {
message: _safe2.default.cyan('Your project name'),
default: _path2.default.basename(process.cwd()),
type: 'string'
},
subdomain: {
message: 'Your domain',
default: 'mydomain',
type: 'string'
},
baseUri: {
message: 'Composr Endpoint',
default: 'https://composr-int.bqws.io/',
type: 'string'
},
author: {
message: 'Your name',
default: _path2.default.basename(getUserHome()),
type: 'string'
},
version: {
message: 'Version',
default: '1.0.0',
type: 'string'
},
source_location: {
message: 'Where is my code?',
default: 'src/',
type: 'string',
required: true
},
git: {
message: 'Git repository url',
default: '',
type: 'string'
},
license: {
message: 'License',
default: 'MIT',
type: 'string'
}
}
};
_prompt2.default.start();
_prompt2.default.get(schema, function (err, result) {
if (err) _print2.default.error(err);
result.vd_dependencies = {};
//result.domain = DOMAIN
//result.id = DOMAIN + '!' + result.name
result.environments = [];
// creating composr.json
_fs2.default.writeFile(process.cwd() + '/composr.json', (0, _stringify2.default)(result, null, 2), function (err) {
if (err) return next(err, false);
return next(null, result);
});
});
}
});
};
/**
* initRC
* @return next
*/
var initRC = function initRC(next) {
if (!_fs2.default.existsSync(USER_HOME_ROOT)) _fs2.default.mkdirSync(USER_HOME_ROOT);
locateRc(false, next);
};
/**
* [locateRc description]
* @return {[type]} [description]
*/
var locateRc = function locateRc(rewrite, next) {
_fs2.default.readFile(USER_HOME_ROOT + '/.composrc', 'utf8', function (err, credentialsYml) {
if (err || rewrite) {
// start prompt
_prompt2.default.start();
//
_prompt2.default.get([{
name: 'clientId',
required: true,
conform: function conform(value) {
return true;
}
}, {
name: 'clientSecret',
required: true,
conform: function conform(value) {
return true;
}
}, {
name: 'scopes',
required: true,
conform: function conform(value) {
return true;
}
}, {
name: 'urlBase',
required: true,
conform: function conform(value) {
return true;
}
}], function (err, result) {
if (err) return _print2.default.error(err);
var credentials = {
clientId: result.clientId || null,
clientSecret: result.clientSecret || null,
scopes: result.scopes || null,
urlBase: result.urlBase || null
};
loginClient(credentials, next);
});
} else {
loginClient(_yamljs2.default.parse(credentialsYml), next);
}
});
};
/**
* [login description]
* @param {[type]} credentials [description]
* @return {[type]} [description]
*/
var loginClient = function loginClient(credentials, next) {
(0, _login2.default)(credentials, function (err, creds, domain) {
if (err) {
_print2.default.error(err);
return next(err, null);
} else {
_print2.default.ok('Credentials verified... OK');
process.env.ACCESS_TOKEN = creds.accessToken;
return (0, _writeCredentials2.default)(USER_HOME_ROOT + '/.composrc', creds, next);
}
});
};
function startCommandLine() {
/**
* ------------------
* CLI INITIALIZATION
* ------------------
*/
var cli = (0, _commandLineArgs2.default)([{
name: 'publish',
alias: 'p',
type: Boolean
}, {
name: 'unpublish',
alias: 'u',
type: Boolean
}, {
name: 'init',
alias: 'i',
type: Boolean
}, {
name: 'status',
alias: 's',
type: Boolean
}, {
name: 'generate',
alias: 'g',
type: Boolean,
defaultOption: false
}, {
name: 'help',
alias: 'h',
type: Boolean,
defaultOption: true
}, {
name: 'phrases',
type: String,
multiple: true
}, {
name: 'version',
alias: 'v',
type: String
}, {
name: 'env',
alias: 'e',
type: String,
multiple: true
}, {
name: 'verbose',
alias: 'd',
type: Boolean
}, {
name: 'build',
alias: 'b',
type: Boolean
}, {
name: 'force',
alias: 'f',
type: Boolean
}, {
name: 'login',
alias: 'l',
type: Boolean
}, {
name: 'new',
alias: 'n',
type: Boolean
}]);
var options = cli.parse();
if (options.init === true) {
_print2.default.ok('Initialization ...');
init(options);
} else if (options.build === true) {
_print2.default.ok('Building definitions ...');
build(options);
} else if (options.publish === true) {
_print2.default.ok('Publish Loading ...');
publish(options);
} else if (options.unpublish === true) {
_print2.default.ok('Unpublish Loading ...');
unpublish(options);
} else if (options.status === true) {
_print2.default.ok('Loading environments status ...');
getStatus(options);
} else if (options.new === true) {
_print2.default.ok('Creating project ...');
(0, _bootstrap2.default)(null, function () {
_print2.default.ok('Your project is built');
});
} else if (options.generate === true) {
_print2.default.ok('Launching generator ...');
locateComposrJson(function (err, config) {
if (err) return _print2.default.error(err);
(0, _cliUi2.default)(config);
});
} else if (options.help === true) {
console.log(cli.getUsage());
} else if (options.login === true) {
locateRc(true, function (err, creds) {
_print2.default.ok('You are logged successfully');
});
} else {
salute();
//dashboard()
}
/**
* uncaughtException handler
*/
process.on('uncaughtException', function (err) {
_print2.default.error('Caught exception: ' + err);
});
}
var salute = function salute() {
_asciiArt2.default.font('Composr', 'Doom', 'bright_green', function (rendered) {
console.log(rendered);
console.log('Composr is a command line utility for bootstrapping your own composr projects');
console.log('Use -h to see the options. If you want to bootstrap a new project use composr -g');
console.log('-----------------------------------');
console.dir({
version: '0.5.0',
madeby: 'BQ'
});
});
};
module.exports = {
cli: startCommandLine,
build: build
};