setupFlavorEntrypoints function

Future<void> setupFlavorEntrypoints(
  1. String projectPath,
  2. List<String> flavors
)

Implementation

Future<void> setupFlavorEntrypoints(String projectPath, List<String> flavors) async {

  final libDir = Directory(p.join(projectPath, 'lib'));
  final mainFile = File(p.join(libDir.path, 'main.dart'));

  if (!mainFile.existsSync()) {
    print('❌ main.dart not found.');
    return;
  }

  var content = mainFile.readAsStringSync();

  // If bootstrap already exists → skip refactor
  if (!content.contains('bootstrap({required String flavor})')) {

    print('🔄 Refactoring main.dart to support flavors...');

    // Match BOTH async and non-async main()
    final mainRegex = RegExp(
      r'(Future<void>\s+main\s*\(\)\s*async\s*{|void\s+main\s*\(\)\s*{)',
      multiLine: true,
    );

    final match = mainRegex.firstMatch(content);

    if (match == null) {
      print('❌ Could not detect main() function safely.');
      return;
    }

    // Replace main signature with bootstrap
    content = content.replaceFirst(
      mainRegex,
      'Future<void> bootstrap({required String flavor}) async {',
    );

    // Append new main() at bottom
    content += '''

Future<void> main() async {
  bootstrap(flavor: 'prod');
}
''';

    mainFile.writeAsStringSync(content);

    print('✅ main.dart refactored successfully.');
  }

  // Generate flavor entrypoints
  for (var flavor in flavors) {
    final flavorFile =
    File(p.join(libDir.path, 'main_$flavor.dart'));

    if (flavorFile.existsSync()) {
      print('⚠ main_$flavor.dart already exists.');
      continue;
    }

    flavorFile.writeAsStringSync('''
import 'main.dart';

Future<void> main() async {
  bootstrap(flavor: '$flavor');
}
''');

    print('✅ main_$flavor.dart created.');
  }
}