Move CI, the image and the Node types to 26 together

Three pins and a types package all described Node 22, and moving any one
of them alone puts the build somewhere the others are not: @types/node
on its own would typecheck against APIs the runtime does not have, and
the base image on its own would ship a major CI never exercised. So
ci.yml, publish.yml, release.yml, both Dockerfile stages and
@types/node move in one change.

Worth knowing before this is deployed: 26 is Current, not LTS. node:26-
alpine reports lts=none, where 24-alpine is Krypton and the 22-alpine we
are leaving is Jod. 26 is due to become Active LTS in October. Nothing
here needs 26 over 24 -- the pins are a single number if the LTS line is
preferred.

engines stays at >=20.19, which is the floor for running ihasmail rather
than the version we build it on; the README's recommendation follows CI
to 26.

Checked on the runtime, not just in CI: the image builds on 26-alpine,
starts, and answers /api/health, and the login, SSE and body-carrying
POST checks from the node-server upgrade pass against a server on
26.8.1.
This commit is contained in:
2026-09-10 08:44:55 -07:00
parent 7d9d5b005c
commit 6632231815
7 changed files with 15 additions and 15 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
- uses: actions/checkout@v7 - uses: actions/checkout@v7
- uses: actions/setup-node@v7 - uses: actions/setup-node@v7
with: with:
node-version: 22 node-version: 26
cache: npm cache: npm
- run: npm ci --ignore-scripts - run: npm ci --ignore-scripts
- run: npm run typecheck - run: npm run typecheck
+1 -1
View File
@@ -82,7 +82,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- uses: actions/setup-node@v7 - uses: actions/setup-node@v7
with: with:
node-version: 22 node-version: 26
- id: v - id: v
run: | run: |
V="$(node scripts/version.mjs)" V="$(node scripts/version.mjs)"
+1 -1
View File
@@ -52,7 +52,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- uses: actions/setup-node@v7 - uses: actions/setup-node@v7
with: with:
node-version: 22 node-version: 26
- id: decide - id: decide
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+2 -2
View File
@@ -1,5 +1,5 @@
# ---- build stage ---- # ---- build stage ----
FROM node:22-alpine AS build FROM node:26-alpine AS build
# What this build calls itself: 2.16.<PR>, worked out by whoever runs the # What this build calls itself: 2.16.<PR>, worked out by whoever runs the
# build. It cannot be worked out in here -- .dockerignore keeps .git out of the # build. It cannot be worked out in here -- .dockerignore keeps .git out of the
# context on purpose, and git is not installed either. `node scripts/version.mjs` # context on purpose, and git is not installed either. `node scripts/version.mjs`
@@ -25,7 +25,7 @@ COPY . .
RUN npm run build RUN npm run build
# ---- runtime stage ---- # ---- runtime stage ----
FROM node:22-alpine AS runtime FROM node:26-alpine AS runtime
# Re-declared: an ARG does not cross stages. # Re-declared: an ARG does not cross stages.
ARG IHASMAIL_VERSION="" ARG IHASMAIL_VERSION=""
ARG BASE_PATH="" ARG BASE_PATH=""
+1 -1
View File
@@ -347,7 +347,7 @@ missing.
## Development ## Development
Requirements: Node ≥ 20.19 (22 recommended), npm ≥ 10. Requirements: Node ≥ 20.19 (26 recommended), npm ≥ 10.
```bash ```bash
npm install npm install
+8 -8
View File
@@ -968,13 +968,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.20.2", "version": "26.5.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.2.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.1.tgz",
"integrity": "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==", "integrity": "sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~8.9.0"
} }
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
@@ -2778,9 +2778,9 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "6.21.0", "version": "8.9.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@@ -3186,7 +3186,7 @@
"hono": "^4.13.7" "hono": "^4.13.7"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.13.10", "@types/node": "^26.5.1",
"tsx": "^4.23.13", "tsx": "^4.23.13",
"typescript": "^7.0.2" "typescript": "^7.0.2"
} }
+1 -1
View File
@@ -20,7 +20,7 @@
"hono": "^4.13.7" "hono": "^4.13.7"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.13.10", "@types/node": "^26.5.1",
"tsx": "^4.23.13", "tsx": "^4.23.13",
"typescript": "^7.0.2" "typescript": "^7.0.2"
} }