Repository navigation
fix(deps): raise the undici override floor to 8.10.2, jsdom's own floor - #1869
Merged
Merged
Conversation
Coverage Report
File CoverageNo changed files found. |
jsdom 30.1.1 declares undici ^8.10.2, but the `undici@>=7.0.0` override replaced each dependent's declared range with its own `^8.9.0`, so pnpm kept reusing the 8.10.0 already in the lockfile and jsdom ran below its floor. Nothing warned, and Renovate cannot catch it: its dashboard lists the overrides with no pending update because `^8.9.0` is still satisfied, and lockFileMaintenance is off. 8.10.2 is also the release that patches GHSA-vp8m-p9jh-q5pm (undici >=8.10.0 <8.10.2, high) and ten sibling advisories, so 8.10.0 was the vulnerable line, not just an old one. Dependabot has not raised an alert for it yet. Replace the `>=7.0.0` and `<6.27.0` selector pair with one `undici@<8.10.2: ^8.10.2`. pnpm applies a `pkg@range` override to every declared range that overlaps the selector, so the pair left a gap: a dependent declaring ^6.28.0 matched neither and resolved 6.29.0 (checked against pnpm 12.8.2 with fixture packages). The single selector lifts every range that can resolve below the floor and leaves ranges already above it, jsdom's included, on their own declaration instead of clamping them to 8.x. The lockfile change is undici alone: the single copy moves from 8.10.0 to 8.11.2 for jsdom, @actions/http-client (^6.23.0), @ai-sdk/provider-utils (^7.29.0) and @semantic-release/github (^7.0.0). Closes #1847 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dawsontoth
force-pushed
the
claude/1847-undici-override-floor
branch
from
October 12, 2026 02:55
47e115f to
bd2517c
Compare
dawsontoth
marked this pull request as ready for review
October 12, 2026 02:55
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.
⊙ Problem
jsdom 30.1.1 declares undici
^8.10.2, but the tree resolved undici 8.10.0 for jsdom and every other dependent (#1847). The cause is the'undici@>=7.0.0': '^8.9.0'override inpnpm-workspace.yaml: apkg@rangeoverride replaces each dependent's own declared range, so jsdom's floor became^8.9.0and pnpm kept reusing the 8.10.0 already in the lockfile. Nothing warned. It is also a security gap, not only a floor mismatch. 8.10.2 is the release that patches GHSA-vp8m-p9jh-q5pm (high severity, affects undici>=8.10.0 <8.10.2) and ten sibling advisories. undici is dev and CI only here (jsdom in vitest, semantic-release in the release workflow), so none of this ships in the Studio bundle.💡 Solution
Replace the two undici selectors (
>=7.0.0and<6.27.0, both^8.9.0) with one'undici@<8.10.2': '^8.10.2'selector inpnpm-workspace.yaml. pnpm applies apkg@rangeoverride to every declared range that overlaps the selector, so this one key lifts every range that can resolve below 8.10.2. It leaves ranges already at or above the floor, jsdom's^8.10.2included, on their own declaration. The comment beside it records why 8.10.2 is the floor and why the selector must stay<floor.pnpm installthen resolves one copy, undici 8.11.2, for all four dependents, jsdom included. Thepnpm-lock.yamldiff touches undici only: the override block, the one undici package and its snapshot entry, and the four dependents' references to it. No other package moved, and theenginesfield (node >=22.19.0) is the same as 8.10.0's.Would Renovate have caught this? No. Its dependency dashboard (#601) lists the overrides with no pending update, because the locked 8.10.0 still satisfies
^8.9.0.lockFileMaintenanceis disabled inrenovate.json, so nothing ever re-resolved undici inside that range. 8.11.2 came out on 2026-09-24, well past Renovate's 3-dayminimumReleaseAge, and the dashboard still shows no undici update. Dependabot has no alert for GHSA-vp8m-p9jh-q5pm on this repo either; I checked the open, dismissed and fixed alerts on 2026-10-11.⚖️ Alternatives
^8.10.2. This PR's first revision did that, and gemini-code-assist found the gap it leaves. A dependent declaring a range in[6.27.0, 7.0.0)matches neither selector. Against pnpm 12.8.2 with fixture packages,^6.28.0resolved 6.29.0 under the pair and 8.11.2 under the single selector.>=7.0.0also rewrites ranges that are already above the floor (jsdom's), and would clamp any future^9dependent down to 8.x.^8.11.2). Rejected: the floor should record the requirement (jsdom's floor plus the security fix), not whatever is newest today. pnpm resolves to 8.11.2 anyway.✅ Verification
stage,pnpm-lock.yamlheld a singleundici@8.10.0, andnode_modules/jsdom/package.json(30.1.1) declares"undici": "^8.10.2".grep "^ undici@" pnpm-lock.yamlshows onlyundici@8.11.2. Resolvingundici/package.jsonfrom each dependent's own directory returns 8.11.2 for jsdom 30.1.1 (declares^8.10.2),@actions/http-client4.0.1 (^6.23.0),@ai-sdk/provider-utils5.0.53 (^7.29.0) and@semantic-release/github12.0.10 (^7.0.0).^6.23.0,^6.28.0,^7.29.0,^8.5.0,~8.10.0and^8.10.2. Under the old pair,^6.28.0escaped to 6.29.0. Under<8.10.2, all six resolved 8.11.2.~8.10.0was lifted too, which confirms pnpm matches by overlap, not subset. With no override, the fixtures split into 6.29.0, 7.30.0, 8.10.2 and 8.11.2.@vitest-environment jsdomfiles, with noMODULE_NOT_FOUNDor collection errors.tsc -b,oxlintanddprint checkall exited 0.@actions/http-clientand@ai-sdk/provider-utilsboth import cleanly from their own directories against 8.11.2. I did not dry-run semantic-release, because that needs release tokens.@actions/http-clientis first exercised on the next release.engines: node >=22.19.0constraint is new. I rejected it:stage's lockfile shows the same constraint on 8.10.0, and CI reads.nvmrc(24.21.0). Round 2, on the single selector: codex LGTM with no findings. Gemini again flagged the override comment as narrating pnpm; I cut it to the floor's reason and the<floorrule, because that rule is what keeps the next edit from reopening the gap. Cursor Muse suggested fixingAGENTS.md's stale "keep jsdom on undici 7" section, which docs(agents): stop telling agents to keep jsdom on undici 7 #1850 already rewrites. The Harper adjudicator failed both rounds because its Claude OAuth session had expired.Closes #1847
🤖 Generated with Claude Code
🤖 Generated by Claude Code (Anthropic Claude); posted via @dawsontoth.
Related PRs: #1850 overlaps (its new AGENTS.md pnpm note describes the 8.10.0 state this PR fixes and cites
'undici@>=7.0.0'as the range-key example; whichever lands second should put that in the past tense and recommend a<floorselector)Complexity: easy
Review-Coverage: authored=claude; ran=gemini,codex,cursor-muse; blocked=cursor-composer(no-receipt),domain(auth); declined=cursor-grok,cursor-kimi; rounds=2; full=1 @ bd2517c
Review-Attention: read ~3m (raised: degraded review) @ bd2517c