UNPKG

forest-cli

Version:

The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.

169 lines 15.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@oclif/core"); const abstract_authenticated_command_1 = __importDefault(require("./abstract-authenticated-command")); const options_1 = require("./services/projects/create/options"); class AbstractProjectCreateCommand extends abstract_authenticated_command_1.default { constructor(argv, config, plan) { super(argv, config, plan); const { assertPresent, eventSender, optionParser, projectCreator, database, messages, spinner, databaseAnalyzer, } = this.context; assertPresent({ eventSender, optionParser, projectCreator, database, messages, spinner, databaseAnalyzer, }); this.eventSender = eventSender; this.optionParser = optionParser; this.projectCreator = projectCreator; this.database = database; this.messages = messages; this.spinner = spinner; this.databaseAnalyzer = databaseAnalyzer; } async runAuthenticated() { try { const { appConfig, dbConfig, language, meta, authenticationToken } = await this.getConfig(); this.spinner.start({ text: 'Creating your project on Forest Admin' }); const projectCreationPromise = this.projectCreator.create(authenticationToken, appConfig, meta); const { id, envSecret, authSecret } = await this.spinner.attachToPromise(projectCreationPromise); this.eventSender.meta.projectId = id; await this.testDatabaseConnection(dbConfig); await this.generateProject({ dbConfig, appConfig, forestAuthSecret: authSecret, forestEnvSecret: envSecret, language, }); await this.notifySuccess(); } catch (error) { // Display customized error for non-authentication errors. if (error.status !== 401 && error.status !== 403) { this.logger.error(['Cannot generate your project.', `${this.messages.ERROR_UNEXPECTED}`]); this.logger.log(`${this.chalk.red(error)}`); this.exit(1); } else { throw error; } } } async generateProject(config) { const schema = await this.analyzeDatabase(config.dbConfig); this.spinner.start({ text: 'Creating your project files' }); const dumpPromise = this.dump(config, schema); await this.spinner.attachToPromise(dumpPromise); } async analyzeDatabase(dbConfig) { const connection = await this.database.connect(dbConfig); this.spinner.start({ text: 'Analyzing the database' }); let schemaPromise; if (dbConfig.dbDialect === 'mongodb') { // the mongodb analyzer display a progress bar during the analysis schemaPromise = this.databaseAnalyzer.analyzeMongoDb(connection, dbConfig, true); } else { schemaPromise = this.databaseAnalyzer.analyze(connection, dbConfig, true); } const schema = await this.spinner.attachToPromise(schemaPromise); this.logger.success('Database is analyzed', { lineColor: 'green' }); await this.database.disconnect(connection); return schema; } async getConfig() { const config = await this.getCommandOptions(); // FIXME: Works as only one instance at execution time. Not ideal. this.eventSender.command = 'projects:create'; this.eventSender.applicationName = config.applicationName; if (!config.databaseDialect && !config.databaseConnectionURL) { this.logger.error('Missing database dialect option value'); this.exit(1); } const appConfig = { appName: config.applicationName, appHostname: config.applicationHost, appPort: Number(config.applicationPort), }; const dbConfig = { dbConnectionUrl: config.databaseConnectionURL, dbDialect: config.databaseDialect, dbSchema: config.databaseSchema, dbName: config.databaseName, dbHostname: config.databaseHost, dbPort: config.databasePort, dbSsl: config.databaseSSL, dbSslMode: config.databaseSslMode, dbUser: config.databaseUser, dbPassword: config.databasePassword, mongodbSrv: config.mongoDBSRV, }; const meta = { // FIXME: Remove the condition when the agent v1 command is dropped agent: this.agent || (dbConfig.dbDialect === 'mongodb' ? 'express-mongoose' : 'express-sequelize'), dbDialect: dbConfig.dbDialect, architecture: 'microservice', isLocal: ['localhost', '127.0.0.1', '::1'].some(keyword => dbConfig.dbHostname ? dbConfig.dbHostname.includes(keyword) : dbConfig.dbConnectionUrl?.includes(keyword)), }; // This `await` seems to be useless but removing it breaks the tests. // Leaving it here for now until we figure out why the mocks are not compatible with the implementation. const authenticationToken = (await this.authenticator.getAuthToken()) || ''; this.eventSender.sessionToken = authenticationToken; this.eventSender.meta = meta; return { appConfig, dbConfig, language: config.language, meta, authenticationToken, }; } async getCommandOptions() { const options = await this.optionParser.getCommandLineOptions(this); // Dialect must be set for the project creator to work even if the connection URL is provided options.databaseDialect = (0, options_1.getDialect)(options); // Support both `databaseSSL` and `databaseSslMode` options if (options.databaseSSL !== undefined && options.databaseSslMode === undefined) { options.databaseSslMode = options.databaseSSL ? 'preferred' : 'disabled'; } else if (options.databaseSSL === undefined && options.databaseSslMode !== undefined) { options.databaseSSL = options.databaseSslMode !== 'disabled'; } else { options.databaseSslMode = 'preferred'; // Default is preferred for agent-nodejs options.databaseSSL = false; // Default is false for forest-express } return options; } async testDatabaseConnection(dbConfig) { this.spinner.start({ text: 'Testing connection to your database' }); const connectionPromise = this.database .connect(dbConfig) .then(connection => this.database.disconnect(connection)); await this.spinner.attachToPromise(connectionPromise); } async notifySuccess() { this.logger.info(`Hooray, ${this.chalk.green('installation success')}!`); await this.eventSender.notifySuccess(); } } exports.default = AbstractProjectCreateCommand; AbstractProjectCreateCommand.args = { applicationName: core_1.Args.string({ name: 'applicationName', required: true, description: 'Name of the project to create.', }), }; /** @see https://oclif.io/docs/commands */ AbstractProjectCreateCommand.description = 'Create a new Forest Admin project.'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtcHJvamVjdC1jcmVhdGUtY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hYnN0cmFjdC1wcm9qZWN0LWNyZWF0ZS1jb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBYUEsc0NBQW1DO0FBRW5DLHNHQUE0RTtBQUM1RSxnRUFBZ0U7QUFFaEUsTUFBOEIsNEJBQTZCLFNBQVEsd0NBQTRCO0lBNEI3RixZQUFZLElBQWMsRUFBRSxNQUFtQixFQUFFLElBQUk7UUFDbkQsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFMUIsTUFBTSxFQUNKLGFBQWEsRUFDYixXQUFXLEVBQ1gsWUFBWSxFQUNaLGNBQWMsRUFDZCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE9BQU8sRUFDUCxnQkFBZ0IsR0FDakIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRWpCLGFBQWEsQ0FBQztZQUNaLFdBQVc7WUFDWCxZQUFZO1lBQ1osY0FBYztZQUNkLFFBQVE7WUFDUixRQUFRO1lBQ1IsT0FBTztZQUNQLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0MsQ0FBQztJQUVTLEtBQUssQ0FBQyxnQkFBZ0I7UUFDOUIsSUFBSTtZQUNGLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJB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