Remove features for migrating to null safety (#3713)

diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 5bad745..0ae3ab3 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -7,8 +7,7 @@
 import 'dart:io';
 import 'dart:math';
 
-import 'package:collection/collection.dart'
-    show IterableExtension, IterableNullableExtension;
+import 'package:collection/collection.dart' show IterableExtension;
 import 'package:path/path.dart' as path;
 
 import '../command.dart';
@@ -69,12 +68,12 @@
       valueHelp: 'PROPERTY',
       allowed: ['outdated', 'null-safety'],
       defaultsTo: 'outdated',
+      hide: true,
     );
 
     argParser.addFlag(
       'prereleases',
-      help: 'Include prereleases in latest version.\n'
-          '(defaults to on in --mode=null-safety).',
+      help: 'Include prereleases in latest version.',
     );
 
     // Preserve for backwards compatibility.
@@ -98,8 +97,7 @@
     );
     argParser.addFlag(
       'transitive',
-      help: 'Show transitive dependencies.\n'
-          '(defaults to off in --mode=null-safety).',
+      help: 'Show transitive dependencies.',
     );
     argParser.addOption('directory',
         abbr: 'C', help: 'Run this in the directory<dir>.', valueHelp: 'dir');
@@ -107,11 +105,11 @@
 
   @override
   Future<void> runProtected() async {
-    final mode = <String, _Mode>{
-      'outdated': _OutdatedMode(),
-      'null-safety': _NullSafetyMode(cache, entrypoint,
-          shouldShowSpinner: _shouldShowSpinner),
-    }[argResults['mode']]!;
+    if (argResults['mode'] == 'null-safety') {
+      dataError('''The `--mode=null-safety` option is no longer supported.
+Consider using the Dart 2.19 sdk to migrate to null safety.''');
+    }
+    final mode = _OutdatedMode();
 
     final includeDevDependencies = argResults['dev-dependencies'];
     final includeDependencyOverrides = argResults['dependency-overrides'];
@@ -288,11 +286,7 @@
   }
 
   bool get showTransitiveDependencies {
-    if (argResults.wasParsed('transitive')) {
-      return argResults['transitive'];
-    }
-    // We default to hidding transitive dependencies in --mode=null-safety
-    return argResults['mode'] != 'null-safety';
+    return argResults['transitive'];
   }
 
   late final bool prereleases = () {
@@ -306,7 +300,7 @@
     if (argResults.wasParsed('pre-releases')) {
       return argResults['pre-releases'];
     }
-    return argResults['mode'] == 'null-safety';
+    return false;
   }();
 
   /// Retrieves the pubspec of package [name] in [version] from [source].
@@ -691,115 +685,6 @@
   }
 }
 
