| // Copyright (c) 2014, 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'; |
| |
| /// A validator of the SDK constraint. |
| /// |
| /// Validates that a package's SDK constraint: |
| /// * has an upper bound. |
| /// * is not depending on a prerelease, unless the package itself is a |
| /// prerelease. |
| class SdkConstraintValidator extends Validator { |
| @override |
| Future validate() async { |
| final dartConstraint = package.pubspec.dartSdkConstraint; |
| final originalConstraint = dartConstraint.originalConstraint; |
| final effectiveConstraint = dartConstraint.effectiveConstraint; |
| if (originalConstraint is VersionRange) { |
| if (originalConstraint.max == null) { |
| errors.add( |
| 'Published packages should have an upper bound constraint on the ' |
| 'Dart SDK (typically this should restrict to less than the next ' |
| 'major version to guard against breaking changes).\n' |
| 'See https://dart.dev/tools/pub/pubspec#sdk-constraints for ' |
| 'instructions on setting an sdk version constraint.', |
| ); |
| } |
| |
| final constraintMin = originalConstraint.min; |
| final packageVersion = package.version; |
| |
| if (constraintMin != null && |
| constraintMin.isPreRelease && |
| !packageVersion.isPreRelease) { |
| warnings.add( |
| 'Packages with an SDK constraint on a pre-release of the Dart SDK ' |
| 'should themselves be published as a pre-release version. ' |
| 'If this package needs Dart version $constraintMin, consider ' |
| 'publishing the package as a pre-release instead.\n' |
| 'See https://dart.dev/tools/pub/publishing#publishing-prereleases ' |
| 'For more information on pre-releases.', |
| ); |
| } |
| if ( |
| // We only want to give this hint if there was no other problems with |
| // the sdk constraint. |
| warnings.isEmpty && |
| errors.isEmpty && |
| originalConstraint != effectiveConstraint) { |
| hints.add(''' |
| The declared SDK constraint is '$originalConstraint', this is interpreted as '$effectiveConstraint'. |
| |
| Consider updating the SDK constraint to: |
| |
| environment: |
| sdk: '$effectiveConstraint' |
| '''); |
| } |
| } |
| } |
| } |