Skip to content

Build with TypeScript 7, and record today's work in the changelog - #30

Merged
adamjohnwright merged 2 commits into
mainfrom
chore/hold-typescript-7
Sep 14, 2026
Merged

adamjohnwright merged 2 commits into
mainfrom
chore/hold-typescript-7

Conversation

@adamjohnwright

@adamjohnwright adamjohnwright commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Adam asked why TypeScript is not being bumped. The earlier answer — "held, typescript-eslint does not support 7" — treated it as a choice between 5.9 and 7. It is not, and I missed two things.

TypeScript 6 was never considered

typescript-eslint declares typescript: ">=4.8.4 <6.1.0". 6.0.3 is supported. Sitting on 5.9 was pointless — I only ever tested the version dependabot proposed.

TypeScript 7 does not require giving up linting

The TypeScript team documents running 7 side by side with 6 — which is what the error typescript-eslint prints links to. I read the error and stopped at the first sentence.

So:

package used for
TypeScript 7.0.2 typescript-7 (alias) build, typecheck, watch
TypeScript 6.0.3 typescript the copy typescript-eslint loads

Builds go from ~2.6s to ~0.38s (3 runs each, clean dist). TypeScript 7's typecheck agrees with 6 across src/ and tests/.

Two things found while doing it

TypeScript 6 no longer auto-includes every @types/* package. The build config has to name what it needs, so tsconfig.json now sets "types": ["node"] — the lint config already did. Without it the build fails on Buffer and process while the typecheck passes, because only one of the two configs declared them.

node_modules/.bin/tsc is not deterministic. Both packages ship a tsc binary. On the same tree:

after incremental install:  Version 7.0.2
after clean npm ci:         Version 6.0.3

A bare tsc in a script would silently compile with a different compiler depending on how the tree was installed. Every script now names the compiler by path. This is the part I'd want a second pair of eyes on.

Guard against the two diverging

npm run check and CI typecheck with both compilers (typecheck on 7, typecheck:lint-compiler on 6), so a disagreement fails a check rather than showing up as lint and build quietly diverging.

What is actually held now

Not TypeScript 7 — the build already uses it. What is held is moving the typescript package to 7, which would disable linting while changing nothing about the build. #29 and the dependabot ignore rule now say that, rather than the earlier, wronger framing. When typescript-eslint ships TS 7 support, the alias goes away and typescript moves to 7.

Also in this PR

The changelog had no Unreleased section, so ten fixed formatter bugs and four major dependency upgrades were nowhere a user of this package could see them. It also owed a credit — @adidev001 was told on #5 that the harvest would be recorded there.

Verification

  • clean npm ci, then npm run check (lint → format → typecheck ×2 → build → test): 64 tests, green
  • npm run sweep against the TypeScript 7 build: all 53 tools called, 16 content expectations checked, no suspicious output
  • npm audit: 0 vulnerabilities
  • both YAML files parse

🤖 Generated with Claude Code

…elog

Two pieces of cleanup left over from the four PRs that just landed.

**Stop relitigating TypeScript 7 weekly.** #19 was closed with its TypeScript
half deliberately unmerged: typescript-eslint does not support TS 7, and taking
it would mean dropping the type-aware linting that found two real bugs the week
it was added. Without an ignore rule dependabot reopens the same PR every
Monday, and a standing red PR nobody intends to merge is indistinguishable from
one nobody has got to yet. The rule points at #29, which records the decision
and how to check whether it is time to revisit.

Verified still true before writing it down: typescript-eslint 8.70.0 is current
and typescript-eslint/typescript-eslint#10940 is open.

**Record the work.** The changelog had no Unreleased section, so ten fixed
formatter bugs, the Spec Kit and tooling additions, and four major dependency
upgrades were nowhere a user of this package could see them. It also owed a
credit: @adidev001 was told on #5 that the harvest would be recorded in the
changelog, and it was not yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adam asked why TypeScript is not being bumped. The earlier answer -- "held,
typescript-eslint does not support 7" -- treated it as a choice between 5.9 and
7, which it is not. Two things were missed.

**TypeScript 6 was never considered.** typescript-eslint declares
`typescript: ">=4.8.4 <6.1.0"`, so 6.0.3 is supported. Sitting on 5.9 was
pointless.

**TypeScript 7 does not actually require giving up linting.** The TypeScript
team documents running it side by side with 6, which is what the error message
typescript-eslint prints links to. So:

  - the build, typecheck and watch run TypeScript 7, installed as the alias
    `typescript-7`
  - the package named `typescript` is 6.0.3, which is the copy typescript-eslint
    loads

Builds go from ~2.6s to ~0.38s. TypeScript 7's typecheck agrees with 6 across
src and tests.

Two things found while doing it, both worth the change on their own:

  - TypeScript 6 no longer auto-includes every `@types/*` package, so the build
    config has to name what it needs. `tsconfig.json` now sets
    `"types": ["node"]`; the lint config already did. Without it the build fails
    on `Buffer` and `process` while the typecheck passes, because only one of
    the two configs declared them.

  - **`node_modules/.bin/tsc` is not deterministic.** Both packages ship a `tsc`
    binary, and on the same tree it resolved to 7.0.2 after an incremental
    install and 6.0.3 after a clean `npm ci`. A bare `tsc` in a script would
    silently compile with a different compiler depending on how the tree was
    installed. Every script now names the compiler by path.

`npm run check` and CI typecheck with **both** compilers, so a disagreement
between them fails a check rather than showing up as lint and build quietly
diverging.

Verified: clean `npm ci`, full check green, 64 tests, and the live sweep runs
all 53 tools against the TypeScript 7 build with no suspicious output.

Issue #29 and the dependabot ignore now say what is actually held -- moving the
`typescript` package to 7, which would disable linting while changing nothing
about the build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@adamjohnwright adamjohnwright changed the title Hold TypeScript 7 in dependabot, and record today's work in the changelog Build with TypeScript 7, and record today's work in the changelog Sep 14, 2026
@adamjohnwright
adamjohnwright merged commit 3b0b8d7 into main Sep 14, 2026
5 checks passed
@adamjohnwright
adamjohnwright deleted the chore/hold-typescript-7 branch September 14, 2026 16:00
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