-class _NullSafetyMode implements _Mode {
-  final SystemCache cache;
-  final Entrypoint entrypoint;
-  final bool shouldShowSpinner;
-
-  final _compliantEmoji = emoji('✓', '+');
-  final _notCompliantEmoji = emoji('✗', 'x');
-
-  _NullSafetyMode(this.cache, this.entrypoint,
-      {required this.shouldShowSpinner});
-
-  @override
-  String explanation(String directoryDescription) => '''
-Showing dependencies$directoryDescription that are currently not opted in to null-safety.
-[${log.red(_notCompliantEmoji)}] indicates versions without null safety support.
-[${log.green(_compliantEmoji)}] indicates versions opting in to null safety.
-''';
-
-  @override
-  String get foundNoBadText =>
-      'All your dependencies declare support for null-safety.';
-
-  @override
-  String get allGood => 'all support null safety.';
-
-  @override
-  String get noResolutionText =>
-      '''No resolution was found. Try running `$topLevelProgram pub upgrade --null-safety --dry-run` to explore why.''';
-
-  @override
-  String get upgradeConstrained =>
-      'edit pubspec.yaml, or run `$topLevelProgram pub upgrade --null-safety`';
-
-  @override
-  String get allSafe => 'All dependencies opt in to null-safety.';
-
-  @override
-  Future<List<List<_MarkedVersionDetails>>> markVersionDetails(
-      List<_PackageDetails> packages) async {
-    final nullSafetyMap =
-        await log.spinner('Computing null safety support', () async {
-      /// Find all unique ids.
-      final ids = {
-        for (final packageDetails in packages) ...[
-          packageDetails.current?._id,
-          packageDetails.upgradable?._id,
-          packageDetails.resolvable?._id,
-          packageDetails.latest?._id,
-        ]
-      }.whereNotNull();
-
-      return Map.fromEntries(
-        await Future.wait(
-          ids.map(
-            (id) async => MapEntry(id,
-                (await cache.describe(id)).languageVersion.supportsNullSafety),
-          ),
-        ),
-      );
-    }, condition: shouldShowSpinner);
-    return [
-      for (final packageDetails in packages)
-        [
-          packageDetails.current,
-          packageDetails.upgradable,
-          packageDetails.resolvable,
-          packageDetails.latest
-        ].map(
-          (versionDetails) {
-            String Function(String)? color;
-            String? prefix;
-            String? suffix;
-            MapEntry<String, Object>? jsonExplanation;
-            var asDesired = false;
-            if (versionDetails != null) {
-              if (packageDetails.isDiscontinued &&
-                  identical(versionDetails, packageDetails.latest)) {
-                suffix = ' (discontinued)';
-              }
-              if (nullSafetyMap[versionDetails._id]!) {
-                color = log.green;
-                prefix = _compliantEmoji;
-                jsonExplanation = MapEntry('nullSafety', true);
-                asDesired = true;
-              } else {
-                color = log.red;
-                prefix = _notCompliantEmoji;
-                jsonExplanation = MapEntry('nullSafety', false);
-              }
-            }
-            return _MarkedVersionDetails(
-              versionDetails,
-              asDesired: asDesired,
-              format: color,
-              prefix: prefix,
-              suffix: suffix,
-              jsonExplanation: jsonExplanation,
-            );
-          },
-        ).toList()
-    ];
-  }
-
-  @override
-  Future<Pubspec> resolvablePubspec(Pubspec pubspec) async {
-    return constrainedToAtLeastNullSafetyPubspec(pubspec, cache);
-  }
-}
-
 /// Details about a single version of a package.
 class _VersionDetails {
   final Pubspec _pubspec;
diff --git a/lib/src/command/upgrade.dart b/lib/src/command/upgrade.dart
index 1a80900..defa20b 100644
--- a/lib/src/command/upgrade.dart
+++ b/lib/src/command/upgrade.dart
@@ -11,16 +11,15 @@
 import '../command.dart';
 import '../command_runner.dart';
 import '../entrypoint.dart';
-import '../exceptions.dart';
 import '../io.dart';
 import '../log.dart' as log;
-import '../null_safety_analysis.dart';
 import '../package.dart';
 import '../package_name.dart';
 import '../pubspec.dart';
 import '../pubspec_utils.dart';
 import '../solver.dart';
 import '../source/hosted.dart';
+import '../utils.dart';
 
 /// Handles the `upgrade` pub command.
 class UpgradeCommand extends PubCommand {
@@ -50,6 +49,7 @@
         help: 'Precompile executables in immediate dependencies.');
 
     argParser.addFlag('null-safety',
+        hide: true,
         negatable: false,
         help: 'Upgrade constraints in pubspec.yaml to null-safety versions');
     argParser.addFlag('nullsafety', negatable: false, hide: true);
@@ -87,22 +87,16 @@
 
   @override
   Future<void> runProtected() async {
+    if (_upgradeNullSafety) {
+      dataError('''The `--null-safety` flag is no longer supported.
+Consider using the Dart 2.19 sdk to migrate to null safety.''');
+    }
     if (argResults.wasParsed('packages-dir')) {
       log.warning(log.yellow(
           'The --packages-dir flag is no longer used and does nothing.'));
     }
 
-    if (_upgradeNullSafety && _upgradeMajorVersions) {
-      usageException('--major-versions and --null-safety cannot be combined');
-    }
-
-    if (_upgradeNullSafety) {
-      if (argResults['example'] && entrypoint.example != null) {
-        log.warning(
-            'Running `upgrade --null-safety` only in `${entrypoint.root.dir}`. Run `$topLevelProgram pub upgrade --null-safety --directory example/` separately.');
-      }
-      await _runUpgradeNullSafety();
-    } else if (_upgradeMajorVersions) {
+    if (_upgradeMajorVersions) {
       if (argResults['example'] && entrypoint.example != null) {
         log.warning(
             'Running `upgrade --major-versions` only in `${entrypoint.root.dir}`. Run `$topLevelProgram pub upgrade --major-versions --directory example/` separately.');
@@ -136,7 +130,7 @@
   ///
   /// This assumes that either `--major-versions` or `--null-safety` was passed.
   List<String> _directDependenciesToUpgrade() {
-    assert(_upgradeNullSafety || _upgradeMajorVersions);
+    assert(_upgradeMajorVersions);
 
     final directDeps = [
       ...entrypoint.root.pubspec.dependencies.keys,
@@ -148,9 +142,6 @@
     final notInDeps = toUpgrade.where((n) => !directDeps.contains(n));
     if (toUpgrade.any(notInDeps.contains)) {
       var modeFlag = '';
-      if (_upgradeNullSafety) {
-        modeFlag = '--null-safety';
-      }
       if (_upgradeMajorVersions) {
         modeFlag = '--major-versions';
       }
@@ -276,124 +267,6 @@
     _showOfflineWarning();
   }
 
-  Future<void> _runUpgradeNullSafety() async {
-    final toUpgrade = _directDependenciesToUpgrade();
-
-    final nullsafetyPubspec = await _upgradeToNullSafetyConstraints(
-      entrypoint.root.pubspec,
-      toUpgrade,
-    );
-
-    /// Solve [nullsafetyPubspec] in-memory and consolidate the resolved
-    /// versions of the packages into a map for quick searching.
-    final resolvedPackages = <String, PackageId>{};
-    final solveResult = await log.spinner('Resolving dependencies', () async {
-      return await resolveVersions(
-        SolveType.upgrade,
-        cache,
-        Package.inMemory(nullsafetyPubspec),
-      );
-    }, condition: _shouldShowSpinner);
-    for (final resolvedPackage in solveResult.packages) {
-      resolvedPackages[resolvedPackage.name] = resolvedPackage;
-    }
-
-    /// Changes to be made to `pubspec.yaml`.
-    /// Mapping from original to changed value.
-    final changes = <PackageRange, PackageRange>{};
-    final declaredHostedDependencies = [
-      ...entrypoint.root.pubspec.dependencies.values,
-      ...entrypoint.root.pubspec.devDependencies.values,
-    ].where((dep) => dep.source is HostedSource);
-    for (final dep in declaredHostedDependencies) {
-      final resolvedPackage = resolvedPackages[dep.name]!;
-      if (!toUpgrade.contains(dep.name)) {
-        // If we're not to upgrade this package, or it wasn't in the
-        // resolution somehow, then we ignore it.
-        continue;
-      }
-
-      final constraint = VersionConstraint.compatibleWith(
-        resolvedPackage.version,
-      );
-      if (dep.constraint.allowsAll(constraint) &&
-          constraint.allowsAll(dep.constraint)) {
-        // If constraint allows the same as the existing constraint then
-        // there is no need to make changes.
-        continue;
-      }
-
-      changes[dep] = dep.toRef().withConstraint(constraint);
-    }
-
-    final newPubspecText = _updatePubspec(changes);
-    if (_dryRun) {
-      // Even if it is a dry run, run `acquireDependencies` so that the user
-      // gets a report on changes.
-      // TODO(jonasfj): Stop abusing Entrypoint.global for dry-run output
-      await Entrypoint.inMemory(
-        Package.inMemory(Pubspec.parse(newPubspecText, cache.sources)),
-        cache,
-        lockFile: entrypoint.lockFile,
-        solveResult: solveResult,
-      ).acquireDependencies(
-        SolveType.upgrade,
-        dryRun: true,
-        precompile: _precompile,
-        analytics: null,
-      );
-    } else {
-      if (changes.isNotEmpty) {
-        writeTextFile(entrypoint.pubspecPath, newPubspecText);
-      }
-      // TODO: Allow Entrypoint to be created with in-memory pubspec, so that
-      //       we can show the changes in --dry-run mode. For now we only show
-      //       the changes made to pubspec.yaml in dry-run mode.
-      await Entrypoint(directory, cache).acquireDependencies(
-        SolveType.upgrade,
-        precompile: _precompile,
-        analytics: analytics,
-      );
-    }
-
-    _outputChangeSummary(changes);
-
-    // Warn if not all dependencies were migrated to a null-safety compatible
-    // version. This can happen because:
-    //  - `upgradeOnly` was given,
-    //  - root has SDK dependencies,
-    //  - root has git or path dependencies,
-    //  - root has dependency_overrides
-    final nonMigratedDirectDeps = <String>[];
-    final directDeps = [
-      ...entrypoint.root.pubspec.dependencies.keys,
-      ...entrypoint.root.pubspec.devDependencies.keys
-    ];
-    await Future.wait(directDeps.map((name) async {
-      final resolvedPackage = resolvedPackages[name]!;
-
-      final pubspec = await cache.describe(resolvedPackage);
-      if (!pubspec.languageVersion.supportsNullSafety) {
-        nonMigratedDirectDeps.add(name);
-      }
-    }));
-    if (nonMigratedDirectDeps.isNotEmpty) {
-      log.warning('''
-\nFollowing direct 'dependencies' and 'dev_dependencies' are not migrated to
-null-safety yet:
- - ${nonMigratedDirectDeps.join('\n - ')}
-
-You may have to:
- * Upgrade git and path dependencies manually,
- * Upgrade to a newer SDK for newer SDK dependencies,
- * Remove dependency_overrides, and/or,
- * Find other packages to use.
-''');
-    }
-
-    _showOfflineWarning();
-  }
-
   /// Updates `pubspec.yaml` with given [changes].
   String _updatePubspec(
     Map<PackageRange, PackageRange> changes,
@@ -448,80 +321,4 @@
           'latest versions of your dependencies.');
     }
   }
-
-  /// Returns new pubspec with the same dependencies as [original], but with:
-  ///  * the lower-bound of hosted package constraint set to first null-safety
-  ///    compatible version, and,
-  ///  * the upper-bound of hosted package constraints removed.
-  ///
-  /// Only changes listed in [upgradeOnly] will have their constraints touched.
-  ///
-  /// Throws [ApplicationException] if one of the dependencies does not have
-  /// a null-safety compatible version.
-  Future<Pubspec> _upgradeToNullSafetyConstraints(
-    Pubspec original,
-    List<String> upgradeOnly,
-  ) async {
-    ArgumentError.checkNotNull(original, 'original');
-    ArgumentError.checkNotNull(upgradeOnly, 'upgradeOnly');
-
-    final hasNoNullSafetyVersions = <String>{};
-    final hasNullSafetyVersions = <String>{};
-
-    Future<Iterable<PackageRange>> removeUpperConstraints(
-      Iterable<PackageRange> dependencies,
-    ) async =>
-        await Future.wait(dependencies.map((dep) async {
-          if (dep.source is! HostedSource) {
-            return dep;
-          }
-          if (!upgradeOnly.contains(dep.name)) {
-            return dep;
-          }
-
-          final packages = await cache.getVersions(dep.toRef());
-          packages.sort((a, b) => a.version.compareTo(b.version));
-
-          for (final package in packages) {
-            final pubspec = await cache.describe(package);
-            if (pubspec.languageVersion.supportsNullSafety) {
-              hasNullSafetyVersions.add(dep.name);
-              return dep.toRef().withConstraint(
-                    VersionRange(min: package.version, includeMin: true),
-                  );
-            }
-          }
-
-          hasNoNullSafetyVersions.add(dep.name);
-          // This value is never used. We will throw an exception because
-          //`hasNonNullSafetyVersions` is not empty.
-          return dep.toRef().withConstraint(VersionConstraint.empty);
-        }));
-
-    final deps = removeUpperConstraints(original.dependencies.values);
-    final devDeps = removeUpperConstraints(original.devDependencies.values);
-    await Future.wait([deps, devDeps]);
-
-    if (hasNoNullSafetyVersions.isNotEmpty) {
-      throw ApplicationException('''
-null-safety compatible versions do not exist for:
- - ${hasNoNullSafetyVersions.join('\n - ')}
-
-You can choose to upgrade only some dependencies to null-safety using:
-  $topLevelProgram pub upgrade --nullsafety ${hasNullSafetyVersions.join(' ')}
-
-Warning: Using null-safety features before upgrading all dependencies is
-discouraged. For more details see: ${NullSafetyAnalysis.guideUrl}
-''');
-    }
-
-    return Pubspec(
-      original.name,
-      version: original.version,
-      sdkConstraints: original.sdkConstraints,
-      dependencies: await deps,
-      devDependencies: await devDeps,
-      dependencyOverrides: original.dependencyOverrides.values,
-    );
-  }
 }
diff --git a/lib/src/null_safety_analysis.dart b/lib/src/null_safety_analysis.dart
deleted file mode 100644
index 284e845..0000000
--- a/lib/src/null_safety_analysis.dart
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright (c) 2020, 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:analyzer/dart/analysis/analysis_context_collection.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:cli_util/cli_util.dart';
-import 'package:path/path.dart' as path;
-import 'package:source_span/source_span.dart';
-import 'package:yaml/yaml.dart';
-
-import 'io.dart';
-import 'language_version.dart';
-import 'package.dart';
-import 'package_name.dart';
-import 'pubspec.dart';
-import 'solver.dart';
-import 'source.dart';
-import 'source/cached.dart';
-import 'system_cache.dart';
-
-enum NullSafetyCompliance {
-  /// This package and all dependencies opted into null safety.
-  compliant,
-
-  /// This package opted into null safety, but some file or dependency is not
-  /// opted in.
-  mixed,
-
-  /// This package did not opt-in to null safety yet.
-  notCompliant,
-
-  /// The resolution failed. Or some dart file in a dependency
-  /// doesn't parse.
-  analysisFailed,
-}
-
-class NullSafetyAnalysis {
-  static const String guideUrl = 'https://dart.dev/null-safety/migration-guide';
-  final SystemCache _systemCache;
-
-  /// A cache of the analysis done for a single package-version, not taking
-  /// dependencies into account. (Only the sdk constraint and no-files-opt-out).
-  ///
-  /// This allows us to reuse the analysis of the same package-version when
-  /// used as a dependency from different packages.
-  ///
-  /// Furthermore by awaiting the Future stored here, we avoid race-conditions
-  /// from downloading the same package-version into [_systemCache]
-  /// simultaneously when doing concurrent analyses.
-  final Map<PackageId, Future<NullSafetyAnalysisResult>>
-      _packageInternallyGoodCache = {};
-
-  NullSafetyAnalysis(SystemCache systemCache) : _systemCache = systemCache;
-
-  /// Decides if package version [packageId] and all its non-dev
-  /// dependencies (transitively) have a language version opting in to
-  /// null-safety and no files in lib/ of  these packages opt out to a
-  /// pre-null-safety language version.
-  ///
-  /// This will do a full resolution of that package's import graph, and also
-  /// download the package and all dependencies into [cache].
-  ///
-  /// To avoid race conditions on downloading to the cache, only one instance
-  /// should be computing nullSafetyCompliance simultaneously with the same
-  /// cache.
-  ///
-  /// If [packageId] is a relative path dependency [containingPath] must be
-  /// provided with an absolute path to resolve it against.
-  Future<NullSafetyAnalysisResult> nullSafetyCompliance(
-    PackageId packageId,
-  ) async {
-    final description = packageId.description.description;
-    final rootPubspec = await _systemCache.describe(packageId);
-
-    // A space in the name prevents clashes with other package names.
-    final fakeRootName = '${packageId.name} importer';
-    final fakeRoot = Package.inMemory(Pubspec(fakeRootName,
-        fields: {
-          'dependencies': {
-            packageId.name: {
-              packageId.source.name: description.serializeForPubspec(
-                  containingDir: null,
-                  languageVersion:
-                      LanguageVersion.firstVersionWithShorterHostedSyntax),
-              'version': packageId.version.toString(),
-            }
-          }
-        },
-        sources: _systemCache.sources,
-        sdkConstraints: {'dart': rootPubspec.dartSdkConstraint}));
-
-    final rootLanguageVersion = rootPubspec.languageVersion;
-    if (!rootLanguageVersion.supportsNullSafety) {
-      final span =
-          _tryGetSpanFromYamlMap(rootPubspec.fields['environment'], 'sdk');
-      final where = span == null
-          ? 'in the sdk constraint in the enviroment key in pubspec.yaml.'
-          : 'in pubspec.yaml: \n${span.highlight()}';
-      return NullSafetyAnalysisResult(
-        NullSafetyCompliance.notCompliant,
-        'Is not opting in to null safety $where',
-      );
-    }
-
-    SolveResult result;
-    try {
-      result = await resolveVersions(
-        SolveType.get,
-        _systemCache,
-        fakeRoot,
-      );
-    } on SolveFailure catch (e) {
-      return NullSafetyAnalysisResult(NullSafetyCompliance.analysisFailed,
-          'Could not resolve constraints: $e');
-    }
-    return nullSafetyComplianceOfPackages(
-      result.packages.where((id) => id.name != fakeRootName),
-      Package(
-        rootPubspec,
-        _systemCache.getDirectory(packageId),
-      ),
-    );
-  }
-
-  /// Decides if all dependendencies (transitively) have a language version
-  /// opting in to null safety, and no files in lib/ of these packages, nor the
-  /// root package opt out to a pre-null-safety language version.
-  ///
-  /// [rootPubspec] is the pubspec of the root package.
-  // TODO(sigurdm): make a source for the root package. Then we should not need
-  // to pass this.
-  ///
-  /// This will download all dependencies into [cache].
-  ///
-  /// Assumes the root package is opted in.
-  Future<NullSafetyAnalysisResult> nullSafetyComplianceOfPackages(
-    Iterable<PackageId> packages,
-    Package rootPackage,
-  ) async {
-    NullSafetyAnalysisResult? firstBadPackage;
-    for (final dependencyId in packages) {
-      final packageInternalAnalysis =
-          await _packageInternallyGoodCache.putIfAbsent(dependencyId, () async {
-        Pubspec pubspec;
-        Source? source;
-        String packageDir;
-        if (dependencyId.isRoot) {
-          pubspec = rootPackage.pubspec;
-          packageDir = rootPackage.dir;
-        } else {
-          source = dependencyId.source;
-          pubspec = await _systemCache.describe(dependencyId);
-          packageDir = _systemCache.getDirectory(dependencyId);
-        }
-
-        if (!pubspec.languageVersion.supportsNullSafety) {
-          final span =
-              _tryGetSpanFromYamlMap(pubspec.fields['environment'], 'sdk');
-          final where = span == null
-              ? 'in the sdk constraint in the environment key in its pubspec.yaml.'
-              : 'in its pubspec.yaml:\n${span.highlight()}';
-          return NullSafetyAnalysisResult(
-            NullSafetyCompliance.notCompliant,
-            'package:${dependencyId.name} is not opted into null safety $where',
-          );
-        }
-
-        if (source is CachedSource) {
-          // TODO(sigurdm): Consider using withDependencyType here.
-          await source.downloadToSystemCache(dependencyId, _systemCache);
-        }
-
-        final libDir =
-            path.absolute(path.normalize(path.join(packageDir, 'lib')));
-        if (dirExists(libDir)) {
-          var contextCollection = AnalysisContextCollection(
-            includedPaths: [path.normalize(packageDir)],
-            resourceProvider: PhysicalResourceProvider.INSTANCE,
-            sdkPath: getSdkPath(),
-          );
-          var analysisContext = contextCollection.contexts.first;
-          var analysisSession = analysisContext.currentSession;
-
-          for (final file in listDir(libDir,
-              recursive: true, includeDirs: false, includeHidden: true)) {
-            if (file.endsWith('.dart')) {
-              final fileUrl =
-                  'package:${dependencyId.name}/${path.relative(file, from: libDir)}';
-              final someUnitResult =
-                  analysisSession.getParsedUnit(path.normalize(file));
-              ParsedUnitResult unitResult;
-              if (someUnitResult is ParsedUnitResult) {
-                unitResult = someUnitResult;
-              } else {
-                return NullSafetyAnalysisResult(
-                    NullSafetyCompliance.analysisFailed,
-                    'Could not analyze $fileUrl.');
-              }
-              if (unitResult.errors.isNotEmpty) {
-                return NullSafetyAnalysisResult(
-                    NullSafetyCompliance.analysisFailed,
-                    'Could not analyze $fileUrl.');
-              }
-              if (unitResult.isPart) continue;
-              final languageVersionToken = unitResult.unit.languageVersionToken;
-              if (languageVersionToken == null) continue;
-              final languageVersion = LanguageVersion.fromLanguageVersionToken(
-                  languageVersionToken);
-              if (!languageVersion.supportsNullSafety) {
-                final sourceFile =
-                    SourceFile.fromString(readTextFile(file), url: fileUrl);
-                final span = sourceFile.span(languageVersionToken.offset,
-                    languageVersionToken.offset + languageVersionToken.length);
-                return NullSafetyAnalysisResult(
-                    NullSafetyCompliance.notCompliant,
-                    '$fileUrl is opting out of null safety:\n${span.highlight()}');
-              }
-            }
-          }
-        }
-        return NullSafetyAnalysisResult(NullSafetyCompliance.compliant, null);
-      });
-      if (packageInternalAnalysis.compliance ==
-          NullSafetyCompliance.analysisFailed) {
-        return packageInternalAnalysis;
-      }
-      if (packageInternalAnalysis.compliance ==
-          NullSafetyCompliance.notCompliant) {
-        firstBadPackage ??= packageInternalAnalysis;
-      }
-    }
-
-    if (firstBadPackage == null) {
-      return NullSafetyAnalysisResult(NullSafetyCompliance.compliant, null);
-    }
-    if (firstBadPackage.compliance == NullSafetyCompliance.analysisFailed) {
-      return firstBadPackage;
-    }
-    return NullSafetyAnalysisResult(
-        NullSafetyCompliance.mixed, firstBadPackage.reason);
-  }
-}
-
-class NullSafetyAnalysisResult {
-  final NullSafetyCompliance compliance;
-
-  /// `null` if compliance == [NullSafetyCompliance.compliant].
-  final String? reason;
-
-  NullSafetyAnalysisResult(this.compliance, this.reason);
-}
-
-SourceSpan? _tryGetSpanFromYamlMap(Object? map, String key) {
-  if (map is YamlMap) {
-    return map.nodes[key]?.span;
-  }
-  return null;
-}
diff --git a/lib/src/pubspec_utils.dart b/lib/src/pubspec_utils.dart
index 71e30c4..f3e461a 100644
--- a/lib/src/pubspec_utils.dart
+++ b/lib/src/pubspec_utils.dart
@@ -2,14 +2,10 @@
 // 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 'package_name.dart';
 import 'pubspec.dart';
-import 'source/hosted.dart';
-import 'system_cache.dart';
 
 /// Returns a new [Pubspec] without [original]'s dev_dependencies.
 Pubspec stripDevDependencies(Pubspec original) {
@@ -39,63 +35,6 @@
   );
 }
 
-Future<Pubspec> constrainedToAtLeastNullSafetyPubspec(
-    Pubspec original, SystemCache cache) async {
-  /// Get the first version of [package] opting in to null-safety.
-  Future<VersionConstraint> constrainToFirstWithNullSafety(
-      PackageRange packageRange) async {
-    final ref = packageRange.toRef();
-    final available = await cache.getVersions(ref);
-    if (available.isEmpty) {
-      return stripUpperBound(packageRange.constraint);
-    }
-
-    available.sort((x, y) => x.version.compareTo(y.version));
-
-    for (final p in available) {
-      final pubspec = await cache.describe(p);
-      if (pubspec.languageVersion.supportsNullSafety) {
-        return VersionRange(min: p.version, includeMin: true);
-      }
-    }
-    return stripUpperBound(packageRange.constraint);
-  }
-
-  Future<List<PackageRange>> allConstrainedToAtLeastNullSafety(
-    Map<String, PackageRange> constrained,
-  ) async {
-    final result = await Future.wait(constrained.keys.map((name) async {
-      final packageRange = constrained[name]!;
-      var unconstrainedRange = packageRange;
-
-      /// We only need to remove the upper bound if it is a hosted package.
-      if (packageRange.description is HostedDescription) {
-        unconstrainedRange = PackageRange(
-          packageRange.toRef(),
-          await constrainToFirstWithNullSafety(packageRange),
-        );
-      }
-      return unconstrainedRange;
-    }));
-
-    return result;
-  }
-
-  final constrainedLists = await Future.wait([
-    allConstrainedToAtLeastNullSafety(original.dependencies),
-    allConstrainedToAtLeastNullSafety(original.devDependencies),
-  ]);
-
-  return Pubspec(
-    original.name,
-    version: original.version,
-    sdkConstraints: original.sdkConstraints,
-    dependencies: constrainedLists[0],
-    devDependencies: constrainedLists[1],
-    dependencyOverrides: original.dependencyOverrides.values,
-  );
-}
-
 /// Returns new pubspec with the same dependencies as [original] but with the
 /// upper bounds of the constraints removed.
 ///
diff --git a/lib/src/validator.dart b/lib/src/validator.dart
index a203f0c..b2d8fcb 100644
--- a/lib/src/validator.dart
+++ b/lib/src/validator.dart
@@ -26,7 +26,6 @@
 import 'validator/leak_detection.dart';
 import 'validator/license.dart';
 import 'validator/name.dart';
-import 'validator/null_safety_mixed_mode.dart';
 import 'validator/pubspec.dart';
 import 'validator/pubspec_field.dart';
 import 'validator/pubspec_typo.dart';
@@ -152,7 +151,6 @@
       FlutterPluginFormatValidator(),
       LanguageVersionValidator(),
       RelativeVersionNumberingValidator(),
-      NullSafetyMixedModeValidator(),
       PubspecTypoValidator(),
       LeakDetectionValidator(),
       SizeValidator(),
diff --git a/lib/src/validator/null_safety_mixed_mode.dart b/lib/src/validator/null_safety_mixed_mode.dart
deleted file mode 100644
index b17e0e5..0000000
--- a/lib/src/validator/null_safety_mixed_mode.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2020, 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:path/path.dart' as p;
-
-import '../command_runner.dart';
-import '../null_safety_analysis.dart';
-import '../package_name.dart';
-import '../source/path.dart';
-import '../validator.dart';
-
-/// Gives a warning when publishing a new version, if this package opts into
-/// null safety, but any of the dependencies do not.
-class NullSafetyMixedModeValidator extends Validator {
-  @override
-  Future<void> validate() async {
-    final pubspec = entrypoint.root.pubspec;
-    final declaredLanguageVersion = pubspec.languageVersion;
-    if (!declaredLanguageVersion.supportsNullSafety) {
-      return;
-    }
-    final analysisResult =
-        await NullSafetyAnalysis(entrypoint.cache).nullSafetyCompliance(
-      PackageId(
-        entrypoint.root.name,
-        entrypoint.root.version,
-        ResolvedPathDescription(
-          PathDescription(p.absolute(entrypoint.root.dir), false),
-        ),
-      ),
-    );
-    if (analysisResult.compliance == NullSafetyCompliance.mixed) {
-      warnings.add('''
-This package is opting into null-safety, but a dependency or file is not.
-
-${analysisResult.reason}
-
-Note that by publishing with non-migrated dependencies your package may be
-broken at any time if one of your dependencies migrates without a breaking
-change release.
-
-We highly recommend that you wait until all of your dependencies have been
-migrated before publishing.
-
-Run `$topLevelProgram pub outdated --mode=null-safety` for more information about the state
-of dependencies.
-
-See ${NullSafetyAnalysis.guideUrl}
-for more information about migrating.
-''');
-    }
-  }
-}
diff --git a/lib/src/validator/relative_version_numbering.dart b/lib/src/validator/relative_version_numbering.dart
index 1b99b79..9a5e214 100644
--- a/lib/src/validator/relative_version_numbering.dart
+++ b/lib/src/validator/relative_version_numbering.dart
@@ -7,7 +7,6 @@
 import 'package:collection/collection.dart' show IterableExtension;
 
 import '../exceptions.dart';
-import '../null_safety_analysis.dart';
 import '../package_name.dart';
 import '../validator.dart';
 
@@ -17,6 +16,9 @@
   static const String semverUrl =
       'https://dart.dev/tools/pub/versioning#semantic-versions';
 
+  static const String nullSafetyGuideUrl =
+      'https://dart.dev/null-safety/migration-guide';
+
   @override
   Future<void> validate() async {
     final hostedSource = entrypoint.cache.hosted;
@@ -43,7 +45,7 @@
       hints.add(
           'You\'re about to publish a package that opts into null safety.\n'
           'The previous version (${previousVersion.version}) isn\'t opted in.\n'
-          'See ${NullSafetyAnalysis.guideUrl} for best practices.');
+          'See $nullSafetyGuideUrl for best practices.');
     } else if (!currentOptedIn && previousOptedIn) {
       hints.add(
           'You\'re about to publish a package that doesn\'t opt into null safety,\n'
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index 8e03ce0..0c88a9f 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -21,10 +21,6 @@
       ['outdated', '--no-color', '--prereleases'],
       ['outdated', '--no-color', '--no-dev-dependencies'],
       ['outdated', '--no-color', '--no-dependency-overrides'],
-      ['outdated', '--no-color', '--mode=null-safety'],
-      ['outdated', '--no-color', '--mode=null-safety', '--transitive'],
-      ['outdated', '--no-color', '--mode=null-safety', '--no-prereleases'],
-      ['outdated', '--json', '--mode=null-safety'],
       ['outdated', '--json', '--no-dev-dependencies'],
     ];
     for (final args in commands) {
@@ -175,137 +171,6 @@
     await ctx.runOutdatedTests();
   });
 
-  testWithGolden('null safety compliance', (ctx) async {
-    await d.dir(appPath, [
-      d.pubspec({
-        'name': 'app',
-        'version': '1.0.1',
-        'dependencies': {
-          'foo': '^1.0.0',
-          'bar': '^1.0.0',
-          'file_opts_out': '^1.0.0',
-          'fails_analysis': '^1.0.0',
-          'file_in_dependency_opts_out': '^1.0.0',
-          'fails_analysis_in_dependency': '^1.0.0',
-        },
-        'environment': {'sdk': '>=2.12.0 < 3.0.0'},
-      }),
-    ]).create();
-
-    await servePackages()
-      ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'}, sdk: '>=2.9.0 < 4.0.0')
-      ..serve('bar', '1.0.0', sdk: '>=2.9.0 < 4.0.0')
-      ..serve(
-        'foo',
-        '2.0.0-nullsafety.0',
-        deps: {'bar': '^2.0.0'},
-        sdk: '^2.12.0',
-      )
-      ..serve(
-        'foo',
-        '2.0.0',
-        deps: {'bar': '^1.0.0'},
-        sdk: '^2.12.0',
-      )
-      ..serve('bar', '2.0.0', sdk: '^2.12.0')
-      ..serve(
-        'file_opts_out',
-        '1.0.0',
-        contents: [
-          d.dir('lib', [d.file('main.dart', '// @dart = 2.9\n')])
-        ],
-        sdk: '^2.12.0',
-      )
-      ..serve('file_opts_out', '2.0.0', sdk: '>=2.9.0 < 4.0.0')
-      ..serve(
-        'fails_analysis',
-        '1.0.0',
-        contents: [
-          d.dir('lib', [d.file('main.dart', 'syntax error\n')])
-        ],
-        sdk: '^2.12.0',
-      )
-      ..serve('fails_analysis', '2.0.0', sdk: '^2.12.0')
-      ..serve(
-        'file_in_dependency_opts_out',
-        '1.0.0',
-        deps: {'file_opts_out': '^1.0.0'},
-        sdk: '^2.12.0',
-      )
-      ..serve('file_in_dependency_opts_out', '2.0.0', sdk: '^2.12.0')
-      ..serve(
-        'fails_analysis_in_dependency',
-        '1.0.0',
-        deps: {'fails_analysis': '^1.0.0'},
-        sdk: '^2.12.0',
-      )
-      ..serve('fails_analysis_in_dependency', '2.0.0', sdk: '^2.12.0');
-    await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.13.0'});
-
-    await ctx.runOutdatedTests(environment: {
-      '_PUB_TEST_SDK_VERSION': '2.13.0',
-    });
-  });
-
-  testWithGolden('null-safety no resolution', (ctx) async {
-    await servePackages()
-      ..serve('foo', '1.0.0', sdk: '>=2.9.0 < 4.0.0')
-      ..serve(
-        'foo',
-        '2.0.0-nullsafety.0',
-        deps: {'bar': '^1.0.0'},
-      )
-      ..serve('bar', '1.0.0', pubspec: {
-        'environment': {'sdk': '>=2.9.0 < 4.0.0'}
-      })
-      ..serve(
-        'bar',
-        '2.0.0-nullsafety.0',
-        deps: {'foo': '^1.0.0'},
-      );
-
-    await d.dir(appPath, [
-      d.pubspec({
-        'name': 'app',
-        'version': '1.0.0',
-        'dependencies': {
-          'foo': '^1.0.0',
-          'bar': '^1.0.0',
-        }
-      }),
-    ]).create();
-
-    await pubGet();
-
-    await ctx.runOutdatedTests();
-  });
-
-  testWithGolden('null-safety already migrated', (ctx) async {
-    await servePackages()
-      ..serve('foo', '1.0.0', sdk: '>=2.9.0 < 4.0.0')
-      ..serve('foo', '2.0.0')
-      ..serve('bar', '1.0.0', sdk: '>=2.9.0 < 4.0.0')
-      ..serve('bar', '2.0.0', deps: {'devTransitive': '^1.0.0'})
-      ..serve('devTransitive', '1.0.0', sdk: '>=2.9.0 < 4.0.0');
-
-    await d.dir(appPath, [
-      d.pubspec({
-        'name': 'app',
-        'version': '1.0.0',
-        'dependencies': {
-          'foo': '^2.0.0',
-        },
-        'dev_dependencies': {
-          'bar': '^2.0.0',
-        },
-      }),
-    ]).create();
-
-    await pubGet();
-
-    await ctx.runOutdatedTests();
-  });
-
   testWithGolden('overridden dependencies', (ctx) async {
     ensureGit();
     await servePackages()
diff --git a/test/testdata/goldens/help_test/pub outdated --help.txt b/test/testdata/goldens/help_test/pub outdated --help.txt
index d0f6bbe..cf411bb 100644
--- a/test/testdata/goldens/help_test/pub outdated --help.txt
+++ b/test/testdata/goldens/help_test/pub outdated --help.txt
@@ -11,16 +11,10 @@
     --[no-]dev-dependencies        Take dev dependencies into account.
                                    (defaults to on)
     --json                         Output the results using a json format.
-    --mode=<PROPERTY>              Highlight versions with PROPERTY.
-                                   Only packages currently missing that PROPERTY
-                                   will be included unless --show-all.
-                                   [outdated (default), null-safety]
     --[no-]prereleases             Include prereleases in latest version.
-                                   (defaults to on in --mode=null-safety).
     --[no-]show-all                Include dependencies that are already
                                    fullfilling --mode.
     --[no-]transitive              Show transitive dependencies.
-                                   (defaults to off in --mode=null-safety).
 -C, --directory=<dir>              Run this in the directory<dir>.
 
 Run "pub help" to see global options.
diff --git a/test/testdata/goldens/help_test/pub upgrade --help.txt b/test/testdata/goldens/help_test/pub upgrade --help.txt
index d1a29b9..d33b3fd 100644
--- a/test/testdata/goldens/help_test/pub upgrade --help.txt
+++ b/test/testdata/goldens/help_test/pub upgrade --help.txt
@@ -10,8 +10,6 @@
 -n, --dry-run            Report what dependencies would change but don't change
                          any.
     --[no-]precompile    Precompile executables in immediate dependencies.
-    --null-safety        Upgrade constraints in pubspec.yaml to null-safety
-                         versions
     --major-versions     Upgrades packages to their latest resolvable versions,
                          and updates pubspec.yaml.
 -C, --directory=<dir>    Run this in the directory<dir>.
diff --git a/test/testdata/goldens/outdated/outdated_test/Handles SDK dependencies.txt b/test/testdata/goldens/outdated/outdated_test/Handles SDK dependencies.txt
index f2f0a22..2e675b7 100644
--- a/test/testdata/goldens/outdated/outdated_test/Handles SDK dependencies.txt
+++ b/test/testdata/goldens/outdated/outdated_test/Handles SDK dependencies.txt
@@ -129,114 +129,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-foo           ✗1.1.0   ✗1.1.0      ✓2.0.0      ✓2.0.0  
-
-dev_dependencies:
-flutter_test  ✗(sdk)   ✗(sdk)      ✗(sdk)      ✗(sdk)  
-
-1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `flutter pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-foo           ✗1.1.0   ✗1.1.0      ✓2.0.0      ✓2.0.0  
-
-dev_dependencies:
-flutter_test  ✗(sdk)   ✗(sdk)      ✗(sdk)      ✗(sdk)  
-
-1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `flutter pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-foo           ✗1.1.0   ✗1.1.0      ✓2.0.0      ✓2.0.0  
-
-dev_dependencies:
-flutter_test  ✗(sdk)   ✗(sdk)      ✗(sdk)      ✗(sdk)  
-
-1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `flutter pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": [
-    {
-      "package": "flutter_test",
-      "kind": "dev",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "resolvable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "latest": {
-        "version": "1.0.0",
-        "nullSafety": false
-      }
-    },
-    {
-      "package": "foo",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.1.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.1.0",
-        "nullSafety": false
-      },
-      "resolvable": {
-        "version": "2.0.0",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "2.0.0",
-        "nullSafety": true
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/circular dependency on root.txt b/test/testdata/goldens/outdated/outdated_test/circular dependency on root.txt
index af8ad58..3b5c001 100644
--- a/test/testdata/goldens/outdated/outdated_test/circular dependency on root.txt
+++ b/test/testdata/goldens/outdated/outdated_test/circular dependency on root.txt
@@ -117,44 +117,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/does not allow arguments - handles bad flags.txt b/test/testdata/goldens/outdated/outdated_test/does not allow arguments - handles bad flags.txt
index e9ae621..10fe350 100644
--- a/test/testdata/goldens/outdated/outdated_test/does not allow arguments - handles bad flags.txt
+++ b/test/testdata/goldens/outdated/outdated_test/does not allow arguments - handles bad flags.txt
@@ -11,16 +11,10 @@
 [STDERR]     --[no-]dev-dependencies        Take dev dependencies into account.
 [STDERR]                                    (defaults to on)
 [STDERR]     --json                         Output the results using a json format.
-[STDERR]     --mode=<PROPERTY>              Highlight versions with PROPERTY.
-[STDERR]                                    Only packages currently missing that PROPERTY
-[STDERR]                                    will be included unless --show-all.
-[STDERR]                                    [outdated (default), null-safety]
 [STDERR]     --[no-]prereleases             Include prereleases in latest version.
-[STDERR]                                    (defaults to on in --mode=null-safety).
 [STDERR]     --[no-]show-all                Include dependencies that are already
 [STDERR]                                    fullfilling --mode.
 [STDERR]     --[no-]transitive              Show transitive dependencies.
-[STDERR]                                    (defaults to off in --mode=null-safety).
 [STDERR] -C, --directory=<dir>              Run this in the directory<dir>.
 [STDERR] 
 [STDERR] Run "pub help" to see global options.
@@ -40,16 +34,10 @@
 [STDERR]     --[no-]dev-dependencies        Take dev dependencies into account.
 [STDERR]                                    (defaults to on)
 [STDERR]     --json                         Output the results using a json format.
-[STDERR]     --mode=<PROPERTY>              Highlight versions with PROPERTY.
-[STDERR]                                    Only packages currently missing that PROPERTY
-[STDERR]                                    will be included unless --show-all.
-[STDERR]                                    [outdated (default), null-safety]
 [STDERR]     --[no-]prereleases             Include prereleases in latest version.
-[STDERR]                                    (defaults to on in --mode=null-safety).
 [STDERR]     --[no-]show-all                Include dependencies that are already
 [STDERR]                                    fullfilling --mode.
 [STDERR]     --[no-]transitive              Show transitive dependencies.
-[STDERR]                                    (defaults to off in --mode=null-safety).
 [STDERR] -C, --directory=<dir>              Run this in the directory<dir>.
 [STDERR] 
 [STDERR] Run "pub help" to see global options.
diff --git a/test/testdata/goldens/outdated/outdated_test/latest version reported while locked on a prerelease can be a prerelease.txt b/test/testdata/goldens/outdated/outdated_test/latest version reported while locked on a prerelease can be a prerelease.txt
index 657222a..1bd3a68 100644
--- a/test/testdata/goldens/outdated/outdated_test/latest version reported while locked on a prerelease can be a prerelease.txt
+++ b/test/testdata/goldens/outdated/outdated_test/latest version reported while locked on a prerelease can be a prerelease.txt
@@ -142,44 +142,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/mutually incompatible newer versions.txt b/test/testdata/goldens/outdated/outdated_test/mutually incompatible newer versions.txt
index 4e0b4ad..1d8d529 100644
--- a/test/testdata/goldens/outdated/outdated_test/mutually incompatible newer versions.txt
+++ b/test/testdata/goldens/outdated/outdated_test/mutually incompatible newer versions.txt
@@ -134,44 +134,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/newer versions available.txt b/test/testdata/goldens/outdated/outdated_test/newer versions available.txt
index c5e17c1..7d91029 100644
--- a/test/testdata/goldens/outdated/outdated_test/newer versions available.txt
+++ b/test/testdata/goldens/outdated/outdated_test/newer versions available.txt
@@ -114,18 +114,10 @@
 dev_dependencies:
 builder       *1.2.3   *1.3.0      2.0.0       2.0.0   
 
-transitive dependencies:
-transitive    *1.2.3   *1.3.0      *1.3.0      2.0.0   
-transitive2   -        -           1.0.0       1.0.0   
-
-transitive dev_dependencies:
-dev_trans     *1.0.0   -           *1.0.0      2.0.0   
-transitive3   -        -           1.0.0       1.0.0   
-
-3 upgradable dependencies are locked (in pubspec.lock) to older versions.
+2 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
 
-3  dependencies are constrained to versions that are older than a resolvable version.
+2  dependencies are constrained to versions that are older than a resolvable version.
 To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
 
 -------------------------------- END OF OUTPUT ---------------------------------
@@ -166,18 +158,10 @@
 dev_dependencies:
 builder        *1.2.3        *1.3.0        2.0.0         2.0.0         
 
-transitive dependencies:
-transitive     *1.2.3        *1.3.0        *1.3.0        2.0.0         
-transitive2    -             -             1.0.0         1.0.0         
-
-transitive dev_dependencies:
-dev_trans      *1.0.0        -             *1.0.0        2.0.0         
-transitive3    -             -             1.0.0         1.0.0         
-
-3 upgradable dependencies are locked (in pubspec.lock) to older versions.
+2 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
 
-3  dependencies are constrained to versions that are older than a resolvable version.
+2  dependencies are constrained to versions that are older than a resolvable version.
 To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
 
 -------------------------------- END OF OUTPUT ---------------------------------
@@ -195,18 +179,10 @@
 dev_dependencies:
 builder       *1.2.3   *1.3.0      *2.0.0      3.0.0-alpha  
 
-transitive dependencies:
-transitive    *1.2.3   *1.3.0      *1.3.0      2.0.0        
-transitive2   -        -           1.0.0       1.0.0        
-
-transitive dev_dependencies:
-dev_trans     *1.0.0   -           *1.0.0      2.0.0        
-transitive3   -        -           1.0.0       1.0.0        
-
-3 upgradable dependencies are locked (in pubspec.lock) to older versions.
+2 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
 
-3  dependencies are constrained to versions that are older than a resolvable version.
+2  dependencies are constrained to versions that are older than a resolvable version.
 To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
 
 -------------------------------- END OF OUTPUT ---------------------------------
@@ -221,11 +197,8 @@
 direct dependencies:
 foo           *1.2.3   *1.3.0      3.0.0       3.0.0   
 
-transitive dependencies:
-transitive    *1.2.3   2.0.0       2.0.0       2.0.0   
-
-2 upgradable dependencies are locked (in pubspec.lock) to older versions.
-To update these dependencies, use `dart pub upgrade`.
+1 upgradable dependency is locked (in pubspec.lock) to an older version.
+To update it, use `dart pub upgrade`.
 
 1 dependency is constrained to a version that is older than a resolvable version.
 To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
@@ -245,113 +218,15 @@
 dev_dependencies:
 builder       *1.2.3   *1.3.0      2.0.0       2.0.0   
 
-transitive dependencies:
-transitive    *1.2.3   *1.3.0      *1.3.0      2.0.0   
-transitive2   -        -           1.0.0       1.0.0   
-
-transitive dev_dependencies:
-dev_trans     *1.0.0   -           *1.0.0      2.0.0   
-transitive3   -        -           1.0.0       1.0.0   
-
-3 upgradable dependencies are locked (in pubspec.lock) to older versions.
+2 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
 
-3  dependencies are constrained to versions that are older than a resolvable version.
+2  dependencies are constrained to versions that are older than a resolvable version.
 To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
 
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies: all support null safety.
-
-dev_dependencies: all support null safety.
-All dependencies opt in to null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies: all support null safety.
-
-dev_dependencies: all support null safety.
-
-transitive dependencies:
-transitive2   -        -           ✓1.0.0      ✓1.0.0  
-
-transitive dev_dependencies:
-transitive3   -        -           ✓1.0.0      ✓1.0.0  
-All dependencies opt in to null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies: all support null safety.
-
-dev_dependencies: all support null safety.
-All dependencies opt in to null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": [
-    {
-      "package": "transitive2",
-      "kind": "transitive",
-      "isDiscontinued": false,
-      "current": null,
-      "upgradable": null,
-      "resolvable": {
-        "version": "1.0.0",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "1.0.0",
-        "nullSafety": true
-      }
-    },
-    {
-      "package": "transitive3",
-      "kind": "transitive",
-      "isDiscontinued": false,
-      "current": null,
-      "upgradable": null,
-      "resolvable": {
-        "version": "1.0.0",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "1.0.0",
-        "nullSafety": true
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/no dependencies.txt b/test/testdata/goldens/outdated/outdated_test/no dependencies.txt
index d256d7f..c999804 100644
--- a/test/testdata/goldens/outdated/outdated_test/no dependencies.txt
+++ b/test/testdata/goldens/outdated/outdated_test/no dependencies.txt
@@ -63,44 +63,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": []
diff --git a/test/testdata/goldens/outdated/outdated_test/no lockfile.txt b/test/testdata/goldens/outdated/outdated_test/no lockfile.txt
index f6b5f62..62f8c6c 100644
--- a/test/testdata/goldens/outdated/outdated_test/no lockfile.txt
+++ b/test/testdata/goldens/outdated/outdated_test/no lockfile.txt
@@ -154,111 +154,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-bar           -        ✓1.2.3      ✓2.0.0      ✓2.0.0  
-foo           -        ✓1.2.3      ✓1.2.3      ✓1.2.3  
-
-No pubspec.lock found. There are no Current versions.
-Run `dart pub get` to create a pubspec.lock with versions matching your pubspec.yaml.
-
-1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-bar           -        ✓1.2.3      ✓2.0.0      ✓2.0.0  
-foo           -        ✓1.2.3      ✓1.2.3      ✓1.2.3  
-
-No pubspec.lock found. There are no Current versions.
-Run `dart pub get` to create a pubspec.lock with versions matching your pubspec.yaml.
-
-1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-bar           -        ✓1.2.3      ✓2.0.0      ✓2.0.0  
-foo           -        ✓1.2.3      ✓1.2.3      ✓1.2.3  
-
-No pubspec.lock found. There are no Current versions.
-Run `dart pub get` to create a pubspec.lock with versions matching your pubspec.yaml.
-
-1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": [
-    {
-      "package": "bar",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": null,
-      "upgradable": {
-        "version": "1.2.3",
-        "nullSafety": true
-      },
-      "resolvable": {
-        "version": "2.0.0",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "2.0.0",
-        "nullSafety": true
-      }
-    },
-    {
-      "package": "foo",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": null,
-      "upgradable": {
-        "version": "1.2.3",
-        "nullSafety": true
-      },
-      "resolvable": {
-        "version": "1.2.3",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "1.2.3",
-        "nullSafety": true
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/null safety compliance.txt b/test/testdata/goldens/outdated/outdated_test/null safety compliance.txt
deleted file mode 100644
index aadad45..0000000
--- a/test/testdata/goldens/outdated/outdated_test/null safety compliance.txt
+++ /dev/null
@@ -1,444 +0,0 @@
-# GENERATED BY: test/outdated/outdated_test.dart
-
-## Section 0
-$ pub outdated --json
-{
-  "packages": [
-    {
-      "package": "bar",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "fails_analysis",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "fails_analysis_in_dependency",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "file_in_dependency_opts_out",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "file_opts_out",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "foo",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0-nullsafety.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 1
-$ pub outdated --no-color
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name                  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:         
-bar                           *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis                *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis_in_dependency  *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_in_dependency_opts_out   *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_opts_out                 *1.0.0   *1.0.0      2.0.0                2.0.0   
-foo                           *1.0.0   *1.0.0      *2.0.0-nullsafety.0  2.0.0   
-
-6  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 2
-$ pub outdated --no-color --no-transitive
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name                  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:         
-bar                           *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis                *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis_in_dependency  *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_in_dependency_opts_out   *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_opts_out                 *1.0.0   *1.0.0      2.0.0                2.0.0   
-foo                           *1.0.0   *1.0.0      *2.0.0-nullsafety.0  2.0.0   
-
-6  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 3
-$ pub outdated --no-color --up-to-date
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name                  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:         
-bar                           *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis                *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis_in_dependency  *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_in_dependency_opts_out   *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_opts_out                 *1.0.0   *1.0.0      2.0.0                2.0.0   
-foo                           *1.0.0   *1.0.0      *2.0.0-nullsafety.0  2.0.0   
-
-6  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 4
-$ pub outdated --no-color --prereleases
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name                  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:         
-bar                           *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis                *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis_in_dependency  *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_in_dependency_opts_out   *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_opts_out                 *1.0.0   *1.0.0      2.0.0                2.0.0   
-foo                           *1.0.0   *1.0.0      *2.0.0-nullsafety.0  2.0.0   
-
-6  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 5
-$ pub outdated --no-color --no-dev-dependencies
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name                  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:         
-bar                           *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis                *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis_in_dependency  *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_in_dependency_opts_out   *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_opts_out                 *1.0.0   *1.0.0      2.0.0                2.0.0   
-foo                           *1.0.0   *1.0.0      *2.0.0-nullsafety.0  2.0.0   
-
-6  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 6
-$ pub outdated --no-color --no-dependency-overrides
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name                  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:         
-bar                           *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis                *1.0.0   *1.0.0      2.0.0                2.0.0   
-fails_analysis_in_dependency  *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_in_dependency_opts_out   *1.0.0   *1.0.0      2.0.0                2.0.0   
-file_opts_out                 *1.0.0   *1.0.0      2.0.0                2.0.0   
-foo                           *1.0.0   *1.0.0      *2.0.0-nullsafety.0  2.0.0   
-
-6  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:
-bar           ✗1.0.0   ✗1.0.0      ✓2.0.0               ✓2.0.0  
-foo           ✗1.0.0   ✗1.0.0      ✓2.0.0-nullsafety.0  ✓2.0.0  
-
-2  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:
-bar           ✗1.0.0   ✗1.0.0      ✓2.0.0               ✓2.0.0  
-foo           ✗1.0.0   ✗1.0.0      ✓2.0.0-nullsafety.0  ✓2.0.0  
-
-2  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable           Latest  
-
-direct dependencies:
-bar           ✗1.0.0   ✗1.0.0      ✓2.0.0               ✓2.0.0  
-foo           ✗1.0.0   ✗1.0.0      ✓2.0.0-nullsafety.0  ✓2.0.0  
-
-2  dependencies are constrained to versions that are older than a resolvable version.
-To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": [
-    {
-      "package": "bar",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "resolvable": {
-        "version": "2.0.0",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "2.0.0",
-        "nullSafety": true
-      }
-    },
-    {
-      "package": "foo",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "resolvable": {
-        "version": "2.0.0-nullsafety.0",
-        "nullSafety": true
-      },
-      "latest": {
-        "version": "2.0.0",
-        "nullSafety": true
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
-$ pub outdated --json --no-dev-dependencies
-{
-  "packages": [
-    {
-      "package": "bar",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "fails_analysis",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "fails_analysis_in_dependency",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "file_in_dependency_opts_out",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "file_opts_out",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    },
-    {
-      "package": "foo",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0"
-      },
-      "upgradable": {
-        "version": "1.0.0"
-      },
-      "resolvable": {
-        "version": "2.0.0-nullsafety.0"
-      },
-      "latest": {
-        "version": "2.0.0"
-      }
-    }
-  ]
-}
-
diff --git a/test/testdata/goldens/outdated/outdated_test/null-safety already migrated.txt b/test/testdata/goldens/outdated/outdated_test/null-safety already migrated.txt
deleted file mode 100644
index f7116b2..0000000
--- a/test/testdata/goldens/outdated/outdated_test/null-safety already migrated.txt
+++ /dev/null
@@ -1,159 +0,0 @@
-# GENERATED BY: test/outdated/outdated_test.dart
-
-## Section 0
-$ pub outdated --json
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 1
-$ pub outdated --no-color
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 2
-$ pub outdated --no-color --no-transitive
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 3
-$ pub outdated --no-color --up-to-date
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name   Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-foo            2.0.0    2.0.0       2.0.0       2.0.0   
-
-dev_dependencies:
-bar            2.0.0    2.0.0       2.0.0       2.0.0   
-
-transitive dev_dependencies:
-devTransitive  1.0.0    1.0.0       1.0.0       1.0.0   
-You are already using the newest resolvable versions listed in the 'Resolvable' column.
-Newer versions, listed in 'Latest', may not be mutually compatible.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 4
-$ pub outdated --no-color --prereleases
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 5
-$ pub outdated --no-color --no-dev-dependencies
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 6
-$ pub outdated --no-color --no-dependency-overrides
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies: all support null safety.
-
-dev_dependencies: all support null safety.
-All dependencies opt in to null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name   Current  Upgradable  Resolvable  Latest  
-
-direct dependencies: all support null safety.
-
-dev_dependencies: all support null safety.
-
-transitive dev_dependencies:
-devTransitive  ✗1.0.0   ✗1.0.0      ✗1.0.0      ✗1.0.0  
-All dependencies opt in to null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies: all support null safety.
-
-dev_dependencies: all support null safety.
-All dependencies opt in to null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": [
-    {
-      "package": "devTransitive",
-      "kind": "transitive",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "resolvable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "latest": {
-        "version": "1.0.0",
-        "nullSafety": false
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
-$ pub outdated --json --no-dev-dependencies
-{
-  "packages": []
-}
-
diff --git a/test/testdata/goldens/outdated/outdated_test/null-safety no resolution.txt b/test/testdata/goldens/outdated/outdated_test/null-safety no resolution.txt
deleted file mode 100644
index ccaa3bd..0000000
--- a/test/testdata/goldens/outdated/outdated_test/null-safety no resolution.txt
+++ /dev/null
@@ -1,172 +0,0 @@
-# GENERATED BY: test/outdated/outdated_test.dart
-
-## Section 0
-$ pub outdated --json
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 1
-$ pub outdated --no-color
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 2
-$ pub outdated --no-color --no-transitive
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 3
-$ pub outdated --no-color --up-to-date
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-bar           1.0.0    1.0.0       1.0.0       1.0.0   
-foo           1.0.0    1.0.0       1.0.0       1.0.0   
-You are already using the newest resolvable versions listed in the 'Resolvable' column.
-Newer versions, listed in 'Latest', may not be mutually compatible.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 4
-$ pub outdated --no-color --prereleases
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Package Name  Current  Upgradable  Resolvable  Latest              
-
-direct dependencies:
-bar           *1.0.0   *1.0.0      *1.0.0      2.0.0-nullsafety.0  
-foo           *1.0.0   *1.0.0      *1.0.0      2.0.0-nullsafety.0  
-You are already using the newest resolvable versions listed in the 'Resolvable' column.
-Newer versions, listed in 'Latest', may not be mutually compatible.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 5
-$ pub outdated --no-color --no-dev-dependencies
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 6
-$ pub outdated --no-color --no-dependency-overrides
-Showing outdated packages.
-[*] indicates versions that are not the latest available.
-
-Found no outdated packages
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest               
-
-direct dependencies:
-bar           ✗1.0.0   ✗1.0.0      -           ✓2.0.0-nullsafety.0  
-foo           ✗1.0.0   ✗1.0.0      -           ✓2.0.0-nullsafety.0  
-No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest               
-
-direct dependencies:
-bar           ✗1.0.0   ✗1.0.0      -           ✓2.0.0-nullsafety.0  
-foo           ✗1.0.0   ✗1.0.0      -           ✓2.0.0-nullsafety.0  
-No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-Package Name  Current  Upgradable  Resolvable  Latest  
-
-direct dependencies:
-bar           ✗1.0.0   ✗1.0.0      -           ✗1.0.0  
-foo           ✗1.0.0   ✗1.0.0      -           ✗1.0.0  
-No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": [
-    {
-      "package": "bar",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "resolvable": null,
-      "latest": {
-        "version": "2.0.0-nullsafety.0",
-        "nullSafety": true
-      }
-    },
-    {
-      "package": "foo",
-      "kind": "direct",
-      "isDiscontinued": false,
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "upgradable": {
-        "version": "1.0.0",
-        "nullSafety": false
-      },
-      "resolvable": null,
-      "latest": {
-        "version": "2.0.0-nullsafety.0",
-        "nullSafety": true
-      }
-    }
-  ]
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
-$ pub outdated --json --no-dev-dependencies
-{
-  "packages": []
-}
-
diff --git a/test/testdata/goldens/outdated/outdated_test/overridden dependencies - no resolution.txt b/test/testdata/goldens/outdated/outdated_test/overridden dependencies - no resolution.txt
index 78d9b51..329641d 100644
--- a/test/testdata/goldens/outdated/outdated_test/overridden dependencies - no resolution.txt
+++ b/test/testdata/goldens/outdated/outdated_test/overridden dependencies - no resolution.txt
@@ -139,44 +139,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/overridden dependencies.txt b/test/testdata/goldens/outdated/outdated_test/overridden dependencies.txt
index f32a4b0..54bf561 100644
--- a/test/testdata/goldens/outdated/outdated_test/overridden dependencies.txt
+++ b/test/testdata/goldens/outdated/outdated_test/overridden dependencies.txt
@@ -170,44 +170,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": [
diff --git a/test/testdata/goldens/outdated/outdated_test/show discontinued.txt b/test/testdata/goldens/outdated/outdated_test/show discontinued.txt
index dc3ea84..10472a0 100644
--- a/test/testdata/goldens/outdated/outdated_test/show discontinued.txt
+++ b/test/testdata/goldens/outdated/outdated_test/show discontinued.txt
@@ -37,9 +37,6 @@
 bar           1.0.0    1.0.0       1.0.0       1.0.0                 
 baz           1.0.0    1.0.0       1.0.0       1.0.0 (discontinued)  
 foo           1.2.3    1.2.3       1.2.3       1.2.3 (discontinued)  
-
-transitive dependencies:
-transitive    1.2.3    1.2.3       1.2.3       1.2.3                 
 You are already using the newest resolvable versions listed in the 'Resolvable' column.
 Newer versions, listed in 'Latest', may not be mutually compatible.
 
@@ -78,44 +75,6 @@
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 7
-$ pub outdated --no-color --mode=null-safety
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 8
-$ pub outdated --no-color --mode=null-safety --transitive
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 9
-$ pub outdated --no-color --mode=null-safety --no-prereleases
-Showing dependencies that are currently not opted in to null-safety.
-[✗] indicates versions without null safety support.
-[✓] indicates versions opting in to null safety.
-
-All your dependencies declare support for null-safety.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 10
-$ pub outdated --json --mode=null-safety
-{
-  "packages": []
-}
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-## Section 11
 $ pub outdated --json --no-dev-dependencies
 {
   "packages": []
diff --git a/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --null-safety does not update null-safety of dependencies in example~.txt b/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --null-safety does not update null-safety of dependencies in example~.txt
index cabc0be..32970c8 100644
--- a/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --null-safety does not update null-safety of dependencies in example~.txt
+++ b/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --null-safety does not update null-safety of dependencies in example~.txt
@@ -2,27 +2,15 @@
 
 ## Section 0
 $ pub upgrade --null-safety --example
-Resolving dependencies...
-+ bar 2.0.0
-Changed 1 dependency!
-
-Changed 1 constraint in pubspec.yaml:
-  bar: ^1.0.0 -> ^2.0.0
-Resolving dependencies in ./example...
-Got dependencies in ./example.
-[STDERR] Running `upgrade --null-safety` only in `.`. Run `dart pub upgrade --null-safety --directory example/` separately.
+[STDERR] The `--null-safety` flag is no longer supported.
+[STDERR] Consider using the Dart 2.19 sdk to migrate to null safety.
+[EXIT CODE] 65
 
 -------------------------------- END OF OUTPUT ---------------------------------
 
 ## Section 1
 $ pub upgrade --null-safety --directory example
-Resolving dependencies in example...
-> bar 2.0.0 (was 1.0.0)
-> foo 2.0.0 (was 1.0.0)
-  myapp 0.0.0 from path .
-Changed 2 dependencies in example!
-
-Changed 2 constraints in pubspec.yaml:
-  foo: ^1.0.0 -> ^2.0.0
-  bar: ^1.0.0 -> ^2.0.0
+[STDERR] The `--null-safety` flag is no longer supported.
+[STDERR] Consider using the Dart 2.19 sdk to migrate to null safety.
+[EXIT CODE] 65
 
diff --git a/test/upgrade/upgrade_null_safety_test.dart b/test/upgrade/upgrade_null_safety_test.dart
deleted file mode 100644
index ad210d8..0000000
--- a/test/upgrade/upgrade_null_safety_test.dart
+++ /dev/null
@@ -1,482 +0,0 @@
-// Copyright (c) 2020, 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 'package:test/test.dart';
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-void main() {
-  group('pub upgrade --null-safety', () {
-    setUp(() async {
-      await servePackages()
-        ..serve('foo', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.10.0<3.0.0'},
-        })
-        ..serve('foo', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0<3.0.0'},
-        })
-        ..serve('bar', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        })
-        ..serve('bar', '2.0.0-nullsafety.0', pubspec: {
-          'environment': {'sdk': '>=2.12.0<3.0.0'},
-        })
-        ..serve('baz', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        })
-        ..serve('has_conflict', '1.0.0', pubspec: {
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        })
-        ..serve('has_conflict', '2.0.0', pubspec: {
-          'environment': {'sdk': '>=2.13.0<3.0.0'},
-        });
-    });
-
-    test('upgrades to null-safety versions', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-      await d.dir(appPath, [
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'foo',
-            version: '1.0.0',
-            languageVersion: '2.10',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.10.0'),
-      ]).validate();
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        output: allOf(
-          contains('Changed 1 constraint in pubspec.yaml:'),
-          contains('foo: ^1.0.0 -> ^2.0.0'),
-        ),
-      );
-
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^2.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'foo',
-            version: '2.0.0',
-            languageVersion: '2.12',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.12.0'),
-      ]).validate();
-    });
-
-    test('upgrades to prereleases when required', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'bar': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-      await d.dir(appPath, [
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'bar',
-            version: '1.0.0',
-            languageVersion: '2.9',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.10.0'),
-      ]).validate();
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        output: allOf(
-          contains('Changed 1 constraint in pubspec.yaml:'),
-          contains('bar: ^1.0.0 -> ^2.0.0-nullsafety.0'),
-        ),
-      );
-
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'bar': '^2.0.0-nullsafety.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'bar',
-            version: '2.0.0-nullsafety.0',
-            languageVersion: '2.12',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.12.0'),
-      ]).validate();
-    });
-
-    test('upgrades multiple dependencies', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        output: allOf(
-          contains('Changed 2 constraints in pubspec.yaml:'),
-          contains('foo: ^1.0.0 -> ^2.0.0'),
-          contains('bar: ^1.0.0 -> ^2.0.0-nullsafety.0'),
-        ),
-      );
-
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^2.0.0',
-            'bar': '^2.0.0-nullsafety.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'foo',
-            version: '2.0.0',
-            languageVersion: '2.12',
-          ),
-          d.packageConfigEntry(
-            name: 'bar',
-            version: '2.0.0-nullsafety.0',
-            languageVersion: '2.12',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.12.0'),
-      ]).validate();
-    });
-
-    test('--dry-run does not mutate pubspec.yaml', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-
-      final stateBeforeUpgrade = d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'foo',
-            version: '1.0.0',
-            languageVersion: '2.10',
-          ),
-          d.packageConfigEntry(
-            name: 'bar',
-            version: '1.0.0',
-            languageVersion: '2.9',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.10.0'),
-      ]);
-      await stateBeforeUpgrade.validate();
-
-      await pubUpgrade(
-        args: ['--null-safety', '--dry-run'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        output: allOf(
-          contains('Would change 2 constraints in pubspec.yaml:'),
-          contains('foo: ^1.0.0 -> ^2.0.0'),
-          contains('bar: ^1.0.0 -> ^2.0.0-nullsafety.0'),
-        ),
-      );
-
-      await stateBeforeUpgrade.validate();
-    });
-
-    test('ignores path dependencies', () async {
-      await d.dir('baz', [
-        d.pubspec({
-          'name': 'baz',
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-            'baz': {
-              'path': d.path('baz'),
-            },
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        output: allOf(
-          contains('Changed 2 constraints in pubspec.yaml:'),
-          contains('foo: ^1.0.0 -> ^2.0.0'),
-          contains('bar: ^1.0.0 -> ^2.0.0-nullsafety.0'),
-        ),
-        warning: allOf(
-          contains('Following direct \'dependencies\' and'),
-          contains('\'dev_dependencies\' are not migrated to'),
-          contains('null-safety yet:'),
-          contains(' - baz'),
-        ),
-      );
-    });
-
-    test('cannot upgrade without null-safety versions', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-            'baz': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        error: allOf(
-          contains('null-safety compatible versions do not exist for:'),
-          contains(' - baz'),
-          contains('You can choose to upgrade only some dependencies'),
-          contains('dart pub upgrade --nullsafety'),
-          contains('https://dart.dev/null-safety/migration-guide'),
-        ),
-      );
-    });
-
-    test('can upgrade partially', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-            'baz': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubUpgrade(
-        args: ['--null-safety', 'bar', 'foo'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        output: allOf(
-          contains('Changed 2 constraints in pubspec.yaml:'),
-          contains('foo: ^1.0.0 -> ^2.0.0'),
-          contains('bar: ^1.0.0 -> ^2.0.0-nullsafety.0'),
-        ),
-        warning: allOf(
-          contains('Following direct \'dependencies\' and'),
-          contains('\'dev_dependencies\' are not migrated to'),
-          contains('null-safety yet:'),
-          contains(' - baz'),
-        ),
-      );
-
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^2.0.0',
-            'bar': '^2.0.0-nullsafety.0',
-            'baz': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-        d.packageConfigFile([
-          d.packageConfigEntry(
-            name: 'foo',
-            version: '2.0.0',
-            languageVersion: '2.12',
-          ),
-          d.packageConfigEntry(
-            name: 'bar',
-            version: '2.0.0-nullsafety.0',
-            languageVersion: '2.12',
-          ),
-          d.packageConfigEntry(
-            name: 'baz',
-            version: '1.0.0',
-            languageVersion: '2.9',
-          ),
-          d.packageConfigEntry(
-            name: 'myapp',
-            languageVersion: '2.9',
-            path: '.',
-          ),
-        ], generatorVersion: '2.12.0'),
-      ]).validate();
-    });
-
-    test('can fail to solve', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-            // This causes a SDK constraint conflict when migrating to
-            // null-safety
-            'has_conflict': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.12.0',
-        },
-        error: allOf(
-          contains('Because myapp depends on has_conflict >=2.0.0 which'),
-          contains('requires SDK version >=2.13.0 <4.0.0,'),
-          contains('version solving failed.'),
-        ),
-      );
-    });
-
-    test('works in 2.14.0', () async {
-      await d.dir(appPath, [
-        d.pubspec({
-          'name': 'myapp',
-          'dependencies': {
-            'foo': '^1.0.0',
-            'bar': '^1.0.0',
-            // This requires SDK >= 2.13.0
-            'has_conflict': '^1.0.0',
-          },
-          'environment': {'sdk': '>=2.9.0<3.0.0'},
-        }),
-      ]).create();
-
-      await pubGet(environment: {
-        '_PUB_TEST_SDK_VERSION': '2.10.0',
-      });
-
-      await pubUpgrade(
-        args: ['--null-safety'],
-        environment: {
-          '_PUB_TEST_SDK_VERSION': '2.14.0',
-        },
-        output: allOf(
-          contains('Changed 3 constraints in pubspec.yaml:'),
-          contains('foo: ^1.0.0 -> ^2.0.0'),
-          contains('bar: ^1.0.0 -> ^2.0.0-nullsafety.0'),
-          contains('has_conflict: ^1.0.0 -> ^2.0.0'),
-        ),
-      );
-    });
-  });
-}
diff --git a/test/validator/null_safety_mixed_mode_test.dart b/test/validator/null_safety_mixed_mode_test.dart
deleted file mode 100644
index d62d051..0000000
--- a/test/validator/null_safety_mixed_mode_test.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2020, 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 'package:test/test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-Future<void> expectValidation(error, int exitCode) async {
-  await runPub(
-    error: error,
-    args: ['publish', '--dry-run'],
-    environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'},
-    workingDirectory: d.path(appPath),
-    exitCode: exitCode,
-  );
-}
-
-Future<void> setup({
-  required String sdkConstraint,
-  Map dependencies = const {},
-  Map devDependencies = const {},
-  List<d.Descriptor> extraFiles = const [],
-}) async {
-  await d.validPackage.create();
-  await d.dir(appPath, [
-    d.pubspec({
-      'name': 'test_pkg',
-      'description':
-          'A just long enough decription to fit the requirement of 60 characters',
-      'homepage': 'https://example.com/',
-      'version': '1.0.0',
-      'environment': {'sdk': sdkConstraint},
-      'dependencies': dependencies,
-      'dev_dependencies': devDependencies,
-    }),
-    ...extraFiles,
-  ]).create();
-
-  await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'});
-}
-
-void main() {
-  group('should consider a package valid if it', () {
-    test('is not opting in to null-safety, but depends on package that is',
-        () async {
-      final server = await servePackages();
-      server.serve(
-        'foo',
-        '0.0.1',
-        pubspec: {
-          'environment': {'sdk': '>=2.12.0<3.0.0'}
-        },
-      );
-
-      await setup(
-          sdkConstraint: '>=2.9.0 <3.0.0', dependencies: {'foo': '^0.0.1'});
-      await expectValidation(contains('Package has 0 warnings.'), 0);
-    });
-    test('is opting in to null-safety and depends on package that is',
-        () async {
-      final server = await servePackages();
-      server.serve(
-        'foo',
-        '0.0.1',
-        pubspec: {
-          'environment': {'sdk': '>=2.12.0<3.0.0'}
-        },
-      );
-
-      await setup(
-          sdkConstraint: '>=2.12.0 <3.0.0', dependencies: {'foo': '^0.0.1'});
-      await expectValidation(contains('Package has 0 warnings.'), 0);
-    });
-
-    test('is opting in to null-safety has dev_dependency that is not',
-        () async {
-      final server = await servePackages();
-      server.serve(
-        'foo',
-        '0.0.1',
-        pubspec: {
-          'environment': {'sdk': '>=2.9.0<3.0.0'}
-        },
-      );
-
-      await setup(sdkConstraint: '>=2.12.0 <3.0.0', devDependencies: {
-        'foo': '^0.0.1',
-      });
-      await expectValidation(contains('Package has 0 warnings.'), 0);
-    });
-  });
-
-  group('should consider a package invalid if it', () {
-    test('is opting in to null-safety, but depends on package that is not',
-        () async {
-      final server = await servePackages();
-      server.serve(
-        'foo',
-        '0.0.1',
-        pubspec: {
-          'environment': {'sdk': '>=2.9.0<3.0.0'}
-        },
-      );
-
-      await setup(
-          sdkConstraint: '>=2.12.0 <3.0.0', dependencies: {'foo': '^0.0.1'});
-      await expectValidation(
-          allOf(
-            contains(
-                'package:foo is not opted into null safety in its pubspec.yaml:'),
-            contains('Package has 1 warning.'),
-          ),
-          65);
-    });
-
-    test('is opting in to null-safety, but has file opting out', () async {
-      await setup(sdkConstraint: '>=2.12.0 <3.0.0', extraFiles: [
-        d.dir('lib', [d.file('a.dart', '// @dart = 2.9\n')])
-      ]);
-      await expectValidation(
-          allOf(
-            contains('package:test_pkg/a.dart is opting out of null safety:'),
-            contains('Package has 1 warning.'),
-          ),
-          65);
-    });
-
-    test(
-        'is opting in to null-safety, but depends on package has file opting out',
-        () async {
-      final server = await servePackages();
-      server.serve('foo', '0.0.1', pubspec: {
-        'environment': {'sdk': '>=2.12.0<3.0.0'}
-      }, contents: [
-        d.dir('lib', [
-          d.file('foo.dart', '''
-// @dart = 2.9
-          ''')
-        ])
-      ]);
-
-      await setup(
-          sdkConstraint: '>=2.12.0 <3.0.0', dependencies: {'foo': '^0.0.1'});
-      await expectValidation(
-          allOf(
-            contains('package:foo/foo.dart is opting out of null safety:'),
-            contains('Package has 1 warning.'),
-          ),
-          65);
-    });
-  });
-}