UNPKG

apiconnect-cli-loopback

Version:

Plugin for IBM API Connect Developer Toolkit

141 lines (129 loc) 4.08 kB
/********************************************************* {COPYRIGHT-TOP} *** * Licensed Materials - Property of IBM * 5725-Z22, 5725-Z63, 5725-U33, 5725-Z63 * * (C) Copyright IBM Corporation 2016, 2018 * * 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 g = require('strong-globalize')(); var Promise = require('bluebird'); var Workspace = require('loopback-workspace').models.Workspace; var _ = require('lodash'); var describeAvailableTemplates = Promise.promisify(Workspace.describeAvailableTemplates); var inquirer = require('inquirer'); var path = require('path'); function getTemplateList() { return describeAvailableTemplates().then(function(templates) { templates = _.filter(templates, function(t) { return t.name !== 'api-server'; }); return templates; }); }; function templateFilter(templates, LBVersion) { return _.filter(templates, function(t) { return t.supportedLBVersions.indexOf(LBVersion) !== -1; }); }; function promptNewApp(options) { if (options.name && typeof options.name !== 'function' && options.template && options.dir) { return Promise.resolve(options); } var inputs = [ { type: 'input', message: g.f('What\'s the name of your application?'), name: 'name', default: function() { if (options.name && typeof options.name !== 'function') { return options.name; } return path.basename(process.cwd()).replace(/[\/@\s\+%:\.]+?/g, '-'); }, validate: validateAppName, }, { type: 'input', message: g.f('Enter name of the directory to contain the project:'), name: 'dir', default: function(answers) { return path.relative(process.cwd(), getAppPath(answers)); }, when: function(answers) { var basepath = path.basename(process.cwd()); return path.basename(basepath) !== answers.name; }, }, { type: 'list', message: g.f('What kind of application do you have in mind?'), name: 'template', choices: function(answers) { return getTemplateList() .then(function(templates) { return templateFilter(templates, '3.x'); }) .then(function(filteredTemplates) { return _.map(filteredTemplates, function(t) { return { name: t.name + ' (' + t.description + ')', short: t.name, value: t.name, }; }); }); }, default: 'hello-world', } ]; return new Promise(function(resolve, reject) { inquirer.prompt(inputs) .then(function(answers) { if (!answers.dir) { answers.dir = getAppPath(answers); } else { answers.dir = path.resolve(answers.dir); } answers.loopbackVersion = '3.x'; return resolve(answers); }); }); function getAppPath(answers) { var basepath = path.basename(process.cwd()); if (path.basename(basepath) === answers.name) { return path.resolve(process.cwd()); } else { return path.resolve(answers.name); } } } /** * validate application (module) name * @param name * @returns {String|Boolean} */ function validateAppName(name) { if (name.charAt(0) === '.') { return g.f('Application name cannot start with .: %s', name); } if (name.match(/[\/@\s\+%:]/)) { return g.f( 'Application name cannot contain special characters (/@+%: ): %s', name); } if (name.toLowerCase() === 'node_modules') { return g.f('Application name cannot be node_modules'); } if (name.toLowerCase() === 'favicon.ico') { return g.f('Application name cannot be favicon.ico'); } if (name !== encodeURIComponent(name)) { return g.f('Application name cannot contain special characters' + ' escaped by encodeURIComponent: %s', name); } return true; }; module.exports = { prompt: promptNewApp, getTemplateList: getTemplateList, };