apiconnect-cli-loopback
Version:
Plugin for IBM API Connect Developer Toolkit
137 lines (120 loc) • 4.29 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 _ = require('lodash');
var project = require('apiconnect-project');
var debug = require('debug')('apic:plugin:loopback');
var g = require('strong-globalize')();
var genApiAndProduct = require('./swagger').genApiAndProduct;
var logger = require('apiconnect-cli-logger');
var path = require('path');
module.exports.exportApiDef = function() {
ensureInProject();
return loopback({});
};
module.exports.refresh = function() {
ensureInProject();
return genApiAndProduct();
};
module.exports.lbGenerator = function() {
ensureInProject();
return loopback({}).then(genApiAndProduct);
};
/**
* name is an undocumented argument that is supported for the sake
* of backward compatibility.
*/
module.exports.launchGenerator = function launchGenerator(name, options) {
ensureInProject();
if (options == null) {
options = name;
name = null;
}
// If someone provides both name arg and option, favor the option
name = _.isFunction(options.name) ? name : options.name;
var argv = process.argv.slice(0, 2);
argv.push('loopback:' + options.type);
if (name) { argv.push(name); }
if (options.skipCache) {
argv.push('--skip-cache');
}
process.argv = argv;
return loopback({}).then(genApiAndProduct);
};
function loopback(opts) {
// LB modules take a long time to load so require modules inside the function
// in order to reduce command load times
var lbGenerator = require('generator-loopback');
//generator-loopback checks this variable to determine where its originated
process.env.SLC_COMMAND = 'apic';
var yeomanEnv = lbGenerator._yeomanEnv; // generator-loopback should export _yeomanEnv
if (!yeomanEnv) {
try {
// Try to use the yeoman-generator from generator-loopback module
yeomanEnv = require('generator-loopback/node_modules/yeoman-environment');
} catch (err) {
// Fall back the peer/parent dep
yeomanEnv = require('yeoman-environment');
}
}
var env = yeomanEnv.createEnv();
// Make sure apic loopback is delegated to apic loopback:app (the default
// subgenerator)
env.alias(/^([^:]+)$/, '$1:app');
// Change the working directory to the generator-loopback module so that
// yoeman can discover the generators
var root = path.dirname(require.resolve('generator-loopback/package.json'));
var cwd = process.cwd();
debug('changing directory to %s', root);
process.chdir(root);
// lookup for every namespaces, within the environments.paths and lookups
env.lookup();
debug('changing directory back to %s', cwd);
process.chdir(cwd); // Switch back
if (opts.version) {
var _package = lbGenerator._package;
if (!_package) {
var pkg = require('generator-loopback/package.json');
_package = pkg.name + ': ' + pkg.version;
}
logger.writeln(_package);
return;
}
// list generators
if (opts.generators) {
logger.writeln(g.f('Available LoopBack generators: '));
logger.writeln(Object.keys(env.getGeneratorsMeta()).filter(function(name) {
return name.indexOf('loopback:') !== -1;
}).join('\n'));
return;
}
var args = process.argv.slice(2);
debug('invoking apic %s', args.join(' '));
return new Promise(function(resolve, reject) {
env.run(args, opts, function(err) {
if (err) {
logger.error(g.f('Error apic %s\n%s', args.join(' '),
opts.debug ? err.stack : err.message));
return reject(err);
}
logger.writeln(g.f('Done running LoopBack generator'));
resolve();
});
});
}
function ensureInProject() {
var info = project.inspectPath(process.cwd());
if (info.type !== 'project' || info.projectType !== 'loopback') {
throw new Error(g.f('This is not a LoopBack project directory.'));
}
};