setupFlavorEntrypoints function
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.');
}
}