@boostercloud/cli
Version:
CLI of the Booster Framework, the next level of abstraction for cloud-native applications
147 lines (146 loc) • 6.43 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseConfig = void 0;
const core_1 = require("@oclif/core");
const script_1 = require("../../common/script");
const brand_1 = require("../../common/brand");
const project_initializer_1 = require("../../services/project-initializer");
const user_prompt_1 = require("../../services/user-prompt");
const provider_service_1 = require("../../services/provider-service");
const project_checker_1 = require("../../services/project-checker");
class Project extends core_1.Command {
async run() {
const { args, flags } = await this.parse(Project);
const { projectName } = args;
try {
if (!projectName)
throw "You haven't provided a project name, but it is required, run with --help for usage";
(0, provider_service_1.assertNameIsCorrect)(projectName);
await (0, project_checker_1.checkProjectAlreadyExists)(projectName);
const parsedFlags = { projectName, ...flags };
await run(parsedFlags, this.config.version);
}
catch (error) {
console.error(error);
}
}
}
Project.description = 'create a new project from scratch';
Project.flags = {
help: core_1.Flags.help({ char: 'h' }),
description: core_1.Flags.string({
char: 'd',
description: 'a short description',
}),
version: core_1.Flags.string({
char: 'v',
description: 'the initial version',
}),
author: core_1.Flags.string({
char: 'a',
description: 'who is writing this?',
}),
homepage: core_1.Flags.string({
char: 'H',
description: 'the website of this project',
}),
license: core_1.Flags.string({
char: 'l',
description: 'which license will you use?',
}),
repository: core_1.Flags.string({
char: 'r',
description: 'the URL of the repository',
}),
providerPackageName: core_1.Flags.string({
char: 'p',
description: 'package name implementing the cloud provider integration where the application will be deployed (i.e: "@boostercloud/framework-provider-azure")',
}),
default: core_1.Flags.boolean({
description: 'generates the project with default parameters (i.e. --license=MIT)',
default: false,
}),
skipInstall: core_1.Flags.boolean({
description: 'skip dependencies installation',
default: false,
}),
skipGit: core_1.Flags.boolean({
description: 'skip git initialization',
default: false,
}),
};
Project.args = {
projectName: core_1.Args.string(),
};
exports.default = Project;
const run = async (flags, boosterVersion) => script_1.Script.init(`boost ${brand_1.default.energize('new')} 🚧`, (0, exports.parseConfig)(new user_prompt_1.default(), flags, boosterVersion))
.step('Creating project root', project_initializer_1.generateRootDirectory)
.step('Generating config files', project_initializer_1.generateConfigFiles)
.optionalStep(Boolean(flags.skipInstall), 'Installing dependencies', project_initializer_1.installDependencies)
.optionalStep(Boolean(flags.skipGit), 'Initializing git repository', project_initializer_1.initializeGit)
.info('Project generated!')
.done();
const getSelectedProviderPackage = (provider) => {
switch (provider) {
case "@boostercloud/framework-provider-aws (AWS) - Currently deprecated" /* Provider.AWS */:
return '@boostercloud/framework-provider-aws';
case "@boostercloud/framework-provider-azure (Azure)" /* Provider.AZURE */:
return '@boostercloud/framework-provider-azure';
default:
return '';
}
};
const getProviderPackageName = async (prompter, providerPackageName) => {
if (providerPackageName) {
return providerPackageName;
}
const providerSelection = (await prompter.defaultOrChoose(providerPackageName, "What's the package name of your provider infrastructure library?", ["@boostercloud/framework-provider-aws (AWS) - Currently deprecated" /* Provider.AWS */, "@boostercloud/framework-provider-azure (Azure)" /* Provider.AZURE */, "Other" /* Provider.OTHER */]));
if (providerSelection === "Other" /* Provider.OTHER */) {
return await prompter.defaultOrPrompt(undefined, "What's the other provider integration library? e.g. @boostercloud/framework-provider-azure");
}
else {
return getSelectedProviderPackage(providerSelection);
}
};
const parseConfig = async (prompter, flags, boosterVersion) => {
if (flags.default) {
return Promise.resolve({
projectName: flags.projectName,
providerPackageName: '@boostercloud/framework-provider-aws',
description: '',
version: '0.1.0',
author: '',
homepage: '',
license: 'MIT',
repository: '',
boosterVersion,
default: flags.default,
skipInstall: flags.skipInstall || false,
skipGit: flags.skipGit || false,
});
}
const description = await prompter.defaultOrPrompt(flags.description, 'What\'s your project description? (default: "")');
const versionPrompt = await prompter.defaultOrPrompt(flags.version, "What's the first version? (default: 0.1.0)");
const version = versionPrompt || '0.1.0';
const author = await prompter.defaultOrPrompt(flags.author, 'Who\'s the author? (default: "")');
const homepage = await prompter.defaultOrPrompt(flags.homepage, 'What\'s the website? (default: "")');
const licensePrompt = await prompter.defaultOrPrompt(flags.license, 'What license will you be publishing this under? (default: MIT)');
const license = licensePrompt || 'MIT';
const repository = await prompter.defaultOrPrompt(flags.repository, 'What\'s the URL of the repository? (default: "")');
const providerPackageName = await getProviderPackageName(prompter, flags.providerPackageName);
return Promise.resolve({
projectName: flags.projectName,
providerPackageName,
description,
version,
author,
homepage,
license,
repository,
boosterVersion,
default: false,
skipInstall: flags.skipInstall || false,
skipGit: flags.skipGit || false,
});
};
exports.parseConfig = parseConfig;