From 4e59b0d03e2f3a79e3b07dd7035f310d59ce8f42 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Sat, 25 Jul 2026 15:57:10 +0700 Subject: [PATCH] ci: run on Node 24 and align types with the runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .github/workflows/ci.yml | 2 +- package.json | 5 +++- pnpm-lock.yaml | 62 +++++++++++++++++++++------------------- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d1453ba..4011391 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@v7 with: - node-version: 22 + node-version: 24 cache: pnpm - run: pnpm install --frozen-lockfile diff --git a/package.json b/package.json index 6ce017a..ef71974 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2468c40..a65f842 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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