fix: support generic npmrc registry config (#530)

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 66669ff..989319f 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -47,6 +47,7 @@
                     - 'e2e/npm_link_package-esm'
                     - 'e2e/pnpm_workspace'
                     - 'e2e/pnpm_workspace_rerooted'
+                    - 'e2e/npm_translate_lock'
                     - 'e2e/npm_translate_lock_auth'
                     - 'e2e/npm_translate_package_lock'
                     - 'e2e/npm_translate_yarn_lock'
diff --git a/e2e/npm_translate_lock/.bazelignore b/e2e/npm_translate_lock/.bazelignore
new file mode 100644
index 0000000..40b878d
--- /dev/null
+++ b/e2e/npm_translate_lock/.bazelignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/e2e/npm_translate_lock/.bazelrc b/e2e/npm_translate_lock/.bazelrc
new file mode 100644
index 0000000..5128b1b
--- /dev/null
+++ b/e2e/npm_translate_lock/.bazelrc
@@ -0,0 +1,2 @@
+# import common bazelrc shared with e2e workspaces
+import %workspace%/../../.bazelrc.common
diff --git a/e2e/npm_translate_lock/.bazelversion b/e2e/npm_translate_lock/.bazelversion
new file mode 120000
index 0000000..96cf949
--- /dev/null
+++ b/e2e/npm_translate_lock/.bazelversion
@@ -0,0 +1 @@
+../../.bazelversion
\ No newline at end of file
diff --git a/e2e/npm_translate_lock/.npmrc b/e2e/npm_translate_lock/.npmrc
new file mode 100644
index 0000000..1ef14f3
--- /dev/null
+++ b/e2e/npm_translate_lock/.npmrc
@@ -0,0 +1,7 @@
+hoist=false
+
+# Override the default registry to use yarn instead of npm
+registry=https://registry.yarnpkg.com
+
+# Override the registry of a scope
+@types:registry=https://registry.npmjs.org/
\ No newline at end of file
diff --git a/e2e/npm_translate_lock/BUILD.bazel b/e2e/npm_translate_lock/BUILD.bazel
new file mode 100644
index 0000000..ce77dfb
--- /dev/null
+++ b/e2e/npm_translate_lock/BUILD.bazel
@@ -0,0 +1,20 @@
+load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files")
+load("@bazel_skylib//rules:build_test.bzl", "build_test")
+load("@npm//:defs.bzl", "npm_link_all_packages")
+
+npm_link_all_packages(name = "node_modules")
+
+build_test(
+    name = "test",
+    targets = [
+        ":node_modules",
+    ],
+)
+
+write_source_files(
+    name = "write_npm_translate_lock",
+    files = {
+        "repositories_checked.bzl": "@npm//:repositories.bzl",
+        "defs_checked.bzl": "@npm//:defs.bzl",
+    },
+)
diff --git a/e2e/npm_translate_lock/README.md b/e2e/npm_translate_lock/README.md
new file mode 100644
index 0000000..cb7fc9a
--- /dev/null
+++ b/e2e/npm_translate_lock/README.md
@@ -0,0 +1,5 @@
+# Tests for npmrc params
+
+## Registry
+
+Test the generated rules respect the `.npmrc` `registry` and `@scope:registry` configuration.
diff --git a/e2e/npm_translate_lock/WORKSPACE b/e2e/npm_translate_lock/WORKSPACE
new file mode 100644
index 0000000..367c12c
--- /dev/null
+++ b/e2e/npm_translate_lock/WORKSPACE
@@ -0,0 +1,29 @@
+local_repository(
+    name = "aspect_rules_js",
+    path = "../..",
+)
+
+load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies")
+
+rules_js_dependencies()
+
+load("@rules_nodejs//nodejs:repositories.bzl", "DEFAULT_NODE_VERSION", "nodejs_register_toolchains")
+
+nodejs_register_toolchains(
+    name = "nodejs",
+    node_version = DEFAULT_NODE_VERSION,
+)
+
+load("@aspect_rules_js//npm:npm_import.bzl", "npm_translate_lock")
+
+# Validate that we can use a yarn.lock file in place of pnpm-lock.yaml
+npm_translate_lock(
+    name = "npm",
+    npmrc = "//:.npmrc",
+    pnpm_lock = "//:pnpm-lock.yaml",
+    verify_node_modules_ignored = "//:.bazelignore",
+)
+
+load("@npm//:repositories.bzl", "npm_repositories")
+
+npm_repositories()
diff --git a/e2e/npm_translate_lock/defs_checked.bzl b/e2e/npm_translate_lock/defs_checked.bzl
new file mode 100755
index 0000000..4d62cb7
--- /dev/null
+++ b/e2e/npm_translate_lock/defs_checked.bzl
@@ -0,0 +1,86 @@
+"@generated by @aspect_rules_js//npm/private:npm_translate_lock.bzl from //:pnpm-lock.yaml"
+
+# buildifier: disable=bzl-visibility
+load("@aspect_rules_js//js:defs.bzl", _js_library = "js_library")
+load("@npm__at_types_node__18.11.0__links//:defs.bzl", link_0 = "npm_link_imported_package_store", store_0 = "npm_imported_package_store")
+load("@npm__at_types_semver__7.3.12__links//:defs.bzl", link_1 = "npm_link_imported_package_store", store_1 = "npm_imported_package_store")
+load("@npm__debug__registry.npmjs.org_debug_4.3.4__links//:defs.bzl", link_2 = "npm_link_imported_package_store", store_2 = "npm_imported_package_store")
+load("@npm__is-number__registry.npmjs.org_is-number_6.0.0__links//:defs.bzl", store_3 = "npm_imported_package_store")
+load("@npm__is-odd__registry.npmjs.org_is-odd_3.0.1__links//:defs.bzl", link_4 = "npm_link_imported_package_store", store_4 = "npm_imported_package_store")
+load("@npm__lru-cache__registry.npmjs.org_lru-cache_6.0.0__links//:defs.bzl", store_5 = "npm_imported_package_store")
+load("@npm__ms__registry.npmjs.org_ms_2.1.2__links//:defs.bzl", store_6 = "npm_imported_package_store")
+load("@npm__semver__registry.npmjs.org_semver_7.3.8__links//:defs.bzl", link_7 = "npm_link_imported_package_store", store_7 = "npm_imported_package_store")
+load("@npm__yallist__registry.npmjs.org_yallist_4.0.0__links//:defs.bzl", store_8 = "npm_imported_package_store")
+
+def npm_link_all_packages(name = "node_modules", imported_links = []):
+    """Generated list of npm_link_package() target generators and first-party linked packages corresponding to the packages in //:pnpm-lock.yaml
+
+    Args:
+        name: name of catch all target to generate for all packages linked
+        imported_links: optional list link functions from manually imported packages
+            that were fetched with npm_import rules,
+
+            For example,
+
+            ```
+            load("@npm//:defs.bzl", "npm_link_all_packages")
+            load("@npm_meaning-of-life__links//:defs.bzl", npm_link_meaning_of_life = "npm_link_imported_package")
+
+            npm_link_all_packages(
+                name = "node_modules",
+                imported_links = [
+                    npm_link_meaning_of_life,
+                ],
+            )```
+    """
+
+    root_package = ""
+    link_packages = [""]
+    is_root = native.package_name() == root_package
+    link = native.package_name() in link_packages
+    if not is_root and not link:
+        msg = "The npm_link_all_packages() macro loaded from @npm//:defs.bzl and called in bazel package '%s' may only be called in the bazel package(s) corresponding to the root package '' and packages ['']" % native.package_name()
+        fail(msg)
+    link_targets = []
+    scope_targets = {}
+
+    for link_fn in imported_links:
+        new_link_targets, new_scope_targets = link_fn(name)
+        link_targets.extend(new_link_targets)
+        for _scope, _targets in new_scope_targets.items():
+            scope_targets[_scope] = scope_targets[_scope] + _targets if _scope in scope_targets else _targets
+
+    if is_root:
+        store_0(name = "{}/@types/node".format(name))
+        store_1(name = "{}/@types/semver".format(name))
+        store_2(name = "{}/debug".format(name))
+        store_3(name = "{}/is-number".format(name))
+        store_4(name = "{}/is-odd".format(name))
+        store_5(name = "{}/lru-cache".format(name))
+        store_6(name = "{}/ms".format(name))
+        store_7(name = "{}/semver".format(name))
+        store_8(name = "{}/yallist".format(name))
+    if link:
+        if native.package_name() == "":
+            link_targets.append(link_0(name = "{}/@types/node".format(name)))
+            scope_targets["@types"] = scope_targets["@types"] + [link_targets[-1]] if "@types" in scope_targets else [link_targets[-1]]
+            link_targets.append(link_1(name = "{}/@types/semver".format(name)))
+            scope_targets["@types"] = scope_targets["@types"] + [link_targets[-1]] if "@types" in scope_targets else [link_targets[-1]]
+            link_targets.append(link_2(name = "{}/debug".format(name)))
+            link_targets.append(link_4(name = "{}/is-odd".format(name)))
+            link_targets.append(link_7(name = "{}/semver".format(name)))
+
+    for scope, scoped_targets in scope_targets.items():
+        _js_library(
+            name = "{}/{}".format(name, scope),
+            srcs = scoped_targets,
+            tags = ["manual"],
+            visibility = ["//visibility:public"],
+        )
+
+    _js_library(
+        name = name,
+        srcs = link_targets,
+        tags = ["manual"],
+        visibility = ["//visibility:public"],
+    )
diff --git a/e2e/npm_translate_lock/package.json b/e2e/npm_translate_lock/package.json
new file mode 100644
index 0000000..52e4b3d
--- /dev/null
+++ b/e2e/npm_translate_lock/package.json
@@ -0,0 +1,12 @@
+{
+    "private": true,
+    "dependencies": {
+        "debug": "^4.3.4",
+        "is-odd": "^3.0.1",
+        "semver": "^7.3.8"
+    },
+    "devDependencies": {
+        "@types/node": "^18.11.0",
+        "@types/semver": "^7.3.12"
+    }
+}
diff --git a/e2e/npm_translate_lock/pnpm-lock.yaml b/e2e/npm_translate_lock/pnpm-lock.yaml
new file mode 100644
index 0000000..2cbcd7a
--- /dev/null
+++ b/e2e/npm_translate_lock/pnpm-lock.yaml
@@ -0,0 +1,89 @@
+lockfileVersion: 5.4
+
+importers:
+
+  .:
+    specifiers:
+      '@types/node': ^18.11.0
+      '@types/semver': ^7.3.12
+      debug: ^4.3.4
+      is-odd: ^3.0.1
+      semver: ^7.3.8
+    dependencies:
+      debug: registry.npmjs.org/debug/4.3.4
+      is-odd: registry.npmjs.org/is-odd/3.0.1
+      semver: registry.npmjs.org/semver/7.3.8
+    devDependencies:
+      '@types/node': 18.11.0
+      '@types/semver': 7.3.12
+
+packages:
+
+  /@types/node/18.11.0:
+    resolution: {integrity: sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==}
+    dev: true
+
+  /@types/semver/7.3.12:
+    resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==}
+    dev: true
+
+  registry.npmjs.org/debug/4.3.4:
+    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/debug/-/debug-4.3.4.tgz}
+    name: debug
+    version: 4.3.4
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: registry.npmjs.org/ms/2.1.2
+    dev: false
+
+  registry.npmjs.org/is-number/6.0.0:
+    resolution: {integrity: sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz}
+    name: is-number
+    version: 6.0.0
+    engines: {node: '>=0.10.0'}
+    dev: false
+
+  registry.npmjs.org/is-odd/3.0.1:
+    resolution: {integrity: sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz}
+    name: is-odd
+    version: 3.0.1
+    engines: {node: '>=4'}
+    dependencies:
+      is-number: registry.npmjs.org/is-number/6.0.0
+    dev: false
+
+  registry.npmjs.org/lru-cache/6.0.0:
+    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz}
+    name: lru-cache
+    version: 6.0.0
+    engines: {node: '>=10'}
+    dependencies:
+      yallist: registry.npmjs.org/yallist/4.0.0
+    dev: false
+
+  registry.npmjs.org/ms/2.1.2:
+    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ms/-/ms-2.1.2.tgz}
+    name: ms
+    version: 2.1.2
+    dev: false
+
+  registry.npmjs.org/semver/7.3.8:
+    resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/semver/-/semver-7.3.8.tgz}
+    name: semver
+    version: 7.3.8
+    engines: {node: '>=10'}
+    hasBin: true
+    dependencies:
+      lru-cache: registry.npmjs.org/lru-cache/6.0.0
+    dev: false
+
+  registry.npmjs.org/yallist/4.0.0:
+    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz}
+    name: yallist
+    version: 4.0.0
+    dev: false
diff --git a/e2e/npm_translate_lock/pnpm-workspace.yaml b/e2e/npm_translate_lock/pnpm-workspace.yaml
new file mode 100644
index 0000000..2cce0eb
--- /dev/null
+++ b/e2e/npm_translate_lock/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+packages:
+    - '.'
diff --git a/e2e/npm_translate_lock/repositories_checked.bzl b/e2e/npm_translate_lock/repositories_checked.bzl
new file mode 100755
index 0000000..0ee705c
--- /dev/null
+++ b/e2e/npm_translate_lock/repositories_checked.bzl
@@ -0,0 +1,167 @@
+"@generated by @aspect_rules_js//npm/private:npm_translate_lock.bzl from //:pnpm-lock.yaml"
+
+load("@aspect_rules_js//npm:npm_import.bzl", "npm_import")
+
+def npm_repositories():
+    "Generated npm_import repository rules corresponding to npm packages in //:pnpm-lock.yaml"
+    npm_import(
+        name = "npm__at_types_node__18.11.0",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {
+            "": ["@types/node"],
+        },
+        package = "@types/node",
+        version = "18.11.0",
+        url = "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==",
+        transitive_closure = {
+            "@types/node": ["18.11.0"],
+        },
+    )
+
+    npm_import(
+        name = "npm__at_types_semver__7.3.12",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {
+            "": ["@types/semver"],
+        },
+        package = "@types/semver",
+        version = "7.3.12",
+        url = "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==",
+        transitive_closure = {
+            "@types/semver": ["7.3.12"],
+        },
+    )
+
+    npm_import(
+        name = "npm__debug__registry.npmjs.org_debug_4.3.4",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {
+            "": ["debug"],
+        },
+        package = "debug",
+        version = "registry.npmjs.org/debug/4.3.4",
+        url = "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+        deps = {
+            "ms": "registry.npmjs.org/ms/2.1.2",
+        },
+        transitive_closure = {
+            "debug": ["registry.npmjs.org/debug/4.3.4"],
+            "ms": ["registry.npmjs.org/ms/2.1.2"],
+        },
+    )
+
+    npm_import(
+        name = "npm__is-number__registry.npmjs.org_is-number_6.0.0",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {},
+        package = "is-number",
+        version = "registry.npmjs.org/is-number/6.0.0",
+        url = "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==",
+        transitive_closure = {
+            "is-number": ["registry.npmjs.org/is-number/6.0.0"],
+        },
+    )
+
+    npm_import(
+        name = "npm__is-odd__registry.npmjs.org_is-odd_3.0.1",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {
+            "": ["is-odd"],
+        },
+        package = "is-odd",
+        version = "registry.npmjs.org/is-odd/3.0.1",
+        url = "https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA==",
+        deps = {
+            "is-number": "registry.npmjs.org/is-number/6.0.0",
+        },
+        transitive_closure = {
+            "is-odd": ["registry.npmjs.org/is-odd/3.0.1"],
+            "is-number": ["registry.npmjs.org/is-number/6.0.0"],
+        },
+    )
+
+    npm_import(
+        name = "npm__lru-cache__registry.npmjs.org_lru-cache_6.0.0",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {},
+        package = "lru-cache",
+        version = "registry.npmjs.org/lru-cache/6.0.0",
+        url = "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+        deps = {
+            "yallist": "registry.npmjs.org/yallist/4.0.0",
+        },
+        transitive_closure = {
+            "lru-cache": ["registry.npmjs.org/lru-cache/6.0.0"],
+            "yallist": ["registry.npmjs.org/yallist/4.0.0"],
+        },
+    )
+
+    npm_import(
+        name = "npm__ms__registry.npmjs.org_ms_2.1.2",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {},
+        package = "ms",
+        version = "registry.npmjs.org/ms/2.1.2",
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+        transitive_closure = {
+            "ms": ["registry.npmjs.org/ms/2.1.2"],
+        },
+    )
+
+    npm_import(
+        name = "npm__semver__registry.npmjs.org_semver_7.3.8",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {
+            "": ["semver"],
+        },
+        package = "semver",
+        version = "registry.npmjs.org/semver/7.3.8",
+        url = "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+        deps = {
+            "lru-cache": "registry.npmjs.org/lru-cache/6.0.0",
+        },
+        transitive_closure = {
+            "semver": ["registry.npmjs.org/semver/7.3.8"],
+            "lru-cache": ["registry.npmjs.org/lru-cache/6.0.0"],
+            "yallist": ["registry.npmjs.org/yallist/4.0.0"],
+        },
+    )
+
+    npm_import(
+        name = "npm__yallist__registry.npmjs.org_yallist_4.0.0",
+        root_package = "",
+        link_workspace = "",
+        link_packages = {},
+        package = "yallist",
+        version = "registry.npmjs.org/yallist/4.0.0",
+        url = "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+        lifecycle_hooks_no_sandbox = True,
+        integrity = "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+        transitive_closure = {
+            "yallist": ["registry.npmjs.org/yallist/4.0.0"],
+        },
+    )
diff --git a/npm/extensions.bzl b/npm/extensions.bzl
index 53b9cf7..7f2a7e4 100644
--- a/npm/extensions.bzl
+++ b/npm/extensions.bzl
@@ -3,7 +3,7 @@
 """
 
 load("//npm/private:utils.bzl", "utils")
-load("//npm/private:npm_translate_lock.bzl", npm_translate_lock_lib = "npm_translate_lock")
+load("//npm/private:npm_translate_lock.bzl", "DEFAULT_REGISTRY", npm_translate_lock_lib = "npm_translate_lock")
 load("//npm/private:npm_import.bzl", npm_import_lib = "npm_import")
 load("//npm:npm_import.bzl", "npm_import", "npm_translate_lock")
 load("//npm/private:transitive_closure.bzl", "translate_to_transitive_closure")
@@ -13,7 +13,7 @@
         for attr in mod.tags.npm_translate_lock:
             lockfile = utils.parse_pnpm_lock(module_ctx.read(attr.pnpm_lock))
             trans = translate_to_transitive_closure(lockfile, attr.prod, attr.dev, attr.no_optional)
-            imports = npm_translate_lock_lib.gen_npm_imports(trans, attr.pnpm_lock.package, attr)
+            imports = npm_translate_lock_lib.gen_npm_imports(trans, attr.pnpm_lock.package, attr, DEFAULT_REGISTRY)
             for i in imports:
                 npm_import(
                     name = i.name,
diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl
index fac8f83..05ae17b 100644
--- a/npm/private/npm_import.bzl
+++ b/npm/private/npm_import.bzl
@@ -4,6 +4,7 @@
 load("@bazel_skylib//lib:paths.bzl", "paths")
 load("@bazel_skylib//lib:dicts.bzl", "dicts")
 load(":utils.bzl", "utils")
+load(":npm_translate_lock.bzl", "DEFAULT_REGISTRY")
 load(":starlark_codegen_utils.bzl", "starlark_codegen_utils")
 
 _LINK_JS_PACKAGE_TMPL = """load("@aspect_rules_js//js:defs.bzl", _js_run_binary = "js_run_binary")
