@launchql/cli
Version:
LaunchQL CLI
84 lines (83 loc) • 2.69 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAvailableDatabases = getAvailableDatabases;
exports.selectDatabase = selectDatabase;
exports.getTargetDatabase = getTargetDatabase;
const pg_cache_1 = require("pg-cache");
const pg_env_1 = require("pg-env");
/**
* Get list of available databases from PostgreSQL
*/
async function getAvailableDatabases(options = {}) {
const { excludeTemplates = true, excludePostgres = true, excludeSystemDbs = true } = options;
const db = await (0, pg_cache_1.getPgPool)({
database: 'postgres'
});
let query = `
SELECT datname FROM pg_catalog.pg_database
WHERE 1=1
`;
if (excludeTemplates) {
query += ` AND datistemplate = FALSE`;
}
if (excludePostgres) {
query += ` AND datname NOT IN ('postgres')`;
}
if (excludeSystemDbs) {
query += ` AND datname !~ '^pg_'`;
}
query += ` ORDER BY datname`;
const result = await db.query(query);
return result.rows.map((row) => row.datname);
}
/**
* Prompt user to select a database
*/
async function selectDatabase(argv, prompter, options = {}) {
const { message = 'Select target database', multiple = false } = options;
// Check if database is already specified
if (!multiple && (argv.db || argv.database)) {
return argv.db || argv.database;
}
// Get available databases
const databases = await getAvailableDatabases(options);
if (databases.length === 0) {
throw new Error('No databases found');
}
// If only one database and not forcing selection, use it
if (!multiple && databases.length === 1 && !argv.interactive) {
return databases[0];
}
// Prompt for selection
const answer = await prompter.prompt(argv, [
{
type: multiple ? 'checkbox' : 'autocomplete',
name: 'database',
message,
options: databases,
required: true
}
]);
return answer.database;
}
/**
* Get target database with fallback to environment
*/
async function getTargetDatabase(argv, prompter, options = {}) {
// If database is specified in args, use it
if (argv.db || argv.database) {
return argv.db || argv.database;
}
// Try to select from available databases
try {
return await selectDatabase(argv, prompter, options);
}
catch (error) {
// Fall back to environment database
const pgEnv = (0, pg_env_1.getPgEnvOptions)();
if (pgEnv.database) {
return pgEnv.database;
}
throw new Error('No database specified and no default database found');
}
}
;