execute method

Future<Map<String, dynamic>> execute(
  1. Map<String, dynamic> args
)

Execute check_available_upgrades Input: projectPath, packageName?, includePrerelease?, targetFlutterVersion? Output: per-dependency upgrade info

Implementation

Future<Map<String, dynamic>> execute(Map<String, dynamic> args) async {
  final projectPath = args['projectPath'] as String;
  final specificPackage = args['packageName'] as String?;
  final includePrerelease = args['includePrerelease'] as bool? ?? false;
  final pubspec = await _parser.parse(projectPath);

  // Determine which packages to check
  Map<String, DependencyInfo> packagesToCheck;
  if (specificPackage != null) {
    final dep = pubspec.dependencies[specificPackage] ??
        pubspec.devDependencies[specificPackage];
    if (dep == null) {
      throw ArgumentError(
          'Package $specificPackage not found in pubspec.yaml');
    }
    packagesToCheck = {specificPackage: dep};
  } else {
    packagesToCheck = {...pubspec.dependencies, ...pubspec.devDependencies};
  }

  // Only check hosted packages (skip path, git, sdk dependencies)
  packagesToCheck.removeWhere((_, dep) => dep.source != 'hosted');

  final upgrades = <Map<String, dynamic>>[];

  for (final entry in packagesToCheck.entries) {
    try {
      final info = await _checkPackageUpgrade(
        entry.key,
        entry.value,
        includePrerelease: includePrerelease,
      );
      if (info != null) upgrades.add(info);
    } catch (e) {
      Logger.warn('Failed to check upgrades for ${entry.key}: $e');
      upgrades.add({
        'packageName': entry.key,
        'error': e.toString(),
      });
    }
  }

  return {
    'projectName': pubspec.name,
    'packagesChecked': packagesToCheck.length,
    'upgradesAvailable':
        upgrades.where((u) => u.containsKey('latestVersion')).length,
    'upgrades': upgrades,
  };
}