apiconnect-cli-loopback
Version:
Plugin for IBM API Connect Developer Toolkit
132 lines (122 loc) • 4.6 kB
JavaScript
/********************************************************* {COPYRIGHT-TOP} ***
* Licensed Materials - Property of IBM
* 5725-Z22, 5725-Z63, 5725-U33, 5725-Z63
*
* (C) Copyright IBM Corporation 2016, 2017
*
* All Rights Reserved.
* US Government Users Restricted Rights - Use, duplication or disclosure
* restricted by GSA ADP Schedule Contract with IBM Corp.
********************************************************** {COPYRIGHT-END} **/
// Node module: apiconnect-cli-loopback
;
var Promise = require('bluebird');
var Workspace = require('loopback-workspace').models.Workspace;
var chalk = require('chalk');
var genApiAndProduct = require('./swagger').genApiAndProduct;
var g = require('strong-globalize')();
var glob = Promise.promisify(require('glob'));
var logger = require('apiconnect-cli-logger');
var mkdirp = Promise.promisify(require('mkdirp'));
var prompt = require('./app-prompt').prompt;
var readdir = Promise.promisify(require('fs').readdir);
var writeFile = Promise.promisify(require('fs').writeFile);
var npmInstall = require('./npm-install');
/**
* Create a new loopback project
*
* @param {object} [options]
* @param {string} [options.name] Application name
* @param {string} [options.dir] Application directory
* @param {string} [options.template] Loopback template
* @param {string} [options.explorer] Enable loopback-explorer endpoint
* @param {Stream} [options.outstream]
* @param {Stream} [options.errstream]
* @param {boolean} [options.skipNextSteps] Skip next steps message
* @param {boolean} [options.skipInstall] Skip npm install
* @param {string} [options.npmLogLevel] Log verbosity for npm install command
* @param {boolean} [options.npmLogPipe] Log npm output to outstream instead of process.stdout/stderr
*
* Warn: Sideeffect of this function changes process.cwd and process.env.WORKSPACE_DIR to options.dir
*/
function create(options) {
options = options || {};
options.outstream = options.outstream || logger;
options.errstream = options.errstream || logger;
var createFromTemplate = Promise.promisify(Workspace.createFromTemplate);
return prompt(options).then(function(answers) {
return mkdirp(answers.dir).then(function() {
return readdir(answers.dir);
}).then(function(files) {
if (files.length > 0) {
throw new Error(g.f('Directory %s is not empty.', answers.dir));
}
process.chdir(answers.dir);
process.env.WORKSPACE_DIR = answers.dir;
options.dir = answers.dir;
}).then(function() {
return createFromTemplate(
answers.template,
answers.name,
{
'loopback-component-explorer': !!options.explorer,
loopbackVersion: answers.loopbackVersion,
}
);
}).then(function() {
return writeFile('.yo-rc.json', '{}', 'utf8');
}).then(function() {
return glob('**', { ignore: 'node_modules/**' }).then(function(files) {
files.forEach(function(file) {
options.outstream.write(chalk.green(' Created ') + file + '\n');
});
});
}).then(function() {
if (options.skipInstall) {
return;
}
return npmInstall(options);
}).then(function() {
if (options.skipInstall) {
return;
}
return genApiAndProduct();
}).then(function() {
if (options.skipNextSteps) {
return;
}
return printNextSteps({
logger: options.outstream,
dir: answers.dir,
skipInstall: options.skipInstall,
});
}).return(answers.dir);
});
};
module.exports = create;
function printNextSteps(opts) {
var logger = opts.logger;
logger.write('\n');
logger.write(g.f('Next steps:\n'));
logger.write('\n');
if (opts.dir && opts.dir !== '.') {
logger.write(g.f(' Change directory to your app\n'));
logger.write(chalk.green(g.f(' $ cd ' + opts.dir + '\n')));
logger.write('\n');
}
if (opts.skipInstall) {
logger.write(g.f(' Install the required dependencies\n'));
logger.write(chalk.green(g.f(' $ npm install\n')));
logger.write('\n');
logger.write(g.f(' Generate product and swagger files\n'));
logger.write(chalk.green(g.f(' $ apic loopback:refresh\n')));
logger.write('\n');
}
logger.write(g.f(' Create a model in your app\n'));
logger.write(chalk.green(g.f(' $ apic create --type model\n')));
logger.write('\n');
logger.write(g.f(' Compose your API, run, manage, enforce and deploy' +
' it with API Connect\n'));
logger.write(chalk.green(g.f(' $ apic edit\n')));
logger.write('\n');
};