Skip to content

chore(deps-dev): eslint 10 and vitest 4, holding typescript at 5 - #35

Merged
cubehouse merged 2 commits into
mainfrom
chore/devdeps-split
Sep 7, 2026
Merged

cubehouse merged 2 commits into
mainfrom
chore/devdeps-split

Conversation

@cubehouse

Copy link
Copy Markdown
Member

Supersedes #27, which cannot go green as a group.

#27 bundles three majors: eslint 9 → 10, vitest 1 → 4, and typescript 5 → 6. The first two are fine. The third is blocked upstream, and it takes the whole group down with it.

Why typescript 6 cannot land here

openapi-typescript@7.13.0, the newest release, still declares:

peerDependencies = { typescript: '^5.x' }

So a clean npm ci with TypeScript 6 fails to resolve before any build runs:

Could not resolve dependency:
peer typescript@"^5.x" from openapi-typescript@7.13.0
Conflicting peer dependency: typescript@5.9.3

openapi-typescript is a real dependency here — scripts/regenerate.ts uses it to build src/_generated/schema.ts — so it cannot simply be dropped. Nothing in this repo can fix it; the peer range has to widen upstream.

A second thing waiting behind it

Worth writing down now so it is not rediscovered later. Even with the peer conflict forced past, TypeScript 6 breaks tsup --dts:

error TS5101: Option 'baseUrl' is deprecated and will stop functioning in TypeScript 7.0.

This repo's tsconfig.json does not set baseUrl. tsup does: tsup@8.5.1 hardcodes baseUrl: compilerOptions.baseUrl || "." in its declaration build (node_modules/tsup/dist/rollup.js:6837). Adding "ignoreDeprecations": "6.0" clears it and the build then succeeds, but that option is itself a countdown — TypeScript 7 removes baseUrl outright. The durable fix is a tsup release that stops injecting it, or moving declaration emit to tsc.

What this PR does

Takes the two majors that work, holds typescript at ^5.4.0. No config or source change was needed.

Result
npm ci clean
npm run typecheck pass
npm run lint pass
npm test 11 files, 64 tests, pass
npm run build pass
npm run test:live 4 tests against the live API, pass

dist/index.d.ts is byte-identical to the one built from main, so the published type surface does not move.

🤖 Generated with Claude Code

cubehouse and others added 2 commits September 7, 2026 17:32
Splits the dev-dependencies group bump. Two of its three majors land here;
the third cannot land at all yet.

eslint 9 -> 10 and vitest 1 -> 4 are clean: no config or source change, and
the emitted dist/index.d.ts is byte-identical to main, so nothing about the
published type surface moves.

typescript 5 -> 6 is held back. openapi-typescript 7.13.0, the newest
release, still declares `peer typescript@"^5.x"`, so a clean `npm ci` with
TypeScript 6 fails to resolve. That is what makes the grouped bump red, and
no amount of retrying the group will fix it.

Worth recording for whenever that peer range widens: TypeScript 6 also
breaks `tsup --dts`. tsup 8.5.1 hardcodes `baseUrl: compilerOptions.baseUrl
|| "."` when it builds declarations, and TS 6 errors on `baseUrl` as
deprecated (TS5101). Adding `"ignoreDeprecations": "6.0"` to tsconfig.json
clears it, but only until TypeScript 7 removes the option outright, so the
durable answer is a tsup that stops injecting it, or moving declaration
emit to tsc.

Verified from a clean `npm ci`: typecheck, lint, unit tests (64), build and
live smoke tests all pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
eslint 10 and vitest 4 both require Node 20 or newer, so the Node 18 lane
fails on `npm ci` while 20 and 22 pass. Node 18 reached end of life on
2025-04-30.

The constraint is entirely in the dev toolchain — nothing in the shipped
bundle needs Node 20. The choice was between quietly dropping the lane while
still advertising `engines: >=18`, and withdrawing a support claim nothing
verifies. This does the second: matrix moves to 20/22/24, `engines` to
`>=20`, README and CHANGELOG updated to match.

Consumers still on Node 18 should stay on 7.1.x.

Note for whoever merges: branch protection still requires `Test (Node 18)`,
which no longer exists. The required contexts need updating to
`Test (Node 20)`, `Test (Node 22)`, `Test (Node 24)` or this cannot merge.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cubehouse

Copy link
Copy Markdown
Member Author

Pushed a second commit: the Node 18 lane is dropped and the tested floor moves to 20.

eslint 10 and vitest 4 both declare Node 20+ (^20.19.0 || ^22.13.0 || >=24 and ^20.0.0 || ^22.0.0 || >=24.0.0), so Node 18 fails at npm ci while 20 and 22 pass. Node 18 has been end-of-life since 2025-04-30.

The constraint is dev-toolchain only — nothing in the shipped bundle needs Node 20. So the choice was between dropping the lane while still advertising engines: >=18, and withdrawing a claim nothing verifies. This does the second: matrix to 20/22/24, engines to >=20, README and CHANGELOG updated. Anyone still on Node 18 stays on 7.1.x.

Before this can merge: branch protection still requires Test (Node 18), which no longer exists. Required contexts need to become Test (Node 20), Test (Node 22), Test (Node 24), or the PR stays blocked on a check that can never report.

@cubehouse
cubehouse merged commit 76d4c47 into main Sep 7, 2026
3 checks passed
@cubehouse
cubehouse deleted the chore/devdeps-split branch September 7, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant