chore(deps-dev): upgrade vitest, coverage-v8 and jsdom; drop EOL Node versions - #22
Merged
Merged
Conversation
Supersedes the four Dependabot PRs, three of which could not pass on their own. Advisories go 6 -> 1. The esbuild -> vite -> vitest chain that survived the last dependency pass is cleared by vitest 4. The one remaining is esbuild 0.27.7 (LOW, arbitrary file read via the dev server on Windows); the fix is esbuild 0.28.2 but tsup pins `esbuild: ^0.27.0`, so it cannot be resolved here. This project runs no dev server and does not build on Windows, so exposure is nil. vitest and @vitest/coverage-v8 had to move together: coverage-v8@4 peer-requires the exact matching vitest, so Dependabot's separate PRs each failed `npm ci` on the peer conflict — neither could land without the other. That was a consequence of the ungrouped-majors rule added last week, which is right in general and wrong for a lockstep family, so dependabot.yml now groups the vitest packages across ALL update types. No test or config changes were needed for vitest 4 — all 635 tests pass unmodified, and the v8 coverage provider and thresholds work as before. CI drops Node 18 and 20. Both are past end-of-life (18 in April 2025, 20 in April 2026) and neither can run the new toolchain: jsdom 30 requires `^22.22.2 || ^24.15.0 || >=26`, vitest 4 requires `^20 || ^22 || >=24`. The matrix is now 22 (LTS maintenance), 24 (active LTS) and 26 (current). engines.node moves to >=20.0.0. This is deliberately one line lower than CI exercises: the published bundle contains no Node-version-specific code and the constraint comes entirely from the test toolchain, so claiming >=22 would warn a large share of consumers away from a package that works fine for them. Nothing below 22 is verified, and CLAUDE.md says so. TypeScript 7 is not included. It fails in `npm run build`: tsup bundles rollup-plugin-dts pinned against typescript 5.7.3, and TS 7 removed the `useCaseSensitiveFileNames` API it calls, so declaration emit dies. Nothing in this repo can fix it, so its majors are now ignored with the reason recorded and a note to remove the entry once tsup catches up. 🤖 Generated with [Nori](https://noriagentic.com) Co-Authored-By: Nori <contact@tilework.tech>
This was referenced Aug 20, 2026
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.
Supersedes Dependabot PRs #17, #18 and #19, three of which could not pass on their own. #20 (TypeScript 7) is blocked upstream and is handled separately — see below.
Advisories: 6 → 1
vitest 4 clears the
esbuild → vite → vitestchain that survived the last dependency pass.The one remaining is
esbuild@0.27.7— LOW severity, arbitrary file read via the dev server on Windows. The fix is esbuild 0.28.2, but tsup pinsesbuild: ^0.27.0, so it cannot be resolved from here. This project runs no dev server and does not build on Windows, so real exposure is nil.Why these three had to move together
@vitest/coverage-v8@4peer-requires the exact matching vitest version. Dependabot raised them as two separate PRs, and each failednpm cion the peer conflict — neither could land without the other:That's a consequence of the ungrouped-majors rule I added last week. It's the right default in general and wrong for a lockstep family, so
dependabot.ymlnow groups the vitest packages across all update types, majors included.No test or config changes were needed for vitest 4. All 635 tests pass unmodified, and the v8 coverage provider and thresholds work as before.
CI drops Node 18 and 20
Neither can run the new toolchain:
^22.22.2 || ^24.15.0 || >=26.0.0^20.0.0 || ^22.0.0 || >=24.0.0Both versions are also past end-of-life — Node 18 in April 2025, Node 20 (Iron) in April 2026 — so CI was spending time proving the library works on runtimes nobody should be shipping on. The matrix is now 22 (LTS maintenance), 24 (active LTS) and 26 (current).
engines.node→>=20.0.0Deliberately one line lower than CI exercises, and worth being explicit about the trade:
URL/URLSearchParamsand nothing else. The constraint comes entirely from the test toolchain, which consumers never install.>=22.0.0would match exactly what's verified, but would make npm warn a large share of consumers away from a package that works fine for them.>=16.0.0is no longer defensible now that nothing below 22 is exercised at all.>=20.0.0is the honest middle. Nothing below Node 22 is verified, andCLAUDE.mdrecords that plainly so the next person doesn't mistake the claim for evidence.TypeScript 7 (PR #20) — closed, majors now ignored
It fails in
npm run build, not type-check:tsup bundles
rollup-plugin-dtspinned against TypeScript 5.x, and TS 7 removed the API it calls, so declaration emit dies. Nothing in this repo can fix it.dependabot.ymlnow ignorestypescriptmajors with the reason recorded and a note to remove the entry once tsup ships a TS 7-compatiblerollup-plugin-dts— the same documented-blocker pattern used elsewhere for peer-capped toolchain deps.Test Plan
npm test— 635 passing, unchanged frommain, no test or config edits needed for vitest 4npm run coverage— 93.77% statements / 88.36% branches, above the 80% gatenpm run type-check/lint/format:check— cleannpm run build— succeeds, all three entries emitted with declarations/serverentry, and the rejection report all behave correctlynpm audit— 6 → 1 (low, dev-only, unfixable without upstream tsup)Follow-ups
esbuildlow advisory clears itself when tsup widens its esbuild range./serverentry, rejection reporting and the three capture options from feat: server-side normalization, rejection reporting and capture options #21 are all unreleased.