forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
149 lines • 14.5 kB
JavaScript
const { Flags } = require('@oclif/core');
const AbstractAuthenticatedCommand = require('../abstract-authenticated-command').default;
const withCurrentProject = require('../services/with-current-project');
const ProjectManager = require('../services/project-manager');
const EnvironmentManager = require('../services/environment-manager');
const { handleInitError, handleDatabaseConfiguration, validateEndpoint, getApplicationPortFromCompleteEndpoint, amendDotenvFile, createDotenvFile, displayEnvironmentVariablesAndCopyToClipboard, } = require('../services/init-manager');
const SUCCESS_MESSAGE_ALL_SET_AND_READY = "You're now set up and ready to develop on Forest Admin";
const SUCCESS_MESSAGE_LEARN_MORE_ON_CLI_USAGE = 'To learn more about the recommended usage of this CLI, please visit https://docs.forestadmin.com/documentation/reference-guide/how-it-works/developing-on-forest-admin/forest-cli-commands.';
const PROMPT_MESSAGE_AUTO_FILLING_ENV_FILE = 'Do you want your current folder `.env` file to be completed automatically with your environment variables?';
const PROMPT_MESSAGE_AUTO_CREATING_ENV_FILE = 'Do you want a new `.env` file (containing your environment variables) to be automatically created in your current folder?';
class InitCommand extends AbstractAuthenticatedCommand {
constructor(argv, config, plan) {
super(argv, config, plan);
const { assertPresent, env, fs, inquirer, spinner, buildDatabaseUrl } = this.context;
assertPresent({
env,
fs,
inquirer,
spinner,
buildDatabaseUrl,
});
this.env = env;
this.fs = fs;
this.inquirer = inquirer;
this.spinner = spinner;
this.buildDatabaseUrl = buildDatabaseUrl;
this.environmentVariables = {};
}
async runAuthenticated() {
try {
this.spinner.start({ text: 'Selecting your project' });
await this.spinner.attachToPromise(this.projectSelection());
this.spinner.start({ text: 'Analyzing your setup' });
await this.spinner.attachToPromise(this.projectValidation());
this.spinner.start({ text: 'Checking your database setup' });
await this.spinner.attachToPromise(this.handleDatabaseUrlConfiguration());
this.spinner.start({ text: 'Setting up your development environment' });
await this.spinner.attachToPromise(this.developmentEnvironmentCreation());
await this.environmentVariablesAutoFilling();
this.spinner.start({ text: SUCCESS_MESSAGE_ALL_SET_AND_READY });
this.spinner.success();
this.logger.info(SUCCESS_MESSAGE_LEARN_MORE_ON_CLI_USAGE);
}
catch (error) {
const exitMessage = handleInitError(error);
this.logger.error(exitMessage);
this.exit(1);
}
}
async projectSelection() {
const parsed = await this.parse(InitCommand);
this.config = await withCurrentProject({
...this.env,
...parsed.flags,
includeLegacy: true,
});
}
async projectValidation() {
const project = await new ProjectManager(this.config).getProjectForDevWorkflow();
this.environmentVariables.projectOrigin = project.origin;
}
async handleDatabaseUrlConfiguration() {
if (this.environmentVariables.projectOrigin !== 'In-app') {
const isDatabaseAlreadyConfigured = !!this.env.DATABASE_URL;
if (!isDatabaseAlreadyConfigured) {
this.spinner.pause();
const databaseConfiguration = await handleDatabaseConfiguration();
this.spinner.continue();
if (databaseConfiguration) {
const dbConfig = {
dbConnectionUrl: databaseConfiguration.dbConnectionUrl,
dbDialect: databaseConfiguration.databaseDialect,
dbHostname: databaseConfiguration.databaseHost,
dbName: databaseConfiguration.databaseName,
dbPassword: databaseConfiguration.databasePassword,
dbPort: databaseConfiguration.databasePort,
dbSchema: databaseConfiguration.databaseSchema,
dbUser: databaseConfiguration.databaseUser,
mongodbSrv: databaseConfiguration.mongodbSrv,
ssl: databaseConfiguration.databaseSSL,
};
this.environmentVariables.databaseUrl = this.buildDatabaseUrl(dbConfig);
this.environmentVariables.databaseSchema = databaseConfiguration.databaseSchema;
this.environmentVariables.databaseSSL = databaseConfiguration.ssl;
}
}
}
}
async developmentEnvironmentCreation() {
let developmentEnvironment;
try {
developmentEnvironment = await new ProjectManager(this.config).getDevelopmentEnvironmentForUser(this.config.projectId);
}
catch (error) {
developmentEnvironment = null;
}
if (!developmentEnvironment) {
this.spinner.pause();
const prompter = await this.inquirer.prompt([
{
name: 'endpoint',
message: 'Enter your local admin backend endpoint:',
type: 'input',
default: 'http://localhost:3310',
validate: validateEndpoint,
},
]);
this.spinner.continue();
developmentEnvironment = await new EnvironmentManager(this.config).createDevelopmentEnvironment(this.config.projectId, prompter.endpoint);
}
this.environmentVariables.forestEnvSecret = developmentEnvironment.secretKey;
this.environmentVariables.applicationPort = getApplicationPortFromCompleteEndpoint(developmentEnvironment.apiEndpoint);
}
async environmentVariablesAutoFilling() {
if (this.environmentVariables.projectOrigin !== 'In-app') {
const existingEnvFile = this.fs.existsSync('.env');
const response = await this.inquirer.prompt([
{
type: 'confirm',
name: 'autoFillOrCreationConfirmation',
message: existingEnvFile
? PROMPT_MESSAGE_AUTO_FILLING_ENV_FILE
: PROMPT_MESSAGE_AUTO_CREATING_ENV_FILE,
},
]);
if (response.autoFillOrCreationConfirmation) {
try {
return existingEnvFile
? amendDotenvFile(this.environmentVariables)
: createDotenvFile(this.environmentVariables);
}
catch (error) {
return displayEnvironmentVariablesAndCopyToClipboard(this.environmentVariables);
}
}
}
return displayEnvironmentVariablesAndCopyToClipboard(this.environmentVariables);
}
}
InitCommand.aliases = ['environments:init'];
InitCommand.description = 'Set up your development environment in your current folder.';
InitCommand.flags = {
projectId: Flags.integer({
char: 'p',
description: 'The id of the project you want to init.',
}),
};
module.exports = InitCommand;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbml0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDekMsTUFBTSw0QkFBNEIsR0FBRyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDMUYsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztBQUN2RSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUM5RCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLE1BQU0sRUFDSixlQUFlLEVBQ2YsMkJBQTJCLEVBQzNCLGdCQUFnQixFQUNoQixzQ0FBc0MsRUFDdEMsZUFBZSxFQUNmLGdCQUFnQixFQUNoQiw2Q0FBNkMsR0FDOUMsR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUV4QyxNQUFNLGlDQUFpQyxHQUFHLHdEQUF3RCxDQUFDO0FBQ25HLE1BQU0sdUNBQXVDLEdBQzNDLDZMQUE2TCxDQUFDO0FBRWhNLE1BQU0sb0NBQW9DLEdBQ3hDLDRHQUE0RyxDQUFDO0FBQy9HLE1BQU0scUNBQXFDLEdBQ3pDLDJIQUEySCxDQUFDO0FBRTlILE1BQU0sV0FBWSxTQUFRLDRCQUE0QjtJQUNwRCxZQUFZLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUM1QixLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDckYsYUFBYSxDQUFDO1lBQ1osR0FBRztZQUNILEVB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