pg-create-db
Version:
Database creation tool for PostgreSQL database server
85 lines (84 loc) • 6.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createDatabase = createDatabase;
exports.checkToRunCreateDatabaseHandler = checkToRunCreateDatabaseHandler;
exports.createDatabaseHandler = createDatabaseHandler;
const commander_1 = require("commander");
const cosmiconfig_1 = require("cosmiconfig");
const path_1 = require("path");
const default_1 = require("../constants/default");
const env_keys_1 = require("../constants/env-keys");
const create_database_service_1 = require("../services/create-database.service");
const replace_env_1 = require("../utils/replace-env");
function createDatabase(program) {
program
.addOption(new commander_1.Option('-d,--dry-run <boolean>', 'Show queries to execute without apply them in database')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.dryRun)
.env(env_keys_1.PG_CREATE_DB_DRY_RUN))
.addOption(new commander_1.Option('-c,--config <string>', 'Configuration file for bulk migrations (example content: [{"databaseUrl":"postgres://${POSTGRES_USER}:POSTGRES_PASSWORD@localhost:POSTGRES_PORT/POSTGRES_DATABASE?schema=public"}], rules: https://github.com/cosmiconfig/cosmiconfig)')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.config)
.env(env_keys_1.PG_CREATE_DB_CONFIG))
.addOption(new commander_1.Option('-r,--root-database-url <string>', 'Database url for connect as root user (example: postgres://postgres:ROOT_POSTGRES_PASSWORD@localhost:POSTGRES_PORT/postgres?schema=public)')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.rootDatabaseUrl)
.env(env_keys_1.PG_CREATE_DB_ROOT_DATABASE_URL))
.addOption(new commander_1.Option('-a,--app-database-url <string>', 'Application database url used for create new database (example: postgres://POSTGRES_USER:POSTGRES_PASSWORD@localhost:POSTGRES_PORT/POSTGRES_DATABASE?schema=public)')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.appDatabaseUrl)
.env(env_keys_1.PG_CREATE_DB_APP_DATABASE_URL))
.addOption(new commander_1.Option('-n,--force-change-username <boolean>', 'Force rename username if one exists in database for app-database-url excluding root')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.forceChangeUsername)
.env(env_keys_1.PG_CREATE_DB_FORCE_CHANGE_USERNAME))
.addOption(new commander_1.Option('-p,--force-change-password <boolean>', 'Force change password of specified app-database-url')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.forceChangePassword)
.env(env_keys_1.PG_CREATE_DB_FORCE_CHANGE_PASSWORD))
.addOption(new commander_1.Option('--drop-app-database <boolean>', 'Drop application database before try create it')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.dropAppDatabase)
.env(env_keys_1.PG_CREATE_DB_DROP_APP_DATABASE))
.addOption(new commander_1.Option('-e,--extensions <boolean>', 'Default extensions')
.default(default_1.PG_CREATE_DB_DEFAULT_CONFIG.extensions)
.env(env_keys_1.PG_CREATE_DB_EXTENSIONS));
}
function checkToRunCreateDatabaseHandler(options) {
return Object.keys(options).filter(Boolean).length > 0;
}
async function createDatabaseHandler(options) {
let configObjects = [];
try {
const dir = (0, path_1.dirname)(options.config);
const searchFrom = dir[0] === '.' ? (0, path_1.join)(process.cwd(), dir) : dir[0] === path_1.sep ? dir : process.cwd();
const moduleName = (0, path_1.basename)(options.config);
const config = await (0, cosmiconfig_1.cosmiconfig)(moduleName, {
loaders: cosmiconfig_1.defaultLoaders,
}).search(searchFrom);
if (config && !config?.isEmpty) {
configObjects = Array.isArray(config.config) ? config.config : [config.config];
}
}
catch (err) {
console.error(err);
}
if (configObjects.length === 0) {
const createDatabaseService = new create_database_service_1.CreateDatabaseService(Boolean((0, replace_env_1.replaceEnv)(options.dryRun)?.toLowerCase() === 'true'));
await createDatabaseService.createDatabase({
appDatabaseUrl: (0, replace_env_1.replaceEnv)(options.appDatabaseUrl),
rootDatabaseUrl: (0, replace_env_1.replaceEnv)(options.rootDatabaseUrl),
extensions: (0, replace_env_1.replaceEnv)(options.extensions).split(','),
forceChangePassword: Boolean((0, replace_env_1.replaceEnv)(options.forceChangePassword)?.toLowerCase() === 'true'),
forceChangeUsername: Boolean((0, replace_env_1.replaceEnv)(options.forceChangeUsername)?.toLowerCase() === 'true'),
dropAppDatabase: Boolean((0, replace_env_1.replaceEnv)(options.dropAppDatabase)?.toLowerCase() === 'true'),
});
}
else {
for (let index = 0; index < configObjects.length; index++) {
const configObject = configObjects[index];
const createDatabaseService = new create_database_service_1.CreateDatabaseService(Boolean((0, replace_env_1.replaceEnv)(configObject.dryRun || options.dryRun)?.toLowerCase() === 'true'));
await createDatabaseService.createDatabase({
appDatabaseUrl: (0, replace_env_1.replaceEnv)(configObject.appDatabaseUrl),
rootDatabaseUrl: (0, replace_env_1.replaceEnv)(configObject.rootDatabaseUrl || options.rootDatabaseUrl),
extensions: (0, replace_env_1.replaceEnv)(configObject.extensions || options.extensions).split(','),
forceChangePassword: Boolean((0, replace_env_1.replaceEnv)(configObject.forceChangePassword || options.forceChangePassword)?.toLowerCase() === 'true'),
forceChangeUsername: Boolean((0, replace_env_1.replaceEnv)(configObject.forceChangeUsername || options.forceChangeUsername)?.toLowerCase() === 'true'),
dropAppDatabase: Boolean((0, replace_env_1.replaceEnv)(configObject.dropAppDatabase || options.dropAppDatabase)?.toLowerCase() === 'true'),
});
}
}
}