validate method

void validate()

Implementation

void validate() {
  const pubspecPath = 'pubspec.yaml';
  final file = File(pubspecPath);
  if (!file.existsSync()) {
    print('❌ pubspec.yaml not found');
    return;
  }

  final content = file.readAsStringSync();
  late YamlMap doc;
  try {
    doc = loadYaml(content) as YamlMap;
  } catch (e) {
    print('❌ Invalid YAML: $e');
    return;
  }

  final editor = YamlEditor(content);

  // --- Enforce Dart SDK version ---
  const enforcedSdk = '^3.9.0';
  final environment = doc['environment'] as YamlMap?;
  if (environment == null) {
    print('➕ Adding environment section with sdk: $enforcedSdk');
    editor.update(['environment'], {'sdk': enforcedSdk});
  } else {
    final currentSdk = environment['sdk']?.toString();
    if (currentSdk != enforcedSdk) {
      print('🔧 Updating Dart SDK from $currentSdk to $enforcedSdk');
      editor.update(['environment', 'sdk'], enforcedSdk);
    } else {
      print('✅ Dart SDK version is correct: $currentSdk');
    }
  }

  // --- Ensure dependencies ---
  final deps = Map<String, dynamic>.from(doc['dependencies'] as YamlMap? ?? {});
  final devDeps = Map<String, dynamic>.from(doc['dev_dependencies'] as YamlMap? ?? {});

  int compareVersions(String current, String required) {
    // Remove any ^ or + parts for simple numeric comparison
    String clean(String v) => v.replaceAll(RegExp(r'[^\d.]'), '');
    final cParts = clean(current).split('.').map(int.parse).toList();
    final rParts = clean(required).split('.').map(int.parse).toList();
    for (int i = 0; i < rParts.length; i++) {
      final c = i < cParts.length ? cParts[i] : 0;
      final r = rParts[i];
      if (c < r) {
        return -1;
      }
      if (c > r) {
        return 1;
      }
    }
    return 0;
  }

  for (var entry in requiredDeps.entries) {
    if (deps.containsKey(entry.key)) {
      final currentVersion = deps[entry.key].toString();
      if (compareVersions(currentVersion, entry.value) < 0) {
        print('🔧 Updating ${entry.key} from $currentVersion to ${entry.value}');
        editor.update(['dependencies', entry.key], entry.value);
      } else {
        print('✅ ${entry.key} : $currentVersion');
      }
    }
  }

  for (var entry in requiredDevDeps.entries) {
    if (devDeps.containsKey(entry.key)) {
      final currentVersion = devDeps[entry.key].toString();
      if (compareVersions(currentVersion, entry.value) < 0) {
        print('🔧 Updating ${entry.key} from $currentVersion to ${entry.value}');
        editor.update(['dev_dependencies', entry.key], entry.value);
      } else {
        print('✅ ${entry.key} : $currentVersion');
      }
    }
  }

  file.writeAsStringSync(editor.toString());
  print('✅ pubspec.yaml updated successfully');
}