| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:async'; |
| |
| import 'package:pub_semver/pub_semver.dart'; |
| |
| import '../validator.dart'; |
| |
| const _pluginDocsUrl = |
| 'https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin'; |
| |
| /// Validates that Flutter plugins doesn't use both new and old plugin format. |
| /// |
| /// Warns if using the old plugin registration format. |
| /// |
| /// See: |
| /// https://flutter.dev/docs/development/packages-and-plugins/developing-packages |
| class FlutterPluginFormatValidator extends Validator { |
| @override |
| Future validate() async { |
| final pubspec = entrypoint.root.pubspec; |
| |
| // Ignore all packages that do not have the `flutter.plugin` property. |
| if (pubspec.fields['flutter'] is! Map || |
| pubspec.fields['flutter']['plugin'] is! Map) { |
| return; |
| } |
| final plugin = pubspec.fields['flutter']['plugin'] as Map; |
| |
| // Determine if this uses the old format by checking if `flutter.plugin` |
| // contains any of the following keys. |
| final usesOldPluginFormat = const { |
| 'androidPackage', |
| 'iosPrefix', |
| 'pluginClass', |
| }.any(plugin.containsKey); |
| |
| // Determine if this uses the new format by check if the: |
| // `flutter.plugin.platforms` keys is defined. |
| final usesNewPluginFormat = plugin['platforms'] != null; |
| |
| // If the new plugin format is used, and the flutter SDK dependency allows |
| // SDKs older than 1.10.0, then this is going to be a problem. |
| final flutterConstraint = pubspec.sdkConstraints['flutter']; |
| if (usesNewPluginFormat && |
| (flutterConstraint == null || |
| flutterConstraint.effectiveConstraint.allowsAny(VersionRange( |
| min: Version.parse('0.0.0'), |
| max: Version.parse('1.10.0'), |
| includeMin: true, |
| )))) { |
| errors.add('pubspec.yaml allows Flutter SDK version 1.9.x, which does ' |
| 'not support the flutter.plugin.platforms key.\n' |
| 'Please consider increasing the Flutter SDK requirement to ' |
| '^1.10.0 (environment.sdk.flutter)\n\nSee $_pluginDocsUrl'); |
| return; |
| } |
| |
| if (usesOldPluginFormat) { |
| errors.add('In pubspec.yaml the ' |
| 'flutter.plugin.{androidPackage,iosPrefix,pluginClass} keys are ' |
| 'deprecated. Instead use the flutter.plugin.platforms key ' |
| 'introduced in Flutter 1.10.0\n\nSee $_pluginDocsUrl'); |
| } |
| } |
| } |