Split out directDependencies and devDependencies in `pub deps` (#4383)

diff --git a/lib/src/command/deps.dart b/lib/src/command/deps.dart
index 212d541..e197f33 100644
--- a/lib/src/command/deps.dart
+++ b/lib/src/command/deps.dart
@@ -126,7 +126,17 @@
           'version': currentPackage.version.toString(),
           'kind': kind,
           'source': source,
-          'dependencies': next,
+          // This field is kept for backwards compatibility with dart 3.5 and
+          // before. Clients should opt to consume directDependencies and
+          // devDependencies separately instead.
+          'dependencies': (isRoot
+                  ? currentPackage.dependencies
+                  : currentPackage.immediateDependencies)
+              .keys
+              .toList(),
+          'directDependencies': currentPackage.dependencies.keys.toList(),
+          if (isRoot)
+            'devDependencies': currentPackage.devDependencies.keys.toList(),
         });
         toVisit.addAll(next);
       }
diff --git a/test/deps_test.dart b/test/deps_test.dart
index 2faca20..e90e5db 100644
--- a/test/deps_test.dart
+++ b/test/deps_test.dart
@@ -158,9 +158,15 @@
       "dependencies": [
         "normal",
         "overridden",
-        "from_path",
-        "unittest",
-        "override_only"
+        "from_path"
+      ],
+      "directDependencies": [
+        "normal",
+        "overridden",
+        "from_path"
+      ],
+      "devDependencies": [
+        "unittest"
       ]
     },
     {
@@ -168,7 +174,8 @@
       "version": "1.2.3",
       "kind": "transitive",
       "source": "hosted",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     },
     {
       "name": "unittest",
@@ -178,6 +185,10 @@
       "dependencies": [
         "shared",
         "dev_only"
+      ],
+      "directDependencies": [
+        "shared",
+        "dev_only"
       ]
     },
     {
@@ -185,7 +196,8 @@
       "version": "1.2.3",
       "kind": "transitive",
       "source": "hosted",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     },
     {
       "name": "shared",
@@ -194,6 +206,9 @@
       "source": "hosted",
       "dependencies": [
         "other"
+      ],
+      "directDependencies": [
+        "other"
       ]
     },
     {
@@ -203,6 +218,9 @@
       "source": "hosted",
       "dependencies": [
         "myapp"
+      ],
+      "directDependencies": [
+        "myapp"
       ]
     },
     {
@@ -210,14 +228,16 @@
       "version": "1.2.3",
       "kind": "direct",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     },
     {
       "name": "overridden",
       "version": "2.0.0",
       "kind": "direct",
       "source": "hosted",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     },
     {
       "name": "normal",
@@ -227,6 +247,10 @@
       "dependencies": [
         "transitive",
         "circular_a"
+      ],
+      "directDependencies": [
+        "transitive",
+        "circular_a"
       ]
     },
     {
@@ -236,6 +260,9 @@
       "source": "hosted",
       "dependencies": [
         "circular_b"
+      ],
+      "directDependencies": [
+        "circular_b"
       ]
     },
     {
@@ -245,6 +272,9 @@
       "source": "hosted",
       "dependencies": [
         "circular_a"
+      ],
+      "directDependencies": [
+        "circular_a"
       ]
     },
     {
@@ -254,6 +284,9 @@
       "source": "hosted",
       "dependencies": [
         "shared"
+      ],
+      "directDependencies": [
+        "shared"
       ]
     }
   ],
