apiconnect-cli-loopback
Version:
Plugin for IBM API Connect Developer Toolkit
141 lines (129 loc) • 4.08 kB
JavaScript
/********************************************************* {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,
};