detectArchitectureFromProject static method

Future<StateManagementArchitecture?> detectArchitectureFromProject({
  1. required Directory root,
  2. required StateManagement stateManagement,
})

Implementation

static Future<StateManagementArchitecture?> detectArchitectureFromProject({
  required Directory root,
  required StateManagement stateManagement,
}) async {
  if (stateManagement == StateManagement.getx) return null;

  final featuresDir = Directory(path.join(root.path, 'lib', 'features'));
  if (!featuresDir.existsSync()) return StateManagementArchitecture.simple;

  final entries = featuresDir.listSync().whereType<Directory>();

  for (final featureDir in entries) {
    final domainDir = Directory(path.join(featureDir.path, 'domain'));
    if (domainDir.existsSync()) return StateManagementArchitecture.clean;

    final dataRepositories = Directory(
      path.join(featureDir.path, 'data', 'repositories'),
    );
    if (dataRepositories.existsSync())
      return StateManagementArchitecture.clean;
  }

  // Fallback: detect clean providers/usecases in files
  if (stateManagement == StateManagement.riverpod) {
    final hasUsecase = await _hasTextInLib(root.path, 'Get');
    final hasRepository = await _hasTextInLib(root.path, 'Repository');
    if (hasUsecase && hasRepository) return StateManagementArchitecture.clean;
  }

  if (stateManagement == StateManagement.bloc) {
    final hasUsecase = await _hasTextInLib(root.path, 'Usecase');
    final hasRepository = await _hasTextInLib(root.path, 'Repository');
    if (hasUsecase && hasRepository) return StateManagementArchitecture.clean;
  }

  return StateManagementArchitecture.simple;
}