diff --git a/test/testdata/goldens/deps/executables_test/applies formatting before printing executables.txt b/test/testdata/goldens/deps/executables_test/applies formatting before printing executables.txt
index 94e40bd..f6b0448 100644
--- a/test/testdata/goldens/deps/executables_test/applies formatting before printing executables.txt
+++ b/test/testdata/goldens/deps/executables_test/applies formatting before printing executables.txt
@@ -48,21 +48,28 @@
       "dependencies": [
         "foo",
         "bar"
-      ]
+      ],
+      "directDependencies": [
+        "foo",
+        "bar"
+      ],
+      "devDependencies": []
     },
     {
       "name": "bar",
       "version": "1.0.0",
       "kind": "direct",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     },
     {
       "name": "foo",
       "version": "1.0.0",
       "kind": "direct",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/dev dependencies.txt b/test/testdata/goldens/deps/executables_test/dev dependencies.txt
index fe0d91c..d0b2ffa 100644
--- a/test/testdata/goldens/deps/executables_test/dev dependencies.txt
+++ b/test/testdata/goldens/deps/executables_test/dev dependencies.txt
@@ -34,7 +34,9 @@
       "version": "0.0.0",
       "kind": "root",
       "source": "root",
-      "dependencies": [
+      "dependencies": [],
+      "directDependencies": [],
+      "devDependencies": [
         "foo"
       ]
     },
@@ -43,7 +45,8 @@
       "version": "1.0.0",
       "kind": "dev",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/lists Dart executables, without entrypoints.txt b/test/testdata/goldens/deps/executables_test/lists Dart executables, without entrypoints.txt
index 4a9cf40..89c4b04 100644
--- a/test/testdata/goldens/deps/executables_test/lists Dart executables, without entrypoints.txt
+++ b/test/testdata/goldens/deps/executables_test/lists Dart executables, without entrypoints.txt
@@ -33,7 +33,9 @@
       "version": "0.0.0",
       "kind": "root",
       "source": "root",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": [],
+      "devDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/lists executables from a dependency.txt b/test/testdata/goldens/deps/executables_test/lists executables from a dependency.txt
index a2e04ea..33c7a04 100644
--- a/test/testdata/goldens/deps/executables_test/lists executables from a dependency.txt
+++ b/test/testdata/goldens/deps/executables_test/lists executables from a dependency.txt
@@ -36,14 +36,19 @@
       "source": "root",
       "dependencies": [
         "foo"
-      ]
+      ],
+      "directDependencies": [
+        "foo"
+      ],
+      "devDependencies": []
     },
     {
       "name": "foo",
       "version": "1.0.0",
       "kind": "direct",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/lists executables only from immediate dependencies.txt b/test/testdata/goldens/deps/executables_test/lists executables only from immediate dependencies.txt
index 5641ae5..cb13a57 100644
--- a/test/testdata/goldens/deps/executables_test/lists executables only from immediate dependencies.txt
+++ b/test/testdata/goldens/deps/executables_test/lists executables only from immediate dependencies.txt
@@ -40,7 +40,11 @@
       "source": "root",
       "dependencies": [
         "foo"
-      ]
+      ],
+      "directDependencies": [
+        "foo"
+      ],
+      "devDependencies": []
     },
     {
       "name": "foo",
@@ -49,6 +53,9 @@
       "source": "path",
       "dependencies": [
         "baz"
+      ],
+      "directDependencies": [
+        "baz"
       ]
     },
     {
@@ -56,7 +63,8 @@
       "version": "1.0.0",
       "kind": "transitive",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/overriden dependencies executables.txt b/test/testdata/goldens/deps/executables_test/overriden dependencies executables.txt
index 4502673..ad13621 100644
--- a/test/testdata/goldens/deps/executables_test/overriden dependencies executables.txt
+++ b/test/testdata/goldens/deps/executables_test/overriden dependencies executables.txt
@@ -41,14 +41,19 @@
       "source": "root",
       "dependencies": [
         "foo"
-      ]
+      ],
+      "directDependencies": [
+        "foo"
+      ],
+      "devDependencies": []
     },
     {
       "name": "foo",
       "version": "2.0.0",
       "kind": "direct",
       "source": "path",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/skips executables in sub directories.txt b/test/testdata/goldens/deps/executables_test/skips executables in sub directories.txt
index ce15a02..044eb9b 100644
--- a/test/testdata/goldens/deps/executables_test/skips executables in sub directories.txt
+++ b/test/testdata/goldens/deps/executables_test/skips executables in sub directories.txt
@@ -34,7 +34,9 @@
       "version": "0.0.0",
       "kind": "root",
       "source": "root",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": [],
+      "devDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/skips non-Dart executables.txt b/test/testdata/goldens/deps/executables_test/skips non-Dart executables.txt
index 71c0fc2..6b8ffe1 100644
--- a/test/testdata/goldens/deps/executables_test/skips non-Dart executables.txt
+++ b/test/testdata/goldens/deps/executables_test/skips non-Dart executables.txt
@@ -31,7 +31,9 @@
       "version": "0.0.0",
       "kind": "root",
       "source": "root",
-      "dependencies": []
+      "dependencies": [],
+      "directDependencies": [],
+      "devDependencies": []
     }
   ],
   "sdks": [
diff --git a/test/workspace_test.dart b/test/workspace_test.dart
index 147c543..e7d2095 100644
--- a/test/workspace_test.dart
+++ b/test/workspace_test.dart
@@ -539,6 +539,103 @@
 transitive dependencies:
 - transitive 1.0.0''',
     );
+    await runPub(
+      args: ['deps', '--json'],
+      environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'},
+      output: '''
+{
+  "root": "myapp",
+  "packages": [
+    {
+      "name": "b",
+      "version": "1.1.1",
+      "kind": "root",
+      "source": "root",
+      "dependencies": [
+        "myapp",
+        "both"
+      ],
+      "directDependencies": [
+        "myapp",
+        "both"
+      ],
+      "devDependencies": []
+    },
+    {
+      "name": "both",
+      "version": "1.0.0",
+      "kind": "direct",
+      "source": "hosted",
+      "dependencies": [],
+      "directDependencies": []
+    },
+    {
+      "name": "myapp",
+      "version": "1.2.3",
+      "kind": "root",
+      "source": "root",
+      "dependencies": [
+        "both",
+        "b"
+      ],
+      "directDependencies": [
+        "both",
+        "b"
+      ],
+      "devDependencies": []
+    },
+    {
+      "name": "a",
+      "version": "1.1.1",
+      "kind": "root",
+      "source": "root",
+      "dependencies": [
+        "myapp",
+        "foo"
+      ],
+      "directDependencies": [
+        "myapp",
+        "foo"
+      ],
+      "devDependencies": [
+        "both"
+      ]
+    },
+    {
+      "name": "foo",
+      "version": "1.0.0",
+      "kind": "transitive",
+      "source": "hosted",
+      "dependencies": [
+        "transitive"
+      ],
+      "directDependencies": [
+        "transitive"
+      ]
+    },
+    {
+      "name": "transitive",
+      "version": "1.0.0",
+      "kind": "transitive",
+      "source": "hosted",
+      "dependencies": [],
+      "directDependencies": []
+    }
+  ],
+  "sdks": [
+    {
+      "name": "Dart",
+      "version": "3.5.0"
+    }
+  ],
+  "executables": [
+    ":myappmain",
+    "both:bothmain",
+    "b:bmain"
+  ]
+}
+''',
+    );
 
     await runPub(
       args: ['deps', '--style=list', '--no-dev'],