ask-cli
Version:
Alexa Skills Kit (ASK) Command Line Interfaces
146 lines (135 loc) • 5.53 kB
JavaScript
const GitClient = require('@src/clients/git-client');
const { AbstractCommand } = require('@src/commands/abstract-command');
const optionModel = require('@src/commands/option-model');
const Messenger = require('@src/view/messenger');
const profileHelper = require('@src/utils/profile-helper');
const CONSTANTS = require('@src/utils/constants');
const helper = require('./helper');
const hostedSkillHelper = require('./hosted-skill-helper');
class UpgradeProjectCommand extends AbstractCommand {
name() {
return 'upgrade-project';
}
description() {
return 'upgrade the v1 ask-cli skill project to v2 structure';
}
requiredOptions() {
return [];
}
optionalOptions() {
return ['profile', 'debug'];
}
handle(cmd, cb) {
let profile, upgradeInfo;
try {
profile = profileHelper.runtimeProfile(cmd.profile);
const { v1Config, isDeployed } = helper.loadV1ProjConfig(process.cwd(), profile);
// 0.upgrade if project is un-deployed v1 template
if (!isDeployed) {
helper.attemptUpgradeUndeployedProject(process.cwd(), v1Config, profile);
Messenger.getInstance().info('Template project migration finished.');
return cb();
}
// 1.extract upgrade-necessary information and confirm project is upgrade-able
upgradeInfo = helper.extractUpgradeInformation(v1Config, profile);
} catch (checkErr) {
Messenger.getInstance().error(checkErr);
return cb(checkErr);
}
// 2.preview new project structure
helper.previewUpgrade(upgradeInfo, (previewErr, previewConfirm) => {
if (previewErr) {
Messenger.getInstance().error(previewErr);
return cb(previewErr);
}
if (!previewConfirm) {
Messenger.getInstance().info('Command upgrade-project aborted.');
return cb();
}
// 3.create v2 project based on the upgrade info
if (upgradeInfo.isHosted) {
_createV2HostedSkillProject(upgradeInfo, profile, cmd.debug, (v2Err) => {
if (v2Err) {
Messenger.getInstance().error(v2Err);
return cb(v2Err);
}
Messenger.getInstance().info('Project migration finished.');
cb();
});
} else {
_createV2NonHostedSkillProject(upgradeInfo, profile, cmd.debug, (v2Err) => {
if (v2Err) {
Messenger.getInstance().error(v2Err);
return cb(v2Err);
}
Messenger.getInstance().info('Project migration finished.');
cb();
});
}
});
}
}
function _createV2HostedSkillProject(upgradeInfo, profile, doDebug, callback) {
const rootPath = process.cwd();
const { skillId, gitRepoUrl } = upgradeInfo;
const verbosityOptions = {
showCommand: !!doDebug,
showOutput: !!doDebug
};
const gitClient = new GitClient(rootPath, verbosityOptions);
try {
hostedSkillHelper.checkIfDevBranchClean(gitClient);
// 1.move v1 skill project content into legacy folder
helper.moveOldProjectToLegacyFolder(rootPath);
// 2.instantiate MVC and ask-resource config
hostedSkillHelper.createV2ProjectSkeletonAndLoadModel(rootPath, skillId, profile);
} catch (initProjErr) {
return callback(initProjErr);
}
// 3.import skill metadata
hostedSkillHelper.downloadSkillPackage(rootPath, skillId, CONSTANTS.SKILL.STAGE.DEVELOPMENT, profile, doDebug, (packageErr) => {
if (packageErr) {
return callback(packageErr);
}
// 4.copy Lambda code to skill code and update deploy state
try {
hostedSkillHelper.handleExistingLambdaCode(rootPath, gitRepoUrl, profile);
} catch (codeErr) {
return callback(codeErr);
}
// 5. config git setting
hostedSkillHelper.postUpgradeGitSetup(profile, doDebug, gitClient, (gitErr) => {
if (gitErr) {
return callback(gitErr);
}
callback();
});
});
}
function _createV2NonHostedSkillProject(upgradeInfo, profile, doDebug, callback) {
const rootPath = process.cwd();
const { skillId, lambdaResources } = upgradeInfo;
try {
// 1.move v1 skill project content into legacy folder
helper.moveOldProjectToLegacyFolder(rootPath);
// 2.instantiate MVC and ask-resource config
helper.createV2ProjectSkeletonAndLoadModel(rootPath, skillId, profile);
} catch (initProjErr) {
return callback(initProjErr);
}
// 3.import skill metadata from skillId
helper.downloadSkillPackage(rootPath, skillId, CONSTANTS.SKILL.STAGE.DEVELOPMENT, profile, doDebug, (packageErr) => {
if (packageErr) {
return callback(packageErr);
}
// 4.copy Lambda code to skill code
try {
helper.handleExistingLambdaCode(rootPath, lambdaResources, profile);
callback();
} catch (codeErr) {
callback(codeErr);
}
});
}
module.exports = UpgradeProjectCommand;
module.exports.createCommand = new UpgradeProjectCommand(optionModel).createCommand();