@dabblelab/plugin-autopilot
Version:
Create, Update, Delete, List, Simulate, Import and Export Twilio Autopilot Bot
108 lines (83 loc) • 3.2 kB
JavaScript
const git = require('simple-git/promise'),
path = require("path"),
request = require('request-promise'),
ora = require('ora')
urlUtils = require("../url-utils");
const cloneTemplate = async(option, inquirer) => {
const templateUrl = (option.url && urlUtils.isValidUrl(option.url)) ? option.url : 'https://cdn.dabblelab.com/templates-autopilot.json';
const templateMap = await getTemplateMap(templateUrl),
templateList = Object.keys(templateMap),
template_name = await getTargetTemplateName(templateList, option.template, inquirer),
cloneTemplate = templateMap[template_name];
await gitCloneTemplate(cloneTemplate, option.botName || '');
return option.botName || cloneTemplateFolderName(cloneTemplate.gitUrl);
}
function getTemplateMap(templateUrl) {
let GIT_ENDPOINT = templateUrl;
let headers = {};
headers['User-Agent'] = 'twilio-autopilot-cli/' + require('../../../package.json').version +
' Node/' + process.version;
let params = {
url: GIT_ENDPOINT,
method: 'GET',
headers: headers
};
return request(params)
.then((response) => {
let templatesJSONMap = response;
try {
if (typeof(response) === 'string') {
templatesJSONMap = JSON.parse(response);
}
} catch (e) {
throw new Error('Failed to parse the response from Twilio Autopilot API Service.');
}
return templatesJSONMap;
}).catch((error) => {
let err = 'Cannot retrieve Twilio Autopilot template list from GitHub repository.';
throw new Error(err);
});
}
function getTargetTemplateName(templateList, inputName, inquirer) {
if (inputName) {
if (templateList.indexOf(inputName) === -1) {
let error = '[Error]: no template associated with the input name';
throw new Error(error);
} else {
return inputName;
}
} else {
let templateChoiceQuestion = {
type: 'list',
message: 'List of templates you can choose from',
name: 'templateName',
choices: templateList.sort()
};
return inquirer.prompt([templateChoiceQuestion])
.then((answer) => {
let templateName = answer.templateName;
return templateName;
});
}
}
const gitCloneTemplate = async(cloneTemplate, botName) =>{
const spinner = ora().start(' Initializing Twilio Autopilot project from' +
' template...')
let cloneDir = path.resolve(process.cwd(), botName || cloneTemplateFolderName(cloneTemplate.gitUrl));
return git().silent(true)
.clone(cloneTemplate.gitUrl, cloneDir)
.then(async (status) => {
spinner.succeed()
return cloneDir;
}).catch((error) => {
spinner.fail();
throw error;
})
}
function cloneTemplateFolderName(templateURL){
const baseName = path.basename(templateURL);
return baseName.substring(0, baseName.indexOf("."));
}
module.exports = {
cloneTemplate
};