···4848 cleanPackage =
4949 p:
5050 if builtins.isAttrs p then
5151- lib.filterAttrs (k: v: k != "hash" && k != "version" && k != "deps" && v != null) p
5151+ let
5252+ cleaned = lib.filterAttrs (k: v: k != "hash" && k != "version" && k != "deps" && v != null) p;
5353+ # Embed version into source spec so pi treats it as pinned (e.g. npm:pi-hooks@1.0.3)
5454+ withVersion =
5555+ if p ? version && p ? source && !(lib.hasInfix "@" (lib.removePrefix "npm:" p.source)) then
5656+ cleaned // { source = "${p.source}@${p.version}"; }
5757+ else
5858+ cleaned;
5959+ in
6060+ withVersion
5261 else
5362 p;
5463