diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl index 587e66c9d..229667767 100644 --- a/npm/private/npm_import.bzl +++ b/npm/private/npm_import.bzl @@ -644,11 +644,7 @@ def _impl_links(rctx): virtual_store_root = utils.virtual_store_root, ) else: - if dep_version.startswith("/"): - store_package, store_version = utils.parse_pnpm_name(dep_version[1:]) - else: - store_package = dep_name - store_version = dep_version + store_package, store_version = utils.parse_pnpm_package_key(dep_name, dep_version) dep_store_target = """":{virtual_store_root}/{{}}/{virtual_store_name}/ref".format(link_root_name)""".format( virtual_store_name = utils.virtual_store_name(store_package, store_version), virtual_store_root = utils.virtual_store_root, @@ -671,11 +667,7 @@ def _impl_links(rctx): lc_deps[dep_store_target] = lc_deps[dep_store_target] + [dep_name] if dep_store_target in lc_deps else [dep_name] deps[dep_store_target] = deps[dep_store_target] + [dep_name] if dep_store_target in deps else [dep_name] else: - if dep_version.startswith("/"): - store_package, store_version = utils.parse_pnpm_name(dep_version[1:]) - else: - store_package = dep_name - store_version = dep_version + store_package, store_version = utils.parse_pnpm_package_key(dep_name, dep_version) dep_store_target_pkg = """":{virtual_store_root}/{{}}/{virtual_store_name}/pkg".format(link_root_name)""".format( virtual_store_name = utils.virtual_store_name(store_package, store_version), virtual_store_root = utils.virtual_store_root, @@ -702,11 +694,7 @@ def _impl_links(rctx): virtual_store_root = utils.virtual_store_root, ) else: - if dep_version.startswith("/"): - store_package, store_version = utils.parse_pnpm_name(dep_version[1:]) - else: - store_package = dep_name - store_version = dep_version + store_package, store_version = utils.parse_pnpm_package_key(dep_name, dep_version) dep_store_target = """":{virtual_store_root}/{{}}/{virtual_store_name}".format(link_root_name)""".format( virtual_store_name = utils.virtual_store_name(store_package, store_version), virtual_store_root = utils.virtual_store_root, diff --git a/npm/private/npm_translate_lock_generate.bzl b/npm/private/npm_translate_lock_generate.bzl index dec52f035..688b50b37 100644 --- a/npm/private/npm_translate_lock_generate.bzl +++ b/npm/private/npm_translate_lock_generate.bzl @@ -155,17 +155,11 @@ sh_binary( virtual_store_name = utils.virtual_store_name(raw_package, "0.0.0"), virtual_store_root = utils.virtual_store_root, ) - elif raw_version.startswith("/"): - store_package, store_version = utils.parse_pnpm_name(raw_version[1:]) - dep_store_target = """"//{root_package}:{virtual_store_root}/{{}}/{virtual_store_name}".format(name)""".format( - root_package = root_package, - virtual_store_name = utils.virtual_store_name(store_package, store_version), - virtual_store_root = utils.virtual_store_root, - ) else: + store_package, store_version = utils.parse_pnpm_package_key(raw_package, raw_version) dep_store_target = """"//{root_package}:{virtual_store_root}/{{}}/{virtual_store_name}".format(name)""".format( root_package = root_package, - virtual_store_name = utils.virtual_store_name(raw_package, raw_version), + virtual_store_name = utils.virtual_store_name(store_package, store_version), virtual_store_root = utils.virtual_store_root, ) if dep_store_target not in transitive_deps: @@ -219,17 +213,11 @@ sh_binary( virtual_store_name = utils.virtual_store_name(raw_package, "0.0.0"), virtual_store_root = utils.virtual_store_root, ) - elif raw_version.startswith("/"): - store_package, store_version = utils.parse_pnpm_name(raw_version[1:]) - dep_store_target = """"//{root_package}:{virtual_store_root}/{{}}/{virtual_store_name}".format(name)""".format( - root_package = root_package, - virtual_store_name = utils.virtual_store_name(store_package, store_version), - virtual_store_root = utils.virtual_store_root, - ) else: + store_package, store_version = utils.parse_pnpm_package_key(raw_package, raw_version) dep_store_target = """"//{root_package}:{virtual_store_root}/{{}}/{virtual_store_name}".format(name)""".format( root_package = root_package, - virtual_store_name = utils.virtual_store_name(raw_package, raw_version), + virtual_store_name = utils.virtual_store_name(store_package, store_version), virtual_store_root = utils.virtual_store_root, ) if dep_store_target not in transitive_deps: diff --git a/npm/private/test/utils_tests.bzl b/npm/private/test/utils_tests.bzl index 2591b4f0f..349161efc 100644 --- a/npm/private/test/utils_tests.bzl +++ b/npm/private/test/utils_tests.bzl @@ -31,10 +31,13 @@ def test_bazel_name(ctx): ) return unittest.end(env) +# buildifier: disable=function-docstring def test_pnpm_name(ctx): env = unittest.begin(ctx) asserts.equals(env, "@scope/y/1.1.1", utils.pnpm_name("@scope/y", "1.1.1")) - asserts.equals(env, ("@scope/y", "1.1.1"), utils.parse_pnpm_name("@scope/y/1.1.1")) + asserts.equals(env, ("@scope/y", "1.1.1"), utils.parse_pnpm_package_key("@scope/y", "/@scope/y/1.1.1")) + asserts.equals(env, ("@scope/y", "registry/@scope/y/1.1.1"), utils.parse_pnpm_package_key("@scope/y", "registry/@scope/y/1.1.1")) + asserts.equals(env, ("@scope/y", "1.1.1"), utils.parse_pnpm_package_key("@scope/y", "1.1.1")) return unittest.end(env) def test_friendly_name(ctx): diff --git a/npm/private/transitive_closure.bzl b/npm/private/transitive_closure.bzl index 6a4f02684..24c1a44f5 100644 --- a/npm/private/transitive_closure.bzl +++ b/npm/private/transitive_closure.bzl @@ -38,9 +38,8 @@ def gather_transitive_closure(packages, package, no_optional): package_key = utils.pnpm_name(name, version) elif version.startswith("/"): # an aliased dependency - version = version[1:] - package_key = version - name, version = utils.parse_pnpm_name(version) + package_key = version[1:] + name, version = utils.parse_pnpm_package_key(name, version) else: package_key = version transitive_closure[name] = transitive_closure.get(name, []) @@ -68,7 +67,7 @@ def _gather_package_info(package_path, package_snapshot): if package_path.startswith("/"): # an aliased dependency package = package_path[1:] - name, version = utils.parse_pnpm_name(package) + name, version = utils.parse_pnpm_package_key("", package_path) friendly_version = utils.strip_peer_dep_or_patched_version(version) package_key = package elif package_path.startswith("file:") and utils.is_vendored_tarfile(package_snapshot): diff --git a/npm/private/utils.bzl b/npm/private/utils.bzl index 1c0c8e00c..bd1fcf9e6 100644 --- a/npm/private/utils.bzl +++ b/npm/private/utils.bzl @@ -49,12 +49,24 @@ def _pnpm_name(name, version): "Make a name/version pnpm-style name for a package name and version" return "%s/%s" % (name, version) -def _parse_pnpm_name(pnpmName): - # Parse a name/version or @scope/name/version string and return - # a (name, version) tuple. This format is found in pnpm lock file v5. - segments = pnpmName.rsplit("/", 1) +def _parse_pnpm_package_key(pnpm_name, pnpm_version): + if not pnpm_version.startswith("/"): + if not pnpm_name: + fail("parse_pnpm_package_key: pnpm_name is empty for non-versioned package %s" % pnpm_version) + + return pnpm_name, pnpm_version + + # Parse a package key such as: + # /name/version + # /@scope/name/version + # registry.com/name/version + # + # return a (name, version) tuple. This format is found in pnpm lock file v5. + _, pnpm_version = pnpm_version.split("/", 1) + + segments = pnpm_version.rsplit("/", 1) if len(segments) != 2: - msg = "unexpected pnpm versioned name {}".format(pnpmName) + msg = "unexpected pnpm versioned name {}".format(pnpm_version) fail(msg) return (segments[0], segments[1]) @@ -405,7 +417,7 @@ utils = struct( bazel_name = _bazel_name, pnpm_name = _pnpm_name, assert_lockfile_version = _assert_lockfile_version, - parse_pnpm_name = _parse_pnpm_name, + parse_pnpm_package_key = _parse_pnpm_package_key, parse_pnpm_lock = _parse_pnpm_lock, friendly_name = _friendly_name, virtual_store_name = _virtual_store_name,