chore(web): jsdom 29.1.1 → 30.0.1 — the only landable npm major (eslint 10 + TypeScript 7 are peer-blocked upstream) [schedule: Daily agent update check] #255
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab#255
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Bump
jsdom29.1.1 → 30.0.1 inweb/package.json+web/package-lock.json. It is the only npm major in this repo's SPA that can actually land right now — the other two available majors (ESLint 10, TypeScript 7) are blocked by peer-dependency walls that are documented at the bottom of this issue so nobody re-derives them.This is a small, bounded change. The reason it gets its own issue rather than a drive-by is that jsdom 30's single breaking change is a Node.js floor bump, which has to clear two independent gates (native CI and the hermetic nix gate) — both of which have been checked below, so you do not have to.
Everything here was verified on 2026-08-01 against the npm registry, jsdom's GitHub releases, and nixpkgs at this repo's pinned
flake.lockrev.Evidence — what is behind
web/package.json:29declares"jsdom": "^29.1.1";web/package-lock.jsonresolves it to 29.1.1. Latest is 30.0.1 (published 2026-07-29).Every other direct dependency in
web/package.jsonis already at its latest published release — commit4cc17b6refreshed the in-range pins on 2026-07-31. Verified againstregistry.npmjs.orgon 2026-08-01:latestjsdom@solidjs/routersolid-jslucide-solidvitevitestvite-plugin-solidprettier@playwright/test@typescript-eslint/*,typescript-eslinteslint-plugin-solideslint,@eslint/jsmaintenancetagtypescriptSo
jsdomis the whole of the actionable work.Security
No npm advisory reaches any version in this repo's dependency tree, and jsdom 30 does not close one. Checked every direct dependency against the GitHub Advisory Database (
ecosystem=npm) on 2026-08-01; the only advisories that matched a package we use are all patched well below our pins:jsdom's only advisory (
GHSA-f4c9-cqv8-9v98) is a withdrawn 2022 entry. This bump is hygiene, not a security fix — do not describe it as one in the PR.What actually changed in jsdom 29.1.1 → 30.0.1
From jsdom's GitHub releases. The delta is two releases and it is small.
v30.0.0 (2026-07-27)
That is the entire breaking-change list — one item. Other changes, all additive or bug fixes:
v30.0.1 (2026-07-29)
Take 30.0.1, not 30.0.0 — 30.0.0 shipped a
getComputedStyle()regression that 30.0.1 fixes.Does any of it break how this repo uses jsdom?
jsdom is a devDependency only. Its sole use is as the vitest test environment —
web/vite.config.ts:29:It is never imported by
web/src/**production code, and the Playwright e2e specs underweb/e2e/run in real browsers and are excluded from vitest. So the blast radius is the vitest suite only.The one thing to watch is
getComputedStyle(). Both 30.0.0 and 30.0.1 change its behavior, and this repo has two production call sites plus a test that asserts against jsdom's implementation of it:web/src/components/ToolPanel.tsx:213—const overflowY = getComputedStyle(n).overflowY;(scroll-container walk)web/src/components/AppShell.tsx:189—const overflowX = getComputedStyle(n).overflowX;(same idiom, horizontal)web/src/components/ToolPanel.test.tsx:599— comment reads "jsdom's getComputedStyle sees it; scroll metrics stubbed (jsdom is 0)."Both call sites read
overflow-x/overflow-y, which are keyword properties (visible,auto,scroll,hidden). The 30.0.0 changes are about length values converted to pixels and CSS function serialization (calc(),var(), etc.) — neither touches keyword serialization. So this is expected to pass unchanged. Run the suite and confirm; ifToolPanel.test.tsxfails, treat it as a real finding and report it on this issue rather than loosening the assertion.Nothing in this repo calls
CSS.escape,CSS.supports,document.evaluate, or readsbackground-position-*, so the additive changes are inert.The Node.js floor — both gates already checked, both clear
jsdom 30 declares
engines: { node: "^22.22.2 || ^24.15.0 || >=26.0.0" }. Two places build the SPA:.forgejo/workflows/ci.yml:51pinsnode-version: "24"viaactions/setup-node@v4, which resolves to the newest 24.x. Currently ≥ 24.16.0. Clear.nix/package.nixbuilds thewebderivation with nixpkgs' defaultnodejs. At this repo's pinnedflake.lockrev (d407951447dc, locked 2026-07-05), nixpkgs setsnodejs = nodejs_24(pkgs/top-level/all-packages.nix:2428) andnodejs/v24.nix:26readsversion = "24.16.0". 24.16.0 ≥ 24.15.0 — clear.No
flake.lockbump is needed for this, and none should be included. Ifnpm installerrors withEBADENGINE, that contradicts the check above — stop and report it here rather than adding--forceor anenginesoverride.Scope
web/package.json:29"jsdom": "^29.1.1"→"^30.0.1"web/package-lock.jsonnpm install, committed in the same commitThat is all. No nix hash to regenerate — unlike the Go side's
vendorHash, the SPA derivation usesimportNpmLock(nix/package.nix:74-75), and the comment atnix/package.nix:67-68states it outright: "importNpmLock derives per-package fetches from web/package-lock.json directly — no npmDepsHash to keep in sync." Do not go looking for one.Both
package.jsonandpackage-lock.jsonmust land together — CI runsnpm ci(.forgejo/workflows/ci.yml:57), which fails if they are out of sync.No production code change is expected. If you need one, that is a finding — report it here.
How to verify
Then the hermetic gate from the repo root, which re-runs lint + format:check + test inside the nix derivation against nixpkgs' node:
Done means
web/package.jsondeclares"jsdom": "^30.0.1"andweb/package-lock.jsonresolves jsdom to30.0.1, both in the same commit.npm cisucceeds (package.json and lockfile in sync) with noEBADENGINEwarning.npm testpasses with no test edited — in particularweb/src/components/ToolPanel.test.tsxpasses unchanged.npm run lint,npm run format:check, andnpm run buildall green.nix flake checkpasses.flake.lockchange, nonix/package.nixchange, noweb/src/**change in the diff.Closes #<this issue>.Out of scope — the two blocked majors, with the evidence
Do not attempt either of these in this PR. Both were investigated on 2026-08-01 and both are blocked by hard peer-dependency ranges. They are recorded here so the next update sweep does not re-derive them.
ESLint 9.39.5 → 10.8.0 — blocked by
eslint-plugin-solideslint-plugin-solid@0.14.5(web/package.json:28, used atweb/eslint.config.js:3) declares:No
^10.0.0. Upstream is effectively dormant — 0.14.5 was published 2024-12-11 and the last commit tosolidjs-community/eslint-plugin-solidwas 2025-11-18. ESLint 10 support is tracked in open issue #203 (2026-02-19) and open, unmerged PR #207 "Add eslint v10 support" (last updated 2026-07-30).typescript-eslint@8.65.0already acceptseslint: ^8.57.0 || ^9.0.0 || ^10.0.0, so it is only the solid plugin holding this back. Note also that ESLint 10'seslint:recommendednewly enablesno-unassigned-vars,no-useless-assignment, andpreserve-caught-error, and that "JSX references are now tracked" in scope analysis — so even once the peer range opens, the bump will produce new lint findings and needs its own issue.We are already on the newest 9.x (
9.39.5, npm'smaintenancedist-tag), so there is nothing to do on ESLint today.TypeScript 6.0.3 → 7.0.2 — blocked by
typescript-eslinttypescript-eslint@8.65.0and both@typescript-eslint/*packages declare:TypeScript 7.0.2 is far outside that range — so is 6.1.
6.0.3(published 2026-04-16) is the newest TypeScript release inside the supported range, and it is what we are pinned to. Nothing to do until typescript-eslint ships a release that widens the range.Not npm, checked and deliberately skipped
go.modhere.2.1.220is still npm'slatestfor@anthropic-ai/claude-codeas of 2026-08-01, so there is nothing newer to chase.alpine:3.22base incontainers/agent-tools/Containerfile.claude:31/Containerfile.codex:27— investigated and deliberately not filed. Alpine 3.24 exists, butalpine:3.22is a floating minor tag on a branch supported until 2027-05-01 that already receives musl security backports: Alpine's secdb showsCVE-2026-6042fixed atmusl 1.2.5-r11andCVE-2026-40200atmusl 1.2.5-r12, which is whatalpine:3.22currently ships. There is no open musl advisory against the pinned base, and the loader it contributes to the claude image (Containerfile.claude:69,77) is the sole libc every containerized Claude Code instance consults — so bumping it to musl 1.2.6 without a security driver is risk with no payoff.Filed by the Daily agent update check schedule, 2026-08-01. Versions from
registry.npmjs.org; advisories from the GitHub Advisory Database; jsdom changelog from its GitHub releases; nixpkgs node version read from the rev pinned in this repo'sflake.lock.