feat(builtin): npm_install/yarn_install node repo

Repository rules need to know which nodejs repository to get tools from
because they run before toolchain resolution.

Removes another hardcoded usage of "@nodejs"
diff --git a/docs/Built-ins.md b/docs/Built-ins.md
index 0f7a32f..f78db9c 100755
--- a/docs/Built-ins.md
+++ b/docs/Built-ins.md
@@ -746,9 +746,10 @@
 <pre>
 npm_install(<a href="#npm_install-name">name</a>, <a href="#npm_install-args">args</a>, <a href="#npm_install-data">data</a>, <a href="#npm_install-environment">environment</a>, <a href="#npm_install-exports_directories_only">exports_directories_only</a>,
             <a href="#npm_install-generate_local_modules_build_files">generate_local_modules_build_files</a>, <a href="#npm_install-included_files">included_files</a>, <a href="#npm_install-links">links</a>, <a href="#npm_install-manual_build_file_contents">manual_build_file_contents</a>,
-            <a href="#npm_install-npm_command">npm_command</a>, <a href="#npm_install-package_json">package_json</a>, <a href="#npm_install-package_json_remove">package_json_remove</a>, <a href="#npm_install-package_json_replace">package_json_replace</a>, <a href="#npm_install-package_lock_json">package_lock_json</a>,
-            <a href="#npm_install-package_path">package_path</a>, <a href="#npm_install-patch_args">patch_args</a>, <a href="#npm_install-patch_tool">patch_tool</a>, <a href="#npm_install-post_install_patches">post_install_patches</a>, <a href="#npm_install-pre_install_patches">pre_install_patches</a>, <a href="#npm_install-quiet">quiet</a>,
-            <a href="#npm_install-repo_mapping">repo_mapping</a>, <a href="#npm_install-strict_visibility">strict_visibility</a>, <a href="#npm_install-symlink_node_modules">symlink_node_modules</a>, <a href="#npm_install-timeout">timeout</a>)
+            <a href="#npm_install-node_repository">node_repository</a>, <a href="#npm_install-npm_command">npm_command</a>, <a href="#npm_install-package_json">package_json</a>, <a href="#npm_install-package_json_remove">package_json_remove</a>, <a href="#npm_install-package_json_replace">package_json_replace</a>,
+            <a href="#npm_install-package_lock_json">package_lock_json</a>, <a href="#npm_install-package_path">package_path</a>, <a href="#npm_install-patch_args">patch_args</a>, <a href="#npm_install-patch_tool">patch_tool</a>, <a href="#npm_install-post_install_patches">post_install_patches</a>,
+            <a href="#npm_install-pre_install_patches">pre_install_patches</a>, <a href="#npm_install-quiet">quiet</a>, <a href="#npm_install-repo_mapping">repo_mapping</a>, <a href="#npm_install-strict_visibility">strict_visibility</a>, <a href="#npm_install-symlink_node_modules">symlink_node_modules</a>,
+            <a href="#npm_install-timeout">timeout</a>)
 </pre>
 
 Runs npm install during workspace setup.
@@ -976,6 +977,13 @@
 
 Defaults to `""`
 
+<h4 id="npm_install-node_repository">node_repository</h4>
+
+(*String*): The basename for nodejs toolchains.
+        Usually this is the value of the `name` attribute given to a nodejs_register_toolchains call in WORKSPACE
+
+Defaults to `"nodejs"`
+
 <h4 id="npm_install-npm_command">npm_command</h4>
 
 (*String*): The npm command to run, to install dependencies.
@@ -1413,8 +1421,8 @@
 <pre>
 yarn_install(<a href="#yarn_install-name">name</a>, <a href="#yarn_install-args">args</a>, <a href="#yarn_install-data">data</a>, <a href="#yarn_install-environment">environment</a>, <a href="#yarn_install-exports_directories_only">exports_directories_only</a>, <a href="#yarn_install-frozen_lockfile">frozen_lockfile</a>,
              <a href="#yarn_install-generate_local_modules_build_files">generate_local_modules_build_files</a>, <a href="#yarn_install-included_files">included_files</a>, <a href="#yarn_install-links">links</a>, <a href="#yarn_install-manual_build_file_contents">manual_build_file_contents</a>,
-             <a href="#yarn_install-package_json">package_json</a>, <a href="#yarn_install-package_json_remove">package_json_remove</a>, <a href="#yarn_install-package_json_replace">package_json_replace</a>, <a href="#yarn_install-package_path">package_path</a>, <a href="#yarn_install-patch_args">patch_args</a>,
-             <a href="#yarn_install-patch_tool">patch_tool</a>, <a href="#yarn_install-post_install_patches">post_install_patches</a>, <a href="#yarn_install-pre_install_patches">pre_install_patches</a>, <a href="#yarn_install-quiet">quiet</a>, <a href="#yarn_install-repo_mapping">repo_mapping</a>,
+             <a href="#yarn_install-node_repository">node_repository</a>, <a href="#yarn_install-package_json">package_json</a>, <a href="#yarn_install-package_json_remove">package_json_remove</a>, <a href="#yarn_install-package_json_replace">package_json_replace</a>, <a href="#yarn_install-package_path">package_path</a>,
+             <a href="#yarn_install-patch_args">patch_args</a>, <a href="#yarn_install-patch_tool">patch_tool</a>, <a href="#yarn_install-post_install_patches">post_install_patches</a>, <a href="#yarn_install-pre_install_patches">pre_install_patches</a>, <a href="#yarn_install-quiet">quiet</a>, <a href="#yarn_install-repo_mapping">repo_mapping</a>,
              <a href="#yarn_install-strict_visibility">strict_visibility</a>, <a href="#yarn_install-symlink_node_modules">symlink_node_modules</a>, <a href="#yarn_install-timeout">timeout</a>, <a href="#yarn_install-use_global_yarn_cache">use_global_yarn_cache</a>, <a href="#yarn_install-yarn_lock">yarn_lock</a>)
 </pre>
 
