registerFeatureDI function

void registerFeatureDI(
  1. String feature,
  2. String snake, {
  3. String stateManagement = 'bloc',
})

Implementation

void registerFeatureDI(String feature, String snake,
    {String stateManagement = 'bloc'}) {
  final libPath = getProjectLibPath();
  final diPath = path.join(libPath, 'core', 'di', 'injection_container.dart');
  final file = File(diPath);

  if (!file.existsSync()) return;

  String content = file.readAsStringSync();

  final imports = '''
import '../../features/$snake/data/datasources/${snake}_remote_datasource.dart';
import '../../features/$snake/data/repositories_impl/${snake}_repository_impl.dart';
import '../../features/$snake/domain/repositories/${snake}_repository.dart';
import '../../features/$snake/domain/usecases/${snake}_usecase.dart';
''';

  // Add state management specific imports (ONLY the main file, NOT the state file)
  String stateManagementImports = '';
  if (stateManagement == 'bloc') {
    stateManagementImports = '''
import '../../features/$snake/presentation/bloc/${snake}_bloc.dart';
''';
  } else if (stateManagement == 'cubit') {
    stateManagementImports = '''
import '../../features/$snake/presentation/cubit/${snake}_cubit.dart';
''';
  } else if (stateManagement == 'getx') {
    stateManagementImports = '''
import '../../features/$snake/presentation/getx/${snake}_controller.dart';
''';
  } else if (stateManagement == 'riverpod') {
    stateManagementImports = '''
import '../../features/$snake/presentation/providers/${snake}_provider.dart';
''';
  }

  if (!content.contains('features/$snake')) {
    final lines = content.split('\n');
    int lastImportIndex = -1;

    for (int i = 0; i < lines.length; i++) {
      if (lines[i].startsWith('import ') || lines[i].startsWith("import ")) {
        lastImportIndex = i;
      }
    }

    if (lastImportIndex != -1) {
      lines.insert(lastImportIndex + 1, imports);
      if (stateManagementImports.isNotEmpty) {
        lines.insert(lastImportIndex + 2, stateManagementImports);
      }
      content = lines.join('\n');
    }
  }

  // Registration based on state management type
  String registration = '''
  // $feature
  sl.registerLazySingleton<${feature}RemoteDataSource>(
    () => ${feature}RemoteDataSourceImpl(),
  );

  sl.registerLazySingleton<${feature}Repository>(
    () => ${feature}RepositoryImpl(sl()),
  );

  sl.registerLazySingleton(
    () => ${feature}UseCase(sl()),
  );
''';

  // Add state management registration
  if (stateManagement == 'bloc') {
    registration += '''
  sl.registerFactory(
    () => ${feature}Bloc(sl()),
  );
''';
  } else if (stateManagement == 'cubit') {
    registration += '''
  sl.registerFactory(
    () => ${feature}Cubit(sl()),
  );
''';
  }

  if (content.contains('${feature}Repository')) {
    print("⚠️ DI already registered for $feature");
    return;
  }

  final marker = 'Future<void> init() async {';

  if (content.contains(marker)) {
    final updated = content.replaceFirst(marker, '$marker$registration');
    safeWrite(diPath, updated);
    print("🔗 DI registered for $feature ($stateManagement)");
  }
}