execute method

Future<void> execute({
  1. String? targetFlavor,
})

Executes the Firebase configuration process. If targetFlavor is provided, only that flavor is configured.

Implementation

Future<void> execute({String? targetFlavor}) async {
  if (!ConfigService.isValidProject(_log)) return;
  if (!ConfigService.requiresInitialized(_log)) return;

  var config = ConfigService.load();
  if (config.firebase == null) {
    final confirmed = _log.confirm(
      '🔥 No Firebase configuration found in flavor_cli.yaml. Would you like to set it up now?',
      defaultValue: true,
    );

    if (!confirmed) {
      _log.error('❌ Firebase setup cancelled.');
      return;
    }

    final firebaseConfig = _promptForFirebaseConfig(config);
    config = config.copyWith(firebase: firebaseConfig);
    ConfigService.save(config);
    _log.success('📝 Firebase configuration saved to flavor_cli.yaml');
  }

  // 1. Check flutterfire
  final hasFlutterFire = await _checkCommand('flutterfire');
  if (!hasFlutterFire) {
    _log.error('❌ flavor_cli: flutterfire CLI not found');
    _log.info(
      '   → install it with: dart pub global activate flutterfire_cli',
    );
    return;
  }

  final flavors = targetFlavor != null ? [targetFlavor] : config.flavors;
  final strategy = config.firebase!.strategy;
  final projects = config.firebase!.projects;
  final useSuffix = config.useSuffix;
  final prodFlavor = config.productionFlavor;
  final baseId = config.android.applicationId;
  final useSeparate = config.useSeparateMains;

  _log.info('🔥 Initializing Firebase (Strategy: $strategy)...');

  if (strategy == 'shared_id_single_project') {
    final projectId = projects['all'] ?? projects.values.first;
    await _runConfigure(
      projectId: projectId,
      packageId: baseId,
      out: 'lib/firebase_options.dart',
      platforms: config.platforms,
    );
    FileService.injectFirebase(separate: useSeparate);
  } else {
    // Per-flavor strategies
    for (final flavor in flavors) {
      final projectId = strategy == 'unique_id_multi_project'
          ? (projects[flavor] ?? projects.values.first)
          : (projects['all'] ?? projects.values.first);

      String packageId = baseId;
      if (useSuffix && flavor != prodFlavor) {
        packageId = '$baseId.$flavor';
      }

      await _runConfigure(
        projectId: projectId,
        packageId: packageId,
        out: 'lib/firebase_options_$flavor.dart',
        flavor: flavor,
        platforms: config.platforms,
      );

      if (useSeparate) {
        FileService.injectFirebase(separate: true, flavor: flavor);
      }
    }

    if (!useSeparate) {
      FileService.injectFirebase(separate: false);
    }
  }

  _log.info('📦 Adding firebase_core dependency...');
  final pubAddResult = await Process.run('flutter', [
    'pub',
    'add',
    'firebase_core',
  ]);
  if (pubAddResult.exitCode != 0) {
    _log.warn(
      '⚠️ Could not automatically add firebase_core to pubspec.yaml. Please add it manually.',
    );
  }

  _log.success('✅ Firebase setup completed for all targets.');
  FileService.updateVSCodeLaunchConfig();
}