Repository navigation
deps: move to pnpm 12 and hold back releases newer than three days - #244
Merged
Merged
Conversation
pnpm 12.8.1 replaces 10.34.6. It's the newest 12.x that was two weeks old when picked, and pnpm/action-setup v6.1.0 already supports it. The lockfile works unchanged. minimumReleaseAge makes pnpm install only versions that have been on the registry for three days. pnpm 12 checks the lockfile's entries too, frozen installs included, so the 19 entries published since 2026-10-10 are listed in minimumReleaseAgeExclude until they pass on 2026-10-15. pmOnFail: ignore keeps pnpm-lock.yaml a single YAML document. pnpm 12 would otherwise put its own version in a first document, and GitHub's dependency graph reads only that one, so it would see no dependencies and close every Dependabot alert. Corepack and action-setup still pin the pnpm version.
Corepack before 0.34.5 looks for bin/pnpm.cjs, and pnpm 12 ships only bin/pnpm.mjs. Node 24.12.0 is the first 24.x to bundle Corepack 0.34.5, and 22.22.1 bundles 0.34.6, so an older Node 24 needs a newer Corepack from npm. Only pnpm 11 and later read pmOnFail. A global pnpm 10 still switches to 12.8.1, while a pnpm 11 or later installed another way runs as its own version without a warning. The last excluded version, @typescript-eslint/parser 8.71.2, was published at 17:11:57 UTC on 2026-10-12, so the list can go after 17:12 UTC on 2026-10-15. The release age paragraph now says what to do when a Dependabot security update brings a version that's under three days old.
Says when a Dependabot security pull request fails the release-age check and how to fix it, instead of implying every one fails.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
Moves the repo from pnpm 10.34.6 to pnpm 12.8.1, and turns on pnpm's release age check.
Version
pnpm 12.8.1 came out on 2026-09-28. It's the newest 12.x that was at least two weeks old when I picked it.
packageManagercarries its sha512, so Corepack checks the download. pnpm/action-setup v6.1.0, which CI already uses, supports pnpm 12.Locally, Corepack needs to be 0.34.5 or later. pnpm 12 ships only
bin/pnpm.mjs, and Corepack up to 0.34.4 looks forbin/pnpm.cjs(nodejs/corepack#776). Node 24.12.0 is the first 24.x that bundles 0.34.5, and 22.22.1 bundles 0.34.6.docs/development.mdnow says so, withnpm i -g corepack@latestfor an older Node 24.The lockfile works unchanged.
pnpm installwith pnpm 12, with and without--frozen-lockfile, leavespnpm-lock.yamlexactly as it is, so no versions change.Release age
minimumReleaseAge: 4320means pnpm only installs versions that have been on the registry for three days. pnpm's own default since 11 is one day. Two things about how pnpm 12 applies it:pnpm addandpnpm updatestop, or ask in a terminal, instead of quietly taking a newer version.pnpm-lock.yaml, on every install. A lockfile that names a version younger than three days failspnpm install --frozen-lockfilein CI withERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION.Dev's lockfile has 19 entries published between 2026-10-10 and 2026-10-12. They're vitest, @vitest/coverage-v8, @vitest/mocker and @vitest/spy 5.0.4, typescript-eslint 8.71.2 with its ten @typescript-eslint packages, @tanstack/react-virtual 3.14.17 and virtual-core 3.19.2, prettier 3.9.10 and tinybench 6.2.2. Rather than downgrade them,
minimumReleaseAgeExcludelists those exact versions. Downgrading wasn't possible for Vitest anyway, since^5.0.4allows nothing older. The last of them, @typescript-eslint/parser 8.71.2, was published at 17:11:57 UTC on 2026-10-12, so it passes the check on its own after 2026-10-15 17:12 UTC. The list stays in this PR. Its entries are exact versions, so leaving them past that date is harmless, and a follow-up removes them.The repo's own packages need no exclusion. The root and
apps/desktopnever come from the registry, and the check only applies to registry versions.Dependabot
pnpm 12 writes an extra YAML document at the top of
pnpm-lock.yamlthat records its own version. GitHub's dependency graph reads only that first document, sees no dependencies, and closes every open alert. That's dependabot/dependabot-core#15904, still open, and it also matches the warning in pnpm's lockfile docs.pmOnFail: ignorekeeps the lockfile a single document, as it is today. I checked that pnpm 12.8.1 then writes one document.The cost is that pnpm 11 and later no longer check or switch their own version. Corepack locally and pnpm/action-setup in CI already run the version
packageManagernames, so this only matters for a pnpm installed some other way. A pnpm 11 or later installed that way runs as its own version without a warning. A global pnpm 10 doesn't knowpmOnFailand still switches to 12.8.1.docs/development.mdsays to use Corepack.Other Dependabot points:
name@versiontominimumReleaseAgeExcludeon that PR's branch.docs/development.mdnow says so.Other pnpm 11 and 12 changes I checked
pnpm_config_*environment variables, notnpm_config_*. Nothing in the repo or CI sets either..npmrcnow holds only auth and registry settings. The repo has none.strictDepBuilds,blockExoticSubdepsandverifyDepsBeforeRunare on by default.strictDepBuildsalready was. Every locked package comes from the registry with an integrity hash.verifyDepsBeforeRunmakespnpm runandpnpm execinstall first whennode_modulesis out of date.pnpm-workspace.yamlit doesn't know. It reads all of ours.v10tov11, so the first install after the switch downloads the packages again.The setup-frontend action's description now mentions the age check, since a CI failure from it shows up in that step.
How it was tested
pnpm install --frozen-lockfilefrom an emptynode_modulespasses and reports all 461 lockfile entries pass the checks. Without the exclusion list it fails on the 19 entries above.pnpm lint,pnpm format:check,pnpm testwith 458 Rust core tests and 2005 frontend tests,pnpm exec tsc -b --noEmitandpnpm build:desktoppass. The pre-commit hook ran on the commit.pnpm tauri ios build --debug --target aarch64-simbuilds with pnpm 12. That includes Xcode's Build Rust Code phase, which runspnpm tauri ios xcode-script.pnpm add tinybench@^6.2.2stops because 6.2.2 is too new,pnpm add tinybench@^6.2.0picks 6.2.1, and the lockfile stays one document.I didn't run the app, so the boxes below stay unchecked.
Checklist
devpnpm lint,pnpm testandcargo clippy --workspace --all-targets -- -D warningspassUnreleasedsection ofCHANGELOG.md(tooling only, so none)