handleFirebaseSetupFull function
End-to-end Firebase setup. Runs every applicable sub-step (auth, billing, FlutterFire / Jaspr JS SDK, Firestore + Storage init, auth providers hand-off, rules deploy, web build, hosting init, hosting release + beta deploy, and — when the project enabled it — Cloud Run / Artifact Registry cleanup).
Idempotent: any sub-step that already ran cleanly short-circuits.
Implementation
Future<void> handleFirebaseSetupFull() async {
if (!await _ensureProjectConfigOrHelp()) {
return;
}
final SetupConfig config = (await ProjectConfigLoader.load())!;
print('');
UserPrompt.printDivider(title: 'Firebase end-to-end setup');
UserPrompt.printList(<String>[
'Project: ${config.firebaseProjectId}',
'Template: ${config.template.name}',
if (SetupGuidance.supportsWebHosting(config)) 'Web hosting: enabled',
if (config.createServer) 'Server (Cloud Run): enabled',
]);
print('');
final FirebaseSetupOrchestrator orchestrator = FirebaseSetupOrchestrator(
config,
);
final OrchestratorReport report = await orchestrator.runAll(
interactive: true,
onStep: (SetupStepResult result) async {
switch (result.status) {
case SetupStepStatus.success:
success(
'${result.step.label}'
'${result.message.isNotEmpty ? ' — ${result.message}' : ''}',
);
break;
case SetupStepStatus.skipped:
warn(
'${result.step.label} skipped'
'${result.message.isNotEmpty ? ': ${result.message}' : ''}',
);
break;
case SetupStepStatus.failed:
error(
'${result.step.label} failed'
'${result.message.isNotEmpty ? ': ${result.message}' : ''}',
);
break;
}
},
);
print('');
UserPrompt.printDivider(title: 'Setup summary');
UserPrompt.printList(<String>[
'Steps succeeded: ${report.successCount}',
'Steps skipped: ${report.skippedCount}',
'Steps failed: ${report.failedCount}',
]);
if (report.releaseUrl != null || report.betaUrl != null) {
print('');
UserPrompt.printDivider(title: 'What was deployed');
UserPrompt.printList(<String>[
if (report.releaseUrl != null) 'Release URL: ${report.releaseUrl}',
if (report.betaUrl != null) 'Beta URL: ${report.betaUrl}',
if (report.firestoreRegion != null)
SetupGuidance.linkLine(
'Firestore console',
FirebaseInitializer.firestoreConsoleUrl(config.firebaseProjectId!),
),
if (report.storageBucketName != null)
SetupGuidance.linkLine(
'Storage console',
FirebaseInitializer.getStartedUrl(config.firebaseProjectId!),
),
if (config.setupCloudRun)
SetupGuidance.linkLine(
'Cloud Run console',
SetupGuidance.cloudRunConsoleUrl(config.firebaseProjectId!),
),
]);
}
if (report.failures.isNotEmpty) {
print('');
UserPrompt.printDivider(title: 'Failures (re-runnable)');
for (final SetupStepResult fail in report.failures) {
UserPrompt.printList(<String>[
'${fail.step.label}: ${fail.message}',
if (fail.fixHint.isNotEmpty) ' Fix: ${fail.fixHint}',
]);
}
}
if (!report.success) {
print('');
error(
'Firebase setup completed with ${report.failedCount} failing step(s). '
'Re-run individual commands above to retry.',
);
} else if (report.skippedCount > 0) {
print('');
info('Firebase setup completed (some steps were skipped).');
} else {
print('');
success('Firebase setup complete!');
}
}