{ lib, stdenvNoCC, writeScript, fetchPnpmDeps, pnpmConfigHook, fetchurl, installShellFiles, nodejs, testers, buildPackages, bashNonInteractive, tests, withNode ? true, version, hash, }: let majorVersion = lib.versions.major version; in stdenvNoCC.mkDerivation (finalAttrs: { pname = "pnpm"; inherit version; src = fetchurl { url = "https://registry.npmjs.org/pnpm/-/pnpm-${finalAttrs.version}.tgz"; inherit hash; }; nativeBuildInputs = [ installShellFiles nodejs ]; buildInputs = [ bashNonInteractive # needed for node-gyp wrapper script ] ++ lib.optionals withNode [ nodejs ]; # Remove binary files from src, we don't need them, and this way we make sure # our distribution is free of binaryNativeCode postUnpack = '' rm -r package/dist/reflink.*node package/dist/vendor ''; installPhase = let # Use ESM pnpm for versions > 11 ext = if lib.versionOlder finalAttrs.version "11" then "cjs" else "mjs"; in '' runHook preInstall install -d $out/{bin,libexec} cp -R . $out/libexec/pnpm ln -s $out/libexec/pnpm/bin/pnpm.${ext} $out/bin/pnpm ln -s $out/libexec/pnpm/bin/pnpx.${ext} $out/bin/pnpx runHook postInstall ''; postInstall = if lib.toInt (lib.versions.major version) < 9 then '' export HOME="$PWD" node $out/bin/pnpm install-completion bash node $out/bin/pnpm install-completion fish node $out/bin/pnpm install-completion zsh sed -i '1 i#compdef pnpm' .config/tabtab/zsh/pnpm.zsh installShellCompletion \ .config/tabtab/bash/pnpm.bash \ .config/tabtab/fish/pnpm.fish \ .config/tabtab/zsh/pnpm.zsh '' else '' node $out/bin/pnpm completion bash >pnpm.bash node $out/bin/pnpm completion fish >pnpm.fish node $out/bin/pnpm completion zsh >pnpm.zsh sed -i '1 i#compdef pnpm' pnpm.zsh installShellCompletion pnpm.{bash,fish,zsh} ''; passthru = let pnpm' = buildPackages."pnpm_${lib.versions.major version}"; in { fetchDeps = lib.warn "pnpm.fetchDeps: The package attribute is deprecated. Use the top-level fetchPnpmDeps attribute instead" ( { ... }@args: fetchPnpmDeps ( args // { pnpm = pnpm'; } ) ); configHook = lib.warn "pnpm.configHook: The package attribute is deprecated. Use the top-level pnpmConfigHook attribute instead" ( pnpmConfigHook.overrideAttrs (prevAttrs: { propagatedBuildInputs = prevAttrs.propagatedBuildInputs or [ ] ++ [ pnpm' ]; }) ); inherit nodejs majorVersion; tests = { inherit (tests) pnpm; version = lib.optionalAttrs withNode (testers.testVersion { package = finalAttrs.finalPackage; }); }; updateScript = writeScript "pnpm-update-script" '' #!/usr/bin/env nix-shell #!nix-shell -i bash -p curl jq common-updater-scripts set -eou pipefail curl_github() { curl -L ''${GITHUB_TOKEN:+" -u \":$GITHUB_TOKEN\""} "$@" } latestTag=$( curl_github https://api.github.com/repos/pnpm/pnpm/releases?per_page=100 | \ jq -r --arg major "v${majorVersion}" \ '[.[] | select(.tag_name | startswith($major)) | select(.prerelease == false)][0].tag_name' ) # Exit if there is no tag with this major version if [ "$latestTag" = "null" ]; then echo "No releases starting with v${majorVersion}" exit 0 fi latestVersion="''${latestTag#v}" update-source-version pnpm_${majorVersion} "$latestVersion" --file=./pkgs/development/tools/pnpm/default.nix ''; }; strictDeps = true; __structuredAttrs = true; dontBuild = true; dontConfigure = true; meta = { description = "Fast, disk space efficient package manager for JavaScript"; homepage = "https://pnpm.io/"; changelog = "https://github.com/pnpm/pnpm/releases/tag/v${finalAttrs.version}"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ Scrumplex gepbird ]; platforms = lib.platforms.all; mainProgram = "pnpm"; }; })