Don't show entries for dev-dependencies in outdated --json --no-dev-dependencies (#2591)

diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index f04c11f..9b33f60 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -206,7 +206,12 @@
     }[argResults['mode']];
     final showAll = argResults['show-all'] || argResults['up-to-date'];
     if (argResults['json']) {
-      await _outputJson(rows, mode, showAll: showAll);
+      await _outputJson(
+        rows,
+        mode,
+        showAll: showAll,
+        includeDevDependencies: includeDevDependencies,
+      );
     } else {
       if (argResults.wasParsed('color')) {
         forceColors = argResults['color'];
@@ -386,12 +391,20 @@
   List<_PackageDetails> rows,
   Mode mode, {
   @required bool showAll,
+  @required bool includeDevDependencies,
 }) async {
   final markedRows =
       Map.fromIterables(rows, await mode.markVersionDetails(rows));
   if (!showAll) {
     rows.removeWhere((row) => markedRows[row][0].asDesired);
   }
+  if (!includeDevDependencies) {
+    rows.removeWhere(
+      (element) =>
+          element.kind == _DependencyKind.dev ||
+          element.kind == _DependencyKind.devTransitive,
+    );
+  }
   log.message(
     JsonEncoder.withIndent('  ').convert(
       {
diff --git a/pubspec.yaml b/pubspec.yaml
index 42bbd64..fcf8913 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -34,3 +34,4 @@
   test: ^1.3.0
   test_descriptor: ^1.0.0
   test_process: ^1.0.0
+  protoc_plugin: <19.0.0
diff --git a/test/outdated/goldens/circular_dependencies.txt b/test/outdated/goldens/circular_dependencies.txt
index 6bbc4e7..49bb7a9 100644
--- a/test/outdated/goldens/circular_dependencies.txt
+++ b/test/outdated/goldens/circular_dependencies.txt
@@ -121,3 +121,24 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.2.3"
+      },
+      "upgradable": {
+        "version": "1.3.0"
+      },
+      "resolvable": {
+        "version": "1.3.0"
+      },
+      "latest": {
+        "version": "1.3.0"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/dependency_overrides.txt b/test/outdated/goldens/dependency_overrides.txt
index cd91a41..32d3234 100644
--- a/test/outdated/goldens/dependency_overrides.txt
+++ b/test/outdated/goldens/dependency_overrides.txt
@@ -222,3 +222,63 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "bar",
+      "current": {
+        "version": "1.0.1",
+        "overridden": true
+      },
+      "upgradable": {
+        "version": "1.0.1",
+        "overridden": true
+      },
+      "resolvable": {
+        "version": "1.0.1",
+        "overridden": true
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "baz",
+      "current": {
+        "version": "2.0.0",
+        "overridden": true
+      },
+      "upgradable": {
+        "version": "2.0.0",
+        "overridden": true
+      },
+      "resolvable": {
+        "version": "2.0.0",
+        "overridden": true
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.0.1",
+        "overridden": true
+      },
+      "upgradable": {
+        "version": "1.0.1",
+        "overridden": true
+      },
+      "resolvable": {
+        "version": "1.0.1",
+        "overridden": true
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/dependency_overrides_no_solution.txt b/test/outdated/goldens/dependency_overrides_no_solution.txt
index f8ec65a..18afa68 100644
--- a/test/outdated/goldens/dependency_overrides_no_solution.txt
+++ b/test/outdated/goldens/dependency_overrides_no_solution.txt
@@ -173,3 +173,45 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "bar",
+      "current": {
+        "version": "1.0.0",
+        "overridden": true
+      },
+      "upgradable": {
+        "version": "1.0.0",
+        "overridden": true
+      },
+      "resolvable": {
+        "version": "1.0.0",
+        "overridden": true
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.0.0",
+        "overridden": true
+      },
+      "upgradable": {
+        "version": "1.0.0",
+        "overridden": true
+      },
+      "resolvable": {
+        "version": "1.0.0",
+        "overridden": true
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/mutually_incompatible.txt b/test/outdated/goldens/mutually_incompatible.txt
index 13febb5..ba1e041 100644
--- a/test/outdated/goldens/mutually_incompatible.txt
+++ b/test/outdated/goldens/mutually_incompatible.txt
@@ -161,3 +161,39 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "bar",
+      "current": {
+        "version": "1.0.0"
+      },
+      "upgradable": {
+        "version": "1.0.0"
+      },
+      "resolvable": {
+        "version": "1.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.0.0"
+      },
+      "upgradable": {
+        "version": "1.0.0"
+      },
+      "resolvable": {
+        "version": "1.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/newer_versions.txt b/test/outdated/goldens/newer_versions.txt
index f69260f..65c2ea9 100644
--- a/test/outdated/goldens/newer_versions.txt
+++ b/test/outdated/goldens/newer_versions.txt
@@ -352,3 +352,39 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.2.3"
+      },
+      "upgradable": {
+        "version": "1.3.0"
+      },
+      "resolvable": {
+        "version": "3.0.0"
+      },
+      "latest": {
+        "version": "3.0.0"
+      }
+    },
+    {
+      "package": "transitive",
+      "current": {
+        "version": "1.2.3"
+      },
+      "upgradable": {
+        "version": "2.0.0"
+      },
+      "resolvable": {
+        "version": "2.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/no_dependencies.txt b/test/outdated/goldens/no_dependencies.txt
index ccb0c3b..a01d0c1 100644
--- a/test/outdated/goldens/no_dependencies.txt
+++ b/test/outdated/goldens/no_dependencies.txt
@@ -29,3 +29,8 @@
   "packages": []
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": []
+}
+
diff --git a/test/outdated/goldens/no_lockfile.txt b/test/outdated/goldens/no_lockfile.txt
index b49c5b1..187ae32 100644
--- a/test/outdated/goldens/no_lockfile.txt
+++ b/test/outdated/goldens/no_lockfile.txt
@@ -169,3 +169,35 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "bar",
+      "current": null,
+      "upgradable": {
+        "version": "1.2.3"
+      },
+      "resolvable": {
+        "version": "2.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "foo",
+      "current": null,
+      "upgradable": {
+        "version": "1.2.3"
+      },
+      "resolvable": {
+        "version": "1.2.3"
+      },
+      "latest": {
+        "version": "1.2.3"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/null_safety.txt b/test/outdated/goldens/null_safety.txt
index 8f9a7ff..542c598 100644
--- a/test/outdated/goldens/null_safety.txt
+++ b/test/outdated/goldens/null_safety.txt
@@ -321,3 +321,99 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "bar",
+      "current": {
+        "version": "1.0.0"
+      },
+      "upgradable": {
+        "version": "1.0.0"
+      },
+      "resolvable": {
+        "version": "1.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "fails_analysis",
+      "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",
+      "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",
+      "current": {
+        "version": "1.0.0"
+      },
+      "upgradable": {
+        "version": "1.0.0"
+      },
+      "resolvable": {
+        "version": "2.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "file_opts_out",
+      "current": {
+        "version": "1.0.0"
+      },
+      "upgradable": {
+        "version": "1.0.0"
+      },
+      "resolvable": {
+        "version": "2.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    },
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.0.0"
+      },
+      "upgradable": {
+        "version": "1.0.0"
+      },
+      "resolvable": {
+        "version": "2.0.0"
+      },
+      "latest": {
+        "version": "2.0.0"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/goldens/prereleases.txt b/test/outdated/goldens/prereleases.txt
index e56cea0..8250fed 100644
--- a/test/outdated/goldens/prereleases.txt
+++ b/test/outdated/goldens/prereleases.txt
@@ -183,3 +183,39 @@
   ]
 }
 
+$ pub outdated --json --no-dev-dependencies
+{
+  "packages": [
+    {
+      "package": "foo",
+      "current": {
+        "version": "1.0.0-dev.1"
+      },
+      "upgradable": {
+        "version": "1.0.0-dev.1"
+      },
+      "resolvable": {
+        "version": "0.9.0"
+      },
+      "latest": {
+        "version": "0.9.0"
+      }
+    },
+    {
+      "package": "mop",
+      "current": {
+        "version": "0.10.0-dev"
+      },
+      "upgradable": {
+        "version": "0.10.0-dev"
+      },
+      "resolvable": {
+        "version": "0.10.0"
+      },
+      "latest": {
+        "version": "1.0.0-dev"
+      }
+    }
+  ]
+}
+
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index 3795ad5..8c762d5 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -42,6 +42,7 @@
     ['--no-color', '--no-dependency-overrides'],
     ['--no-color', '--mode=null-safety'],
     ['--json', '--mode=null-safety'],
+    ['--json', '--no-dev-dependencies'],
   ]) {
     await runPubOutdated(args, buffer, environment: environment);
   }