@@ -346,7 +347,7 @@
 def _impl(rctx):
     # scoped packages contain a slash in the name, which doesn't appear in the later part of the URL
     package_name_no_scope = rctx.attr.package.rsplit("/", 1)[-1]
-    download_url = rctx.attr.url if rctx.attr.url else utils.npm_registry_download_url(rctx.attr.package, rctx.attr.version)
+    download_url = rctx.attr.url if rctx.attr.url else utils.npm_registry_download_url(rctx.attr.package, rctx.attr.version, {}, DEFAULT_REGISTRY)
 
     auth = {
         download_url: {
diff --git a/npm/private/npm_translate_lock.bzl b/npm/private/npm_translate_lock.bzl
index 8bbaac2..9b27e98 100644
--- a/npm/private/npm_translate_lock.bzl
+++ b/npm/private/npm_translate_lock.bzl
@@ -7,6 +7,8 @@
 load(":transitive_closure.bzl", "translate_to_transitive_closure")
 load(":starlark_codegen_utils.bzl", "starlark_codegen_utils")
 
+DEFAULT_REGISTRY = "https://registry.npmjs.org/"
+
 _ATTRS = {
     "pnpm_lock": attr.label(),
     "package_json": attr.label(),
@@ -213,7 +215,7 @@
 
     return (tokens, registries)
 
-def _gen_npm_imports(lockfile, root_package, attr, registries = {}):
+def _gen_npm_imports(lockfile, root_package, attr, registries, default_registry):
     "Converts packages from the lockfile to a struct of attributes for npm_import"
 
     if attr.prod and attr.dev:
@@ -330,14 +332,14 @@
         url = None
         if tarball:
             if _is_url(tarball):
-                if registry and tarball.startswith(utils.npm_registry_url):
-                    url = registry + tarball[len(utils.npm_registry_url):]
+                if registry and tarball.startswith(default_registry):
+                    url = registry + tarball[len(default_registry):]
                 else:
                     url = tarball
             else:
                 if not registry:
                     (scope, _) = utils.parse_package_name(name)
-                    registry = "https://{}".format(registries[scope]) if scope in registries else utils.npm_registry_url
+                    registry = "https://{}".format(registries[scope]) if scope in registries else default_registry
                 url = "{0}/{1}".format(registry.removesuffix("/"), tarball)
 
         result.append(struct(
@@ -470,6 +472,7 @@
     lockfile_description = None
     npm_tokens = {}
     npm_registries = {}
+    default_registry = DEFAULT_REGISTRY
 
     # Read tokens from npmrc label
     if rctx.attr.npmrc:
@@ -477,6 +480,9 @@
         npmrc = parse_ini(rctx.read(npmrc_path))
         (npm_tokens, npm_registries) = get_npm_auth(npmrc, npmrc_path, rctx.os.environ)
 
+        if "registry" in npmrc:
+            default_registry = npmrc["registry"]
+
     _validate_attrs(rctx)
 
     if rctx.attr.pnpm_lock != None:
@@ -599,7 +605,7 @@
     defs_bzl_header = generated_by_lines + ["""# buildifier: disable=bzl-visibility
 load("@aspect_rules_js//js:defs.bzl", _js_library = "js_library")"""]
 
-    npm_imports = _gen_npm_imports(lockfile, root_package, rctx.attr, npm_registries)
+    npm_imports = _gen_npm_imports(lockfile, root_package, rctx.attr, npm_registries, default_registry)
 
     fp_links = {}
     rctx_files = {
@@ -779,7 +785,7 @@
     stores_bzl = []
     links_bzl = {}
     for (i, _import) in enumerate(npm_imports):
-        url = _import.url if _import.url else utils.npm_registry_download_url(_import.package, _import.version, npm_registries)
+        url = _import.url if _import.url else utils.npm_registry_download_url(_import.package, _import.version, npm_registries, default_registry)
 
         maybe_integrity = """
         integrity = "%s",""" % _import.integrity if _import.integrity else ""
diff --git a/npm/private/test/utils_tests.bzl b/npm/private/test/utils_tests.bzl
index a809ba6..474ba65 100644
--- a/npm/private/test/utils_tests.bzl
+++ b/npm/private/test/utils_tests.bzl
@@ -71,17 +71,22 @@
     asserts.equals(
         env,
         "https://registry.npmjs.org/y/-/y-1.2.3.tgz",
-        utils.npm_registry_download_url("y", "1.2.3"),
+        utils.npm_registry_download_url("y", "1.2.3", {}, "https://registry.npmjs.org/"),
     )
     asserts.equals(
         env,
         "https://registry.npmjs.org/@scope/y/-/y-1.2.3.tgz",
-        utils.npm_registry_download_url("@scope/y", "1.2.3"),
+        utils.npm_registry_download_url("@scope/y", "1.2.3", {}, "https://registry.npmjs.org/"),
     )
     asserts.equals(
         env,
         "https://npm.pkg.github.com/@scope/y/-/y-1.2.3.tgz",
-        utils.npm_registry_download_url("@scope/y", "1.2.3", {"@scope": "npm.pkg.github.com/"}),
+        utils.npm_registry_download_url("@scope/y", "1.2.3", {"@scope": "npm.pkg.github.com/"}, "https://registry.npmjs.org/"),
+    )
+    asserts.equals(
+        env,
+        "https://npm.pkg.github.com/@scope/y/-/y-1.2.3.tgz",
+        utils.npm_registry_download_url("@scope/y", "1.2.3", {}, "https://npm.pkg.github.com/"),
     )
     return unittest.end(env)
 
diff --git a/npm/private/utils.bzl b/npm/private/utils.bzl
index 09a1830..9ea51c3 100644
--- a/npm/private/utils.bzl
+++ b/npm/private/utils.bzl
@@ -124,11 +124,11 @@
         return (segments[0], segments[1])
     return ("", segments[0])
 
-def _npm_registry_download_url(package, version, registries = {}):
+def _npm_registry_download_url(package, version, registries, default_registry):
     "Make a registry download URL for a given package and version"
 
     (package_scope, package_name_no_scope) = _parse_package_name(package)
-    registry = "https://{}".format(registries[package_scope]) if package_scope in registries else utils.npm_registry_url
+    registry = "https://{}".format(registries[package_scope]) if package_scope in registries else default_registry
 
     return "{0}/{1}/-/{2}-{3}.tgz".format(
         registry.removesuffix("/"),
@@ -153,8 +153,6 @@
     links_repo_suffix = "__links",
     # Output group name for the package directory of a linked package
     package_directory_output_group = "package_directory",
-    # Default npm registry URL
-    npm_registry_url = "https://registry.npmjs.org/",
     npm_registry_download_url = _npm_registry_download_url,
     parse_package_name = _parse_package_name,
 )