firebaseSetupCommand function
Orchestrates the full Firebase setup flow for a Flutter project.
If full is true, it performs a comprehensive setup including tool
checks, login, project creation, and dependency configuration.
The env parameter specifies the target environment (e.g., 'dev').
Implementation
Future<void> firebaseSetupCommand({
required bool full,
required String env,
}) async {
final firebase = FirebaseService();
final flutter = FlutterService();
final prompt = PromptService();
final envService = EnvService();
final feature = FeatureService();
print('š FirePilot: Elite Firebase Setup ($env)\n');
try {
/// š¹ Validate Flutter project
if (!File('pubspec.yaml').existsSync()) {
print('ā Not a Flutter project');
print('š Run this inside a Flutter project folder');
return;
}
/// š¹ Check & auto-fix tools
await _checkAndFixTools();
/// š¹ Ask Project ID
/// š¹ Ask Project ID with Validation
String projectId = '';
while (true) {
projectId = prompt.ask('Enter Firebase project ID');
if (projectId.isEmpty) {
print('ā Project ID cannot be empty');
continue;
}
final regExp = RegExp(r'^[a-z][a-z0-9-]{5,29}$');
if (!regExp.hasMatch(projectId)) {
print('ā Invalid Project ID format');
print('š Must be 6-30 chars, lowercase, numbers, and hyphens (no underscores)');
print('š Must start with a letter');
continue;
}
break;
}
/// š¹ Firebase Login
print('š Checking Firebase login...');
await firebase.login();
/// š¹ List Projects (Helpful for Quota debugging)
print('\nš Your existing Firebase projects:');
await firebase.listProjects();
/// š¹ Create Project (Optional)
final shouldCreate = prompt.confirm('Create Firebase project?');
if (shouldCreate) {
print('š¦ Creating Firebase project...');
try {
await firebase.createProject(projectId);
} catch (e) {
print('\nā Project creation failed!');
print('š Possible reasons:');
print(' 1. ID "$projectId" is already taken (globally unique).');
print(' 2. You have reached your Firebase project quota.');
print(' 3. Network or permission issues.');
print('š TIP: Try a MORE UNIQUE ID (e.g. my-elite-$projectId)\n');
final proceed = prompt.confirm(
'Continue anyway? (Choose yes ONLY if the project already exists)');
if (!proceed) {
print('ā Setup aborted by user');
return;
}
}
} else {
print('ā Skipping project creation');
}
/// š¹ Configure FlutterFire
print('āļø Configuring FlutterFire...');
await firebase.configure(projectId);
/// š¹ Add Dependencies
print('š¦ Adding Firebase dependencies...');
await flutter.addDeps();
/// š Setup SHA
print('š Setting up SHA...');
try {
await firebase.setupSha(projectId);
} catch (e) {
print('ā ļø SHA setup failed, skipping...');
}
/// š¹ Create Environment Folder
print('š Setting up environment...');
envService.create(env);
/// š„ Full Setup (UPDATED: Firestore removed)
if (full) {
print('š„ Running FULL setup...\n');
final features = ['auth', 'fcm']; // ā
firestore removed
for (final f in features) {
await feature.enable(f, projectId: projectId);
}
print('\nš¦ Enabled: auth, fcm');
print('š« Skipped: firestore (manual enable recommended)');
} else {
print('ā¹ļø Skipping feature setup (use --full to enable)');
}
print('\nš Firebase setup completed successfully for [$env]');
} catch (e) {
print('\nā Setup failed!');
print('Error: $e');
}
}