ci: run on Node 24 and align types with the runtime

The runner already defaults to Node 24 and local dev is on v24.14.0, while CI
pinned 22 and @types/node was still ^22 — so the type definitions described an
older runtime than anything actually running.

- CI node-version 22 -> 24
- @types/node ^22 -> ^24 (matches the runtime major; the newer ^26 line targets
  Node 26, which we don't run)
- declare engines.node >=24 so local, CI, and Vercel resolve the same major

All six CI gates pass locally on Node 24: secret-leak, format:check, test (97),
lint, typecheck, build.
This commit is contained in:
2026-07-25 15:57:10 +07:00
parent f0faece37b
commit 4e59b0d03e
3 changed files with 38 additions and 31 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ jobs:
- uses: actions/setup-node@v7
with:
node-version: 22
node-version: 24
cache: pnpm
- run: pnpm install --frozen-lockfile
+4 -1
View File
@@ -3,6 +3,9 @@
"version": "0.1.0",
"private": true,
"packageManager": "pnpm@11.1.1",
"engines": {
"node": ">=24"
},
"scripts": {
"dev": "next dev",
"build": "next build",
@@ -53,7 +56,7 @@
"@eslint/eslintrc": "^3.3.5",
"@playwright/test": "^1.61.1",
"@tailwindcss/postcss": "^4.3.0",
"@types/node": "^22.10.0",
"@types/node": "^24.13.3",
"@types/react": "^19.2.15",
"@types/react-dom": "^19.2.3",
"@vitest/coverage-v8": "^4.1.10",
+33 -29
View File
@@ -59,10 +59,10 @@ importers:
version: 0.546.0(react@19.2.6)
next:
specifier: ^16.2.11
version: 16.2.11(@playwright/test@1.61.1)(@types/node@22.19.19)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
version: 16.2.11(@playwright/test@1.61.1)(@types/node@24.13.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next-intl:
specifier: ^4.12.0
version: 4.12.0(@swc/helpers@0.5.21)(next@16.2.11(@playwright/test@1.61.1)(@types/node@22.19.19)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(typescript@5.9.3)
version: 4.12.0(@swc/helpers@0.5.21)(next@16.2.11(@playwright/test@1.61.1)(@types/node@24.13.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(typescript@5.9.3)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -104,8 +104,8 @@ importers:
specifier: ^4.3.0
version: 4.3.0
'@types/node':
specifier: ^22.10.0
version: 22.19.19
specifier: ^24.13.3
version: 24.13.3
'@types/react':
specifier: ^19.2.15
version: 19.2.15
@@ -144,7 +144,7 @@ importers:
version: 5.9.3
vitest:
specifier: ^4.1.10
version: 4.1.10(@types/node@22.19.19)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))
version: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))
packages:
@@ -2011,8 +2011,8 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
'@types/node@22.19.19':
resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==}
'@types/node@24.13.3':
resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==}
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
@@ -4000,8 +4000,8 @@ packages:
uncrypto@0.1.3:
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
unicode-properties@1.4.1:
resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==}
@@ -5920,9 +5920,9 @@ snapshots:
'@types/json5@0.0.29': {}
'@types/node@22.19.19':
'@types/node@24.13.3':
dependencies:
undici-types: 6.21.0
undici-types: 7.18.2
'@types/react-dom@19.2.3(@types/react@19.2.15)':
dependencies:
@@ -6126,7 +6126,7 @@ snapshots:
obug: 2.1.4
std-env: 4.2.0
tinyrainbow: 3.1.0
vitest: 4.1.10(@types/node@22.19.19)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))
vitest: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))
'@vitest/expect@4.1.10':
dependencies:
@@ -6137,13 +6137,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
'@vitest/mocker@4.1.10(vite@8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))':
'@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))':
dependencies:
'@vitest/spy': 4.1.10
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3)
vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3)
'@vitest/pretty-format@4.1.10':
dependencies:
@@ -6888,6 +6888,10 @@ snapshots:
optionalDependencies:
picomatch: 4.0.4
fdir@6.5.0(picomatch@4.0.5):
optionalDependencies:
picomatch: 4.0.5
fflate@0.8.3: {}
file-entry-cache@8.0.0:
@@ -7387,14 +7391,14 @@ snapshots:
next-intl-swc-plugin-extractor@4.12.0: {}
next-intl@4.12.0(@swc/helpers@0.5.21)(next@16.2.11(@playwright/test@1.61.1)(@types/node@22.19.19)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(typescript@5.9.3):
next-intl@4.12.0(@swc/helpers@0.5.21)(next@16.2.11(@playwright/test@1.61.1)(@types/node@24.13.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6)(typescript@5.9.3):
dependencies:
'@formatjs/intl-localematcher': 0.8.8
'@parcel/watcher': 2.5.6
'@swc/core': 1.15.40(@swc/helpers@0.5.21)
icu-minify: 4.12.0
negotiator: 1.0.0
next: 16.2.11(@playwright/test@1.61.1)(@types/node@22.19.19)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next: 16.2.11(@playwright/test@1.61.1)(@types/node@24.13.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next-intl-swc-plugin-extractor: 4.12.0
po-parser: 2.1.1
react: 19.2.6
@@ -7409,7 +7413,7 @@ snapshots:
react: 19.2.6
react-dom: 19.2.6(react@19.2.6)
next@16.2.11(@playwright/test@1.61.1)(@types/node@22.19.19)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
next@16.2.11(@playwright/test@1.61.1)(@types/node@24.13.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
dependencies:
'@next/env': 16.2.11
'@swc/helpers': 0.5.15
@@ -7429,7 +7433,7 @@ snapshots:
'@next/swc-win32-arm64-msvc': 16.2.11
'@next/swc-win32-x64-msvc': 16.2.11
'@playwright/test': 1.61.1
sharp: 0.35.3(@types/node@22.19.19)
sharp: 0.35.3(@types/node@24.13.3)
transitivePeerDependencies:
- '@babel/core'
- '@types/node'
@@ -7846,7 +7850,7 @@ snapshots:
es-errors: 1.3.0
es-object-atoms: 1.1.2
sharp@0.35.3(@types/node@22.19.19):
sharp@0.35.3(@types/node@24.13.3):
dependencies:
'@img/colour': 1.1.0
detect-libc: 2.1.2
@@ -7877,7 +7881,7 @@ snapshots:
'@img/sharp-win32-arm64': 0.35.3
'@img/sharp-win32-ia32': 0.35.3
'@img/sharp-win32-x64': 0.35.3
'@types/node': 22.19.19
'@types/node': 24.13.3
optional: true
shebang-command@2.0.0:
@@ -8026,8 +8030,8 @@ snapshots:
tinyglobby@0.2.17:
dependencies:
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4
fdir: 6.5.0(picomatch@4.0.5)
picomatch: 4.0.5
tinyrainbow@3.1.0: {}
@@ -8113,7 +8117,7 @@ snapshots:
uncrypto@0.1.3: {}
undici-types@6.21.0: {}
undici-types@7.18.2: {}
unicode-properties@1.4.1:
dependencies:
@@ -8214,7 +8218,7 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
vite@8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3):
vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.5
@@ -8222,16 +8226,16 @@ snapshots:
rolldown: 1.1.5
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 22.19.19
'@types/node': 24.13.3
esbuild: 0.28.1
fsevents: 2.3.3
jiti: 2.7.0
tsx: 4.22.3
vitest@4.1.10(@types/node@22.19.19)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3)):
vitest@4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3)):
dependencies:
'@vitest/expect': 4.1.10
'@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))
'@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3))
'@vitest/pretty-format': 4.1.10
'@vitest/runner': 4.1.10
'@vitest/snapshot': 4.1.10
@@ -8248,10 +8252,10 @@ snapshots:
tinyexec: 1.2.4
tinyglobby: 0.2.16
tinyrainbow: 3.1.0
vite: 8.1.5(@types/node@22.19.19)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3)
vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.3)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.19.19
'@types/node': 24.13.3
'@vitest/coverage-v8': 4.1.10(vitest@4.1.10)
transitivePeerDependencies:
- msw