[Backport release-26.05] pnpmConfigHook: add support for __structuredAttrs = true (#530524)

This commit is contained in:
Gergő Gutyina 2026-07-03 09:50:58 +00:00 committed by GitHub
commit 79042903ee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 120 additions and 7 deletions

View file

@ -80,12 +80,13 @@ pnpmConfigHook() {
fi
echo "Installing dependencies"
if [[ -n "$pnpmWorkspaces" ]]; then
local IFS=" "
for ws in $pnpmWorkspaces; do
pnpmInstallFlags+=("--filter=$ws")
done
fi
local -a pnpmWorkspacesArray
concatTo pnpmWorkspacesArray pnpmWorkspaces
for ws in "${pnpmWorkspacesArray[@]}"; do
pnpmInstallFlags+=("--filter=$ws")
done
runHook prePnpmInstall

View file

@ -1,7 +1,8 @@
{ callPackage }:
{ callPackage, lib }:
{
pnpm-empty-lockfile = callPackage ./pnpm-empty-lockfile { };
pnpm-fixup-state-db = callPackage ./pnpm-fixup-state-db { };
pnpm-workspaces = lib.recurseIntoAttrs (callPackage ./pnpm-workspaces { });
pnpm_11_v3 = callPackage ./pnpm_11_v3 { };
pnpm_11_v4 = callPackage ./pnpm_11_v4 { };
}

View file

@ -0,0 +1,57 @@
{
stdenv,
fetchPnpmDeps,
pnpm,
pnpmConfigHook,
testers,
}:
let
mkTest =
{ structuredAttrs }:
stdenv.mkDerivation (finalAttrs: {
name = "pnpm-workspaces-${if structuredAttrs then "structured" else "legacy"}";
src = ./src;
pnpmDeps = testers.invalidateFetcherByDrvHash fetchPnpmDeps {
pname = "pnpm-workspaces";
inherit (finalAttrs) src pnpmWorkspaces;
inherit pnpm;
fetcherVersion = 4;
hash = "sha256-dIp6CNh1Kn4aqJWku1G/FUdn/u+epzhqlqwnAkB2uW0=";
};
pnpmWorkspaces = [
"@pnpm-workspaces-test/a"
"@pnpm-workspaces-test/b"
];
__structuredAttrs = structuredAttrs;
nativeBuildInputs = [
pnpm
pnpmConfigHook
];
buildPhase = ''
runHook preBuild
for package in a b; do
if [ -e "packages/$package/node_modules/@pnpm-workspaces-test/$package-dep" ]; then
echo "$package was installed (its dependency $package-dep is linked)"
else
echo "ERROR: $package was not installed"
exit 1
fi
done
touch $out
runHook postBuild
'';
});
in
{
legacy = mkTest { structuredAttrs = false; };
structured = mkTest { structuredAttrs = true; };
}

View file

@ -0,0 +1,5 @@
{
"name": "pnpm-workspaces-test",
"version": "0.0.0",
"private": true
}

View file

@ -0,0 +1,4 @@
{
"name": "@pnpm-workspaces-test/a-dep",
"version": "0.0.0"
}

View file

@ -0,0 +1,7 @@
{
"name": "@pnpm-workspaces-test/a",
"version": "0.0.0",
"dependencies": {
"@pnpm-workspaces-test/a-dep": "workspace:*"
}
}

View file

@ -0,0 +1,4 @@
{
"name": "@pnpm-workspaces-test/b-dep",
"version": "0.0.0"
}

View file

@ -0,0 +1,7 @@
{
"name": "@pnpm-workspaces-test/b",
"version": "0.0.0",
"dependencies": {
"@pnpm-workspaces-test/b-dep": "workspace:*"
}
}

View file

@ -0,0 +1,25 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.: {}
packages/a:
dependencies:
'@pnpm-workspaces-test/a-dep':
specifier: workspace:*
version: link:../a-dep
packages/a-dep: {}
packages/b:
dependencies:
'@pnpm-workspaces-test/b-dep':
specifier: workspace:*
version: link:../b-dep
packages/b-dep: {}

View file

@ -0,0 +1,2 @@
packages:
- 'packages/*'