chore: upgrade to pnpm 12 and restore Node 20 in CI - #86
Conversation
pnpm 12's lockfile supply-chain verification resolves @jsr/* packages against the default npm registry and 404s, so the @jsr scope is declared through `registries` in pnpm-workspace.yaml while the jsr: specifiers stay unchanged. Node 20 returns to the CI matrix now that pnpm no longer requires Node 22.13.
@standardserver/aws-lambda
@standardserver/core
@standardserver/fastify
@standardserver/fetch
@standardserver/node
@standardserver/peer
@standardserver/shared
commit: |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — Tooling/CI chore: devEngines.packageManager moved from pnpm ^11 to ^12, the lockfile re-provisions pnpm 12.3.4 in self-executable form (dropping the old @pnpm/exe/@reflink dependency pair), pnpm-workspace.yaml gains a registries route mapping the @jsr scope to https://npm.jsr.io/ so pnpm 12's lockfile supply-chain verification can re-resolve the jsr:-protocol packages, Node 20 is restored to the test matrix, and a few transitive deps (eslint-plugin-jsdoc, eslint-plugin-regexp, @eslint/plugin-kit, postcss, browserslist data) are refreshed within their existing ranges.
I verified the two load-bearing claims directly on pnpm 12.3.4: pnpm i --frozen-lockfile passes the supply-chain check over all 835 lockfile entries, and a fresh pnpm i from an empty node_modules resolves the @jsr specifiers without ERR_PNPM_META_FETCH_FAIL — neither run rewrites the lockfile. The registries shape matches pnpm's documented URL-keyed form, and pnpm/action-setup@v6 does read devEngines.packageManager, so the "no workflow change needed" claim holds.
ℹ️ Node 20 is EOL
Node 20 hit end-of-life on 2026-04-30, so this restores an unsupported runtime to the matrix. Keeping it is defensible — consumers running the library on Node 20 are precisely who gain coverage — but the PR's stated rationale is "unblocked by pnpm 12", not "Node 20 is a supported target", and no workspace package declares an engines field to pin a support contract. If broader old-runtime coverage is the goal, pnpm 12 (engines >=18.*) also enables a Node 18 leg.
Technical details
# Consider the EOL Node 20 matrix leg
## Context
- `.github/workflows/ci.yaml:30` — `node-version: [26, 24, 22, 20]`.
- Node 20 maintenance LTS ended 2026-04-30; no security fixes thereafter.
- No `engines` field in root `package.json` or any workspace package.
## Open questions for the human
- Keep the Node 20 leg for downstream-compat confidence, or use the slot for Node 18 (now supported by pnpm 12)?DeepSeek Flash (default — pick a model for stronger reviews) | 𝕏

Moves the workspace from pnpm 11 to pnpm 12 and puts Node 20 back into the CI test matrix. pnpm 12 verifies every lockfile entry against its supply-chain policies before installing, and that pass looks
@jsr/*packages up on the default npm registry, which 404s and aborts every install. The JSR scope is now declared through theregistriessetting in pnpm-workspace.yaml, so the existingjsr:specifiers keep working unchanged.Changes
devEngines.packageManagerrequires pnpm^12.0.0; the lockfile records pnpm 12.3.4 as the self-provisioned package manager.pnpm/action-setupreads the same field, so CI needs no workflow change for it.registriesmaps the@jsrscope to https://npm.jsr.io/, the registry thejsr:protocol already resolves through internally. Without it pnpm 12 fails withERR_PNPM_META_FETCH_FAILon@jsr/std__assertbefore fetching anything. pnpm 12 rejects the.npmrc-style@jsr:registrykey in the workspace file as unrecognized, so this is the supported workspace form.Testing
pnpm installwith pnpm 12.3.4 from an emptynode_modulespasses the supply-chain check and installs 735 packages;--frozen-lockfileis clean afterwards.pnpm runtime set node 20, the same way the CI job runs it: vitest 1082 tests in 59 files, Bun 50 tests, Deno 4 suites with 50 steps, all passing. Same result on Node 24.20.0.pnpm run lintandpnpm run type:checkpass.