UNPKG

apiconnect-cli-loopback

Version:

Plugin for IBM API Connect Developer Toolkit

137 lines (120 loc) 4.29 kB
/********************************************************* {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 'use strict'; 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.')); } };