apply method

Future<void> apply({
  1. String? flavor,
  2. String? firebaseProjectId,
})

Applies the inspected migration idempotently.

Implementation

Future<void> apply({String? flavor, String? firebaseProjectId}) async {
  final definesDirectory = Directory("dart_defines");
  if (!definesDirectory.existsSync()) {
    await definesDirectory.create(recursive: true);
  }
  for (final flavor in ["dev", "prod"]) {
    final file = File("dart_defines/$flavor.env");
    final current = file.existsSync() ? await file.readAsString() : "";
    await file.writeAsString(_normalizeDefine(current, flavor));
  }
  final gradle = _androidGradleFile();
  if (gradle != null) {
    var source = await gradle.readAsString();
    if (!source.contains(AndroidNativeEnvironmentSynchronizer.beginMarker)) {
      source = _restoreLegacyApplicationId(source);
      source = AndroidNativeEnvironmentSynchronizer.synchronize(
        source,
        isKotlin: gradle.path.endsWith(".kts"),
      );
      await gradle.writeAsString(source);
    }
  }
  for (final path in _appleProjectPaths) {
    final file = File(path);
    if (!file.existsSync()) {
      continue;
    }
    await file.writeAsString(
      AppleFirebaseEnvironmentSynchronizer.synchronizeProject(
        await file.readAsString(),
      ),
    );
  }
  for (final path in [
    "ios/Flutter/Debug.xcconfig",
    "ios/Flutter/Release.xcconfig",
  ]) {
    final file = File(path);
    if (!file.existsSync()) {
      continue;
    }
    final lines = await file.readAsLines();
    await file.writeAsString(
      lines.where((line) => !line.contains("DartDefine.xcconfig")).join("\n"),
    );
  }
  for (final path in [
    "android/env.properties",
    "ios/Flutter/DartDefine.xcconfig",
  ]) {
    final file = File(path);
    if (file.existsSync()) {
      await file.delete();
    }
  }
  if (flavor != null && (firebaseProjectId?.isNotEmpty ?? false)) {
    await _migrateLegacyFirebase(flavor, firebaseProjectId!);
  }
}