Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: voidzero-dev/setup-vp
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 329490f
Choose a base ref
...
head repository: voidzero-dev/setup-vp
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 2dec1e3
Choose a head ref
  • 2 commits
  • 3 files changed
  • 3 contributors

Commits on Jun 1, 2026

  1. chore(deps): update pnpm to v11.4.0 (#77)

    This PR contains the following updates:
    
    | Package | Change |
    [Age](https://docs.renovatebot.com/merge-confidence/) |
    [Adoption](https://docs.renovatebot.com/merge-confidence/) |
    [Passing](https://docs.renovatebot.com/merge-confidence/) |
    [Confidence](https://docs.renovatebot.com/merge-confidence/) |
    |---|---|---|---|---|---|
    | [pnpm](https://pnpm.io)
    ([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
    [`11.1.2` →
    `11.4.0`](https://renovatebot.com/diffs/npm/pnpm/11.1.2/11.4.0) |
    ![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.4.0?slim=true)
    |
    ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/pnpm/11.4.0?slim=true)
    |
    ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/pnpm/11.1.2/11.4.0?slim=true)
    |
    ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.2/11.4.0?slim=true)
    |
    
    ---
    
    ### Release Notes
    
    <details>
    <summary>pnpm/pnpm (pnpm)</summary>
    
    ###
    [`v11.4.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1140)
    
    [Compare
    Source](https://redirect.github.com/pnpm/pnpm/compare/v11.3.0...v11.4.0)
    
    ##### Minor Changes
    
    - Treat tarball-integrity mismatches against the lockfile as a hard
    failure by default. Previously, `pnpm install` (non-frozen) would log
    `ERR_PNPM_TARBALL_INTEGRITY`, silently re-resolve from the registry, and
    overwrite the locked integrity — which meant a compromised registry,
    proxy, or republished version could substitute attacker-controlled
    content on a clean machine even though the project shipped a committed
    lockfile.
    
    `pnpm install` now exits with `ERR_PNPM_TARBALL_INTEGRITY` and a hint
    pointing at the new opt-in flag.
    
    The only opt-in is **`pnpm install --update-checksums`** — narrowly
    scoped to refreshing the locked integrity values from what the registry
    currently serves. Mirrors yarn's flag of the same name. A warning still
    prints when the bypass takes effect so the operation is auditable.
    
    `--force` and `pnpm update` deliberately do **not** bypass the integrity
    check. They are routine refresh operations; silently overwriting a
    locked integrity in those flows would erase the protection a committed
    lockfile is supposed to provide. `--frozen-lockfile` behavior is
    unchanged. `--fix-lockfile` keeps its documented purpose (filling in
    missing lockfile entries) and is also not a bypass.
    
    - `pnpm runtime set <name> <version>` now saves the runtime to
    `devEngines.runtime` by default instead of `engines.runtime`. Pass
    `--save-prod` (or `-P`) to save it to `engines.runtime` instead
    [#&#8203;11948](https://redirect.github.com/pnpm/pnpm/issues/11948).
    
    ##### Patch Changes
    
    - Fix a credential disclosure issue where an unscoped `_authToken` (or
    `_auth`, or `username` + `_password`, or `tokenHelper`) defined in one
    source — `~/.npmrc`, `~/.config/pnpm/auth.ini`, a workspace `.npmrc`,
    CLI flags, etc. — would be sent as an `Authorization` header to
    whichever registry a different (potentially untrusted) source named. The
    same fix extends to client TLS credentials (`cert`, `key`) so they
    aren't presented to a registry their author didn't choose.
    
    pnpm now rewrites each unscoped per-registry setting (`_authToken`,
    `_auth`, `username`, `_password`, `tokenHelper`, `cert`, `key`) to its
    URL-scoped form at load time, using the `registry=` value declared in
    the same source (or the npmjs default registry if the source declares
    none). A later layer overriding `registry=` therefore cannot pull an
    unscoped credential along, because it is already pinned to the URL its
    author intended. `ca`/`cafile` are intentionally not rescoped — they're
    trust anchors, not credentials, and corporate MITM-proxy setups rely on
    them applying globally.
    
    Every rescope emits a deprecation warning telling the user where the
    setting was pinned and how to write it directly. npm has rejected
    unscoped credentials outright since `npm@9`, and pnpm intends to remove
    support in a future major release. To target a specific registry, write
    the setting URL-scoped (e.g. `//registry.example.com/:_authToken=...` or
    `//registry.example.com/:cert=...`).
    
    `@pnpm/network.auth-header`: removed the `defaultRegistry` parameter
    from `createGetAuthHeaderByURI` and `getAuthHeadersFromCreds`. Now that
    credentials are URL-scoped at load time, the merged `configByUri` never
    contains the empty-string "default registry" placeholder slot, so
    re-keying it onto the merged default registry is no longer needed.
    
    - Fix `pnpm deploy` crashing with `ENOENT: ... lstat
    '<deployDir>/node_modules'` when `configDependencies` declares pacquet
    (`pacquet` or `@pnpm/pacquet`). The deploy directory never installs
    config dependencies, so the install engine they designate isn't on disk
    to invoke; the nested install now skips them.
    
    - Reject git resolutions whose `commit` field is not a 40-character
    hexadecimal SHA before invoking `git`. A malicious lockfile could
    otherwise smuggle a value such as `--upload-pack=<command>` through `git
    fetch` / `git checkout`, which on SSH or local-file transports executes
    the supplied command.
    
    - Limit concurrent project manifest reads while listing large workspaces
    to avoid `EMFILE` errors.
    
    - Reject patch files whose `diff --git` headers reference paths outside
    the patched package directory. Previously a malicious `.patch` file
    added via a pull request could write, delete, or rename arbitrary files
    reachable by the user running `pnpm install`.
    
    - Improve the log message that pnpm prints after auto-adding entries to
    `minimumReleaseAgeExclude` when `minimumReleaseAge` is set without
    `minimumReleaseAgeStrict`. The message previously referred to the
    internal "loose mode" terminology, which wasn't searchable in the docs;
    it now tells the user to set `minimumReleaseAgeStrict` to `true` if they
    want these updates gated behind a prompt instead
    [#&#8203;11747](https://redirect.github.com/pnpm/pnpm/issues/11747).
    
    - Reject dependency aliases that contain path-traversal segments (such
    as `@x/../../../../../.git/hooks`) when reading them from a package
    manifest or symlinking them into `node_modules`. A malicious registry
    package could otherwise use a transitive dependency key to make `pnpm
    install` create symlinks at attacker-chosen paths outside the intended
    `node_modules` directory.
    
    - Reject `pnpm-lock.yaml` entries whose remote tarball `resolution:`
    block is missing the `integrity` field. Previously the worker that
    extracts a downloaded tarball skipped hash verification when no
    integrity was supplied and minted a fresh one from the unverified bytes,
    so an attacker who could both alter the lockfile (e.g. via a pull
    request that strips `integrity:`) and serve modified content at the
    referenced tarball URL could install a tampered package without any
    error — including under `--frozen-lockfile`. pnpm now fails closed at
    lockfile-read time with `ERR_PNPM_MISSING_TARBALL_INTEGRITY`. Git-hosted
    tarballs (`gitHosted: true` or a URL on codeload.github.com /
    bitbucket.org / gitlab.com) and `file:` tarballs are exempt — the commit
    SHA in a git-host URL and the user-controlled local path already anchor
    the bytes.
    
    - Validate `devEngines.runtime` and `engines.runtime` version ranges for
    `node`, `deno`, and `bun` when `onFail` is set to `error` or `warn`.
    Previously these settings only had an effect with `onFail: 'download'` —
    the `error` and `warn` modes silently did nothing
    [#&#8203;11818](https://redirect.github.com/pnpm/pnpm/issues/11818).
    Violations now throw `ERR_PNPM_BAD_RUNTIME_VERSION`.
    
    - Require provenance before treating trusted publisher metadata as the
    strongest trust evidence.
    
    ###
    [`v11.3.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1130)
    
    [Compare
    Source](https://redirect.github.com/pnpm/pnpm/compare/v11.2.2...v11.3.0)
    
    ##### Minor Changes
    
    - Added `pnpm stage` with `publish`, `list`, `view`, `approve`,
    `reject`, and `download` subcommands for npm staged publishing.
    - Added a new setting `trustLockfile`. When `true`, `pnpm install` skips
    the supply-chain verification pass that re-applies `minimumReleaseAge` /
    `trustPolicy='no-downgrade'` to every entry in the loaded lockfile. The
    install treats the lockfile as already-trusted — useful for
    closed-source projects where every commit comes from a trusted author.
    Defaults to `false`; verification stays on by default. Set in
    `pnpm-workspace.yaml`.
    
    Also cut the memory footprint of the verification pass itself: the
    per-(registry, name) trust-meta cache previously retained the full
    packument — dependency graphs, scripts, README, and per-version
    manifests — for the entire install. On large workspaces (`~4k` lockfile
    entries with `minimumReleaseAge` + `trustPolicy: no-downgrade` enabled)
    this could OOM CI runners with a 2GB heap cap. The cache now stores only
    the fields the trust check actually reads (`time`, per-version
    `_npmUser.trustedPublisher`, `dist.attestations.provenance`). The
    abbreviated-metadata cache is similarly projected to just the
    package-level `modified` field and the set of currently-listed version
    names. Fixes
    [#&#8203;11860](https://redirect.github.com/pnpm/pnpm/issues/11860).
    - Implemented `pnpm pkg` command natively, following `npm pkg`
    standards.
    - Implemented `pnpm repo` command natively, following `npm repo`
    standards.
    - Implemented `pnpm set-script` (alias `ss`) natively. Adds or updates
    an entry in the `scripts` field of the project manifest, supporting
    `package.json`, `package.json5`, and `package.yaml` formats.
    - Add a `skip-manifest-obfuscation` option for `pnpm pack` and `pnpm
    publish`. When enabled, the original `packageManager` field and publish
    lifecycle scripts are kept in the packed/published manifest instead of
    being stripped. The pnpm-specific `pnpm` field continues to be omitted.
    
    ##### Patch Changes
    
    - Fixed `pnpm dlx` failing with `ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND`
    when the installed package's CAS slot is missing its `package.json`.
    Observed in the wild for `pnpm dlx node@runtime:<version>` when the GVS
    slot was populated without the synthesized manifest runtime archives
    need (they don't ship a `package.json` of their own, so the synthesized
    one is the only way it gets there; an existing slot from an earlier code
    path that skipped the synthesis stays incomplete). The bin link itself
    is wired up from the resolution and remains valid, so `dlx` now falls
    back to the scopeless package name when the slot's manifest is
    unreadable — for single-bin packages (the dlx common case, including
    every `runtime:` spec) this matches what `manifest.bin` would have
    named. Multi-bin packages already require `--package=<spec> <bin>` to
    disambiguate and don't enter this code path.
    - Fixed non-determinism in `pnpm dedupe` and `pnpm install` when a
    dependency graph contains packages with transitive peer dependencies on
    each other (e.g. `@aws-sdk/client-sts` and `@aws-sdk/client-sso-oidc`)
    and `auto-install-peers` is enabled. The lockfile no longer flips
    between two equally-valid forms across consecutive runs. The root cause
    was that `resolveDependencies` pushed onto its `pkgAddresses` /
    `postponedResolutionsQueue` arrays from inside `Promise.all`-spawned
    callbacks, so completion-order timing leaked into the array order and
    downstream cyclic-peer suffix assignment. Fixes
    [#&#8203;8155](https://redirect.github.com/pnpm/pnpm/issues/8155).
    - Fixed a regression introduced by
    [#&#8203;11711](https://redirect.github.com/pnpm/pnpm/pull/11711) where
    `pnpm add <github-shorthand>` (and any other wanted-dependency whose
    alias can't be parsed from the user-supplied spec, e.g. tarball URLs or
    `pnpm/test-git-fetch#sha`) was silently dropped from the manifest update
    and from `pendingBuilds`. The alias-keyed lookup added in that PR
    couldn't find a `wantedDependency` whose `alias` was `undefined` at
    parse time but resolved to a package name only after fetching, so the
    entry never made it into `specsToUpsert`. Restored the original
    index-based pairing between `directDependencies` and
    `wantedDependencies`; the catalog-protocol preservation that PR was
    originally fixing is unaffected because it's driven by
    `rdd.catalogLookup.userSpecifiedBareSpecifier`, not by the lookup. Fixes
    the three `rebuilds dependencies` / `rebuilds specific dependencies` /
    `rebuild with pending option` failures in
    `building/commands/test/build/index.ts`.
    - Fixed `pnpm add --config` leaving orphan entries in
    `pnpm-lock.env.yaml` (the optional subdependencies of the previously
    resolved version of the updated config dependency).
    
    ###
    [`v11.2.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1122)
    
    [Compare
    Source](https://redirect.github.com/pnpm/pnpm/compare/v11.2.1...v11.2.2)
    
    ##### Patch Changes
    
    - When the install engine is delegated to pacquet via
    `configDependencies`, the user's CLI flags passed to `pnpm install`
    (e.g. `--no-runtime`, `--prod`, `--dev`, `--no-optional`,
    `--node-linker`, `--cpu`/`--os`/`--libc`, `--offline`,
    `--prefer-offline`) are now forwarded to pacquet's `install` subcommand
    verbatim. Previously pacquet was invoked with a fixed argument list, so
    flags like `--no-runtime` were silently dropped. Flag forwarding is
    gated on the command being `install`/`i`; `add`, `update`, and `dedupe`
    still don't forward (their flag surface doesn't line up with pacquet's
    `install`).
    - Fixed `pnpm up` (and `pnpm add` / `pnpm remove`) failing with
    `pacquet_package_manager::outdated_lockfile` when pacquet is declared in
    `configDependencies`. pnpm now passes `--ignore-manifest-check` to
    pacquet so its `--frozen-lockfile` check doesn't fire against the
    (pre-mutation) `package.json` pnpm hasn't written yet
    [#&#8203;11797](https://redirect.github.com/pnpm/pnpm/issues/11797).
    Requires a pacquet release that supports the flag — bump
    `PACQUET_VERSION` in the e2e tests once it ships.
    
    ###
    [`v11.2.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1121)
    
    [Compare
    Source](https://redirect.github.com/pnpm/pnpm/compare/v11.2.0...v11.2.1)
    
    ##### Patch Changes
    
    - Mark optional subdependency snapshots of config dependencies with
    `optional: true` in the env lockfile, matching how optional dependencies
    are recorded elsewhere in `pnpm-lock.yaml`. Previously, snapshots for
    the platform-specific subdeps pulled in via a config dep's
    `optionalDependencies` were written as empty objects, which was
    inconsistent with the rest of the lockfile and made it look like those
    non-host platform variants were required.
    - Fix `pickRegistryForPackage` returning the wrong registry for an
    unscoped `npm:` alias under a scoped local name. A manifest entry like
    `"@&#8203;private/foo": "npm:lodash@^1"` was routing the `lodash` fetch
    through `registries["@&#8203;private"]`, even though `lodash` is
    unscoped and doesn't live on that registry. The npm-alias branch now
    returns the alias target's own scope (or `null` for an unscoped target,
    falling through to `registries.default`) instead of leaking into the
    local key's scope.
    - Don't print "Installing config dependencies..." when config
    dependencies are already installed and nothing needs to be fetched,
    re-linked, or removed.
    
    ###
    [`v11.2.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1120)
    
    [Compare
    Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.3...v11.2.0)
    
    ##### Minor Changes
    
    - **Experimental:** Adding
    [`@pnpm/pacquet`](https://npmx.dev/package/@&#8203;pnpm/pacquet) (the
    Rust port of pnpm) to `configDependencies` in `pnpm-workspace.yaml` now
    delegates the materialization phase of `pnpm install` to the pacquet
    binary. pnpm still owns dependency resolution; pacquet only fetches and
    imports from the freshly-written lockfile. This is an opt-in preview of
    the Rust install engine
    [#&#8203;11723](https://redirect.github.com/pnpm/pnpm/issues/11723).
    
      To configure pacquet in a project, run:
    
      ```
      pnpm add @&#8203;pnpm/pacquet --config
      ```
    
    You'll see changes in `pnpm-workspace.yaml` and `pnpm-lock.yaml` that
    should be committed. If you experience any issues with pacquet, please
    let us know by mentioning this in the GitHub issue you create.
    
    - `configDependencies` now resolve and install one level of
    `optionalDependencies` declared by the config dependency, with
    `os`/`cpu`/`libc` platform filtering applied at install time. This
    unlocks the esbuild/swc-style pattern where a package ships
    platform-specific binaries via `optionalDependencies` — a config
    dependency can now do the same and have the matching binary symlinked
    next to it in the global virtual store, so
    `require('pkg-platform-arch')` from inside the config dependency
    resolves correctly.
    
    The env lockfile records all platform variants regardless of host
    platform, so it remains portable across machines. Each entry in a config
    dependency's `optionalDependencies` must declare an exact version —
    ranges and tags are rejected to keep installs reproducible.
    
    - Implement the documented `pnpm login --scope <scope>` flag. The scope
    is normalized (a leading `@` is added if missing; blank values are
    ignored) and an `@<scope>:registry=<registry>` mapping is written to the
    pnpm auth file alongside the auth token. Subsequent installs of
    `@<scope>/*` packages then route to the chosen registry. Previously
    `pnpm login --scope foo` errored with `Unknown option: 'scope'` despite
    the flag being listed in the online documentation
    [#&#8203;11716](https://redirect.github.com/pnpm/pnpm/issues/11716).
    
    - `pnpm outdated` and `pnpm update --interactive` now report Node.js,
    Deno, and Bun runtimes installed as project dependencies (`runtime:`
    specifiers). Previously these were silently skipped.
    
    ##### Patch Changes
    
    - Fix `cafile=<relative-path>` in `.npmrc` being read from the wrong
    directory when pnpm is invoked from a different cwd (e.g. `pnpm --dir
    <project> install` from a CI wrapper or monorepo script). The path is
    now resolved against the directory of the `.npmrc` that declared it, not
    `process.cwd()`. Before this fix the CA file silently failed to load —
    the install proceeded without the configured CA and the user only saw
    TLS errors against a private registry, with no log line tying back to
    the wrongly resolved path
    [#&#8203;11624](https://redirect.github.com/pnpm/pnpm/issues/11624).
    
    - Fix `config.registry` getting a trailing slash appended when
    `registry` is set in `.npmrc` and no `registries.default` is provided by
    `pnpm-workspace.yaml`. The sync from `registries.default` to
    `config.registry` introduced in
    [#&#8203;11744](https://redirect.github.com/pnpm/pnpm/issues/11744) now
    only fires when the workspace manifest actually contributes a different
    default.
    
    - Fix global add/update to handle minimumReleaseAge policy violations
    instead of surfacing an internal resolver guardrail error.
    
    - Fix two crashes with `injectWorkspacePackages: true` when the lockfile
    has been pruned (e.g. by `turbo prune --docker`):
    
    - `Cannot use 'in' operator to search for 'directory' in undefined`: a
    peer-dependency-variant injected snapshot inherits its `resolution` from
    the base `packages:` entry; when a pruner drops that base entry the
    readers crash. `convertToLockfileObject` now reconstructs the directory
    resolution from the `file:` depPath at load time — a single
    normalization point, so every reader sees a fully-formed snapshot.
    - `ERR_PNPM_ENOENT` on `node_modules/.bin/<tool>`: after
    `prepare`/`postinstall`, `runLifecycleHooksConcurrently` re-imported
    each injected workspace package; the `scanDir`-into-`filesMap`
    workaround fed target-internal paths to the importer, which the
    `makeEmptyDir` fast path
    ([#&#8203;11088](https://redirect.github.com/pnpm/pnpm/issues/11088))
    then wiped. Drop the workaround and pass `keepModulesDir: true` so the
    importer preserves the target's existing `node_modules` (bin links +
    transitive deps) and source files keep their hardlinks.
    
    - Fixed `pnpm login` and `pnpm logout` ignoring `registries.default`
    from `pnpm-workspace.yaml`
    [#&#8203;10099](https://redirect.github.com/pnpm/pnpm/issues/10099).
    
    - Fix the `minimumReleaseAge` (publishedBy) maturity shortcut to be
    inclusive at the cutoff. Previously, abbreviated metadata whose
    `modified` field equalled the cutoff fell off the fast path and
    triggered a full-metadata re-fetch (or a `MISSING_TIME` error when full
    metadata wasn't permitted). Since `modified` is an upper bound on every
    version's publish time, `modified == publishedBy` already implies every
    version passes the per-version `<=` filter in
    `filterPkgMetadataByPublishDate`, so the shortcut now accepts the
    boundary case directly. Strictly `>` (was `>=`) at the rejection branch.
    
    - Honor `publishConfig.access` when publishing packages.
    
    ###
    [`v11.1.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1113)
    
    [Compare
    Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.2...v11.1.3)
    
    ##### Patch Changes
    
    - `pnpm install` now re-validates `pnpm-lock.yaml` entries against the
    active `minimumReleaseAge` and `trustPolicy: 'no-downgrade'` policies
    before any tarball is fetched. Lockfiles resolved elsewhere (committed
    to the repo, restored from a CI cache, produced by an older pnpm) under
    a weaker or absent policy can no longer install a freshly-published or
    trust-downgraded version silently. Violating entries abort the install
    with `ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION`,
    `ERR_PNPM_TRUST_DOWNGRADE`, or the generic
    `ERR_PNPM_LOCKFILE_RESOLUTION_VERIFICATION` when both policies trip in
    the same batch; `minimumReleaseAgeExclude` and `trustPolicyExclude` are
    honored. Verification results are cached so repeat installs against an
    unchanged lockfile take a fast path, and pnpm shows a transient progress
    line while the registry round-trip runs.
    
    When fresh resolution picks an immature version, the behavior depends on
    `minimumReleaseAgeStrict`:
    
    - **Loose mode** — the default, in effect whenever `minimumReleaseAge`
    keeps its built-in 24-hour value — auto-adds the immature picks to
    `minimumReleaseAgeExclude` in `pnpm-workspace.yaml` and lets the install
    proceed. A single info message lists what was persisted.
    - **Strict mode** in an interactive terminal collects every immature
    direct AND transitive pick in one pass and prompts once with the full
    list. Approving adds them to `minimumReleaseAgeExclude` and the install
    continues; declining aborts before the lockfile, `package.json`, or
    `node_modules` is touched.
    - **Strict mode** in CI (or any non-TTY context) aborts with
    `ERR_PNPM_NO_MATURE_MATCHING_VERSION` listing every offending entry,
    instead of failing on the first one the resolver hit.
    
    `minimumReleaseAgeStrict` auto-enables whenever the user explicitly sets
    `minimumReleaseAge` (CLI flag, env var, global `config.yaml`, or
    `pnpm-workspace.yaml`); set `minimumReleaseAgeStrict: false` to keep
    loose-mode auto-collect even with an explicit `minimumReleaseAge` value.
    Closes
    [#&#8203;10438](https://redirect.github.com/pnpm/pnpm/issues/10438),
    [#&#8203;10488](https://redirect.github.com/pnpm/pnpm/issues/10488),
    [#&#8203;11687](https://redirect.github.com/pnpm/pnpm/issues/11687).
    
    - Allow redundant trailing base64 padding in `.npmrc` auth values and
    report invalid auth base64 with a pnpm error.
    
    - Make `pnpm self-update` respect `minimumReleaseAge` (and
    `minimumReleaseAgeExclude`) when resolving which pnpm version to
    install.
    
    When the `latest` dist-tag points to a version newer than the configured
    age threshold, `self-update` now selects the newest mature version
    instead unless excluded by `minimumReleaseAgeExclude`.
    
    Also makes `dlx` and `outdated` surface invalid
    `minimumReleaseAgeExclude` patterns under the same
    `ERR_PNPM_INVALID_MINIMUM_RELEASE_AGE_EXCLUDE` error code already used
    by `install`, instead of leaking the internal
    `ERR_PNPM_INVALID_VERSION_UNION` /
    `ERR_PNPM_NAME_PATTERN_IN_VERSION_UNION` codes.
    
    - Global installs respect global config build policy (e.g.,
    `dangerouslyAllowAllBuilds` from config.yaml) when GVS is enabled
    [#&#8203;9249](https://redirect.github.com/pnpm/pnpm/issues/9249).
    
    The global virtual-store (GVS) default `allowBuilds = {}` was applied
    before workspace manifest settings were read and before global config
    values (stripped by `extractAndRemoveDependencyBuildOptions`) were
    re-applied via `globalDepsBuildConfig`. This caused
    `hasDependencyBuildOptions` to return `true` (because `{}` is not null),
    blocking restoration of global config values like
    `dangerouslyAllowAllBuilds`. As a result, global installs skipped all
    build scripts even when the config explicitly allowed them.
    
    This fix moves the GVS default to **after** workspace manifest reading
    and `globalDepsBuildConfig` re-application, so that:
    
      1. Workspace manifest `allowBuilds` takes precedence (if present)
    2. Global config `dangerouslyAllowAllBuilds` is properly restored (if
    set and no workspace policy exists)
    3. Empty `{}` is only applied as a last resort when no policy is
    configured anywhere
    
    - Honor `--silent` when `verifyDepsBeforeRun: install` auto-installs
    dependencies before `pnpm run` or `pnpm exec`, preventing install output
    from being written to stdout
    [#&#8203;11636](https://redirect.github.com/pnpm/pnpm/issues/11636).
    
    - Fix lockfile parsing failures when `pnpm-lock.yaml` contains CRLF line
    endings and multiple YAML documents
    [#&#8203;11612](https://redirect.github.com/pnpm/pnpm/issues/11612).
    
    - Anchor the side-effects-cache key and global-virtual-store hash to the
    project's script-runner Node — `engines.runtime` pin when present, shell
    `node` otherwise — instead of pnpm's own runtime.
    
    `ENGINE_NAME` (the `<platform>;<arch>;node<major>` prefix used as the
    side-effects-cache key and the engine portion of the GVS hash) was
    computed from `process.version` — the Node that runs pnpm itself. That
    was wrong in two situations:
    
    1. **`@pnpm/exe` SEA bundle.** The bundle has its own embedded Node, not
    the `node` on the user's `PATH` that actually spawns lifecycle scripts.
    Two pnpm installations on the same machine (one SEA, one npm-package)
    therefore disagreed on the cache key, partitioning the side-effects
    cache and the global virtual store across two Node majors even though
    both installs would run scripts on the same shell `node`.
    2. **`engines.runtime` / `devEngines.runtime` pin.** When a project pins
    a Node version via `devEngines.runtime` (pnpm v11+), pnpm downloads that
    Node into `node_modules/node/` and uses it to run lifecycle scripts. But
    the hash still anchored to whichever Node ran pnpm itself, not to the
    pinned Node — so two installs of the same project with two different
    runner Nodes would still disagree on the GVS slot path even though
    scripts run on the same pinned Node.
    
      Three changes:
    
    - `@pnpm/engine.runtime.system-node-version` now exports
    `engineName(nodeVersion?)`. Resolves the version in this order: explicit
    override → `getSystemNodeVersion()` (which already prefers `node
    --version` over `process.version` in SEA contexts) → `process.version`.
    - `@pnpm/deps.graph-hasher` now exports
    `findRuntimeNodeVersion(snapshotKeys)` — scans an iterable of lockfile
    snapshot keys for a `node@runtime:<version>` entry and returns its bare
    version string. `calcDepState` and
    `calcGraphNodeHash`/`iterateHashedGraphNodes` accept a `nodeVersion?`
    (in the options bag for the first, as a trailing parameter / ctx field
    for the others), forwarded to `engineName()`. The default (no override)
    preserves the pre-change behaviour. The legacy `ENGINE_NAME` constant in
    `@pnpm/constants` is unchanged so external consumers and existing tests
    keep working; in non-SEA, non-pinned contexts every value lines up.
    - Every install-side caller of the graph-hasher
    (`@pnpm/installing.deps-resolver`, `@pnpm/installing.deps-restorer`,
    `@pnpm/installing.deps-installer`, `@pnpm/building.during-install`,
    `@pnpm/building.after-install`, `@pnpm/deps.graph-builder`) now derives
    the project's pinned runtime via
    `findRuntimeNodeVersion(Object.keys(graph))` once per invocation and
    threads it through.
    
      On upgrade, two one-time GVS slot churns are possible:
    
    - **SEA-pnpm users** without a runtime pin: slots that previously hashed
    under the embedded-Node major (e.g. `node26`) now hash under the
    shell-Node major (e.g. `node24`), matching what pacquet, the
    npm-published `pnpm` package, and any other pnpm-compatible tool already
    produce.
    - **Projects with a `devEngines.runtime` pin**: slots that previously
    hashed under the runner's Node major now hash under the pinned Node
    major, matching what the lifecycle scripts will actually run on.
    
      In both cases the old slots become prune-eligible.
    
    - Resolve the GVS hash's engine portion per-snapshot when a dependency
    declares its own `engines.runtime`, instead of using an install-wide
    value.
    
    Pnpm's resolver desugars a dep's `engines.runtime` into
    `dependencies.node: 'runtime:<version>'`, and the bin linker spawns that
    dep's lifecycle scripts through the pinned Node downloaded into
    `<pkgDir>/node_modules/node/`. The GVS hash and the side-effects-cache
    key prefix were still anchored to the install-wide runtime — so a
    pinning snapshot's slot encoded the wrong Node major, and a reinstall on
    the same host could read the cached side-effects under a key whose
    `<platform>;<arch>;node<major>` triple disagreed with the Node the build
    actually ran on.
    
    Per-snapshot resolution now matches what `bins/linker` already does on a
    per-package basis:
    
    - `@pnpm/deps.graph-hasher` adds `readSnapshotRuntimePin(children)` —
    reads the `node` entry from one snapshot's graph children and extracts
    the version from a `node@runtime:` value. Pairs with the existing
    `findRuntimeNodeVersion(snapshotKeys)` install-wide fallback (also now
    exported from `@pnpm/deps.graph-hasher` rather than
    `@pnpm/engine.runtime.system-node-version`, where it was a poor fit —
    `system-node-version` is about probing the host Node, not parsing
    lockfile-derived strings).
    - `calcDepState` and `calcGraphNodeHash` consult
    `readSnapshotRuntimePin(graph[depPath].children)` first and only fall
    back to the install-wide `nodeVersion` parameter when the snapshot
    doesn't pin its own Node.
    
    Pacquet mirrors the same precedence at the `calc_graph_node_hash` call
    site in `package-manager/src/virtual_store_layout.rs` — a new
    `find_own_runtime_node_major(snapshot)` helper reads each snapshot's
    `dependencies` for a `node` entry with `Prefix::Runtime` and overrides
    the install-wide engine when present.
    
    On upgrade, snapshots of dependencies that declare their own
    `engines.runtime` re-hash under that dep's pinned Node instead of the
    install-wide value. The old slots become prune-eligible. Closes
    [#&#8203;11690](https://redirect.github.com/pnpm/pnpm/issues/11690).
    
    - Fixed `pnpm publish` failing with a 404 when authentication relied on
    OIDC trusted publishing alongside an `.npmrc` written by
    `actions/setup-node` (`_authToken=${NODE_AUTH_TOKEN}`) without
    `NODE_AUTH_TOKEN` being set. Unresolved `${VAR}` placeholders in auth
    values are now treated as empty rather than passed through verbatim, so
    the literal placeholder no longer surfaces as a bearer token when OIDC
    fallback is the intended auth source
    [#&#8203;11513](https://redirect.github.com/pnpm/pnpm/issues/11513).
    
    - Fix `devEngines.packageManager` (singular form, without `onFail`)
    defaulting to `onFail: "error"` instead of the documented `pmOnFail:
    "download"`. As a result, a project that pinned a different pnpm version
    via `devEngines.packageManager` and ran `pnpm install` from a mismatched
    pnpm version failed with a hard error, even though the migration table
    from `managePackageManagerVersions: true` to `pmOnFail: download
    (default)` promises the install would auto-download the wanted version
    [#&#8203;11676](https://redirect.github.com/pnpm/pnpm/issues/11676).
    
    The array form of `devEngines.packageManager` keeps its existing
    per-element defaults (`error` for the last entry, `ignore` for the
    rest), since those reflect explicit prioritization by the user. Explicit
    `onFail` values continue to win.
    
    - Fix `devEngines.packageManager` not writing
    `packageManagerDependencies` to `pnpm-lock.yaml` when the lockfile lacks
    an env-doc entry. Previously the lockfile sync skipped resolution unless
    an existing `packageManagerDependencies.pnpm` entry needed refreshing,
    so a fresh install without `onFail: "download"` left the resolved pnpm
    version unrecorded — contradicting the documented behavior that the
    resolved version is stored in `pnpm-lock.yaml`
    [#&#8203;11674](https://redirect.github.com/pnpm/pnpm/issues/11674).
    
    - Warn when `package.json` contains a legacy `pnpm` field with settings
    pnpm no longer reads from `package.json` (e.g. `pnpm.overrides`,
    `pnpm.patchedDependencies`). Previously these were silently ignored
    after the upgrade from v10, leaving users unaware that their
    overrides/patched dependencies had stopped taking effect
    [#&#8203;11677](https://redirect.github.com/pnpm/pnpm/issues/11677).
    
    </details>
    
    ---
    
    ### Configuration
    
    📅 **Schedule**: (in timezone Asia/Shanghai)
    
    - Branch creation
      - "before 10am on the first day of the month"
    - Automerge
      - At any time (no schedule defined)
    
    🚦 **Automerge**: Enabled.
    
    ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
    rebase/retry checkbox.
    
    🔕 **Ignore**: Close this PR and you won't be reminded about this update
    again.
    
    ---
    
    - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
    this box
    
    ---
    
    This PR was generated by [Mend Renovate](https://mend.io/renovate/).
    View the [repository job
    log](https://developer.mend.io/github/voidzero-dev/setup-vp).
    
    <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDIuMSIsInVwZGF0ZWRJblZlciI6IjQzLjIwMi4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
    
    Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
    renovate[bot] authored Jun 1, 2026
    Configuration menu
    Copy the full SHA
    4afd5a7 View commit details
    Browse the repository at this point in the history
  2. chore(deps): update dependency socketdev/sfw-free to v1.12.0 (#76)

    This PR contains the following updates:
    
    | Package | Update | Change |
    |---|---|---|
    | [SocketDev/sfw-free](https://redirect.github.com/SocketDev/sfw-free) |
    minor | `v1.11.0` → `v1.12.0` |
    
    ---
    
    ### Release Notes
    
    <details>
    <summary>SocketDev/sfw-free (SocketDev/sfw-free)</summary>
    
    ###
    [`v1.12.0`](https://redirect.github.com/SocketDev/sfw-free/releases/tag/v1.12.0)
    
    [Compare
    Source](https://redirect.github.com/SocketDev/sfw-free/compare/v1.11.0...v1.12.0)
    
    ### Socket Firewall Free v1.12.0
    
    Binary releases for sfw-free.
    
    #### Changelog
    
    ##### Bug Fixes
    
    - **purl/parse:** allow npm staged-publishing /-/stage endpoints
    ([#&#8203;123](https://redirect.github.com/SocketDev/sfw-free/issues/123))
    ([`5f4ed9a`](https://redirect.github.com/SocketDev/sfw-free/commit/5f4ed9a))
    
    ##### Other
    
    - Test improvements
    
    </details>
    
    ---
    
    ### Configuration
    
    📅 **Schedule**: (in timezone Asia/Shanghai)
    
    - Branch creation
      - "before 10am on monday"
    - Automerge
      - At any time (no schedule defined)
    
    🚦 **Automerge**: Enabled.
    
    ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
    rebase/retry checkbox.
    
    🔕 **Ignore**: Close this PR and you won't be reminded about this update
    again.
    
    ---
    
    - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
    this box
    
    ---
    
    This PR was generated by [Mend Renovate](https://mend.io/renovate/).
    View the [repository job
    log](https://developer.mend.io/github/voidzero-dev/setup-vp).
    
    <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDIuMSIsInVwZGF0ZWRJblZlciI6IjQzLjIwMi4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
    
    ---------
    
    Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: MK (fengmk2) <fengmk2@gmail.com>
    3 people authored Jun 1, 2026
    Configuration menu
    Copy the full SHA
    2dec1e3 View commit details
    Browse the repository at this point in the history
Loading