From 327a20c77f9ea34b3afbe106fe158d32f60ba1a1 Mon Sep 17 00:00:00 2001 From: Rupert Germann Date: Mon, 13 Jul 2026 09:55:09 +0200 Subject: [PATCH] chore: upgrade Node runtime to v24 --- .github/workflows/sidecar-release.yml | 2 +- .node-version | 2 +- .nvmrc | 2 +- README.md | 2 +- package-lock.json | 167 +++++++++++--------------- package.json | 4 +- scripts/check-node-version.mjs | 2 +- tests/nodeRuntimeVersion.test.ts | 29 +++++ 8 files changed, 105 insertions(+), 105 deletions(-) create mode 100644 tests/nodeRuntimeVersion.test.ts diff --git a/.github/workflows/sidecar-release.yml b/.github/workflows/sidecar-release.yml index 957165e..a8f135f 100644 --- a/.github/workflows/sidecar-release.yml +++ b/.github/workflows/sidecar-release.yml @@ -23,7 +23,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: "22.12.0" + node-version: "24.18.0" cache: npm - uses: actions/setup-python@v5 diff --git a/.node-version b/.node-version index 442c758..ca5c350 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -22.20.0 +24.18.0 diff --git a/.nvmrc b/.nvmrc index 442c758..ca5c350 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.20.0 +24.18.0 diff --git a/README.md b/README.md index 3187598..461ea46 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ Rowing Tracker is a modern, AI-powered web app built specifically for rowers who ### Prerequisites -- Node.js 22.12+ +- Node.js 24+ - npm 10.8+ - Docker & Docker Compose (for local development) - OpenAI API Key (optional, for AI features) diff --git a/package-lock.json b/package-lock.json index f9e9333..5e7c1b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,7 @@ "devDependencies": { "@tailwindcss/postcss": "^4", "@types/bcryptjs": "^2.4.6", - "@types/node": "^20", + "@types/node": "^24", "@types/nodemailer": "^8.0.0", "@types/papaparse": "^5.5.0", "@types/pg": "^8.16.0", @@ -77,7 +77,7 @@ "typescript": "^5" }, "engines": { - "node": ">=22.12.0", + "node": ">=24.0.0", "npm": ">=10.8.0" } }, @@ -94,76 +94,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@auth/core": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.34.3.tgz", - "integrity": "sha512-jMjY/S0doZnWYNV90x0jmU3B+UcrsfGYnukxYrRbj0CVvGI/MX3JbHsxSrx2d4mbnXaUsqJmAcDfoQWA6r0lOw==", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "@panva/hkdf": "^1.1.1", - "@types/cookie": "0.6.0", - "cookie": "0.6.0", - "jose": "^5.1.3", - "oauth4webapi": "^2.10.4", - "preact": "10.11.3", - "preact-render-to-string": "5.2.3" - }, - "peerDependencies": { - "@simplewebauthn/browser": "^9.0.1", - "@simplewebauthn/server": "^9.0.2", - "nodemailer": "^7" - }, - "peerDependenciesMeta": { - "@simplewebauthn/browser": { - "optional": true - }, - "@simplewebauthn/server": { - "optional": true - }, - "nodemailer": { - "optional": true - } - } - }, - "node_modules/@auth/core/node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@auth/core/node_modules/preact": { - "version": "10.11.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", - "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/@auth/core/node_modules/preact-render-to-string": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", - "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "pretty-format": "^3.8.0" - }, - "peerDependencies": { - "preact": ">=10" - } - }, "node_modules/@auth/prisma-adapter": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/@auth/prisma-adapter/-/prisma-adapter-2.11.2.tgz", @@ -3651,6 +3581,66 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.1.17", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", @@ -3717,14 +3707,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", @@ -3851,12 +3833,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/nodemailer": { @@ -9441,17 +9423,6 @@ "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", "license": "MIT" }, - "node_modules/oauth4webapi": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.17.0.tgz", - "integrity": "sha512-lbC0Z7uzAFNFyzEYRIC+pkSVvDHJTbEW+dYlSBAlCYDe6RxUkJ26bClhk8ocBZip1wfI9uKTe0fm4Ib4RHn6uQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11720,9 +11691,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/unified": { diff --git a/package.json b/package.json index 4a8345e..c6777fe 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "homepage": "https://github.com/rupertgermann/rowing-tracker", "packageManager": "npm@10.9.3", "engines": { - "node": ">=22.12.0", + "node": ">=24.0.0", "npm": ">=10.8.0" }, "scripts": { @@ -90,7 +90,7 @@ "devDependencies": { "@tailwindcss/postcss": "^4", "@types/bcryptjs": "^2.4.6", - "@types/node": "^20", + "@types/node": "^24", "@types/nodemailer": "^8.0.0", "@types/papaparse": "^5.5.0", "@types/pg": "^8.16.0", diff --git a/scripts/check-node-version.mjs b/scripts/check-node-version.mjs index 6d46f01..e0e287a 100644 --- a/scripts/check-node-version.mjs +++ b/scripts/check-node-version.mjs @@ -1,4 +1,4 @@ -const minimum = [22, 12, 0]; +const minimum = [24, 0, 0]; const current = process.versions.node.split(".").map(Number); let isSupported = true; diff --git a/tests/nodeRuntimeVersion.test.ts b/tests/nodeRuntimeVersion.test.ts new file mode 100644 index 0000000..ddac9a0 --- /dev/null +++ b/tests/nodeRuntimeVersion.test.ts @@ -0,0 +1,29 @@ +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import path from "node:path"; +import { test } from "node:test"; +import { fileURLToPath } from "node:url"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const expectedNodeVersion = "24.18.0"; + +function readRepositoryFile(filePath: string): string { + return readFileSync(path.join(repositoryRoot, filePath), "utf8"); +} + +test("Node 24 is used consistently across local, app, and CI runtimes", () => { + assert.equal(readRepositoryFile(".nvmrc").trim(), expectedNodeVersion); + assert.equal(readRepositoryFile(".node-version").trim(), expectedNodeVersion); + + const packageJson = JSON.parse(readRepositoryFile("package.json")); + assert.equal(packageJson.engines.node, ">=24.0.0"); + + assert.match( + readRepositoryFile("scripts/check-node-version.mjs"), + /const minimum = \[24, 0, 0\];/ + ); + assert.match( + readRepositoryFile(".github/workflows/sidecar-release.yml"), + /node-version: "24\.18\.0"/ + ); +});