nodejsLockUtils: fix computing parent path for workspace packages

This commit is contained in:
DavHau 2024-08-01 22:40:22 +07:00 committed by mergify[bot]
parent 64fbb0f415
commit 3fd4c14d36
2 changed files with 25 additions and 23 deletions

View File

@ -1,11 +1,15 @@
{lib, ...}: let
# path = node_modules/@org/lib/node_modules/bar
stripPath = path: let
split = lib.splitString "node_modules/" path; # = [ "@org/lib" "bar" ]
suffix = "node_modules/${lib.last split}"; # = "node_modules/bar"
nextPath = lib.removeSuffix suffix path; # = "node_modules/@org/lib/node_modules/bar";
parentPath = path: let
# noPackages = lib.removePrefix "packages/" path;
packages = lib.splitString "node_modules/" path; # = [ "@org/lib" "bar" ]
nextPath = lib.concatStringsSep "node_modules/" (lib.init packages);
in
lib.removeSuffix "/" nextPath;
lib.removeSuffix "/" (
if path == nextPath
then ""
else nextPath
);
findEntry =
# = "attrs"
@ -22,7 +26,8 @@
searchPath
else if currentPath == ""
then throw "${search} not found in package-lock.json."
else findEntry packageLock (stripPath currentPath) search;
# if the package cannot be found as a sub-dependency, check the parent
else findEntry packageLock (parentPath currentPath) search;
in {
inherit findEntry stripPath;
inherit findEntry parentPath;
}

View File

@ -4,35 +4,32 @@
nodejsLockUtils ? import ../../../lib/internal/nodejsLockUtils.nix {inherit lib;},
}: {
# test the path strip function
test_nodejsLockUtils_stripPath_simple = let
nextPath = nodejsLockUtils.stripPath "node_modules/@org/lib/node_modules/bar";
in {
expr = nextPath;
test_nodejsLockUtils_parentPath_simple = {
expr = nodejsLockUtils.parentPath "node_modules/@org/lib/node_modules/bar";
expected = "node_modules/@org/lib";
};
test_nodejsLockUtils_stripPath_root = let
nextPath = nodejsLockUtils.stripPath "node_modules/bar";
in {
expr = nextPath;
test_nodejsLockUtils_parentPath_root = {
expr = nodejsLockUtils.parentPath "node_modules/bar";
# The root
expected = "";
};
test_nodejsLockUtils_stripPath_empty = let
nextPath = nodejsLockUtils.stripPath "";
in {
expr = nextPath;
test_nodejsLockUtils_parentPath_empty = {
expr = nodejsLockUtils.parentPath "";
expected = "";
};
test_nodejsLockUtils_stripPath_complex = let
nextPath = nodejsLockUtils.stripPath "node_modules/@org/lib/node_modules/bar/node_modules/foo";
in {
expr = nextPath;
test_nodejsLockUtils_parentPath_complex = {
expr = nodejsLockUtils.parentPath "node_modules/@org/lib/node_modules/bar/node_modules/foo";
expected = "node_modules/@org/lib/node_modules/bar";
};
test_nodejsLockUtils_parentPath_local_package = {
expr = nodejsLockUtils.parentPath "packages/foo";
expected = "";
};
# test the resolve function
test_nodejsLockUtils_findEntry_argparse = let
plock = builtins.fromJSON (builtins.readFile ./package-lock.json);