chore: upgrade pnpm 9 → 11 with supply-chain protection#235
chore: upgrade pnpm 9 → 11 with supply-chain protection#235cameronapak wants to merge 3 commits into
Conversation
- Upgrade pnpm 9.0.0 → 11.1.1 (packageManager, engines, corepack) - Add minimumReleaseAge: 4320 (3-day cooldown) to pnpm-workspace.yaml - Move overrides from package.json → pnpm-workspace.yaml (pnpm 11 requirement) - Add @internal/eslint-config and eslint-plugin-storybook as root devDeps - Add allowBuilds for esbuild, @parcel/watcher, msw - Remove version pins from CI workflows (reads from packageManager field) - Update AGENTS.md with pnpm 11 refs and supply-chain docs
|
- Bump node-version from 20 → 22 in ci.yml and storybook.yml (pnpm 11 requires Node >= 22.13) - Bump engines.node from >=20 → >=22 in package.json - Remove minimumReleaseAgeExclude — workspace packages bypass the gate inherently - Update AGENTS.md Node requirement references
|
Hey @jhampton, Can I get your feedback on this PR? Mainly around the idea of it. I just want to make sure that with the rise of supply chain attacks, that we are protected on our repos. So I just want to share this with you and let me know so that I can hear your feedback (any feedback) |
The recent news of seeing more and more supply-chain attacks via npm has caused me to want to make sure we're as secure as can be. That's what this PR does.
Summary
minimumReleaseAge: 4320(3-day cooldown) to mitigate supply-chain attacks on new package versionspackage.json→pnpm-workspace.yaml(pnpm 11 breaking change — overrides in package.json no longer enforce for auto-installed peers)pnpm/action-setup@v4now reads frompackageManagerfield (single source of truth)Changes
package.jsonpackageManager: "pnpm@11.1.1",engines.pnpm: ">=11.0.0", removedpnpm.overrides, added@internal/eslint-config+eslint-plugin-storybookas root devDepspnpm-workspace.yamlminimumReleaseAge,overrides,allowBuilds.github/workflows/ci.ymlversion: 9.0.0pins.github/workflows/release.ymlversion: 9.0.0pin.github/workflows/storybook.ymlversion: 9.0.0pinAGENTS.mdpnpm 11 breaking changes handled
pnpm-workspace.yaml(notpackage.json) to enforce for auto-installed peersallowBuildsapproval (esbuild, @parcel/watcher, msw)@internal/eslint-configandeslint-plugin-storybookmust be root devDependenciesminimumReleaseAgeblocks packages published < 3 days ago; override with--forceif needed urgentlyVerification
pnpm lint— all 7 packages passpnpm typecheck— all 6 packages passpnpm test— 88 tests pass (core: 288, hooks: 261, ui: 88)Greptile Summary
This PR upgrades pnpm 9 → 11.1.1 with supply-chain hardening: a 3-day
minimumReleaseAgecooldown,allowBuildsapproval list, andpackageManagerhash pinning via corepack. The pnpm 11 breaking change of moving overrides frompackage.jsontopnpm-workspace.yamlis handled correctly, as is the Node.js bump from 20 → 22 and the removal of hardcoded version pins from all CI workflows.pnpm.overridesmoved topnpm-workspace.yaml,allowBuildsadded foresbuild,@parcel/watcher, andmsw;@internal/eslint-configandeslint-plugin-storybookpromoted to root devDependencies for workspace resolution.minimumReleaseAge: 4320(3-day cooldown, stricter than pnpm 11's new default of 1 day) blocks packages published fewer than 3 days ago from being installed..npmrcnon-auth settings (auto-install-peers,strict-peer-dependencies,public-hoist-pattern) are silently ignored by pnpm 11 per the official migration guide and need to be moved topnpm-workspace.yaml.Confidence Score: 4/5
Safe to merge after addressing the incomplete .npmrc migration — the remaining settings are currently silently ignored by pnpm 11.
The core pnpm 11 breaking changes (overrides, allowBuilds, workspace hoisting) are handled correctly and CI passes. However,
.npmrcnon-auth settings are a documented required migration step in the pnpm 11 guide —auto-install-peers,strict-peer-dependencies, andpublic-hoist-patternare silently ignored by pnpm 11 and need to be moved topnpm-workspace.yamlbefore the migration is complete..npmrcandpnpm-workspace.yaml— the three non-auth settings from.npmrcneed to be ported topnpm-workspace.yamlas camelCase keys.Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[pnpm 11 config sources] --> B{Setting type?} B -->|Auth / registry| C[.npmrc ✅ still read] B -->|All other settings| D[pnpm-workspace.yaml ✅ read] B -->|All other settings| E[.npmrc ❌ silently ignored in pnpm 11] D --> F[minimumReleaseAge: 4320] D --> G[overrides: react, vite…] D --> H[allowBuilds: esbuild, msw…] D --> I["❌ MISSING: autoInstallPeers\nstrictPeerDependencies\npublicHoistPattern"] E --> J["auto-install-peers=true\nstrict-peer-dependencies=false\npublic-hoist-pattern[]=*eslint*\npublic-hoist-pattern[]=*prettier*\npublic-hoist-pattern[]=@types/*"] style E fill:#ffcccc,stroke:#cc0000 style I fill:#ffcccc,stroke:#cc0000 style J fill:#ffcccc,stroke:#cc0000Comments Outside Diff (1)
pnpm-lock.yaml, line 194-195 (link)@swc/coreno longer resolved as atsuppeerAcross every package (
root,packages/core,packages/hooks,packages/ui),tsup@8.5.0previously resolved with@swc/core@1.13.5as a satisfied peer; after this upgrade it resolves without it. This means tsup will now use esbuild as its transformer instead of SWC. If any package'stsup.config.tsexplicitly sets esbuildOptions or SWC-specific options, behaviour changes silently. The test suite passing is reassuring, but it's worth confirming notsup.configreferencesexperimentalDtsor similar options that behaved differently under SWC.Prompt To Fix With AI
Prompt To Fix All With AI
Reviews (3): Last reviewed commit: "Merge branch 'main' into chore/pnpm-11-u..." | Re-trigger Greptile