Skip to content

Commit 3edb907

Browse files
fix: flutterfire configure command when existing firebase_options.dart has a wrong format (#424)
Co-authored-by: Russell Wheatley <russellwheatley85@gmail.com>
1 parent fd69a95 commit 3edb907

File tree

2 files changed

+88
-8
lines changed

2 files changed

+88
-8
lines changed

packages/flutterfire_cli/lib/src/firebase/firebase_dart_configuration_write.dart

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,8 @@ class FirebaseDartConfigurationWrite {
5959
);
6060
outputFile.writeAsStringSync(updatedFileString);
6161
} else {
62-
_writeHeader();
63-
_writeClass();
64-
6562
outputFile.createSync(recursive: true);
66-
outputFile.writeAsStringSync(_stringBuffer.toString());
63+
outputFile.writeAsStringSync(_buildConfigurationFile());
6764
}
6865

6966
return _firebaseJsonWrites();
@@ -130,14 +127,28 @@ class FirebaseDartConfigurationWrite {
130127
platform == kWeb ? 'if (kIsWeb)' : 'case TargetPlatform.$platform:',
131128
),
132129
);
133-
final unsupportedErrorLineIndex = startIndex + 1;
134130

135-
if (fileConfigurationLines[unsupportedErrorLineIndex]
136-
.contains('UnsupportedError')) {
131+
// Existing file does not match generated FlutterFire structure.
132+
// Regenerate so configure can recover from template placeholders.
133+
if (startIndex == -1) {
134+
return _buildConfigurationFile();
135+
}
136+
137+
final unsupportedErrorLineIndex = fileConfigurationLines.indexWhere(
138+
(line) =>
139+
line.contains('throw UnsupportedError(') ||
140+
line.contains('throw UnimplementedError('),
141+
startIndex,
142+
);
143+
144+
if (unsupportedErrorLineIndex != -1) {
137145
final endIndex = fileConfigurationLines.indexWhere(
138146
(line) => line.contains(');'),
139147
unsupportedErrorLineIndex,
140148
);
149+
if (endIndex == -1) {
150+
return _buildConfigurationFile();
151+
}
141152
fileConfigurationLines.removeRange(
142153
unsupportedErrorLineIndex,
143154
endIndex + 1,
@@ -150,7 +161,7 @@ class FirebaseDartConfigurationWrite {
150161
: ' return ${platform.toLowerCase()};',
151162
);
152163
} else {
153-
throw Exception('`UnsupportedError` not found in $platform');
164+
return _buildConfigurationFile();
154165
}
155166

156167
final insertIndex = fileConfigurationLines.lastIndexOf('}');
@@ -169,6 +180,13 @@ class FirebaseDartConfigurationWrite {
169180
return formatList(fileConfigurationLines).join('\n');
170181
}
171182

183+
String _buildConfigurationFile() {
184+
_stringBuffer.clear();
185+
_writeHeader();
186+
_writeClass();
187+
return formatList(_stringBuffer.toString().split('\n')).join('\n');
188+
}
189+
172190
// ensure only one empty line between each static property
173191
List<String> formatList(List<String> items) {
174192
return items.fold<List<String>>([], (acc, item) {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import 'dart:io';
2+
3+
import 'package:flutterfire_cli/src/firebase/firebase_dart_configuration_write.dart';
4+
import 'package:flutterfire_cli/src/firebase/firebase_options.dart';
5+
import 'package:path/path.dart' as p;
6+
import 'package:test/test.dart';
7+
8+
void main() {
9+
group('FirebaseDartConfigurationWrite', () {
10+
// Regression test for
11+
// https://github.com/invertase/flutterfire_cli/issues/422
12+
test(
13+
'replaces placeholder firebase_options.dart with generated output',
14+
() {
15+
final tempDir = Directory.systemTemp.createTempSync();
16+
addTearDown(() => tempDir.deleteSync(recursive: true));
17+
18+
final filePath = p.join(tempDir.path, 'lib', 'firebase_options.dart');
19+
File(filePath)
20+
..createSync(recursive: true)
21+
..writeAsStringSync('''
22+
// File normally generated by FlutterFire CLI. This is a stand-in.
23+
// See README.md for details.
24+
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
25+
26+
class DefaultFirebaseOptions {
27+
// TODO: Remove this file and run `flutterfire config` for Firebase options
28+
static FirebaseOptions get currentPlatform {
29+
throw UnimplementedError(
30+
'Generate this file by running `flutterfire configure`. '
31+
'See README.md for details.',
32+
);
33+
}
34+
}
35+
''');
36+
37+
final writer = FirebaseDartConfigurationWrite(
38+
configurationFilePath: filePath,
39+
flutterAppPath: tempDir.path,
40+
firebaseProjectId: 'test-project-id',
41+
webOptions: const FirebaseOptions(
42+
optionsSourceContent: '{}',
43+
optionsSourceFileName: 'firebase-config.json',
44+
apiKey: 'api-key',
45+
appId: 'app-id',
46+
messagingSenderId: 'sender-id',
47+
projectId: 'test-project-id',
48+
measurementId: 'measurement-id',
49+
),
50+
);
51+
52+
writer.write();
53+
54+
final updatedContent = File(filePath).readAsStringSync();
55+
expect(updatedContent, contains('if (kIsWeb) {'));
56+
expect(updatedContent, contains('return web;'));
57+
expect(updatedContent, contains('static const FirebaseOptions web'));
58+
expect(updatedContent, isNot(contains('UnimplementedError')));
59+
},
60+
);
61+
});
62+
}

0 commit comments

Comments
 (0)