diff --git a/packages/flutterfire_cli/lib/src/common/package.dart b/packages/flutterfire_cli/lib/src/common/package.dart index a22a6b81..ce1374fb 100644 --- a/packages/flutterfire_cli/lib/src/common/package.dart +++ b/packages/flutterfire_cli/lib/src/common/package.dart @@ -75,14 +75,19 @@ class Package { late final bool isFlutterPackage = dependencies.contains('flutter') || dependencies.contains('flutter_localizations'); + /// Returns whether this package is compatible with Flutter plugins, even + /// if it doesn't depend on the Flutter SDK directly. + /// + /// This is currently only true for packages that depend on Jaspr. + late final bool isFlutterCompatiblePackage = dependencies.contains('jaspr'); + /// Returns whether this package is a Flutter app. /// This is determined by ensuring all the following conditions are met: - /// a) the package depends on the Flutter SDK. + /// a) the package depends on the Flutter SDK or is a Flutter compatible package. /// b) the package does not define itself as a Flutter plugin inside pubspec.yaml. - /// c) a lib/main.dart file exists in the package. bool get isFlutterApp { - // Must directly depend on the Flutter SDK. - if (!isFlutterPackage) return false; + // Must directly depend on the Flutter SDK or be a Flutter compatible package. + if (!isFlutterPackage && !isFlutterCompatiblePackage) return false; // Must not have a Flutter plugin definition in it's pubspec.yaml. if (isFlutterPlugin) return false; diff --git a/packages/flutterfire_cli/test/unit_test.dart b/packages/flutterfire_cli/test/unit_test.dart index 292473d8..526611df 100644 --- a/packages/flutterfire_cli/test/unit_test.dart +++ b/packages/flutterfire_cli/test/unit_test.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'package:flutterfire_cli/src/common/package.dart'; import 'package:flutterfire_cli/src/common/strings.dart'; import 'package:flutterfire_cli/src/common/utils.dart'; +import 'package:pubspec_parse/pubspec_parse.dart'; import 'package:test/test.dart'; void main() { @@ -233,4 +235,114 @@ void main() { }); }, ); + + group('Package class', () { + test( + 'isFlutterPackage returns true if depends on flutter or flutter_localizations', + () { + final package1 = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + flutter: + sdk: flutter +'''), + ); + expect(package1.isFlutterPackage, isTrue); + + final package2 = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + flutter_localizations: + sdk: flutter +'''), + ); + expect(package2.isFlutterPackage, isTrue); + + final package3 = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + http: ^0.13.0 +'''), + ); + expect(package3.isFlutterPackage, isFalse); + }); + + test('isFlutterCompatiblePackage returns true if depends on jaspr', () { + final package1 = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + jaspr: ^0.23.0 +'''), + ); + expect(package1.isFlutterCompatiblePackage, isTrue); + + final package2 = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + http: ^0.13.0 +'''), + ); + expect(package2.isFlutterCompatiblePackage, isFalse); + }); + + test( + 'isFlutterApp returns correctly based on dependencies and plugin definition', + () { + final flutterApp = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + flutter: + sdk: flutter +'''), + ); + expect(flutterApp.isFlutterApp, isTrue); + + final jasprApp = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + jaspr: ^0.1.0 +'''), + ); + expect(jasprApp.isFlutterApp, isTrue); + + final dartApp = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + http: ^0.13.0 +'''), + ); + expect(dartApp.isFlutterApp, isFalse); + + final flutterPlugin = Package( + path: '', + pubSpec: Pubspec.parse(''' +name: test_pkg +dependencies: + flutter: + sdk: flutter +flutter: + plugin: + platforms: + android: +'''), + ); + expect(flutterPlugin.isFlutterApp, isFalse); + }); + }); }