Skip to content

Commit

Permalink
refactor: simplify pnpm parse_pnpm_name util
Browse files Browse the repository at this point in the history
  • Loading branch information
jbedard committed Jan 16, 2024
1 parent 4aeb9fc commit 396e426
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 42 deletions.
18 changes: 3 additions & 15 deletions npm/private/npm_import.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down
20 changes: 4 additions & 16 deletions npm/private/npm_translate_lock_generate.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
5 changes: 4 additions & 1 deletion npm/private/test/utils_tests.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
7 changes: 3 additions & 4 deletions npm/private/transitive_closure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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, [])
Expand Down Expand Up @@ -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):
Expand Down
24 changes: 18 additions & 6 deletions npm/private/utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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])

Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 396e426

Please sign in to comment.