fix: respect dev vs non-dev dependencies of workspace projects at link-time

Fix #2013
diff --git a/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl b/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl
index cbbf732..97a0be6 100644
--- a/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl
+++ b/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl
@@ -228,9 +228,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package segfault-handler@1.3.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -244,12 +245,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl b/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl
index c36b29b..38f6988 100644
--- a/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl
+++ b/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl
@@ -228,9 +228,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package segfault-handler@1.3.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -244,12 +245,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl b/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl
index f71d16a..ce2c435 100644
--- a/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl
@@ -42,9 +42,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/c@2.0.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -58,12 +59,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/npm_translate_lock_disable_hooks/snapshots/defs.bzl b/e2e/npm_translate_lock_disable_hooks/snapshots/defs.bzl
index 9f07fb7..3846457 100644
--- a/e2e/npm_translate_lock_disable_hooks/snapshots/defs.bzl
+++ b/e2e/npm_translate_lock_disable_hooks/snapshots/defs.bzl
@@ -34,7 +34,7 @@
         store_0(name)
     if link:
         if bazel_package == "":
-            link_0("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_0("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
diff --git a/e2e/npm_translate_lock_replace_packages/snapshots/bzlmod/npm_defs.bzl b/e2e/npm_translate_lock_replace_packages/snapshots/bzlmod/npm_defs.bzl
index 144c6cd..4fd9ef9 100644
--- a/e2e/npm_translate_lock_replace_packages/snapshots/bzlmod/npm_defs.bzl
+++ b/e2e/npm_translate_lock_replace_packages/snapshots/bzlmod/npm_defs.bzl
@@ -36,9 +36,9 @@
         store_1(name)
     if link:
         if bazel_package == "":
-            link_0("{}/chalk".format(name), name, "chalk")
+            link_0("{}/chalk".format(name), False, name, "chalk")
             link_targets.append(":{}/chalk".format(name))
-            link_1("{}/lodash".format(name), name, "lodash")
+            link_1("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
 
     for scope, scoped_targets in scope_targets.items():
diff --git a/e2e/npm_translate_lock_replace_packages/snapshots/wksp/npm_defs.bzl b/e2e/npm_translate_lock_replace_packages/snapshots/wksp/npm_defs.bzl
index b940d07..11de359 100644
--- a/e2e/npm_translate_lock_replace_packages/snapshots/wksp/npm_defs.bzl
+++ b/e2e/npm_translate_lock_replace_packages/snapshots/wksp/npm_defs.bzl
@@ -36,9 +36,9 @@
         store_1(name)
     if link:
         if bazel_package == "":
-            link_0("{}/chalk".format(name), name, "chalk")
+            link_0("{}/chalk".format(name), False, name, "chalk")
             link_targets.append(":{}/chalk".format(name))
-            link_1("{}/lodash".format(name), name, "lodash")
+            link_1("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
 
     for scope, scoped_targets in scope_targets.items():
diff --git a/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_a_links_defs.bzl b/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_a_links_defs.bzl
index eab506f..1828c2d 100644
--- a/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_a_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_a_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/a@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_b_links_defs.bzl b/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_b_links_defs.bzl
index 95a52dc..1d8e5fb 100644
--- a/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_b_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_b_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/b@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_c_links_defs.bzl b/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_c_links_defs.bzl
index e219fb5..ba46f13 100644
--- a/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v101/snapshots/aspect_test_c_links_defs.bzl
@@ -44,9 +44,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/c@2.0.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -60,12 +61,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v101/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v101/snapshots/defs.bzl
index bba4afc..5415c57 100644
--- a/e2e/pnpm_lockfiles/v101/snapshots/defs.bzl
+++ b/e2e/pnpm_lockfiles/v101/snapshots/defs.bzl
@@ -176,169 +176,169 @@
         store_68(name)
     if link:
         if bazel_package == "<LOCKVERSION>":
-            link_4("{}/@aspect-test-a-bad-scope".format(name), name, "@aspect-test-a-bad-scope")
+            link_4("{}/@aspect-test-a-bad-scope".format(name), False, name, "@aspect-test-a-bad-scope")
             link_targets.append(":{}/@aspect-test-a-bad-scope".format(name))
             if "@aspect-test-a-bad-scop" not in scope_targets:
                 scope_targets["@aspect-test-a-bad-scop"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-a-bad-scop"].append(link_targets[-1])
-            link_4("{}/@aspect-test-custom-scope/a".format(name), name, "@aspect-test-custom-scope/a")
+            link_4("{}/@aspect-test-custom-scope/a".format(name), False, name, "@aspect-test-custom-scope/a")
             link_targets.append(":{}/@aspect-test-custom-scope/a".format(name))
             if "@aspect-test-custom-scope" not in scope_targets:
                 scope_targets["@aspect-test-custom-scope"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-custom-scope"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_4("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a2".format(name), name, "@aspect-test/a2")
+            link_4("{}/@aspect-test/a2".format(name), False, name, "@aspect-test/a2")
             link_targets.append(":{}/@aspect-test/a2".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/aspect-test-a-no-scope".format(name), name, "aspect-test-a-no-scope")
+            link_4("{}/aspect-test-a-no-scope".format(name), False, name, "aspect-test-a-no-scope")
             link_targets.append(":{}/aspect-test-a-no-scope".format(name))
-            link_4("{}/aspect-test-a/no-at".format(name), name, "aspect-test-a/no-at")
+            link_4("{}/aspect-test-a/no-at".format(name), False, name, "aspect-test-a/no-at")
             link_targets.append(":{}/aspect-test-a/no-at".format(name))
-            link_5("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_5("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_12("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_12("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_13("{}/@aspect-test/h-is-only-optional".format(name), name, "@aspect-test/h-is-only-optional")
+            link_13("{}/@aspect-test/h-is-only-optional".format(name), False, name, "@aspect-test/h-is-only-optional")
             link_targets.append(":{}/@aspect-test/h-is-only-optional".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), False, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_15("{}/@isaacs/cliui".format(name), name, "@isaacs/cliui")
+            link_15("{}/@isaacs/cliui".format(name), False, name, "@isaacs/cliui")
             link_targets.append(":{}/@isaacs/cliui".format(name))
             if "@isaacs" not in scope_targets:
                 scope_targets["@isaacs"] = [link_targets[-1]]
             else:
                 scope_targets["@isaacs"].append(link_targets[-1])
-            link_16("{}/rollup-plugin-with-peers".format(name), name, "rollup-plugin-with-peers")
+            link_16("{}/rollup-plugin-with-peers".format(name), False, name, "rollup-plugin-with-peers")
             link_targets.append(":{}/rollup-plugin-with-peers".format(name))
-            link_18("{}/@types/archiver".format(name), name, "@types/archiver")
+            link_18("{}/@types/archiver".format(name), True, name, "@types/archiver")
             link_targets.append(":{}/@types/archiver".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/alias-types-node".format(name), name, "alias-types-node")
+            link_22("{}/alias-types-node".format(name), True, name, "alias-types-node")
             link_targets.append(":{}/alias-types-node".format(name))
-            link_23("{}/alias-only-sizzle".format(name), name, "alias-only-sizzle")
+            link_23("{}/alias-only-sizzle".format(name), True, name, "alias-only-sizzle")
             link_targets.append(":{}/alias-only-sizzle".format(name))
-            link_26("{}/debug".format(name), name, "debug")
+            link_26("{}/debug".format(name), False, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), False, name, "hello")
             link_targets.append(":{}/hello".format(name))
-            link_39("{}/is-odd-v0".format(name), name, "is-odd-v0")
+            link_39("{}/is-odd-v0".format(name), False, name, "is-odd-v0")
             link_targets.append(":{}/is-odd-v0".format(name))
-            link_40("{}/is-odd-v1".format(name), name, "is-odd-v1")
+            link_40("{}/is-odd-v1".format(name), False, name, "is-odd-v1")
             link_targets.append(":{}/is-odd-v1".format(name))
-            link_41("{}/is-odd-v2".format(name), name, "is-odd-v2")
+            link_41("{}/is-odd-v2".format(name), False, name, "is-odd-v2")
             link_targets.append(":{}/is-odd-v2".format(name))
-            link_42("{}/is-odd-v3".format(name), name, "is-odd-v3")
+            link_42("{}/is-odd-v3".format(name), False, name, "is-odd-v3")
             link_targets.append(":{}/is-odd-v3".format(name))
-            link_43("{}/is-odd".format(name), name, "is-odd")
+            link_43("{}/is-odd".format(name), False, name, "is-odd")
             link_targets.append(":{}/is-odd".format(name))
-            link_43("{}/is-odd-alias".format(name), name, "is-odd-alias")
+            link_43("{}/is-odd-alias".format(name), False, name, "is-odd-alias")
             link_targets.append(":{}/is-odd-alias".format(name))
-            link_44("{}/jquery-git-ssh-399b201".format(name), name, "jquery-git-ssh-399b201")
+            link_44("{}/jquery-git-ssh-399b201".format(name), False, name, "jquery-git-ssh-399b201")
             link_targets.append(":{}/jquery-git-ssh-399b201".format(name))
-            link_45("{}/jquery-git-ssh-e61fccb".format(name), name, "jquery-git-ssh-e61fccb")
+            link_45("{}/jquery-git-ssh-e61fccb".format(name), False, name, "jquery-git-ssh-e61fccb")
             link_targets.append(":{}/jquery-git-ssh-e61fccb".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_49("{}/meaning-of-life".format(name), name, "meaning-of-life")
+            link_49("{}/meaning-of-life".format(name), False, name, "meaning-of-life")
             link_targets.append(":{}/meaning-of-life".format(name))
-            link_55("{}/rollup".format(name), name, "rollup")
+            link_55("{}/rollup".format(name), False, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_56("{}/rollup3".format(name), name, "rollup3")
+            link_56("{}/rollup3".format(name), False, name, "rollup3")
             link_targets.append(":{}/rollup3".format(name))
-            link_63("{}/tslib".format(name), name, "tslib")
+            link_63("{}/tslib".format(name), False, name, "tslib")
             link_targets.append(":{}/tslib".format(name))
-            link_64("{}/typescript".format(name), name, "typescript")
+            link_64("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
-            link_66("{}/uvu".format(name), name, "uvu")
+            link_66("{}/uvu".format(name), False, name, "uvu")
             link_targets.append(":{}/uvu".format(name))
         elif bazel_package == "projects/peers-combo-2":
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_9("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peers-combo-1":
-            link_7("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_7("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_10("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peer-types":
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), True, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), True, name, "hello")
             link_targets.append(":{}/hello".format(name))
         elif bazel_package == "projects/a-types":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), False, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/b":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/alts":
-            link_47("{}/lodash-dupe".format(name), name, "lodash-dupe")
+            link_47("{}/lodash-dupe".format(name), False, name, "lodash-dupe")
             link_targets.append(":{}/lodash-dupe".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_48("{}/lodash-file".format(name), name, "lodash-file")
+            link_48("{}/lodash-file".format(name), False, name, "lodash-file")
             link_targets.append(":{}/lodash-file".format(name))
 
     if is_root:
diff --git a/e2e/pnpm_lockfiles/v101/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v101/snapshots/rollup_links_defs.bzl
index 443bb09..46eaf3a 100644
--- a/e2e/pnpm_lockfiles/v101/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v101/snapshots/rollup_links_defs.bzl
@@ -46,9 +46,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package rollup@2.14.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -62,12 +63,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_a_links_defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_a_links_defs.bzl
index eab506f..1828c2d 100644
--- a/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_a_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_a_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/a@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_b_links_defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_b_links_defs.bzl
index 95a52dc..1d8e5fb 100644
--- a/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_b_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_b_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/b@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_c_links_defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_c_links_defs.bzl
index e219fb5..ba46f13 100644
--- a/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v54/snapshots/aspect_test_c_links_defs.bzl
@@ -44,9 +44,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/c@2.0.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -60,12 +61,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl
index c81840e..e1a67f7 100644
--- a/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl
+++ b/e2e/pnpm_lockfiles/v54/snapshots/defs.bzl
@@ -174,163 +174,163 @@
         store_67(name)
     if link:
         if bazel_package == "<LOCKVERSION>":
-            link_4("{}/@aspect-test-a-bad-scope".format(name), name, "@aspect-test-a-bad-scope")
+            link_4("{}/@aspect-test-a-bad-scope".format(name), False, name, "@aspect-test-a-bad-scope")
             link_targets.append(":{}/@aspect-test-a-bad-scope".format(name))
             if "@aspect-test-a-bad-scop" not in scope_targets:
                 scope_targets["@aspect-test-a-bad-scop"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-a-bad-scop"].append(link_targets[-1])
-            link_4("{}/@aspect-test-custom-scope/a".format(name), name, "@aspect-test-custom-scope/a")
+            link_4("{}/@aspect-test-custom-scope/a".format(name), False, name, "@aspect-test-custom-scope/a")
             link_targets.append(":{}/@aspect-test-custom-scope/a".format(name))
             if "@aspect-test-custom-scope" not in scope_targets:
                 scope_targets["@aspect-test-custom-scope"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-custom-scope"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_4("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a2".format(name), name, "@aspect-test/a2")
+            link_4("{}/@aspect-test/a2".format(name), False, name, "@aspect-test/a2")
             link_targets.append(":{}/@aspect-test/a2".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/aspect-test-a-no-scope".format(name), name, "aspect-test-a-no-scope")
+            link_4("{}/aspect-test-a-no-scope".format(name), False, name, "aspect-test-a-no-scope")
             link_targets.append(":{}/aspect-test-a-no-scope".format(name))
-            link_4("{}/aspect-test-a/no-at".format(name), name, "aspect-test-a/no-at")
+            link_4("{}/aspect-test-a/no-at".format(name), False, name, "aspect-test-a/no-at")
             link_targets.append(":{}/aspect-test-a/no-at".format(name))
-            link_5("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_5("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_12("{}/@aspect-test/h-is-only-optional".format(name), name, "@aspect-test/h-is-only-optional")
+            link_12("{}/@aspect-test/h-is-only-optional".format(name), False, name, "@aspect-test/h-is-only-optional")
             link_targets.append(":{}/@aspect-test/h-is-only-optional".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_13("{}/jsonify".format(name), name, "jsonify")
+            link_13("{}/jsonify".format(name), False, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_14("{}/@isaacs/cliui".format(name), name, "@isaacs/cliui")
+            link_14("{}/@isaacs/cliui".format(name), False, name, "@isaacs/cliui")
             link_targets.append(":{}/@isaacs/cliui".format(name))
             if "@isaacs" not in scope_targets:
                 scope_targets["@isaacs"] = [link_targets[-1]]
             else:
                 scope_targets["@isaacs"].append(link_targets[-1])
-            link_15("{}/rollup-plugin-with-peers".format(name), name, "rollup-plugin-with-peers")
+            link_15("{}/rollup-plugin-with-peers".format(name), False, name, "rollup-plugin-with-peers")
             link_targets.append(":{}/rollup-plugin-with-peers".format(name))
-            link_17("{}/@types/archiver".format(name), name, "@types/archiver")
+            link_17("{}/@types/archiver".format(name), True, name, "@types/archiver")
             link_targets.append(":{}/@types/archiver".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_21("{}/@types/node".format(name), name, "@types/node")
+            link_21("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_21("{}/alias-types-node".format(name), name, "alias-types-node")
+            link_21("{}/alias-types-node".format(name), True, name, "alias-types-node")
             link_targets.append(":{}/alias-types-node".format(name))
-            link_22("{}/alias-only-sizzle".format(name), name, "alias-only-sizzle")
+            link_22("{}/alias-only-sizzle".format(name), True, name, "alias-only-sizzle")
             link_targets.append(":{}/alias-only-sizzle".format(name))
-            link_25("{}/debug".format(name), name, "debug")
+            link_25("{}/debug".format(name), False, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_35("{}/hello".format(name), name, "hello")
+            link_35("{}/hello".format(name), False, name, "hello")
             link_targets.append(":{}/hello".format(name))
-            link_38("{}/is-odd-v0".format(name), name, "is-odd-v0")
+            link_38("{}/is-odd-v0".format(name), False, name, "is-odd-v0")
             link_targets.append(":{}/is-odd-v0".format(name))
-            link_39("{}/is-odd-v1".format(name), name, "is-odd-v1")
+            link_39("{}/is-odd-v1".format(name), False, name, "is-odd-v1")
             link_targets.append(":{}/is-odd-v1".format(name))
-            link_40("{}/is-odd-v2".format(name), name, "is-odd-v2")
+            link_40("{}/is-odd-v2".format(name), False, name, "is-odd-v2")
             link_targets.append(":{}/is-odd-v2".format(name))
-            link_41("{}/is-odd-v3".format(name), name, "is-odd-v3")
+            link_41("{}/is-odd-v3".format(name), False, name, "is-odd-v3")
             link_targets.append(":{}/is-odd-v3".format(name))
-            link_42("{}/is-odd".format(name), name, "is-odd")
+            link_42("{}/is-odd".format(name), False, name, "is-odd")
             link_targets.append(":{}/is-odd".format(name))
-            link_42("{}/is-odd-alias".format(name), name, "is-odd-alias")
+            link_42("{}/is-odd-alias".format(name), False, name, "is-odd-alias")
             link_targets.append(":{}/is-odd-alias".format(name))
-            link_43("{}/jquery-git-ssh-399b201".format(name), name, "jquery-git-ssh-399b201")
+            link_43("{}/jquery-git-ssh-399b201".format(name), False, name, "jquery-git-ssh-399b201")
             link_targets.append(":{}/jquery-git-ssh-399b201".format(name))
-            link_44("{}/jquery-git-ssh-e61fccb".format(name), name, "jquery-git-ssh-e61fccb")
+            link_44("{}/jquery-git-ssh-e61fccb".format(name), False, name, "jquery-git-ssh-e61fccb")
             link_targets.append(":{}/jquery-git-ssh-e61fccb".format(name))
-            link_47("{}/lodash".format(name), name, "lodash")
+            link_47("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_48("{}/meaning-of-life".format(name), name, "meaning-of-life")
+            link_48("{}/meaning-of-life".format(name), False, name, "meaning-of-life")
             link_targets.append(":{}/meaning-of-life".format(name))
-            link_54("{}/rollup".format(name), name, "rollup")
+            link_54("{}/rollup".format(name), False, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_55("{}/rollup3".format(name), name, "rollup3")
+            link_55("{}/rollup3".format(name), False, name, "rollup3")
             link_targets.append(":{}/rollup3".format(name))
-            link_62("{}/tslib".format(name), name, "tslib")
+            link_62("{}/tslib".format(name), False, name, "tslib")
             link_targets.append(":{}/tslib".format(name))
-            link_63("{}/typescript".format(name), name, "typescript")
+            link_63("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
-            link_65("{}/uvu".format(name), name, "uvu")
+            link_65("{}/uvu".format(name), False, name, "uvu")
             link_targets.append(":{}/uvu".format(name))
         elif bazel_package == "projects/peers-combo-2":
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_9("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peers-combo-1":
-            link_7("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_7("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_10("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peer-types":
-            link_13("{}/jsonify".format(name), name, "jsonify")
+            link_13("{}/jsonify".format(name), True, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_35("{}/hello".format(name), name, "hello")
+            link_35("{}/hello".format(name), True, name, "hello")
             link_targets.append(":{}/hello".format(name))
         elif bazel_package == "projects/a-types":
-            link_21("{}/@types/node".format(name), name, "@types/node")
+            link_21("{}/@types/node".format(name), False, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/b":
-            link_21("{}/@types/node".format(name), name, "@types/node")
+            link_21("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/alts":
-            link_46("{}/lodash-dupe".format(name), name, "lodash-dupe")
+            link_46("{}/lodash-dupe".format(name), False, name, "lodash-dupe")
             link_targets.append(":{}/lodash-dupe".format(name))
-            link_47("{}/lodash".format(name), name, "lodash")
+            link_47("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_47("{}/lodash-file".format(name), name, "lodash-file")
+            link_47("{}/lodash-file".format(name), False, name, "lodash-file")
             link_targets.append(":{}/lodash-file".format(name))
 
     if is_root:
diff --git a/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl
index 443bb09..46eaf3a 100644
--- a/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl
@@ -46,9 +46,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package rollup@2.14.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -62,12 +63,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_a_links_defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_a_links_defs.bzl
index eab506f..1828c2d 100644
--- a/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_a_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_a_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/a@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_b_links_defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_b_links_defs.bzl
index 95a52dc..1d8e5fb 100644
--- a/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_b_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_b_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/b@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_c_links_defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_c_links_defs.bzl
index e219fb5..ba46f13 100644
--- a/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v60/snapshots/aspect_test_c_links_defs.bzl
@@ -44,9 +44,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/c@2.0.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -60,12 +61,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl
index 835c266..60701c9 100644
--- a/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl
+++ b/e2e/pnpm_lockfiles/v60/snapshots/defs.bzl
@@ -176,169 +176,169 @@
         store_68(name)
     if link:
         if bazel_package == "<LOCKVERSION>":
-            link_4("{}/@aspect-test-a-bad-scope".format(name), name, "@aspect-test-a-bad-scope")
+            link_4("{}/@aspect-test-a-bad-scope".format(name), False, name, "@aspect-test-a-bad-scope")
             link_targets.append(":{}/@aspect-test-a-bad-scope".format(name))
             if "@aspect-test-a-bad-scop" not in scope_targets:
                 scope_targets["@aspect-test-a-bad-scop"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-a-bad-scop"].append(link_targets[-1])
-            link_4("{}/@aspect-test-custom-scope/a".format(name), name, "@aspect-test-custom-scope/a")
+            link_4("{}/@aspect-test-custom-scope/a".format(name), False, name, "@aspect-test-custom-scope/a")
             link_targets.append(":{}/@aspect-test-custom-scope/a".format(name))
             if "@aspect-test-custom-scope" not in scope_targets:
                 scope_targets["@aspect-test-custom-scope"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-custom-scope"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_4("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a2".format(name), name, "@aspect-test/a2")
+            link_4("{}/@aspect-test/a2".format(name), False, name, "@aspect-test/a2")
             link_targets.append(":{}/@aspect-test/a2".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/aspect-test-a-no-scope".format(name), name, "aspect-test-a-no-scope")
+            link_4("{}/aspect-test-a-no-scope".format(name), False, name, "aspect-test-a-no-scope")
             link_targets.append(":{}/aspect-test-a-no-scope".format(name))
-            link_4("{}/aspect-test-a/no-at".format(name), name, "aspect-test-a/no-at")
+            link_4("{}/aspect-test-a/no-at".format(name), False, name, "aspect-test-a/no-at")
             link_targets.append(":{}/aspect-test-a/no-at".format(name))
-            link_5("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_5("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_12("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_12("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_13("{}/@aspect-test/h-is-only-optional".format(name), name, "@aspect-test/h-is-only-optional")
+            link_13("{}/@aspect-test/h-is-only-optional".format(name), False, name, "@aspect-test/h-is-only-optional")
             link_targets.append(":{}/@aspect-test/h-is-only-optional".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), False, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_15("{}/@isaacs/cliui".format(name), name, "@isaacs/cliui")
+            link_15("{}/@isaacs/cliui".format(name), False, name, "@isaacs/cliui")
             link_targets.append(":{}/@isaacs/cliui".format(name))
             if "@isaacs" not in scope_targets:
                 scope_targets["@isaacs"] = [link_targets[-1]]
             else:
                 scope_targets["@isaacs"].append(link_targets[-1])
-            link_16("{}/rollup-plugin-with-peers".format(name), name, "rollup-plugin-with-peers")
+            link_16("{}/rollup-plugin-with-peers".format(name), False, name, "rollup-plugin-with-peers")
             link_targets.append(":{}/rollup-plugin-with-peers".format(name))
-            link_18("{}/@types/archiver".format(name), name, "@types/archiver")
+            link_18("{}/@types/archiver".format(name), True, name, "@types/archiver")
             link_targets.append(":{}/@types/archiver".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/alias-types-node".format(name), name, "alias-types-node")
+            link_22("{}/alias-types-node".format(name), True, name, "alias-types-node")
             link_targets.append(":{}/alias-types-node".format(name))
-            link_23("{}/alias-only-sizzle".format(name), name, "alias-only-sizzle")
+            link_23("{}/alias-only-sizzle".format(name), True, name, "alias-only-sizzle")
             link_targets.append(":{}/alias-only-sizzle".format(name))
-            link_26("{}/debug".format(name), name, "debug")
+            link_26("{}/debug".format(name), False, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), False, name, "hello")
             link_targets.append(":{}/hello".format(name))
-            link_39("{}/is-odd-v0".format(name), name, "is-odd-v0")
+            link_39("{}/is-odd-v0".format(name), False, name, "is-odd-v0")
             link_targets.append(":{}/is-odd-v0".format(name))
-            link_40("{}/is-odd-v1".format(name), name, "is-odd-v1")
+            link_40("{}/is-odd-v1".format(name), False, name, "is-odd-v1")
             link_targets.append(":{}/is-odd-v1".format(name))
-            link_41("{}/is-odd-v2".format(name), name, "is-odd-v2")
+            link_41("{}/is-odd-v2".format(name), False, name, "is-odd-v2")
             link_targets.append(":{}/is-odd-v2".format(name))
-            link_42("{}/is-odd-v3".format(name), name, "is-odd-v3")
+            link_42("{}/is-odd-v3".format(name), False, name, "is-odd-v3")
             link_targets.append(":{}/is-odd-v3".format(name))
-            link_43("{}/is-odd".format(name), name, "is-odd")
+            link_43("{}/is-odd".format(name), False, name, "is-odd")
             link_targets.append(":{}/is-odd".format(name))
-            link_43("{}/is-odd-alias".format(name), name, "is-odd-alias")
+            link_43("{}/is-odd-alias".format(name), False, name, "is-odd-alias")
             link_targets.append(":{}/is-odd-alias".format(name))
-            link_44("{}/jquery-git-ssh-399b201".format(name), name, "jquery-git-ssh-399b201")
+            link_44("{}/jquery-git-ssh-399b201".format(name), False, name, "jquery-git-ssh-399b201")
             link_targets.append(":{}/jquery-git-ssh-399b201".format(name))
-            link_45("{}/jquery-git-ssh-e61fccb".format(name), name, "jquery-git-ssh-e61fccb")
+            link_45("{}/jquery-git-ssh-e61fccb".format(name), False, name, "jquery-git-ssh-e61fccb")
             link_targets.append(":{}/jquery-git-ssh-e61fccb".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_49("{}/meaning-of-life".format(name), name, "meaning-of-life")
+            link_49("{}/meaning-of-life".format(name), False, name, "meaning-of-life")
             link_targets.append(":{}/meaning-of-life".format(name))
-            link_55("{}/rollup".format(name), name, "rollup")
+            link_55("{}/rollup".format(name), False, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_56("{}/rollup3".format(name), name, "rollup3")
+            link_56("{}/rollup3".format(name), False, name, "rollup3")
             link_targets.append(":{}/rollup3".format(name))
-            link_63("{}/tslib".format(name), name, "tslib")
+            link_63("{}/tslib".format(name), False, name, "tslib")
             link_targets.append(":{}/tslib".format(name))
-            link_64("{}/typescript".format(name), name, "typescript")
+            link_64("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
-            link_66("{}/uvu".format(name), name, "uvu")
+            link_66("{}/uvu".format(name), False, name, "uvu")
             link_targets.append(":{}/uvu".format(name))
         elif bazel_package == "projects/peers-combo-2":
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_9("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peers-combo-1":
-            link_7("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_7("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_10("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peer-types":
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), True, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), True, name, "hello")
             link_targets.append(":{}/hello".format(name))
         elif bazel_package == "projects/a-types":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), False, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/b":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/alts":
-            link_47("{}/lodash-dupe".format(name), name, "lodash-dupe")
+            link_47("{}/lodash-dupe".format(name), False, name, "lodash-dupe")
             link_targets.append(":{}/lodash-dupe".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_48("{}/lodash-file".format(name), name, "lodash-file")
+            link_48("{}/lodash-file".format(name), False, name, "lodash-file")
             link_targets.append(":{}/lodash-file".format(name))
 
     if is_root:
diff --git a/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl
index 443bb09..46eaf3a 100644
--- a/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl
@@ -46,9 +46,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package rollup@2.14.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -62,12 +63,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_a_links_defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_a_links_defs.bzl
index eab506f..1828c2d 100644
--- a/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_a_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_a_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/a@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_b_links_defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_b_links_defs.bzl
index 95a52dc..1d8e5fb 100644
--- a/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_b_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_b_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/b@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_c_links_defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_c_links_defs.bzl
index e219fb5..ba46f13 100644
--- a/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v61/snapshots/aspect_test_c_links_defs.bzl
@@ -44,9 +44,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/c@2.0.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -60,12 +61,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl
index 835c266..60701c9 100644
--- a/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl
+++ b/e2e/pnpm_lockfiles/v61/snapshots/defs.bzl
@@ -176,169 +176,169 @@
         store_68(name)
     if link:
         if bazel_package == "<LOCKVERSION>":
-            link_4("{}/@aspect-test-a-bad-scope".format(name), name, "@aspect-test-a-bad-scope")
+            link_4("{}/@aspect-test-a-bad-scope".format(name), False, name, "@aspect-test-a-bad-scope")
             link_targets.append(":{}/@aspect-test-a-bad-scope".format(name))
             if "@aspect-test-a-bad-scop" not in scope_targets:
                 scope_targets["@aspect-test-a-bad-scop"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-a-bad-scop"].append(link_targets[-1])
-            link_4("{}/@aspect-test-custom-scope/a".format(name), name, "@aspect-test-custom-scope/a")
+            link_4("{}/@aspect-test-custom-scope/a".format(name), False, name, "@aspect-test-custom-scope/a")
             link_targets.append(":{}/@aspect-test-custom-scope/a".format(name))
             if "@aspect-test-custom-scope" not in scope_targets:
                 scope_targets["@aspect-test-custom-scope"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-custom-scope"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_4("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a2".format(name), name, "@aspect-test/a2")
+            link_4("{}/@aspect-test/a2".format(name), False, name, "@aspect-test/a2")
             link_targets.append(":{}/@aspect-test/a2".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/aspect-test-a-no-scope".format(name), name, "aspect-test-a-no-scope")
+            link_4("{}/aspect-test-a-no-scope".format(name), False, name, "aspect-test-a-no-scope")
             link_targets.append(":{}/aspect-test-a-no-scope".format(name))
-            link_4("{}/aspect-test-a/no-at".format(name), name, "aspect-test-a/no-at")
+            link_4("{}/aspect-test-a/no-at".format(name), False, name, "aspect-test-a/no-at")
             link_targets.append(":{}/aspect-test-a/no-at".format(name))
-            link_5("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_5("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_12("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_12("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_13("{}/@aspect-test/h-is-only-optional".format(name), name, "@aspect-test/h-is-only-optional")
+            link_13("{}/@aspect-test/h-is-only-optional".format(name), False, name, "@aspect-test/h-is-only-optional")
             link_targets.append(":{}/@aspect-test/h-is-only-optional".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), False, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_15("{}/@isaacs/cliui".format(name), name, "@isaacs/cliui")
+            link_15("{}/@isaacs/cliui".format(name), False, name, "@isaacs/cliui")
             link_targets.append(":{}/@isaacs/cliui".format(name))
             if "@isaacs" not in scope_targets:
                 scope_targets["@isaacs"] = [link_targets[-1]]
             else:
                 scope_targets["@isaacs"].append(link_targets[-1])
-            link_16("{}/rollup-plugin-with-peers".format(name), name, "rollup-plugin-with-peers")
+            link_16("{}/rollup-plugin-with-peers".format(name), False, name, "rollup-plugin-with-peers")
             link_targets.append(":{}/rollup-plugin-with-peers".format(name))
-            link_18("{}/@types/archiver".format(name), name, "@types/archiver")
+            link_18("{}/@types/archiver".format(name), True, name, "@types/archiver")
             link_targets.append(":{}/@types/archiver".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/alias-types-node".format(name), name, "alias-types-node")
+            link_22("{}/alias-types-node".format(name), True, name, "alias-types-node")
             link_targets.append(":{}/alias-types-node".format(name))
-            link_23("{}/alias-only-sizzle".format(name), name, "alias-only-sizzle")
+            link_23("{}/alias-only-sizzle".format(name), True, name, "alias-only-sizzle")
             link_targets.append(":{}/alias-only-sizzle".format(name))
-            link_26("{}/debug".format(name), name, "debug")
+            link_26("{}/debug".format(name), False, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), False, name, "hello")
             link_targets.append(":{}/hello".format(name))
-            link_39("{}/is-odd-v0".format(name), name, "is-odd-v0")
+            link_39("{}/is-odd-v0".format(name), False, name, "is-odd-v0")
             link_targets.append(":{}/is-odd-v0".format(name))
-            link_40("{}/is-odd-v1".format(name), name, "is-odd-v1")
+            link_40("{}/is-odd-v1".format(name), False, name, "is-odd-v1")
             link_targets.append(":{}/is-odd-v1".format(name))
-            link_41("{}/is-odd-v2".format(name), name, "is-odd-v2")
+            link_41("{}/is-odd-v2".format(name), False, name, "is-odd-v2")
             link_targets.append(":{}/is-odd-v2".format(name))
-            link_42("{}/is-odd-v3".format(name), name, "is-odd-v3")
+            link_42("{}/is-odd-v3".format(name), False, name, "is-odd-v3")
             link_targets.append(":{}/is-odd-v3".format(name))
-            link_43("{}/is-odd".format(name), name, "is-odd")
+            link_43("{}/is-odd".format(name), False, name, "is-odd")
             link_targets.append(":{}/is-odd".format(name))
-            link_43("{}/is-odd-alias".format(name), name, "is-odd-alias")
+            link_43("{}/is-odd-alias".format(name), False, name, "is-odd-alias")
             link_targets.append(":{}/is-odd-alias".format(name))
-            link_44("{}/jquery-git-ssh-399b201".format(name), name, "jquery-git-ssh-399b201")
+            link_44("{}/jquery-git-ssh-399b201".format(name), False, name, "jquery-git-ssh-399b201")
             link_targets.append(":{}/jquery-git-ssh-399b201".format(name))
-            link_45("{}/jquery-git-ssh-e61fccb".format(name), name, "jquery-git-ssh-e61fccb")
+            link_45("{}/jquery-git-ssh-e61fccb".format(name), False, name, "jquery-git-ssh-e61fccb")
             link_targets.append(":{}/jquery-git-ssh-e61fccb".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_49("{}/meaning-of-life".format(name), name, "meaning-of-life")
+            link_49("{}/meaning-of-life".format(name), False, name, "meaning-of-life")
             link_targets.append(":{}/meaning-of-life".format(name))
-            link_55("{}/rollup".format(name), name, "rollup")
+            link_55("{}/rollup".format(name), False, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_56("{}/rollup3".format(name), name, "rollup3")
+            link_56("{}/rollup3".format(name), False, name, "rollup3")
             link_targets.append(":{}/rollup3".format(name))
-            link_63("{}/tslib".format(name), name, "tslib")
+            link_63("{}/tslib".format(name), False, name, "tslib")
             link_targets.append(":{}/tslib".format(name))
-            link_64("{}/typescript".format(name), name, "typescript")
+            link_64("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
-            link_66("{}/uvu".format(name), name, "uvu")
+            link_66("{}/uvu".format(name), False, name, "uvu")
             link_targets.append(":{}/uvu".format(name))
         elif bazel_package == "projects/peers-combo-2":
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_9("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peers-combo-1":
-            link_7("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_7("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_10("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peer-types":
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), True, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), True, name, "hello")
             link_targets.append(":{}/hello".format(name))
         elif bazel_package == "projects/a-types":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), False, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/b":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/alts":
-            link_47("{}/lodash-dupe".format(name), name, "lodash-dupe")
+            link_47("{}/lodash-dupe".format(name), False, name, "lodash-dupe")
             link_targets.append(":{}/lodash-dupe".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_48("{}/lodash-file".format(name), name, "lodash-file")
+            link_48("{}/lodash-file".format(name), False, name, "lodash-file")
             link_targets.append(":{}/lodash-file".format(name))
 
     if is_root:
diff --git a/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl
index 443bb09..46eaf3a 100644
--- a/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl
@@ -46,9 +46,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package rollup@2.14.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -62,12 +63,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_a_links_defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_a_links_defs.bzl
index eab506f..1828c2d 100644
--- a/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_a_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_a_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/a@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_b_links_defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_b_links_defs.bzl
index 95a52dc..1d8e5fb 100644
--- a/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_b_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_b_links_defs.bzl
@@ -52,9 +52,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/b@5.0.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -68,12 +69,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_c_links_defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_c_links_defs.bzl
index e219fb5..ba46f13 100644
--- a/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v90/snapshots/aspect_test_c_links_defs.bzl
@@ -44,9 +44,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package @aspect-test/c@2.0.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -60,12 +61,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl
index 03be57b..2673cbb 100644
--- a/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl
+++ b/e2e/pnpm_lockfiles/v90/snapshots/defs.bzl
@@ -176,169 +176,169 @@
         store_68(name)
     if link:
         if bazel_package == "<LOCKVERSION>":
-            link_4("{}/@aspect-test-a-bad-scope".format(name), name, "@aspect-test-a-bad-scope")
+            link_4("{}/@aspect-test-a-bad-scope".format(name), False, name, "@aspect-test-a-bad-scope")
             link_targets.append(":{}/@aspect-test-a-bad-scope".format(name))
             if "@aspect-test-a-bad-scop" not in scope_targets:
                 scope_targets["@aspect-test-a-bad-scop"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-a-bad-scop"].append(link_targets[-1])
-            link_4("{}/@aspect-test-custom-scope/a".format(name), name, "@aspect-test-custom-scope/a")
+            link_4("{}/@aspect-test-custom-scope/a".format(name), False, name, "@aspect-test-custom-scope/a")
             link_targets.append(":{}/@aspect-test-custom-scope/a".format(name))
             if "@aspect-test-custom-scope" not in scope_targets:
                 scope_targets["@aspect-test-custom-scope"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test-custom-scope"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_4("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/@aspect-test/a2".format(name), name, "@aspect-test/a2")
+            link_4("{}/@aspect-test/a2".format(name), False, name, "@aspect-test/a2")
             link_targets.append(":{}/@aspect-test/a2".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_4("{}/aspect-test-a-no-scope".format(name), name, "aspect-test-a-no-scope")
+            link_4("{}/aspect-test-a-no-scope".format(name), False, name, "aspect-test-a-no-scope")
             link_targets.append(":{}/aspect-test-a-no-scope".format(name))
-            link_4("{}/aspect-test-a/no-at".format(name), name, "aspect-test-a/no-at")
+            link_4("{}/aspect-test-a/no-at".format(name), False, name, "aspect-test-a/no-at")
             link_targets.append(":{}/aspect-test-a/no-at".format(name))
-            link_5("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_5("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_12("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_12("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_13("{}/@aspect-test/h-is-only-optional".format(name), name, "@aspect-test/h-is-only-optional")
+            link_13("{}/@aspect-test/h-is-only-optional".format(name), False, name, "@aspect-test/h-is-only-optional")
             link_targets.append(":{}/@aspect-test/h-is-only-optional".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), False, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_15("{}/@isaacs/cliui".format(name), name, "@isaacs/cliui")
+            link_15("{}/@isaacs/cliui".format(name), False, name, "@isaacs/cliui")
             link_targets.append(":{}/@isaacs/cliui".format(name))
             if "@isaacs" not in scope_targets:
                 scope_targets["@isaacs"] = [link_targets[-1]]
             else:
                 scope_targets["@isaacs"].append(link_targets[-1])
-            link_16("{}/rollup-plugin-with-peers".format(name), name, "rollup-plugin-with-peers")
+            link_16("{}/rollup-plugin-with-peers".format(name), False, name, "rollup-plugin-with-peers")
             link_targets.append(":{}/rollup-plugin-with-peers".format(name))
-            link_18("{}/@types/archiver".format(name), name, "@types/archiver")
+            link_18("{}/@types/archiver".format(name), True, name, "@types/archiver")
             link_targets.append(":{}/@types/archiver".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_22("{}/alias-types-node".format(name), name, "alias-types-node")
+            link_22("{}/alias-types-node".format(name), True, name, "alias-types-node")
             link_targets.append(":{}/alias-types-node".format(name))
-            link_23("{}/alias-only-sizzle".format(name), name, "alias-only-sizzle")
+            link_23("{}/alias-only-sizzle".format(name), True, name, "alias-only-sizzle")
             link_targets.append(":{}/alias-only-sizzle".format(name))
-            link_26("{}/debug".format(name), name, "debug")
+            link_26("{}/debug".format(name), False, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), False, name, "hello")
             link_targets.append(":{}/hello".format(name))
-            link_39("{}/is-odd-v0".format(name), name, "is-odd-v0")
+            link_39("{}/is-odd-v0".format(name), False, name, "is-odd-v0")
             link_targets.append(":{}/is-odd-v0".format(name))
-            link_40("{}/is-odd-v1".format(name), name, "is-odd-v1")
+            link_40("{}/is-odd-v1".format(name), False, name, "is-odd-v1")
             link_targets.append(":{}/is-odd-v1".format(name))
-            link_41("{}/is-odd-v2".format(name), name, "is-odd-v2")
+            link_41("{}/is-odd-v2".format(name), False, name, "is-odd-v2")
             link_targets.append(":{}/is-odd-v2".format(name))
-            link_42("{}/is-odd-v3".format(name), name, "is-odd-v3")
+            link_42("{}/is-odd-v3".format(name), False, name, "is-odd-v3")
             link_targets.append(":{}/is-odd-v3".format(name))
-            link_43("{}/is-odd".format(name), name, "is-odd")
+            link_43("{}/is-odd".format(name), False, name, "is-odd")
             link_targets.append(":{}/is-odd".format(name))
-            link_43("{}/is-odd-alias".format(name), name, "is-odd-alias")
+            link_43("{}/is-odd-alias".format(name), False, name, "is-odd-alias")
             link_targets.append(":{}/is-odd-alias".format(name))
-            link_44("{}/jquery-git-ssh-399b201".format(name), name, "jquery-git-ssh-399b201")
+            link_44("{}/jquery-git-ssh-399b201".format(name), False, name, "jquery-git-ssh-399b201")
             link_targets.append(":{}/jquery-git-ssh-399b201".format(name))
-            link_45("{}/jquery-git-ssh-e61fccb".format(name), name, "jquery-git-ssh-e61fccb")
+            link_45("{}/jquery-git-ssh-e61fccb".format(name), False, name, "jquery-git-ssh-e61fccb")
             link_targets.append(":{}/jquery-git-ssh-e61fccb".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_49("{}/meaning-of-life".format(name), name, "meaning-of-life")
+            link_49("{}/meaning-of-life".format(name), False, name, "meaning-of-life")
             link_targets.append(":{}/meaning-of-life".format(name))
-            link_55("{}/rollup".format(name), name, "rollup")
+            link_55("{}/rollup".format(name), False, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_56("{}/rollup3".format(name), name, "rollup3")
+            link_56("{}/rollup3".format(name), False, name, "rollup3")
             link_targets.append(":{}/rollup3".format(name))
-            link_63("{}/tslib".format(name), name, "tslib")
+            link_63("{}/tslib".format(name), False, name, "tslib")
             link_targets.append(":{}/tslib".format(name))
-            link_64("{}/typescript".format(name), name, "typescript")
+            link_64("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
-            link_66("{}/uvu".format(name), name, "uvu")
+            link_66("{}/uvu".format(name), False, name, "uvu")
             link_targets.append(":{}/uvu".format(name))
         elif bazel_package == "projects/peers-combo-2":
-            link_6("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_6("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_9("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peers-combo-1":
-            link_7("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_7("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_10("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "projects/peer-types":
-            link_14("{}/jsonify".format(name), name, "jsonify")
+            link_14("{}/jsonify".format(name), True, name, "jsonify")
             link_targets.append(":{}/jsonify".format(name))
-            link_36("{}/hello".format(name), name, "hello")
+            link_36("{}/hello".format(name), True, name, "hello")
             link_targets.append(":{}/hello".format(name))
         elif bazel_package == "projects/a-types":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), False, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/b":
-            link_22("{}/@types/node".format(name), name, "@types/node")
+            link_22("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "projects/alts":
-            link_47("{}/lodash-dupe".format(name), name, "lodash-dupe")
+            link_47("{}/lodash-dupe".format(name), False, name, "lodash-dupe")
             link_targets.append(":{}/lodash-dupe".format(name))
-            link_48("{}/lodash".format(name), name, "lodash")
+            link_48("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_48("{}/lodash-file".format(name), name, "lodash-file")
+            link_48("{}/lodash-file".format(name), False, name, "lodash-file")
             link_targets.append(":{}/lodash-file".format(name))
 
     if is_root:
diff --git a/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl
index 443bb09..46eaf3a 100644
--- a/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl
@@ -46,9 +46,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package rollup@2.14.0
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -62,12 +63,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/e2e/pnpm_workspace/snapshots/defs.bzl b/e2e/pnpm_workspace/snapshots/defs.bzl
index f466c77..bec0abd 100644
--- a/e2e/pnpm_workspace/snapshots/defs.bzl
+++ b/e2e/pnpm_workspace/snapshots/defs.bzl
@@ -64,95 +64,95 @@
         store_12(name)
     if link:
         if bazel_package == "":
-            link_0("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_0("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_1("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_1("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_2("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_2("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/lodash".format(name), name, "lodash")
+            link_10("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_11("{}/typescript".format(name), name, "typescript")
+            link_11("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
         elif bazel_package == "app/a":
-            link_0("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_0("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/g".format(name), name, "@aspect-test/g")
+            link_6("{}/@aspect-test/g".format(name), False, name, "@aspect-test/g")
             link_targets.append(":{}/@aspect-test/g".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "app/c":
-            link_0("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_0("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/g".format(name), name, "@aspect-test/g")
+            link_6("{}/@aspect-test/g".format(name), False, name, "@aspect-test/g")
             link_targets.append(":{}/@aspect-test/g".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "lib/d":
-            link_3("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_3("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_8("{}/alias-2".format(name), name, "alias-2")
+            link_8("{}/alias-2".format(name), False, name, "alias-2")
             link_targets.append(":{}/alias-2".format(name))
         elif bazel_package == "lib/a":
-            link_4("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_4("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "lib/b":
-            link_5("{}/@aspect-test/f".format(name), name, "@aspect-test/f")
+            link_5("{}/@aspect-test/f".format(name), False, name, "@aspect-test/f")
             link_targets.append(":{}/@aspect-test/f".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/alias-1".format(name), name, "alias-1")
+            link_9("{}/alias-1".format(name), False, name, "alias-1")
             link_targets.append(":{}/alias-1".format(name))
         elif bazel_package == "lib/c":
-            link_5("{}/@aspect-test/f".format(name), name, "@aspect-test/f")
+            link_5("{}/@aspect-test/f".format(name), False, name, "@aspect-test/f")
             link_targets.append(":{}/@aspect-test/f".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "app/d":
-            link_6("{}/@aspect-test/g".format(name), name, "@aspect-test/g")
+            link_6("{}/@aspect-test/g".format(name), False, name, "@aspect-test/g")
             link_targets.append(":{}/@aspect-test/g".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "app/b":
-            link_7("{}/@aspect-test/h".format(name), name, "@aspect-test/h")
+            link_7("{}/@aspect-test/h".format(name), False, name, "@aspect-test/h")
             link_targets.append(":{}/@aspect-test/h".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
diff --git a/e2e/pnpm_workspace_deps/tests/test_pkg_deps_linked.js b/e2e/pnpm_workspace_deps/tests/test_pkg_deps_linked.js
index 4330e06..50f6a8e 100644
--- a/e2e/pnpm_workspace_deps/tests/test_pkg_deps_linked.js
+++ b/e2e/pnpm_workspace_deps/tests/test_pkg_deps_linked.js
@@ -11,15 +11,7 @@
     e = ex
 }
 if (e == null) {
-    // TODO: see https://github.com/aspect-build/rules_js/issues/2013 and similar issues.
-    //
-    // The transitive-dev logic was depending on the incorrect pnpm <v9 'dev' flag behavior
-    // and this test only passed due to that behaviour working in this specific test case.
-    //
-    // As of pnpm 9+ this test no longer passes due to incorrect assumptions and needs a
-    // proper fix regarding transitive dep deps of local packages.
-    //
-    // throw new Error('devDependency should NOT be available')
+    throw new Error('devDependency should NOT be available')
 } else {
     console.log('devDependency not available')
 }
diff --git a/e2e/pnpm_workspace_rerooted/snapshots/defs.bzl b/e2e/pnpm_workspace_rerooted/snapshots/defs.bzl
index 3b6200f..95a0dda 100644
--- a/e2e/pnpm_workspace_rerooted/snapshots/defs.bzl
+++ b/e2e/pnpm_workspace_rerooted/snapshots/defs.bzl
@@ -64,95 +64,95 @@
         store_12(name)
     if link:
         if bazel_package == "":
-            link_0("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_0("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_1("{}/@aspect-test/b".format(name), name, "@aspect-test/b")
+            link_1("{}/@aspect-test/b".format(name), True, name, "@aspect-test/b")
             link_targets.append(":{}/@aspect-test/b".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_2("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_2("{}/@aspect-test/c".format(name), False, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_10("{}/lodash".format(name), name, "lodash")
+            link_10("{}/lodash".format(name), False, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_11("{}/typescript".format(name), name, "typescript")
+            link_11("{}/typescript".format(name), False, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
         elif bazel_package == "app/a":
-            link_0("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_0("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/g".format(name), name, "@aspect-test/g")
+            link_6("{}/@aspect-test/g".format(name), False, name, "@aspect-test/g")
             link_targets.append(":{}/@aspect-test/g".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "app/c":
-            link_0("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_0("{}/@aspect-test/a".format(name), False, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_6("{}/@aspect-test/g".format(name), name, "@aspect-test/g")
+            link_6("{}/@aspect-test/g".format(name), False, name, "@aspect-test/g")
             link_targets.append(":{}/@aspect-test/g".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "lib/d":
-            link_3("{}/@aspect-test/d".format(name), name, "@aspect-test/d")
+            link_3("{}/@aspect-test/d".format(name), False, name, "@aspect-test/d")
             link_targets.append(":{}/@aspect-test/d".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_8("{}/alias-2".format(name), name, "alias-2")
+            link_8("{}/alias-2".format(name), False, name, "alias-2")
             link_targets.append(":{}/alias-2".format(name))
         elif bazel_package == "lib/a":
-            link_4("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_4("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "lib/b":
-            link_5("{}/@aspect-test/f".format(name), name, "@aspect-test/f")
+            link_5("{}/@aspect-test/f".format(name), False, name, "@aspect-test/f")
             link_targets.append(":{}/@aspect-test/f".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_9("{}/alias-1".format(name), name, "alias-1")
+            link_9("{}/alias-1".format(name), False, name, "alias-1")
             link_targets.append(":{}/alias-1".format(name))
         elif bazel_package == "lib/c":
-            link_5("{}/@aspect-test/f".format(name), name, "@aspect-test/f")
+            link_5("{}/@aspect-test/f".format(name), False, name, "@aspect-test/f")
             link_targets.append(":{}/@aspect-test/f".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "app/d":
-            link_6("{}/@aspect-test/g".format(name), name, "@aspect-test/g")
+            link_6("{}/@aspect-test/g".format(name), False, name, "@aspect-test/g")
             link_targets.append(":{}/@aspect-test/g".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
         elif bazel_package == "app/b":
-            link_7("{}/@aspect-test/h".format(name), name, "@aspect-test/h")
+            link_7("{}/@aspect-test/h".format(name), False, name, "@aspect-test/h")
             link_targets.append(":{}/@aspect-test/h".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
diff --git a/examples/linked_consumer/test_pkg_deps_linked.js b/examples/linked_consumer/test_pkg_deps_linked.js
index c4bea5c..36b5f20 100644
--- a/examples/linked_consumer/test_pkg_deps_linked.js
+++ b/examples/linked_consumer/test_pkg_deps_linked.js
@@ -21,15 +21,7 @@
     e = ex
 }
 if (e == null) {
-    // TODO: see https://github.com/aspect-build/rules_js/issues/2013 and similar issues.
-    //
-    // The transitive-dev logic was depending on the incorrect pnpm <v9 'dev' flag behavior
-    // and this test only passed due to that behaviour working in this specific test case.
-    //
-    // As of pnpm 9+ this test no longer passes due to incorrect assumptions and needs a
-    // proper fix regarding transitive dep deps of local packages.
-    //
-    // throw new Error('devDependency should NOT be available')
+    throw new Error('devDependency should NOT be available')
 } else {
     console.log('devDependency not available')
 }
diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl
index 185fa6b..1123cc6 100644
--- a/npm/private/npm_import.bzl
+++ b/npm/private/npm_import.bzl
@@ -233,6 +233,7 @@
 
 def npm_link_imported_package_store_internal(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package,
@@ -245,6 +246,7 @@
     # terminal package store target to link
     npm_link_package_store(
         name = name,
+        dev = dev,
         package = link_alias,
         src = "//%s:%s" % (root_package, store_target_name),
         visibility = link_visibility,
@@ -267,9 +269,10 @@
 _LINK_JS_PACKAGE_LINK_IMPORTED_STORE_TMPL = """\
 # Generated npm_package_store and npm_link_package_store targets for npm package {package}@{version}
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -286,6 +289,7 @@
         name,
         package,
         version,
+        dev,
         root_package,
         link,
         link_packages,
@@ -322,6 +326,7 @@
             link_target_name = "{}/{}".format(name, link_alias)
             npm_link_imported_package_store_macro(
                 name = link_target_name,
+                dev = dev,
                 link_root_name = name,
                 link_alias = link_alias,
             )
@@ -343,12 +348,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = {link_default},
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {link_packages},
diff --git a/npm/private/npm_link_package_store.bzl b/npm/private/npm_link_package_store.bzl
index a565aaa..f0263a5 100644
--- a/npm/private/npm_link_package_store.bzl
+++ b/npm/private/npm_link_package_store.bzl
@@ -32,6 +32,10 @@
 If set, takes precendance over the package name in the src npm_package_store.
 """,
     ),
+    "dev": attr.bool(
+        doc = """Whether or not the linked package is a dev dependency.
+""",
+    ),
     "bins": attr.string_dict(
         doc = """Dictionary of `node_modules/.bin` binary files to create mapped to their node entry points.
 
@@ -63,6 +67,11 @@
     store_info = ctx.attr.src[NpmPackageStoreInfo]
     store_js_info = ctx.attr.src[JsInfo]
 
+    # Ensure the DEPRECATED NpmPackageStoreInfo.dev flag is never True when linking
+    # as a non-devDependency
+    if store_info.dev and not ctx.attr.dev:
+        fail("cannot link a devDependency package as a non-devDependency")
+
     package_store_directory = store_info.package_store_directory
     if not package_store_directory:
         fail("src must be a npm_link_package that provides a package_store_directory")
@@ -129,7 +138,7 @@
             transitive_types = store_js_info.transitive_types,
             npm_sources = npm_sources,
             # only propagate non-dev npm dependencies to use as direct dependencies when linking downstream npm_package targets with npm_link_package
-            npm_package_store_infos = depset([store_info]) if not store_info.dev else depset(),
+            npm_package_store_infos = depset([store_info]) if not ctx.attr.dev else depset(),
         ),
     ]
     if OutputGroupInfo in ctx.attr.src:
diff --git a/npm/private/npm_translate_lock_generate.bzl b/npm/private/npm_translate_lock_generate.bzl
index 240bb2a..3c3ff68 100644
--- a/npm/private/npm_translate_lock_generate.bzl
+++ b/npm/private/npm_translate_lock_generate.bzl
@@ -305,6 +305,7 @@
 
             link_importer_key = package_to_importer.get(link_package)
             link_importer = importers.get(link_importer_key)
+            link_prod_deps = link_importer.get("deps", {})
 
             # the build file for the package being linked
             build_file = "{}/{}".format(link_package, "BUILD.bazel") if link_package else "BUILD.bazel"
@@ -318,8 +319,11 @@
 
             # for each alias of this package
             for link_alias in link_aliases:
-                links_bzl[link_package].append("""            link_{i}("{{}}/{alias}".format(name), name, "{alias}")""".format(
+                is_dev = link_alias not in link_prod_deps
+
+                links_bzl[link_package].append("""            link_{i}("{{}}/{alias}".format(name), {dev}, name, "{alias}")""".format(
                     i = i,
+                    dev = is_dev,
                     alias = link_alias,
                 ))
 
@@ -328,8 +332,6 @@
                     links_bzl[link_package].append(add_to_link_all)
 
                     append_stmt_base = """link_targets.append(":{{}}/{alias}".format(name))""".format(alias = link_alias)
-                    link_prod_deps = link_importer.get("deps", {})
-                    is_dev = link_alias not in link_prod_deps
 
                     if is_dev:
                         links_targets_bzl[link_package]["dev"].append("                " + append_stmt_base)
diff --git a/npm/private/test/snapshots/fsevents_links_defs.bzl b/npm/private/test/snapshots/fsevents_links_defs.bzl
index da95b50..e3357b7 100644
--- a/npm/private/test/snapshots/fsevents_links_defs.bzl
+++ b/npm/private/test/snapshots/fsevents_links_defs.bzl
@@ -44,9 +44,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package fsevents@2.3.3
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -60,12 +61,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = True,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/npm/private/test/snapshots/npm_defs.bzl b/npm/private/test/snapshots/npm_defs.bzl
index 52a4414..a0c1ee8 100644
--- a/npm/private/test/snapshots/npm_defs.bzl
+++ b/npm/private/test/snapshots/npm_defs.bzl
@@ -2346,377 +2346,377 @@
         store_1133(name)
     if link:
         if bazel_package == "js/private/worker/src":
-            link_1("{}/abortcontroller-polyfill".format(name), name, "abortcontroller-polyfill")
+            link_1("{}/abortcontroller-polyfill".format(name), True, name, "abortcontroller-polyfill")
             link_targets.append(":{}/abortcontroller-polyfill".format(name))
-            link_212("{}/@rollup/plugin-commonjs".format(name), name, "@rollup/plugin-commonjs")
+            link_212("{}/@rollup/plugin-commonjs".format(name), True, name, "@rollup/plugin-commonjs")
             link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_213("{}/@rollup/plugin-json".format(name), name, "@rollup/plugin-json")
+            link_213("{}/@rollup/plugin-json".format(name), True, name, "@rollup/plugin-json")
             link_targets.append(":{}/@rollup/plugin-json".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_214("{}/@rollup/plugin-node-resolve".format(name), name, "@rollup/plugin-node-resolve")
+            link_214("{}/@rollup/plugin-node-resolve".format(name), True, name, "@rollup/plugin-node-resolve")
             link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_215("{}/@rollup/plugin-typescript".format(name), name, "@rollup/plugin-typescript")
+            link_215("{}/@rollup/plugin-typescript".format(name), True, name, "@rollup/plugin-typescript")
             link_targets.append(":{}/@rollup/plugin-typescript".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_269("{}/@types/google-protobuf".format(name), name, "@types/google-protobuf")
+            link_269("{}/@types/google-protobuf".format(name), True, name, "@types/google-protobuf")
             link_targets.append(":{}/@types/google-protobuf".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_277("{}/@types/node".format(name), name, "@types/node")
+            link_277("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_589("{}/google-protobuf".format(name), name, "google-protobuf")
+            link_589("{}/google-protobuf".format(name), False, name, "google-protobuf")
             link_targets.append(":{}/google-protobuf".format(name))
-            link_953("{}/rollup".format(name), name, "rollup")
+            link_953("{}/rollup".format(name), True, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_1059("{}/tslib".format(name), name, "tslib")
+            link_1059("{}/tslib".format(name), True, name, "tslib")
             link_targets.append(":{}/tslib".format(name))
-            link_1070("{}/typescript".format(name), name, "typescript")
+            link_1070("{}/typescript".format(name), True, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
         elif bazel_package == "js/private/test/image":
-            link_6("{}/acorn".format(name), name, "acorn")
+            link_6("{}/acorn".format(name), False, name, "acorn")
             link_targets.append(":{}/acorn".format(name))
         elif bazel_package == "examples/npm_deps":
-            link_8("{}/acorn".format(name), name, "acorn")
+            link_8("{}/acorn".format(name), True, name, "acorn")
             link_targets.append(":{}/acorn".format(name))
-            link_41("{}/@aspect-test/a".format(name), name, "@aspect-test/a")
+            link_41("{}/@aspect-test/a".format(name), True, name, "@aspect-test/a")
             link_targets.append(":{}/@aspect-test/a".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_43("{}/@aspect-test/c".format(name), name, "@aspect-test/c")
+            link_43("{}/@aspect-test/c".format(name), True, name, "@aspect-test/c")
             link_targets.append(":{}/@aspect-test/c".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_149("{}/@gregmagolan/test-b".format(name), name, "@gregmagolan/test-b")
+            link_149("{}/@gregmagolan/test-b".format(name), True, name, "@gregmagolan/test-b")
             link_targets.append(":{}/@gregmagolan/test-b".format(name))
             if "@gregmagolan" not in scope_targets:
                 scope_targets["@gregmagolan"] = [link_targets[-1]]
             else:
                 scope_targets["@gregmagolan"].append(link_targets[-1])
-            link_211("{}/@rollup/plugin-commonjs".format(name), name, "@rollup/plugin-commonjs")
+            link_211("{}/@rollup/plugin-commonjs".format(name), True, name, "@rollup/plugin-commonjs")
             link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_439("{}/debug".format(name), name, "debug")
+            link_439("{}/debug".format(name), True, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_755("{}/meaning-of-life".format(name), name, "meaning-of-life")
+            link_755("{}/meaning-of-life".format(name), True, name, "meaning-of-life")
             link_targets.append(":{}/meaning-of-life".format(name))
-            link_790("{}/mobx-react".format(name), name, "mobx-react")
+            link_790("{}/mobx-react".format(name), True, name, "mobx-react")
             link_targets.append(":{}/mobx-react".format(name))
-            link_791("{}/mobx".format(name), name, "mobx")
+            link_791("{}/mobx".format(name), True, name, "mobx")
             link_targets.append(":{}/mobx".format(name))
-            link_808("{}/ms".format(name), name, "ms")
+            link_808("{}/ms".format(name), True, name, "ms")
             link_targets.append(":{}/ms".format(name))
-            link_923("{}/react".format(name), name, "react")
+            link_923("{}/react".format(name), True, name, "react")
             link_targets.append(":{}/react".format(name))
-            link_952("{}/rollup".format(name), name, "rollup")
+            link_952("{}/rollup".format(name), True, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
-            link_1089("{}/uvu".format(name), name, "uvu")
+            link_1089("{}/uvu".format(name), True, name, "uvu")
             link_targets.append(":{}/uvu".format(name))
         elif bazel_package == "examples/npm_package/packages/pkg_a":
-            link_8("{}/acorn".format(name), name, "acorn")
+            link_8("{}/acorn".format(name), False, name, "acorn")
             link_targets.append(":{}/acorn".format(name))
-            link_1088("{}/uuid".format(name), name, "uuid")
+            link_1088("{}/uuid".format(name), False, name, "uuid")
             link_targets.append(":{}/uuid".format(name))
         elif bazel_package == "examples/npm_package/packages/pkg_b":
-            link_8("{}/acorn".format(name), name, "acorn")
+            link_8("{}/acorn".format(name), False, name, "acorn")
             link_targets.append(":{}/acorn".format(name))
-            link_1088("{}/uuid".format(name), name, "uuid")
+            link_1088("{}/uuid".format(name), False, name, "uuid")
             link_targets.append(":{}/uuid".format(name))
         elif bazel_package == "examples/npm_package/packages/pkg_d":
-            link_8("{}/acorn".format(name), name, "acorn")
+            link_8("{}/acorn".format(name), False, name, "acorn")
             link_targets.append(":{}/acorn".format(name))
-            link_1088("{}/uuid".format(name), name, "uuid")
+            link_1088("{}/uuid".format(name), False, name, "uuid")
             link_targets.append(":{}/uuid".format(name))
         elif bazel_package == "examples/linked_lib":
-            link_45("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_45("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_45("{}/alias-e".format(name), name, "alias-e")
+            link_45("{}/alias-e".format(name), False, name, "alias-e")
             link_targets.append(":{}/alias-e".format(name))
-            link_46("{}/@aspect-test/f".format(name), name, "@aspect-test/f")
+            link_46("{}/@aspect-test/f".format(name), True, name, "@aspect-test/f")
             link_targets.append(":{}/@aspect-test/f".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_276("{}/@types/node".format(name), name, "@types/node")
+            link_276("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "examples/linked_pkg":
-            link_45("{}/@aspect-test/e".format(name), name, "@aspect-test/e")
+            link_45("{}/@aspect-test/e".format(name), False, name, "@aspect-test/e")
             link_targets.append(":{}/@aspect-test/e".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_45("{}/alias-e".format(name), name, "alias-e")
+            link_45("{}/alias-e".format(name), False, name, "alias-e")
             link_targets.append(":{}/alias-e".format(name))
-            link_46("{}/@aspect-test/f".format(name), name, "@aspect-test/f")
+            link_46("{}/@aspect-test/f".format(name), True, name, "@aspect-test/f")
             link_targets.append(":{}/@aspect-test/f".format(name))
             if "@aspect-test" not in scope_targets:
                 scope_targets["@aspect-test"] = [link_targets[-1]]
             else:
                 scope_targets["@aspect-test"].append(link_targets[-1])
-            link_276("{}/@types/node".format(name), name, "@types/node")
+            link_276("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "":
-            link_47("{}/@babel/cli".format(name), name, "@babel/cli")
+            link_47("{}/@babel/cli".format(name), True, name, "@babel/cli")
             link_targets.append(":{}/@babel/cli".format(name))
             if "@babel" not in scope_targets:
                 scope_targets["@babel"] = [link_targets[-1]]
             else:
                 scope_targets["@babel"].append(link_targets[-1])
-            link_50("{}/@babel/core".format(name), name, "@babel/core")
+            link_50("{}/@babel/core".format(name), True, name, "@babel/core")
             link_targets.append(":{}/@babel/core".format(name))
             if "@babel" not in scope_targets:
                 scope_targets["@babel"] = [link_targets[-1]]
             else:
                 scope_targets["@babel"].append(link_targets[-1])
-            link_63("{}/@babel/plugin-transform-modules-commonjs".format(name), name, "@babel/plugin-transform-modules-commonjs")
+            link_63("{}/@babel/plugin-transform-modules-commonjs".format(name), True, name, "@babel/plugin-transform-modules-commonjs")
             link_targets.append(":{}/@babel/plugin-transform-modules-commonjs".format(name))
             if "@babel" not in scope_targets:
                 scope_targets["@babel"] = [link_targets[-1]]
             else:
                 scope_targets["@babel"].append(link_targets[-1])
-            link_277("{}/@types/node".format(name), name, "@types/node")
+            link_277("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_356("{}/chalk".format(name), name, "chalk")
+            link_356("{}/chalk".format(name), True, name, "chalk")
             link_targets.append(":{}/chalk".format(name))
-            link_632("{}/inline-fixtures".format(name), name, "inline-fixtures")
+            link_632("{}/inline-fixtures".format(name), True, name, "inline-fixtures")
             link_targets.append(":{}/inline-fixtures".format(name))
-            link_699("{}/jsonpath-plus".format(name), name, "jsonpath-plus")
+            link_699("{}/jsonpath-plus".format(name), True, name, "jsonpath-plus")
             link_targets.append(":{}/jsonpath-plus".format(name))
-            link_1070("{}/typescript".format(name), name, "typescript")
+            link_1070("{}/typescript".format(name), True, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
         elif bazel_package == "examples/runfiles":
-            link_68("{}/@bazel/runfiles".format(name), name, "@bazel/runfiles")
+            link_68("{}/@bazel/runfiles".format(name), False, name, "@bazel/runfiles")
             link_targets.append(":{}/@bazel/runfiles".format(name))
             if "@bazel" not in scope_targets:
                 scope_targets["@bazel"] = [link_targets[-1]]
             else:
                 scope_targets["@bazel"].append(link_targets[-1])
         elif bazel_package == "npm/private/test":
-            link_144("{}/@fastify/send".format(name), name, "@fastify/send")
+            link_144("{}/@fastify/send".format(name), True, name, "@fastify/send")
             link_targets.append(":{}/@fastify/send".format(name))
             if "@fastify" not in scope_targets:
                 scope_targets["@fastify"] = [link_targets[-1]]
             else:
                 scope_targets["@fastify"].append(link_targets[-1])
-            link_145("{}/@figma/nodegit".format(name), name, "@figma/nodegit")
+            link_145("{}/@figma/nodegit".format(name), True, name, "@figma/nodegit")
             link_targets.append(":{}/@figma/nodegit".format(name))
             if "@figma" not in scope_targets:
                 scope_targets["@figma"] = [link_targets[-1]]
             else:
                 scope_targets["@figma"].append(link_targets[-1])
-            link_180("{}/@kubernetes/client-node".format(name), name, "@kubernetes/client-node")
+            link_180("{}/@kubernetes/client-node".format(name), True, name, "@kubernetes/client-node")
             link_targets.append(":{}/@kubernetes/client-node".format(name))
             if "@kubernetes" not in scope_targets:
                 scope_targets["@kubernetes"] = [link_targets[-1]]
             else:
                 scope_targets["@kubernetes"].append(link_targets[-1])
-            link_208("{}/@plotly/regl".format(name), name, "@plotly/regl")
+            link_208("{}/@plotly/regl".format(name), True, name, "@plotly/regl")
             link_targets.append(":{}/@plotly/regl".format(name))
             if "@plotly" not in scope_targets:
                 scope_targets["@plotly"] = [link_targets[-1]]
             else:
                 scope_targets["@plotly"].append(link_targets[-1])
-            link_208("{}/regl".format(name), name, "regl")
+            link_208("{}/regl".format(name), True, name, "regl")
             link_targets.append(":{}/regl".format(name))
-            link_339("{}/bufferutil".format(name), name, "bufferutil")
+            link_339("{}/bufferutil".format(name), True, name, "bufferutil")
             link_targets.append(":{}/bufferutil".format(name))
-            link_442("{}/debug".format(name), name, "debug")
+            link_442("{}/debug".format(name), True, name, "debug")
             link_targets.append(":{}/debug".format(name))
-            link_497("{}/esbuild".format(name), name, "esbuild")
+            link_497("{}/esbuild".format(name), True, name, "esbuild")
             link_targets.append(":{}/esbuild".format(name))
-            link_607("{}/hello".format(name), name, "hello")
+            link_607("{}/hello".format(name), True, name, "hello")
             link_targets.append(":{}/hello".format(name))
-            link_608("{}/handlebars-helpers/helper-date".format(name), name, "handlebars-helpers/helper-date")
+            link_608("{}/handlebars-helpers/helper-date".format(name), True, name, "handlebars-helpers/helper-date")
             link_targets.append(":{}/handlebars-helpers/helper-date".format(name))
-            link_609("{}/hot-shots".format(name), name, "hot-shots")
+            link_609("{}/hot-shots".format(name), True, name, "hot-shots")
             link_targets.append(":{}/hot-shots".format(name))
-            link_633("{}/inline-fixtures".format(name), name, "inline-fixtures")
+            link_633("{}/inline-fixtures".format(name), True, name, "inline-fixtures")
             link_targets.append(":{}/inline-fixtures".format(name))
-            link_693("{}/json-stable-stringify".format(name), name, "json-stable-stringify")
+            link_693("{}/json-stable-stringify".format(name), True, name, "json-stable-stringify")
             link_targets.append(":{}/json-stable-stringify".format(name))
-            link_736("{}/lodash".format(name), name, "lodash")
+            link_736("{}/lodash".format(name), True, name, "lodash")
             link_targets.append(":{}/lodash".format(name))
-            link_824("{}/node-gyp".format(name), name, "node-gyp")
+            link_824("{}/node-gyp".format(name), True, name, "node-gyp")
             link_targets.append(":{}/node-gyp".format(name))
-            link_888("{}/plotly.js".format(name), name, "plotly.js")
+            link_888("{}/plotly.js".format(name), True, name, "plotly.js")
             link_targets.append(":{}/plotly.js".format(name))
-            link_889("{}/pngjs".format(name), name, "pngjs")
+            link_889("{}/pngjs".format(name), True, name, "pngjs")
             link_targets.append(":{}/pngjs".format(name))
-            link_907("{}/protoc-gen-grpc".format(name), name, "protoc-gen-grpc")
+            link_907("{}/protoc-gen-grpc".format(name), True, name, "protoc-gen-grpc")
             link_targets.append(":{}/protoc-gen-grpc".format(name))
-            link_915("{}/puppeteer".format(name), name, "puppeteer")
+            link_915("{}/puppeteer".format(name), True, name, "puppeteer")
             link_targets.append(":{}/puppeteer".format(name))
-            link_964("{}/segfault-handler".format(name), name, "segfault-handler")
+            link_964("{}/segfault-handler".format(name), True, name, "segfault-handler")
             link_targets.append(":{}/segfault-handler".format(name))
-            link_965("{}/semver-first-satisfied".format(name), name, "semver-first-satisfied")
+            link_965("{}/semver-first-satisfied".format(name), True, name, "semver-first-satisfied")
             link_targets.append(":{}/semver-first-satisfied".format(name))
-            link_1026("{}/syncpack".format(name), name, "syncpack")
+            link_1026("{}/syncpack".format(name), True, name, "syncpack")
             link_targets.append(":{}/syncpack".format(name))
-            link_1070("{}/typescript".format(name), name, "typescript")
+            link_1070("{}/typescript".format(name), True, name, "typescript")
             link_targets.append(":{}/typescript".format(name))
-            link_1082("{}/unused".format(name), name, "unused")
-            link_1099("{}/webpack-bundle-analyzer".format(name), name, "webpack-bundle-analyzer")
+            link_1082("{}/unused".format(name), True, name, "unused")
+            link_1099("{}/webpack-bundle-analyzer".format(name), True, name, "webpack-bundle-analyzer")
             link_targets.append(":{}/webpack-bundle-analyzer".format(name))
         elif bazel_package == "js/private/coverage/bundle":
-            link_212("{}/@rollup/plugin-commonjs".format(name), name, "@rollup/plugin-commonjs")
+            link_212("{}/@rollup/plugin-commonjs".format(name), True, name, "@rollup/plugin-commonjs")
             link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_213("{}/@rollup/plugin-json".format(name), name, "@rollup/plugin-json")
+            link_213("{}/@rollup/plugin-json".format(name), True, name, "@rollup/plugin-json")
             link_targets.append(":{}/@rollup/plugin-json".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_214("{}/@rollup/plugin-node-resolve".format(name), name, "@rollup/plugin-node-resolve")
+            link_214("{}/@rollup/plugin-node-resolve".format(name), True, name, "@rollup/plugin-node-resolve")
             link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_341("{}/c8".format(name), name, "c8")
+            link_341("{}/c8".format(name), False, name, "c8")
             link_targets.append(":{}/c8".format(name))
-            link_953("{}/rollup".format(name), name, "rollup")
+            link_953("{}/rollup".format(name), True, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
         elif bazel_package == "js/private/devserver/src":
-            link_214("{}/@rollup/plugin-node-resolve".format(name), name, "@rollup/plugin-node-resolve")
+            link_214("{}/@rollup/plugin-node-resolve".format(name), True, name, "@rollup/plugin-node-resolve")
             link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
             if "@rollup" not in scope_targets:
                 scope_targets["@rollup"] = [link_targets[-1]]
             else:
                 scope_targets["@rollup"].append(link_targets[-1])
-            link_277("{}/@types/node".format(name), name, "@types/node")
+            link_277("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_953("{}/rollup".format(name), name, "rollup")
+            link_953("{}/rollup".format(name), True, name, "rollup")
             link_targets.append(":{}/rollup".format(name))
         elif bazel_package == "examples/nextjs":
-            link_255("{}/@tailwindcss/postcss".format(name), name, "@tailwindcss/postcss")
+            link_255("{}/@tailwindcss/postcss".format(name), True, name, "@tailwindcss/postcss")
             link_targets.append(":{}/@tailwindcss/postcss".format(name))
             if "@tailwindcss" not in scope_targets:
                 scope_targets["@tailwindcss"] = [link_targets[-1]]
             else:
                 scope_targets["@tailwindcss"].append(link_targets[-1])
-            link_819("{}/next".format(name), name, "next")
+            link_819("{}/next".format(name), False, name, "next")
             link_targets.append(":{}/next".format(name))
-            link_922("{}/react-dom".format(name), name, "react-dom")
+            link_922("{}/react-dom".format(name), False, name, "react-dom")
             link_targets.append(":{}/react-dom".format(name))
-            link_924("{}/react".format(name), name, "react")
+            link_924("{}/react".format(name), False, name, "react")
             link_targets.append(":{}/react".format(name))
-            link_1027("{}/tailwindcss".format(name), name, "tailwindcss")
+            link_1027("{}/tailwindcss".format(name), True, name, "tailwindcss")
             link_targets.append(":{}/tailwindcss".format(name))
         elif bazel_package == "examples/js_lib_pkg/a":
-            link_277("{}/@types/node".format(name), name, "@types/node")
+            link_277("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "examples/js_lib_pkg/b":
-            link_277("{}/@types/node".format(name), name, "@types/node")
+            link_277("{}/@types/node".format(name), True, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
         elif bazel_package == "js/private/test/js_run_devserver":
-            link_277("{}/@types/node".format(name), name, "@types/node")
+            link_277("{}/@types/node".format(name), False, name, "@types/node")
             link_targets.append(":{}/@types/node".format(name))
             if "@types" not in scope_targets:
                 scope_targets["@types"] = [link_targets[-1]]
             else:
                 scope_targets["@types"].append(link_targets[-1])
-            link_677("{}/jasmine".format(name), name, "jasmine")
+            link_677("{}/jasmine".format(name), False, name, "jasmine")
             link_targets.append(":{}/jasmine".format(name))
         elif bazel_package == "examples/webpack_cli":
-            link_288("{}/@vanilla-extract/css".format(name), name, "@vanilla-extract/css")
+            link_288("{}/@vanilla-extract/css".format(name), False, name, "@vanilla-extract/css")
             link_targets.append(":{}/@vanilla-extract/css".format(name))
             if "@vanilla-extract" not in scope_targets:
                 scope_targets["@vanilla-extract"] = [link_targets[-1]]
             else:
                 scope_targets["@vanilla-extract"].append(link_targets[-1])
-            link_291("{}/@vanilla-extract/webpack-plugin".format(name), name, "@vanilla-extract/webpack-plugin")
+            link_291("{}/@vanilla-extract/webpack-plugin".format(name), True, name, "@vanilla-extract/webpack-plugin")
             link_targets.append(":{}/@vanilla-extract/webpack-plugin".format(name))
             if "@vanilla-extract" not in scope_targets:
                 scope_targets["@vanilla-extract"] = [link_targets[-1]]
             else:
                 scope_targets["@vanilla-extract"].append(link_targets[-1])
-            link_411("{}/css-loader".format(name), name, "css-loader")
+            link_411("{}/css-loader".format(name), False, name, "css-loader")
             link_targets.append(":{}/css-loader".format(name))
-            link_753("{}/mathjs".format(name), name, "mathjs")
+            link_753("{}/mathjs".format(name), False, name, "mathjs")
             link_targets.append(":{}/mathjs".format(name))
-            link_763("{}/mini-css-extract-plugin".format(name), name, "mini-css-extract-plugin")
+            link_763("{}/mini-css-extract-plugin".format(name), True, name, "mini-css-extract-plugin")
             link_targets.append(":{}/mini-css-extract-plugin".format(name))
-            link_1100("{}/webpack-cli".format(name), name, "webpack-cli")
+            link_1100("{}/webpack-cli".format(name), True, name, "webpack-cli")
             link_targets.append(":{}/webpack-cli".format(name))
-            link_1103("{}/webpack".format(name), name, "webpack")
+            link_1103("{}/webpack".format(name), True, name, "webpack")
             link_targets.append(":{}/webpack".format(name))
         elif bazel_package == "examples/npm_package/libs/lib_a":
-            link_355("{}/chalk".format(name), name, "chalk")
+            link_355("{}/chalk".format(name), False, name, "chalk")
             link_targets.append(":{}/chalk".format(name))
         elif bazel_package == "npm/private/test/npm_package":
-            link_355("{}/chalk".format(name), name, "chalk")
+            link_355("{}/chalk".format(name), False, name, "chalk")
             link_targets.append(":{}/chalk".format(name))
-            link_356("{}/chalk-alt".format(name), name, "chalk-alt")
+            link_356("{}/chalk-alt".format(name), False, name, "chalk-alt")
             link_targets.append(":{}/chalk-alt".format(name))
         elif bazel_package == "examples/macro":
-            link_792("{}/mocha-junit-reporter".format(name), name, "mocha-junit-reporter")
+            link_792("{}/mocha-junit-reporter".format(name), True, name, "mocha-junit-reporter")
             link_targets.append(":{}/mocha-junit-reporter".format(name))
-            link_793("{}/mocha-multi-reporters".format(name), name, "mocha-multi-reporters")
+            link_793("{}/mocha-multi-reporters".format(name), True, name, "mocha-multi-reporters")
             link_targets.append(":{}/mocha-multi-reporters".format(name))
-            link_794("{}/mocha".format(name), name, "mocha")
+            link_794("{}/mocha".format(name), True, name, "mocha")
             link_targets.append(":{}/mocha".format(name))
         elif bazel_package == "examples/stack_traces":
-            link_991("{}/source-map-support".format(name), name, "source-map-support")
+            link_991("{}/source-map-support".format(name), True, name, "source-map-support")
             link_targets.append(":{}/source-map-support".format(name))
 
     if is_root:
diff --git a/npm/private/test/snapshots/rollup_links_defs.bzl b/npm/private/test/snapshots/rollup_links_defs.bzl
index 96566c9..ca3966d 100644
--- a/npm/private/test/snapshots/rollup_links_defs.bzl
+++ b/npm/private/test/snapshots/rollup_links_defs.bzl
@@ -46,9 +46,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package rollup@2.70.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -62,12 +63,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {
diff --git a/npm/private/test/snapshots/unused_links_defs.bzl b/npm/private/test/snapshots/unused_links_defs.bzl
index 133473a..900352c 100644
--- a/npm/private/test/snapshots/unused_links_defs.bzl
+++ b/npm/private/test/snapshots/unused_links_defs.bzl
@@ -53,9 +53,10 @@
 
 # Generated npm_package_store and npm_link_package_store targets for npm package unused@0.2.2
 # buildifier: disable=function-docstring
-def npm_link_imported_package_store(name, link_root_name, link_alias):
+def npm_link_imported_package_store(name, dev, link_root_name, link_alias):
     return _npm_link_imported_package_store(
         name,
+        dev,
         link_root_name,
         link_alias,
         root_package = _ROOT_PACKAGE,
@@ -69,12 +70,14 @@
 # buildifier: disable=function-docstring
 def npm_link_imported_package(
         name = "node_modules",
+        dev = False,
         link = None,
         fail_if_no_link = True):
     return _npm_link_imported_package(
         name,
         package = PACKAGE,
         version = VERSION,
+        dev = dev,
         root_package = _ROOT_PACKAGE,
         link = link,
         link_packages = {