Outdated: If current is a prerelease, use prereleases for latest if no newer stable (#2484)

diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 0d5f289..e239a27 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -219,6 +219,12 @@
 
   /// Get the latest version of [package].
   ///
+  /// Will include prereleases in the comparison  '--prereleases' was provided
+  /// in arguments.
+  ///
+  /// If [package] is a [PackageId] with a prerelease version and there are no
+  /// later stable version we return a prerelease version if it exists.
+  ///
   /// Returns `null`, if unable to find the package.
   Future<PackageId> _getLatest(PackageName package) async {
     if (package == null) {
@@ -229,12 +235,19 @@
     if (available.isEmpty) {
       return null;
     }
+
     final prereleases = argResults.wasParsed('prereleases')
         ? argResults['prereleases']
         : argResults['pre-releases'];
+
     available.sort(prereleases
         ? (x, y) => x.version.compareTo(y.version)
         : (x, y) => Version.prioritize(x.version, y.version));
+    if (package is PackageId &&
+        package.version.isPreRelease &&
+        package.version < available.last.version) {
+      available.sort((x, y) => x.version.compareTo(y.version));
+    }
     return available.last;
   }
 
diff --git a/test/outdated/goldens/prereleases.txt b/test/outdated/goldens/prereleases.txt
new file mode 100644
index 0000000..931b5de
--- /dev/null
+++ b/test/outdated/goldens/prereleases.txt
@@ -0,0 +1,118 @@
+$ pub outdated --json
+{
+  "packages": [
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.0.0-dev.1"
+      },
+      "upgradable": {
+        "version": "1.0.0-dev.1"
+      },
+      "resolvable": {
+        "version": "0.9.0"
+      },
+      "latest": {
+        "version": "0.9.0"
+      }
+    },
+    {
+      "package": "mop",
+      "current": {
+        "version": "0.10.0-dev"
+      },
+      "upgradable": {
+        "version": "0.10.0-dev"
+      },
+      "resolvable": {
+        "version": "0.10.0"
+      },
+      "latest": {
+        "version": "1.0.0-dev"
+      }
+    }
+  ]
+}
+
+$ pub outdated --no-color
+Dependencies  Current       Upgradable    Resolvable  Latest     
+foo           *1.0.0-dev.1  *1.0.0-dev.1  0.9.0       0.9.0      
+mop           *0.10.0-dev   *0.10.0-dev   *0.10.0     1.0.0-dev  
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2  dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --mark=none
+Dependencies  Current      Upgradable   Resolvable  Latest     
+foo           1.0.0-dev.1  1.0.0-dev.1  0.9.0       0.9.0      
+mop           0.10.0-dev   0.10.0-dev   0.10.0      1.0.0-dev  
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2  dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --up-to-date
+Dependencies  Current       Upgradable    Resolvable  Latest     
+bar           0.9.0         0.9.0         0.9.0       0.9.0      
+foo           *1.0.0-dev.1  *1.0.0-dev.1  0.9.0       0.9.0      
+mop           *0.10.0-dev   *0.10.0-dev   *0.10.0     1.0.0-dev  
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2  dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --prereleases
+Dependencies  Current       Upgradable    Resolvable  Latest       
+bar           *0.9.0        *0.9.0        *0.9.0      1.0.0-dev.2  
+foo           *1.0.0-dev.1  *1.0.0-dev.1  *0.9.0      1.0.0-dev.2  
+mop           *0.10.0-dev   *0.10.0-dev   *0.10.0     1.0.0-dev    
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2  dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --no-dev-dependencies
+Dependencies  Current       Upgradable    Resolvable  Latest     
+foo           *1.0.0-dev.1  *1.0.0-dev.1  0.9.0       0.9.0      
+mop           *0.10.0-dev   *0.10.0-dev   *0.10.0     1.0.0-dev  
+
+transitive dependencies: all up-to-date
+
+2  dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --no-dependency-overrides
+Dependencies  Current       Upgradable    Resolvable  Latest     
+foo           *1.0.0-dev.1  *1.0.0-dev.1  0.9.0       0.9.0      
+mop           *0.10.0-dev   *0.10.0-dev   *0.10.0     1.0.0-dev  
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2  dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index b8aaf8a..227276d 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -219,4 +219,34 @@
 
     await variations('dependency_overrides_no_solution');
   });
+
+  test(
+      'latest version reported while locked on a prerelease can be a prerelease',
+      () async {
+    await servePackages((builder) => builder
+      ..serve('foo', '0.9.0')
+      ..serve('foo', '1.0.0-dev.1')
+      ..serve('foo', '1.0.0-dev.2')
+      ..serve('bar', '0.9.0')
+      ..serve('bar', '1.0.0-dev.1')
+      ..serve('bar', '1.0.0-dev.2')
+      ..serve('mop', '0.10.0-dev')
+      ..serve('mop', '0.10.0')
+      ..serve('mop', '1.0.0-dev'));
+    await d.dir(appPath, [
+      d.pubspec({
+        'name': 'app',
+        'version': '1.0.1',
+        'dependencies': {
+          'foo': '1.0.0-dev.1',
+          'bar': '^0.9.0',
+          'mop': '0.10.0-dev'
+        },
+      })
+    ]).create();
+
+    await pubGet();
+
+    await variations('prereleases');
+  });
 }