Add dependency constraints natively to `pub deps --json` (#4797)
diff --git a/lib/src/command/deps.dart b/lib/src/command/deps.dart
index f74aeb5..8304b22 100644
--- a/lib/src/command/deps.dart
+++ b/lib/src/command/deps.dart
@@ -148,6 +148,10 @@
           'directDependencies': currentPackage.dependencies.keys.toList(),
           if (isRoot)
             'devDependencies': currentPackage.devDependencies.keys.toList(),
+          'dependencyConstraints': (isRoot
+                  ? currentPackage.immediateDependencies
+                  : currentPackage.dependencies)
+              .map((k, v) => MapEntry(k, v.constraint.toString())),
         });
         toVisit.addAll(next);
       }
diff --git a/test/deps_test.dart b/test/deps_test.dart
index 3aff815..11dc020 100644
--- a/test/deps_test.dart
+++ b/test/deps_test.dart
@@ -172,7 +172,14 @@
       ],
       "devDependencies": [
         "unittest"
-      ]
+      ],
+      "dependencyConstraints": {
+        "normal": "any",
+        "overridden": "2.0.0",
+        "from_path": "any",
+        "unittest": "any",
+        "override_only": "any"
+      }
     },
     {
       "name": "override_only",
@@ -180,7 +187,8 @@
       "kind": "transitive",
       "source": "hosted",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     },
     {
       "name": "unittest",
@@ -194,7 +202,11 @@
       "directDependencies": [
         "shared",
         "dev_only"
-      ]
+      ],
+      "dependencyConstraints": {
+        "shared": "any",
+        "dev_only": "any"
+      }
     },
     {
       "name": "dev_only",
@@ -202,7 +214,8 @@
       "kind": "transitive",
       "source": "hosted",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     },
     {
       "name": "shared",
@@ -214,7 +227,10 @@
       ],
       "directDependencies": [
         "other"
-      ]
+      ],
+      "dependencyConstraints": {
+        "other": "any"
+      }
     },
     {
       "name": "other",
@@ -226,7 +242,10 @@
       ],
       "directDependencies": [
         "myapp"
-      ]
+      ],
+      "dependencyConstraints": {
+        "myapp": "any"
+      }
     },
     {
       "name": "from_path",
@@ -234,7 +253,8 @@
       "kind": "direct",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     },
     {
       "name": "overridden",
@@ -242,7 +262,8 @@
       "kind": "direct",
       "source": "hosted",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     },
     {
       "name": "normal",
@@ -256,7 +277,11 @@
       "directDependencies": [
         "transitive",
         "circular_a"
-      ]
+      ],
+      "dependencyConstraints": {
+        "transitive": "any",
+        "circular_a": "any"
+      }
     },
     {
       "name": "circular_a",
@@ -268,7 +293,10 @@
       ],
       "directDependencies": [
         "circular_b"
-      ]
+      ],
+      "dependencyConstraints": {
+        "circular_b": "any"
+      }
     },
     {
       "name": "circular_b",
@@ -280,7 +308,10 @@
       ],
       "directDependencies": [
         "circular_a"
-      ]
+      ],
+      "dependencyConstraints": {
+        "circular_a": "any"
+      }
     },
     {
       "name": "transitive",
@@ -292,7 +323,10 @@
       ],
       "directDependencies": [
         "shared"
-      ]
+      ],
+      "dependencyConstraints": {
+        "shared": "any"
+      }
     }
   ],
   "sdks": [
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 f6b0448..beca1d7 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
@@ -53,7 +53,11 @@
         "foo",
         "bar"
       ],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {
+        "foo": "any",
+        "bar": "any"
+      }
     },
     {
       "name": "bar",
@@ -61,7 +65,8 @@
       "kind": "direct",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     },
     {
       "name": "foo",
@@ -69,7 +74,8 @@
       "kind": "direct",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "sdks": [
diff --git a/test/testdata/goldens/deps/executables_test/dev dependencies.txt b/test/testdata/goldens/deps/executables_test/dev dependencies.txt
index 0e30ebc..5784bfd 100644
--- a/test/testdata/goldens/deps/executables_test/dev dependencies.txt
+++ b/test/testdata/goldens/deps/executables_test/dev dependencies.txt
@@ -40,7 +40,10 @@
       "directDependencies": [],
       "devDependencies": [
         "foo"
-      ]
+      ],
+      "dependencyConstraints": {
+        "foo": "any"
+      }
     },
     {
       "name": "foo",
@@ -48,7 +51,8 @@
       "kind": "dev",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "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 89c4b04..173978d 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
@@ -35,7 +35,8 @@
       "source": "root",
       "dependencies": [],
       "directDependencies": [],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "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 33c7a04..876f2c4 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
@@ -40,7 +40,10 @@
       "directDependencies": [
         "foo"
       ],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {
+        "foo": "any"
+      }
     },
     {
       "name": "foo",
@@ -48,7 +51,8 @@
       "kind": "direct",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "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 cb13a57..9dc658f 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
@@ -44,7 +44,10 @@
       "directDependencies": [
         "foo"
       ],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {
+        "foo": "any"
+      }
     },
     {
       "name": "foo",
@@ -56,7 +59,10 @@
       ],
       "directDependencies": [
         "baz"
-      ]
+      ],
+      "dependencyConstraints": {
+        "baz": "any"
+      }
     },
     {
       "name": "baz",
@@ -64,7 +70,8 @@
       "kind": "transitive",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "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 ad13621..775ca03 100644
--- a/test/testdata/goldens/deps/executables_test/overriden dependencies executables.txt
+++ b/test/testdata/goldens/deps/executables_test/overriden dependencies executables.txt
@@ -45,7 +45,10 @@
       "directDependencies": [
         "foo"
       ],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {
+        "foo": "any"
+      }
     },
     {
       "name": "foo",
@@ -53,7 +56,8 @@
       "kind": "direct",
       "source": "path",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "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 044eb9b..a7bad55 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
@@ -36,7 +36,8 @@
       "source": "root",
       "dependencies": [],
       "directDependencies": [],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "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 6b8ffe1..d7469e3 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
@@ -33,7 +33,8 @@
       "source": "root",
       "dependencies": [],
       "directDependencies": [],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "sdks": [
diff --git a/test/workspace_test.dart b/test/workspace_test.dart
index 4df7a91..fad9655 100644
--- a/test/workspace_test.dart
+++ b/test/workspace_test.dart
@@ -538,7 +538,11 @@
         "myapp",
         "both"
       ],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {
+        "myapp": "any",
+        "both": "^1.0.0"
+      }
     },
     {
       "name": "both",
@@ -546,7 +550,8 @@
       "kind": "direct",
       "source": "hosted",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     },
     {
       "name": "myapp",
@@ -561,7 +566,11 @@
         "both",
         "b"
       ],
-      "devDependencies": []
+      "devDependencies": [],
+      "dependencyConstraints": {
+        "both": "^1.0.0",
+        "b": "any"
+      }
     },
     {
       "name": "a",
@@ -579,7 +588,12 @@
       ],
       "devDependencies": [
         "both"
-      ]
+      ],
+      "dependencyConstraints": {
+        "myapp": "any",
+        "foo": "^1.0.0",
+        "both": "^1.0.0"
+      }
     },
     {
       "name": "foo",
@@ -591,7 +605,10 @@
       ],
       "directDependencies": [
         "transitive"
-      ]
+      ],
+      "dependencyConstraints": {
+        "transitive": "^1.0.0"
+      }
     },
     {
       "name": "transitive",
@@ -599,7 +616,8 @@
       "kind": "transitive",
       "source": "hosted",
       "dependencies": [],
-      "directDependencies": []
+      "directDependencies": [],
+      "dependencyConstraints": {}
     }
   ],
   "sdks": [