@@ -1658,6 +1666,13 @@
 
 Defaults to `""`
 
+<h4 id="yarn_install-node_repository">node_repository</h4>
+
+(*String*): The basename for nodejs toolchains.
+        Usually this is the value of the `name` attribute given to a nodejs_register_toolchains call in WORKSPACE
+
+Defaults to `"nodejs"`
+
 <h4 id="yarn_install-package_json">package_json</h4>
 
 (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>, mandatory*)
diff --git a/internal/node/node_labels.bzl b/internal/node/node_labels.bzl
index 393661c..8c67761 100644
--- a/internal/node/node_labels.bzl
+++ b/internal/node/node_labels.bzl
@@ -19,22 +19,18 @@
 
 load("//nodejs/private:os_name.bzl", "is_windows_os", "os_name")
 
+def _get_label(rctx, tool):
+    ext = ".cmd" if is_windows_os(rctx) else ""
+    return Label("@{}_{}//:{}{}".format(rctx.attr.node_repository, os_name(rctx), tool, ext))
+
 def get_node_label(rctx):
-    if is_windows_os(rctx):
-        return Label("@nodejs_%s//:bin/node.cmd" % os_name(rctx))
-    return Label("@nodejs_%s//:bin/node" % os_name(rctx))
+    return _get_label(rctx, "bin/node")
 
 def get_npm_label(rctx):
-    if is_windows_os(rctx):
-        return Label("@nodejs_%s//:bin/npm.cmd" % os_name(rctx))
-    return Label("@nodejs_%s//:bin/npm" % os_name(rctx))
+    return _get_label(rctx, "bin/npm")
 
 def get_npm_node_repositories_label(rctx):
-    if is_windows_os(rctx):
-        return Label("@nodejs_%s//:bin/npm_node_repositories.cmd" % os_name(rctx))
-    return Label("@nodejs_%s//:bin/npm_node_repositories" % os_name(rctx))
+    return _get_label(rctx, "bin/npm_node_repositories")
 
 def get_yarn_label(rctx):
-    if is_windows_os(rctx):
-        return Label("@nodejs_%s//:bin/yarn.cmd" % os_name(rctx))
-    return Label("@nodejs_%s//:bin/yarn" % os_name(rctx))
+    return _get_label(rctx, "bin/yarn")
diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl
index adfcef1..03c6e8a 100644
--- a/internal/npm_install/npm_install.bzl
+++ b/internal/npm_install/npm_install.bzl
@@ -219,6 +219,11 @@
 fine grained npm dependencies.
 """,
     ),
+    "node_repository": attr.string(
+        default = "nodejs",
+        doc = """The basename for nodejs toolchains.
+        Usually this is the value of the `name` attribute given to a nodejs_register_toolchains call in WORKSPACE""",
+    ),
     "package_json": attr.label(
         mandatory = True,
         allow_single_file = True,
@@ -627,11 +632,11 @@
     # Add a dep to the node_info & yarn_info files from node_repositories
     # so that if the node or yarn versions change we re-run the repository rule
     repository_ctx.symlink(
-        Label("@nodejs_%s//:node_info" % os_name(repository_ctx)),
+        Label("@{}_{}//:node_info".format(repository_ctx.attr.node_repository, os_name(repository_ctx))),
         repository_ctx.path("_node_info"),
     )
     repository_ctx.symlink(
-        Label("@nodejs_%s//:yarn_info" % os_name(repository_ctx)),
+        Label("@{}_{}//:yarn_info".format(repository_ctx.attr.node_repository, os_name(repository_ctx))),
         repository_ctx.path("_yarn_info"),
     )
 
@@ -667,7 +672,6 @@
 
 def _npm_install_impl(repository_ctx):
     """Core implementation of npm_install."""
-
     _check_min_bazel_version("npm_install", repository_ctx)
 
     is_windows_host = is_windows_os(repository_ctx)
@@ -807,7 +811,6 @@
 
 def _yarn_install_impl(repository_ctx):
     """Core implementation of yarn_install."""
-
     _check_min_bazel_version("yarn_install", repository_ctx)
 
     is_windows_host = is_windows_os(repository_ctx)
diff --git a/npm_deps.bzl b/npm_deps.bzl
index 3fda83d..31632c3 100644
--- a/npm_deps.bzl
+++ b/npm_deps.bzl
@@ -1,6 +1,18 @@
 """Define npm deps in yarn_install && npm_install repositories"""
 
-load("//:index.bzl", "npm_install", "yarn_install")
+load("//:index.bzl", _npm_install = "npm_install", _yarn_install = "yarn_install")
+
+def npm_install(**kwargs):
+    _npm_install(
+        node_repository = "node16",
+        **kwargs
+    )
+
+def yarn_install(**kwargs):
+    _yarn_install(
+        node_repository = "node16",
+        **kwargs
+    )
 
 def npm_deps():
     """Organize all yarn_install and npm_install calls here to prevent WORKSPACE bloat"""