@re-shell/cli
Version:
Full-stack development platform uniting microservices and microfrontends. Build complete applications with .NET (ASP.NET Core Web API, Minimal API), Java (Spring Boot, Quarkus, Micronaut, Vert.x), Rust (Actix-Web, Warp, Rocket, Axum), Python (FastAPI, Dja
364 lines (363 loc) ⢠13.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.manageMigration = manageMigration;
const chalk_1 = __importDefault(require("chalk"));
const prompts_1 = __importDefault(require("prompts"));
const migration_1 = require("../utils/migration");
async function manageMigration(options = {}) {
const { spinner, verbose, json } = options;
try {
if (options.auto) {
await autoMigrate(options, spinner);
return;
}
if (options.check) {
await checkMigrationStatus(options, spinner);
return;
}
if (options.history) {
await showMigrationHistory(options, spinner);
return;
}
if (options.rollback) {
await rollbackMigration(options.rollback, options, spinner);
return;
}
if (options.interactive) {
await interactiveMigration(options, spinner);
return;
}
if (options.global) {
await migrateGlobalConfig(options, spinner);
return;
}
if (options.project) {
await migrateProjectConfig(options, spinner);
return;
}
// Default: check migration status and prompt for action
await checkAndPromptMigration(options, spinner);
}
catch (error) {
if (spinner)
spinner.fail(chalk_1.default.red('Migration operation failed'));
throw error;
}
}
async function autoMigrate(options, spinner) {
if (spinner)
spinner.setText('Running auto-migration...');
const results = await migration_1.migrationManager.autoMigrate();
if (spinner)
spinner.stop();
if (options.json) {
console.log(JSON.stringify(results, null, 2));
}
else {
console.log(chalk_1.default.cyan('\nš Auto-Migration Results'));
console.log(chalk_1.default.gray('ā'.repeat(40)));
if (results.global) {
console.log(chalk_1.default.cyan('\nš Global Configuration:'));
displayMigrationResult(results.global);
}
else {
console.log(chalk_1.default.green('\nš Global Configuration: Up to date'));
}
if (results.project) {
console.log(chalk_1.default.cyan('\nšļø Project Configuration:'));
displayMigrationResult(results.project);
}
else {
console.log(chalk_1.default.green('\nšļø Project Configuration: Up to date or not found'));
}
}
}
async function checkMigrationStatus(options, spinner) {
if (spinner)
spinner.setText('Checking migration status...');
const globalCheck = await migration_1.migrationManager.checkIntegrity('global');
const projectCheck = await migration_1.migrationManager.checkIntegrity('project');
if (spinner)
spinner.stop();
if (options.json) {
console.log(JSON.stringify({ global: globalCheck, project: projectCheck }, null, 2));
}
else {
console.log(chalk_1.default.cyan('\nš Migration Status Check'));
console.log(chalk_1.default.gray('ā'.repeat(40)));
console.log(chalk_1.default.cyan('\nš Global Configuration:'));
displayIntegrityCheck(globalCheck);
console.log(chalk_1.default.cyan('\nšļø Project Configuration:'));
displayIntegrityCheck(projectCheck);
}
}
async function showMigrationHistory(options, spinner) {
if (spinner)
spinner.setText('Loading migration history...');
const globalHistory = await migration_1.migrationManager.getMigrationHistory('global');
const projectHistory = await migration_1.migrationManager.getMigrationHistory('project');
if (spinner)
spinner.stop();
if (options.json) {
console.log(JSON.stringify({ global: globalHistory, project: projectHistory }, null, 2));
}
else {
console.log(chalk_1.default.cyan('\nš Migration History'));
console.log(chalk_1.default.gray('ā'.repeat(40)));
console.log(chalk_1.default.cyan('\nš Global Configuration:'));
displayMigrationHistory(globalHistory);
console.log(chalk_1.default.cyan('\nšļø Project Configuration:'));
displayMigrationHistory(projectHistory);
}
}
async function rollbackMigration(targetVersion, options, spinner) {
if (spinner)
spinner.setText(`Rolling back to version ${targetVersion}...`);
const configType = options.global ? 'global' : 'project';
const result = await migration_1.migrationManager.rollback(configType, targetVersion);
if (spinner) {
if (result.success) {
spinner.succeed(chalk_1.default.green(`Rollback to ${targetVersion} completed!`));
}
else {
spinner.fail(chalk_1.default.red(`Rollback to ${targetVersion} failed!`));
}
}
if (options.json) {
console.log(JSON.stringify(result, null, 2));
}
else {
displayMigrationResult(result);
}
}
async function migrateGlobalConfig(options, spinner) {
if (spinner)
spinner.setText('Migrating global configuration...');
const result = await migration_1.migrationManager.migrate('global');
if (spinner) {
if (result.success) {
spinner.succeed(chalk_1.default.green('Global configuration migrated successfully!'));
}
else {
spinner.fail(chalk_1.default.red('Global configuration migration failed!'));
}
}
if (options.json) {
console.log(JSON.stringify(result, null, 2));
}
else {
displayMigrationResult(result);
}
}
async function migrateProjectConfig(options, spinner) {
if (spinner)
spinner.setText('Migrating project configuration...');
const result = await migration_1.migrationManager.migrate('project');
if (spinner) {
if (result.success) {
spinner.succeed(chalk_1.default.green('Project configuration migrated successfully!'));
}
else {
spinner.fail(chalk_1.default.red('Project configuration migration failed!'));
}
}
if (options.json) {
console.log(JSON.stringify(result, null, 2));
}
else {
displayMigrationResult(result);
}
}
async function checkAndPromptMigration(options, spinner) {
if (spinner)
spinner.setText('Checking migration requirements...');
const globalNeeds = await migration_1.migrationManager.needsMigration('global');
const projectNeeds = await migration_1.migrationManager.needsMigration('project');
if (spinner)
spinner.stop();
if (!globalNeeds && !projectNeeds) {
console.log(chalk_1.default.green('\nā
All configurations are up to date!'));
return;
}
console.log(chalk_1.default.yellow('\nā ļø Configuration migration required'));
if (globalNeeds) {
console.log(chalk_1.default.yellow(' Global configuration needs migration'));
}
if (projectNeeds) {
console.log(chalk_1.default.yellow(' Project configuration needs migration'));
}
if (!options.force) {
const response = await (0, prompts_1.default)([
{
type: 'confirm',
name: 'migrate',
message: 'Run migration now?',
initial: true
}
]);
if (!response.migrate) {
console.log(chalk_1.default.gray('Migration cancelled. Run with --auto to migrate automatically.'));
return;
}
}
await autoMigrate(options);
}
async function interactiveMigration(options, spinner) {
if (spinner)
spinner.stop();
const response = await (0, prompts_1.default)([
{
type: 'select',
name: 'action',
message: 'What would you like to do?',
choices: [
{ title: 'š Auto-migrate all configurations', value: 'auto' },
{ title: 'š Check migration status', value: 'check' },
{ title: 'š View migration history', value: 'history' },
{ title: 'š Migrate global configuration only', value: 'global' },
{ title: 'šļø Migrate project configuration only', value: 'project' },
{ title: 'āŖ Rollback to previous version', value: 'rollback' },
{ title: 'š§ Advanced options', value: 'advanced' }
]
}
]);
if (!response.action)
return;
switch (response.action) {
case 'auto':
await autoMigrate(options);
break;
case 'check':
await checkMigrationStatus(options);
break;
case 'history':
await showMigrationHistory(options);
break;
case 'global':
await migrateGlobalConfig(options);
break;
case 'project':
await migrateProjectConfig(options);
break;
case 'rollback':
await interactiveRollback();
break;
case 'advanced':
await interactiveAdvancedOptions();
break;
}
}
async function interactiveRollback() {
const globalHistory = await migration_1.migrationManager.getMigrationHistory('global');
const projectHistory = await migration_1.migrationManager.getMigrationHistory('project');
const response = await (0, prompts_1.default)([
{
type: 'select',
name: 'configType',
message: 'Which configuration to rollback?',
choices: [
{ title: 'Global configuration', value: 'global' },
{ title: 'Project configuration', value: 'project' }
]
},
{
type: 'select',
name: 'version',
message: 'Select target version:',
choices: (prev) => {
const history = prev.configType === 'global' ? globalHistory : projectHistory;
return history.appliedMigrations.map(version => ({
title: version,
value: version
}));
}
},
{
type: 'confirm',
name: 'confirm',
message: 'Are you sure you want to rollback? This action cannot be easily undone.',
initial: false
}
]);
if (response.confirm) {
const result = await migration_1.migrationManager.rollback(response.configType, response.version);
displayMigrationResult(result);
}
}
async function interactiveAdvancedOptions() {
console.log(chalk_1.default.cyan('š§ Advanced migration options coming soon...'));
const options = [
'Custom migration scripts',
'Backup management',
'Configuration validation',
'Migration testing'
];
console.log(chalk_1.default.gray('\nPlanned features:'));
options.forEach(option => {
console.log(` ⢠${option}`);
});
}
// Display helper functions
function displayMigrationResult(result) {
if (result.success) {
console.log(chalk_1.default.green(`ā
Migration successful: ${result.fromVersion} ā ${result.toVersion}`));
if (result.appliedMigrations.length > 0) {
console.log(chalk_1.default.cyan('\nApplied migrations:'));
result.appliedMigrations.forEach(version => {
console.log(` ⢠${version}`);
});
}
}
else {
console.log(chalk_1.default.red(`ā Migration failed: ${result.fromVersion} ā ${result.toVersion}`));
}
if (result.warnings && result.warnings.length > 0) {
console.log(chalk_1.default.yellow('\nWarnings:'));
result.warnings.forEach(warning => {
console.log(chalk_1.default.yellow(` ā ļø ${warning}`));
});
}
if (result.errors && result.errors.length > 0) {
console.log(chalk_1.default.red('\nErrors:'));
result.errors.forEach(error => {
console.log(chalk_1.default.red(` ā ${error}`));
});
}
}
function displayIntegrityCheck(check) {
console.log(` Version: ${check.version}`);
console.log(` Status: ${check.valid ? chalk_1.default.green('Valid') : chalk_1.default.red('Issues found')}`);
if (check.issues.length > 0) {
console.log(chalk_1.default.red(' Issues:'));
check.issues.forEach(issue => {
console.log(chalk_1.default.red(` ⢠${issue}`));
});
}
if (check.recommendations.length > 0) {
console.log(chalk_1.default.yellow(' Recommendations:'));
check.recommendations.forEach(rec => {
console.log(chalk_1.default.yellow(` ⢠${rec}`));
});
}
}
function displayMigrationHistory(history) {
console.log(` Current version: ${chalk_1.default.green(history.currentVersion)}`);
if (history.appliedMigrations.length > 0) {
console.log(chalk_1.default.green(' Applied migrations:'));
history.appliedMigrations.forEach(version => {
console.log(chalk_1.default.green(` ā
${version}`));
});
}
if (history.pendingMigrations.length > 0) {
console.log(chalk_1.default.yellow(' Pending migrations:'));
history.pendingMigrations.forEach(version => {
console.log(chalk_1.default.yellow(` ā³ ${version}`));
});
}
if (history.pendingMigrations.length === 0 && history.appliedMigrations.length > 0) {
console.log(chalk_1.default.green(' Status: Up to date'));
}
}