@deepbrainspace/nx-surrealdb
Version:
NX plugin for SurrealDB migrations with modular architecture
166 lines • 8.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = runExecutor;
const devkit_1 = require("@nx/devkit");
const migration_service_1 = require("../../lib/domain/migration-service");
const debug_1 = require("../../lib/infrastructure/debug");
async function runExecutor(options, context) {
const service = new migration_service_1.MigrationService(context);
const debug = debug_1.Debug.scope('rollback-executor');
// Enable debug mode if requested
debug_1.Debug.setEnabled(!!options.debug);
try {
// Service already initialized above
// Determine target modules and filenames
const rawTargetModules = options.module !== undefined && options.module !== ''
? String(options.module)
.split(',')
.map(m => m.trim())
.filter(m => m.length > 0)
: undefined;
const targetFilenames = options.filename !== undefined && options.filename !== ''
? String(options.filename)
.split(',')
.map(f => f.trim())
.filter(f => f.length > 0)
: undefined;
debug.log(`Raw target modules: ${rawTargetModules ? rawTargetModules.join(', ') : 'all'}`);
debug.log(`Target filenames: ${targetFilenames ? targetFilenames.join(', ') : 'all'}`);
// Initialize migration service first
await service.initialize({
url: options.url || '',
user: options.user || '',
pass: options.pass || '',
namespace: options.namespace,
database: options.database,
envFile: options.envFile,
useTransactions: options.useTransactions,
initPath: options.initPath || 'database',
schemaPath: options.schemaPath,
force: options.force || false,
configPath: options.configPath,
debug: options.debug,
dryRun: options.dryRun || false,
});
// Now resolve target modules to full names (e.g., "010" -> "010_auth")
const resolvedTargetModules = rawTargetModules
? service.resolveTargetModules(rawTargetModules)
: undefined;
debug.log(`Resolved target modules: ${resolvedTargetModules ? resolvedTargetModules.join(', ') : 'all'}`);
// Handle filename-specific rollback validation
if (targetFilenames && targetFilenames.length > 0) {
try {
const rollbackResult = await service.resolveRollbackFilenames(targetFilenames, resolvedTargetModules);
// Show dependency warnings if any
if (rollbackResult.warnings.length > 0) {
devkit_1.logger.warn('⚠️ Rollback filename warnings:');
for (const warning of rollbackResult.warnings) {
devkit_1.logger.warn(` • ${warning}`);
}
}
debug.log(`Resolved ${rollbackResult.resolved.length} rollback filenames`);
}
catch (error) {
devkit_1.logger.error(`❌ Failed to resolve rollback filenames: ${error.message}`);
return { success: false };
}
}
// First, validate rollback safety unless force is enabled
if (!options.force) {
devkit_1.logger.info('🔍 Validating rollback safety...');
const validation = await service.validateRollback(rawTargetModules);
if (!validation.canRollback) {
devkit_1.logger.error('❌ Rollback validation failed!');
devkit_1.logger.error(' Blocked by dependencies:');
for (const blocker of validation.blockedBy) {
devkit_1.logger.error(` • ${blocker}`);
}
if (validation.warnings.length > 0) {
devkit_1.logger.error(' Warnings:');
for (const warning of validation.warnings) {
devkit_1.logger.error(` • ${warning}`);
}
}
devkit_1.logger.info('\n💡 To resolve this:');
devkit_1.logger.info(' Option 1: Rollback dependent modules first');
for (const blocker of validation.blockedBy) {
devkit_1.logger.info(` • nx run ${context.projectName}:rollback --module ${blocker}`);
}
devkit_1.logger.info(' Option 2: Use --force to bypass safety checks (not recommended)');
return { success: false };
}
if (validation.warnings.length > 0) {
devkit_1.logger.warn('⚠️ Rollback warnings:');
for (const warning of validation.warnings) {
devkit_1.logger.warn(` • ${warning}`);
}
}
devkit_1.logger.info('✅ Rollback safety validation passed');
}
// Execute rollback migrations
if (options.dryRun) {
devkit_1.logger.info('🔍 Dry run mode - showing rollback migrations without executing them');
}
if (options.detailed || options.debug) {
devkit_1.logger.info('🔄 Starting rollback execution...');
}
const result = await service.executeMigrations(resolvedTargetModules, 'rollback', targetFilenames);
if (result.success) {
if (result.filesProcessed === 0 && result.results.length === 0) {
devkit_1.logger.info(`⚠️ No migrations to rollback - all requested migrations are already rolled back or not yet applied`);
devkit_1.logger.info(` Execution time: ${result.executionTimeMs}ms`);
}
else {
devkit_1.logger.info(`✅ Rollback completed successfully!`);
devkit_1.logger.info(` Files processed: ${result.filesProcessed}`);
devkit_1.logger.info(` Files skipped: ${result.filesSkipped}`);
devkit_1.logger.info(` Execution time: ${result.executionTimeMs}ms`);
}
if (result.results.length > 0) {
devkit_1.logger.info('\n📊 Rollback Details:');
for (const fileResult of result.results) {
const status = fileResult.success ? '✅' : fileResult.skipped ? '⏭️' : '❌';
const reason = fileResult.skipped
? ` (${fileResult.skipReason})`
: fileResult.error
? ` (${fileResult.error})`
: '';
devkit_1.logger.info(` ${status} ${fileResult.file.moduleId}/${fileResult.file.filename}${reason}`);
// Show detailed information when detailed flag is used
if (options.detailed && (fileResult.success || fileResult.skipped)) {
devkit_1.logger.info(` File: ${fileResult.file.number}_${fileResult.file.name}_${fileResult.file.direction}.surql`);
devkit_1.logger.info(` Execution time: ${fileResult.executionTimeMs}ms`);
if (fileResult.file.checksum) {
devkit_1.logger.info(` Checksum: ${fileResult.file.checksum.substring(0, 12)}...`);
}
}
}
}
}
else {
devkit_1.logger.error('❌ Rollback failed!');
for (const fileResult of result.results) {
if (!fileResult.success && !fileResult.skipped) {
devkit_1.logger.error(` ❌ ${fileResult.file.moduleId}/${fileResult.file.filename}: ${fileResult.error}`);
// Show detailed error information when detailed flag is used
if (options.detailed) {
devkit_1.logger.error(` File: ${fileResult.file.number}_${fileResult.file.name}_${fileResult.file.direction}.surql`);
devkit_1.logger.error(` Execution time: ${fileResult.executionTimeMs}ms`);
}
}
}
devkit_1.logger.info(` Files processed: ${result.filesProcessed}`);
devkit_1.logger.info(` Execution time: ${result.executionTimeMs}ms`);
}
return { success: result.success };
}
catch (error) {
devkit_1.logger.error('💥 Rollback execution failed:');
devkit_1.logger.error(error instanceof Error ? error.message : String(error));
return { success: false };
}
finally {
await service.close();
}
}
//# sourceMappingURL=executor.js.map