Skip to content

ci: move workflows from Node 20 (EOL) to Node 24 LTS - #111

Merged
Ndevu12 merged 1 commit into
mainfrom
ci/node-24
Jul 31, 2026
Merged

ci: move workflows from Node 20 (EOL) to Node 24 LTS#111
Ndevu12 merged 1 commit into
mainfrom
ci/node-24

Conversation

@Ndevu12

@Ndevu12 Ndevu12 commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Moves all CI/CD jobs off an end-of-life Node runtime, and unblocks #95 as a consequence.

Node 20 is EOL

Node 20 reached end-of-life on 2026-04-30. Every job in this repo — CI, Pages deploy, and release — has been running on a runtime that no longer receives security patches. All six node-version pins across ci.yml, deploy.yml, and release.yml move to Node 24, the current LTS (supported to April 2028).

This is also the real fix for #95

#95 (jsdom 29 → 30) fails CI, and the reported error is misleading:

ERROR: Coverage for lines (0%) does not meet global threshold (80%)

That is a symptom, not the cause. The actual failure is that every vitest worker crashed before running a single test:

Error: [vitest-pool]: Failed to start forks worker for test files .../Dialogs.test.tsx
  at Object.<anonymous> node_modules/jsdom/lib/api.js:12:33

jsdom@30 requires Node ^22.22.2 || ^24.15.0 || >=26.0.0. On Node 20 it cannot load at all, so no test executed, so coverage was 0%, so the 80/75 thresholds failed.

The tempting quick fixes here are both wrong:

  • Pinning jsdom back to 29 hides the fact that CI runs an EOL runtime.
  • Lowering the coverage thresholds would mask a total test-execution failure as if it were a coverage regression. Actual coverage on main is healthy at 92.9% statements / 84.1% branches — the thresholds are correct and should not be touched.

Raising Node fixes the underlying condition, after which #95 can merge on its own merits.

Deliberately not adding an engines field

This is a browser-targeted library; Node is only a build and test concern. Declaring a Node floor in package.json would constrain consumers without benefiting them.

Verification

CI on this PR is itself the test — every job now runs on Node 24. Once green, I will rebase #95 onto this and confirm the jsdom 30 suite passes.

Node 20 reached end-of-life on 2026-04-30, so every job in this repo has
been building and testing on an unsupported runtime that no longer receives
security patches.

Bumps all six node-version pins across ci.yml, deploy.yml and release.yml
to Node 24, the current LTS (supported to April 2028).

This also unblocks #95. jsdom 30 requires Node ^22.22.2 || ^24.15.0 || >=26,
so on Node 20 every vitest worker died while loading jsdom/lib/api.js:

  Error: [vitest-pool]: Failed to start forks worker for test files ...
    at Object.<anonymous> node_modules/jsdom/lib/api.js:12:33

No test executed, which reported as 0% coverage and tripped the 80/75
thresholds. The coverage errors were the symptom; the EOL runtime was the
cause. Raising Node is the fix rather than pinning jsdom back to 29 or
lowering the thresholds.

No engines field is added to package.json: this is a browser-targeted
library, Node is only a build/test concern, and declaring a floor would
constrain consumers for no benefit.
@Ndevu12
Ndevu12 merged commit 014b26c into main Jul 31, 2026
9 checks passed
@Ndevu12
Ndevu12 deleted the ci/node-24 branch July 31, 2026 23:26
@Ndevu12 Ndevu12 self-assigned this Jul 31, 2026
@Ndevu12 Ndevu12 added the enhancement New feature or request label Jul 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant