Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,15 @@ extension FirebaseDartOptions on FirebaseOptions {
var jsonBody = '';
if (match != null) {
jsonBody = match.namedGroup('jsonBody')!;
return FirebaseOptions.fromMap(
const JsonDecoder().convert('{$jsonBody}') as Map,
);
} else {
// Handle new JSON format introduced in Firebase CLI v13.31.0
// The config is now returned as direct JSON instead of JavaScript format
return FirebaseOptions.fromMap(
const JsonDecoder().convert(appSdkConfig.fileContents) as Map,
);
}
return FirebaseOptions.fromMap(
const JsonDecoder().convert('{$jsonBody}') as Map,
);
}
}
76 changes: 76 additions & 0 deletions packages/flutterfire_cli/test/firebase_dart_options_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import 'package:flutterfire_cli/src/firebase.dart';
import 'package:flutterfire_cli/src/firebase/firebase_dart_options.dart';
import 'package:test/test.dart';

void main() {
group('FirebaseDartOptions', () {
group('convertConfigToOptions', () {
test('parses traditional JavaScript format correctly', () {
final config = FirebaseAppSdkConfig(
fileName: 'firebase-config.js',
fileContents: '''
firebase.initializeApp({
"projectId": "test-project",
"appId": "1:1234567890:web:abcdef1234567890",
"apiKey": "test-api-key",
"authDomain": "test-project.firebaseapp.com",
"messagingSenderId": "1234567890",
"measurementId": "G-ABCDEF1234"
});''',
);

final options = FirebaseDartOptions.convertConfigToOptions(
config,
'test-project',
);

expect(options.projectId, 'test-project');
expect(options.appId, '1:1234567890:web:abcdef1234567890');
expect(options.apiKey, 'test-api-key');
expect(options.messagingSenderId, '1234567890');
expect(options.measurementId, 'G-ABCDEF1234');
});

test('parses new JSON format correctly', () {
final config = FirebaseAppSdkConfig(
fileName: 'firebase-config.json',
fileContents: '''
{
"projectId": "test-project",
"appId": "1:1234567890:web:abcdef1234567890",
"apiKey": "test-api-key",
"authDomain": "test-project.firebaseapp.com",
"messagingSenderId": "1234567890",
"measurementId": "G-ABCDEF1234"
}''',
);

final options = FirebaseDartOptions.convertConfigToOptions(
config,
'test-project',
);

expect(options.projectId, 'test-project');
expect(options.appId, '1:1234567890:web:abcdef1234567890');
expect(options.apiKey, 'test-api-key');
expect(options.messagingSenderId, '1234567890');
expect(options.measurementId, 'G-ABCDEF1234');
});

test('throws FirebaseCommandException for invalid format', () {
final config = FirebaseAppSdkConfig(
fileName: 'invalid-config.txt',
fileContents: 'Invalid config format',
);

expect(
() => FirebaseDartOptions.convertConfigToOptions(
config,
'test-project',
),
throwsA(isA<Exception>()),
);
});
});
});
}
Loading