addDependencies method

  1. @override
Future<void> addDependencies(
  1. String projectName,
  2. StateManagementType stateManagement,
  3. bool includeGoRouter,
  4. bool includeCleanArchitecture,
  5. bool includeFreezed,
)
override

Implementation

@override
Future<void> addDependencies(String projectName, StateManagementType stateManagement, bool includeGoRouter, bool includeCleanArchitecture, bool includeFreezed) async {
  final pubspecPath = path.join(projectName, 'pubspec.yaml');
  final pubspecFile = File(pubspecPath);

  if (!pubspecFile.existsSync()) {
    throw FileSystemException('pubspec.yaml not found');
  }

  String pubspecContent = pubspecFile.readAsStringSync();

  // Build dependencies list
  final dependencies = <String>[];

  // Add state management dependencies
  switch (stateManagement) {
    case StateManagementType.bloc:
      dependencies.addAll([
        'flutter_bloc: ^9.1.1',
        'hydrated_bloc: ^10.1.1',
        'replay_bloc: ^0.3.0',
        'bloc_concurrency: ^0.3.0',
        'dartz: ^0.10.1',
        'path_provider: ^2.1.5',
        'path: ^1.9.0',
        'package_info_plus: ^8.0.0',
        'equatable: ^2.0.7',
        'get_it: ^8.0.3',
        'dio: ^5.7.0',
        'flutter_secure_storage: ^9.2.2',
        'nested: ^1.0.0',
        'pretty_dio_logger: ^1.4.0',
        'talker_dio_logger: ^4.4.1',
        'talker_flutter: ^4.4.1',
        'flutter_form_builder: ^9.4.1',
        'form_builder_validators: ^10.0.1',
        'drift: ^2.18.0',
        'sqlite3_flutter_libs: ^0.5.0',
      ]);

      if (includeFreezed) {
        dependencies.addAll([
          'json_annotation: ^4.9.0',
          'freezed_annotation: ^2.4.4',
        ]);
      }
      break;
    case StateManagementType.provider:
      dependencies.addAll([
        'provider: ^6.1.5',
        'get_it: ^8.0.3',
      ]);

      // Always add Freezed for non-BLoC state management
      dependencies.addAll([
        'json_annotation: ^4.9.0',
        'freezed_annotation: ^2.4.4',
        'freezed: ^2.5.7',
      ]);
      break;
    case StateManagementType.none:
      // Always add Freezed for non-BLoC state management
      dependencies.addAll([
        'json_annotation: ^4.9.0',
        'freezed_annotation: ^2.4.4',
        'freezed: ^2.5.7',
      ]);
      break;
  }

  // Add Go Router dependency if requested
  if (includeGoRouter && !dependencies.any((d) => d.startsWith('go_router:'))) {
    dependencies.add('go_router: ^16.0.0');
  }

  // Always add get_it for dependency injection
  if (!dependencies.any((d) => d.startsWith('get_it:'))) {
    dependencies.add('get_it: ^8.0.3');
  }

  // Add Clean Architecture dependencies if requested
  if (includeCleanArchitecture) {
    if (!dependencies.any((d) => d.startsWith('equatable:'))) {
      dependencies.add('equatable: ^2.0.7');
    }
  }

  // Add internationalization dependencies
  dependencies.addAll([
    'flutter_localizations:',
    '  sdk: flutter',
    'intl: any',
  ]);

  // Build dev dependencies list
  final devDependencies = <String>[];

  // Always add Freezed dev dependencies for Provider/None or when Freezed is selected
  if (includeFreezed || stateManagement == StateManagementType.provider || stateManagement == StateManagementType.none) {
    devDependencies.addAll([
      'freezed: ^2.5.7',
      'json_serializable: ^6.9.0',
      'build_runner: ^2.4.13',
    ]);
  }

  // Add Drift dev dependencies for BLoC
  if (stateManagement == StateManagementType.bloc) {
    devDependencies.addAll([
      'drift_dev: ^2.18.0',
    ]);
  }

  // Add internationalization dev dependencies
  devDependencies.addAll([
    'intl_utils: ^2.8.7',
  ]);

  final lines = pubspecContent.split('\n');
  final newLines = <String>[];
  bool skipUntilNextSection = false;
  bool dependenciesAdded = false;
  bool devDependenciesAdded = false;

  for (int i = 0; i < lines.length; i++) {
    final line = lines[i];
    final trimmedLine = line.trim();

    if (trimmedLine == 'dependencies:') {
      skipUntilNextSection = true;
      if (!dependenciesAdded) {
        newLines.add('dependencies:');
        for (final dep in dependencies) {
          newLines.add('  $dep');
        }
        newLines.add('');
        dependenciesAdded = true;
      }
      continue;
    }

    if (trimmedLine == 'dev_dependencies:') {
      skipUntilNextSection = true;
      if (!devDependenciesAdded) {
        newLines.add('dev_dependencies:');
        for (final dep in devDependencies) {
          newLines.add('  $dep');
        }
        newLines.add('');
        devDependenciesAdded = true;
      }
      continue;
    }

    if (skipUntilNextSection) {
      if (trimmedLine.isEmpty || trimmedLine.startsWith('  ') || trimmedLine.startsWith('    ') || trimmedLine.startsWith('#')) {
        continue;
      } else {
        skipUntilNextSection = false;
      }
    }

    if (trimmedLine == 'flutter:' && !dependenciesAdded) {
      newLines.add('dependencies:');
      for (final dep in dependencies) {
        newLines.add('  $dep');
      }
      newLines.add('');
      dependenciesAdded = true;
    }

    if (trimmedLine == 'flutter:' && dependenciesAdded && !devDependenciesAdded) {
      newLines.add('dev_dependencies:');
      for (final dep in devDependencies) {
        newLines.add('  $dep');
      }
      newLines.add('');
      devDependenciesAdded = true;
    }

    newLines.add(line);
  }

  if (!dependenciesAdded) {
    final flutterIndex = newLines.indexWhere((line) => line.trim() == 'flutter:');
    if (flutterIndex != -1) {
      newLines.insert(flutterIndex, '');
      for (int i = dependencies.length - 1; i >= 0; i--) {
        newLines.insert(flutterIndex, '  ${dependencies[i]}');
      }
      newLines.insert(flutterIndex, 'dependencies:');
      dependenciesAdded = true;
    }
  }

  if (!devDependenciesAdded && dependenciesAdded) {
    final flutterIndex = newLines.indexWhere((line) => line.trim() == 'flutter:');
    if (flutterIndex != -1) {
      newLines.insert(flutterIndex, '');
      for (int i = devDependencies.length - 1; i >= 0; i--) {
        newLines.insert(flutterIndex, '  ${devDependencies[i]}');
      }
      newLines.insert(flutterIndex, 'dev_dependencies:');
      devDependenciesAdded = true;
    }
  }

  pubspecContent = newLines.join('\n');

  pubspecFile.writeAsStringSync(pubspecContent);

  // Add flutter configuration for internationalization
  await _addFlutterConfiguration(projectName);
}