execute method
Implementation
Future<void> execute() async {
final snakeFeatureName = StringUtils.toSnakeCase(featureName);
final snakePageName = StringUtils.toSnakeCase(pageName);
final pascalPageName = StringUtils.toPascalCase(pageName);
// Check if running from project root
final currentDir = Directory.current.path;
final melosFile = File('$currentDir/melos.yaml');
final packagesDir = Directory('$currentDir/packages');
if (!melosFile.existsSync() || !packagesDir.existsSync()) {
Logger.error(
'❌ Please run this command from the project root directory!',
);
Logger.error(
' (The directory containing melos.yaml and packages/ folder)',
);
print('');
print('Current directory: ${_cyan}$currentDir$_reset');
print('Expected files: ${_cyan}melos.yaml, packages/$_reset');
exit(1);
}
Logger.header(
'Removing Page: $snakePageName from feature: $snakeFeatureName');
// Check if feature exists
final featurePath = '$currentDir/packages/features_$snakeFeatureName';
final featureDir = Directory(featurePath);
if (!featureDir.existsSync()) {
Logger.error('Feature "features_$snakeFeatureName" does not exist!');
Logger.warning('Available features:');
final packagesDirectory = Directory('$currentDir/packages');
await for (var entity in packagesDirectory.list()) {
if (entity is Directory && entity.path.contains('features_')) {
final name = entity.path.split('/').last;
Logger.warning(' • $name');
}
}
exit(1);
}
// Check if page exists
final pageFile =
File('$featurePath/lib/presentation/pages/${snakePageName}_page.dart');
if (!pageFile.existsSync()) {
Logger.error(
'Page "${snakePageName}_page.dart" does not exist in features_$snakeFeatureName!');
Logger.warning('Available pages:');
final pagesDir = Directory('$featurePath/lib/presentation/pages');
if (pagesDir.existsSync()) {
await for (var entity in pagesDir.list()) {
if (entity is File && entity.path.endsWith('_page.dart')) {
final name = entity.path.split('/').last;
Logger.warning(' • $name');
}
}
}
exit(1);
}
// Detect what was generated with the page
final blocFile =
File('$featurePath/lib/presentation/bloc/${snakePageName}_bloc.dart');
final entityFile =
File('$featurePath/lib/domain/entities/${snakePageName}_entity.dart');
final hasBloc = blocFile.existsSync();
final hasData = entityFile.existsSync();
// Ask for confirmation
print('');
print('${_red}⚠️ WARNING: This will permanently delete:$_reset');
print(' • Page: ${snakePageName}_page.dart');
if (hasBloc) {
print(
' • BLoC files: ${snakePageName}_bloc.dart, ${snakePageName}_event.dart, ${snakePageName}_state.dart');
}
if (hasData) {
print(' • Domain layer: entity, repository, use case');
print(' • Data layer: model, datasource, repository implementation');
}
print(' • Exports from barrel file');
print('');
stdout.write('Are you sure you want to continue? (yes/no): ');
final confirmation = stdin.readLineSync()?.toLowerCase().trim();
if (confirmation != 'yes' && confirmation != 'y') {
Logger.warning('Operation cancelled.');
exit(0);
}
print('');
try {
// Remove page file
Logger.step('Removing page file...');
pageFile.deleteSync();
Logger.success('Removed ${snakePageName}_page.dart');
// Remove BLoC files if they exist
if (hasBloc) {
Logger.step('Removing BLoC files...');
_removeBlocFiles(featurePath, snakePageName);
Logger.success('Removed BLoC files');
}
// Remove data and domain layers if they exist
if (hasData) {
Logger.step('Removing domain layer...');
_removeDomainLayer(featurePath, snakePageName);
Logger.success('Removed domain layer');
Logger.step('Removing data layer...');
_removeDataLayer(featurePath, snakePageName);
Logger.success('Removed data layer');
}
// Update barrel exports
Logger.step('Updating barrel exports...');
_removeFromBarrelExports(
featurePath, snakePageName, snakeFeatureName, hasBloc, hasData);
Logger.success('Updated barrel exports');
// Remove route from app_routes.dart
Logger.step('Removing route from app_routes.dart...');
_removeRouteFromAppRoutes(currentDir, snakePageName, pascalPageName);
Logger.success('Removed route from app_routes.dart');
// Remove route from app_router.dart
Logger.step('Removing route from app_router.dart...');
_removeRouteFromAppRouter(currentDir, snakePageName, pascalPageName);
Logger.success('Removed route from app_router.dart');
// Remove from dependency injection
if (hasBloc) {
Logger.step('Removing from dependency injection...');
_removeFromDI(currentDir, snakePageName, pascalPageName, hasData);
Logger.success('Removed from dependency injection');
}
Logger.header('Page Removed Successfully! 🗑️');
print('');
print('${_green}✨ What was removed:$_reset');
print(' • Page: ${snakePageName}_page.dart');
if (hasBloc) {
print(' • BLoC: ${snakePageName}_bloc.dart');
print(' • Events: ${snakePageName}_event.dart');
print(' • States: ${snakePageName}_state.dart');
}
if (hasData) {
print(' • Entity: ${snakePageName}_entity.dart');
print(' • Repository: ${snakePageName}_repository.dart');
print(' • Use Case: get_${snakePageName}_usecase.dart');
print(' • Model: ${snakePageName}_model.dart');
print(' • DataSource: ${snakePageName}_remote_datasource.dart');
print(
' • Repository Implementation: ${snakePageName}_repository_impl.dart');
}
print('');
print('${_green}✨ What was cleaned up automatically:$_reset');
print(' • Route removed from app_routes.dart');
print(' • Route removed from app_router.dart');
if (hasBloc) {
print(' • Dependencies removed from injection_container.dart');
}
print('');
} catch (e) {
Logger.error('Error removing page: $e');
exit(1);
}
}