diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index e64ea34a..4e0c8f45 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -6,7 +6,7 @@ runs: steps: - uses: actions/setup-node@v4 with: - node-version: '20' + node-version-file: '.nvmrc' - uses: actions/download-artifact@v4 with: name: node-modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 104288a6..bb53fa98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24.14.1' cache: 'npm' - run: npm ci - run: tar -czf node-modules.tar.gz node_modules @@ -162,7 +162,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24.14.1' - name: Generate release metadata run: | PREVIOUS_RELEASE_SHA=$(git rev-parse HEAD^ 2>/dev/null || true) \ diff --git a/.github/workflows/deploy-frontend.yml b/.github/workflows/deploy-frontend.yml index b58ac95d..4f62846a 100644 --- a/.github/workflows/deploy-frontend.yml +++ b/.github/workflows/deploy-frontend.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24.14.1' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b4755905..a6453967 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -30,7 +30,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24.14.1' - name: Generate release metadata run: | diff --git a/.nvmrc b/.nvmrc index 209e3ef4..8e350348 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20 +24.14.1 diff --git a/README.md b/README.md index 5f7e9ef3..8efe855b 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ mocker/ ### Prerequisites -- **Node.js** 20+ (for backend and frontend development) +- **Node.js** 24 LTS (>=24.14.1, for backend and frontend development) - **MySQL** 5.7+ (for storing messages, users, game state) - **Slack workspace** (for bot integration) - **Ngrok** (optional, for local tunneling during development) diff --git a/package-lock.json b/package-lock.json index 017cd633..370303e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,9 @@ "prettier": "^3.8.1", "typescript": "^5.9.3", "typescript-eslint": "^8.57.1" + }, + "engines": { + "node": ">=24.14.1 <25" } }, "node_modules/@adobe/css-tools": { @@ -3014,12 +3017,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", - "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/node-cron": { @@ -3040,9 +3043,9 @@ } }, "node_modules/@types/node/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.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, "node_modules/@types/qs": { @@ -10723,7 +10726,7 @@ "@types/easy-table": "0.0.32", "@types/express": "^4.17.21", "@types/lolex": "^3.1.1", - "@types/node": "^20.19.37", + "@types/node": "^24.0.0", "@types/node-cron": "^3.0.11", "@types/sentiment": "^5.0.1", "@types/supertest": "^7.2.0", @@ -10735,6 +10738,9 @@ "supertest": "^7.2.2", "ts-node": "^10.4.0", "vitest": "^4.1.1" + }, + "engines": { + "node": ">=24.14.1 <25" } }, "packages/frontend": { @@ -10769,6 +10775,9 @@ "typescript-eslint": "^8.30.1", "vite": "^6.3.5", "vitest": "^4.1.1" + }, + "engines": { + "node": ">=24.14.1 <25" } } } diff --git a/package.json b/package.json index 60656a5e..acf90d2a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "1.0.0", "description": "Mock your friends - Monorepo", "private": true, + "engines": { + "node": ">=24.14.1 <25" + }, "workspaces": [ "packages/*" ], diff --git a/packages/backend/Dockerfile b/packages/backend/Dockerfile index 456dde6a..275ccca7 100644 --- a/packages/backend/Dockerfile +++ b/packages/backend/Dockerfile @@ -2,7 +2,7 @@ # Before building, generate release metadata: # PREVIOUS_RELEASE_SHA="$(git rev-parse HEAD^ 2>/dev/null || true)" \ # node packages/backend/scripts/write-release-metadata.js packages/backend/release-metadata.json -FROM node:20-alpine AS build +FROM node:24.14.1-bookworm-slim AS build WORKDIR /usr/src/app # Copy workspace and backend files required for compilation and minification. @@ -22,7 +22,7 @@ RUN npm ci \ && npm run build:prod -w @mocker/backend \ && npm prune --omit=dev -FROM gcr.io/distroless/nodejs20-debian12:nonroot AS release +FROM gcr.io/distroless/nodejs24-debian13:nonroot AS release ENV NODE_ENV=production \ PORT=80 \ IMAGE_DIR=/tmp/mocker-images diff --git a/packages/backend/package.json b/packages/backend/package.json index 5effc8b9..c8a04412 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -3,6 +3,9 @@ "version": "1.0.0", "description": "Mock your friends - Backend API", "main": "dist/index.js", + "engines": { + "node": ">=24.14.1 <25" + }, "scripts": { "build": "tsc -p tsconfig.build.json", "build:prod": "tsc -p tsconfig.prod.json", @@ -10,7 +13,7 @@ "lint:fix": "eslint --cache --cache-location ../../node_modules/.cache/eslint/backend/.eslintcache './**/*.{js,ts}' --quiet --fix", "format:check": "prettier --cache --ignore-path ../../.prettierignore --check \"**/*.{ts,js,json,md,yml,yaml}\"", "format:fix": "prettier --cache --ignore-path ../../.prettierignore --write \"**/*.{ts,js,json,md,yml,yaml}\"", - "minify": "esbuild dist/**.js dist/**/*.js --bundle --minify --target=node18 --platform=node --outdir=dist --allow-overwrite --packages=external --external:dist/shared/db/models/*", + "minify": "esbuild dist/**.js dist/**/*.js --bundle --minify --target=node24 --platform=node --outdir=dist --allow-overwrite --packages=external --external:dist/shared/db/models/*", "start": "npm run start:dev", "start:prod": "node dist/index.js", "start:dev": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts", @@ -49,7 +52,7 @@ "@types/easy-table": "0.0.32", "@types/express": "^4.17.21", "@types/lolex": "^3.1.1", - "@types/node": "^20.19.37", + "@types/node": "^24.0.0", "@types/node-cron": "^3.0.11", "@types/sentiment": "^5.0.1", "@types/supertest": "^7.2.0", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 17ff904c..8a43ec05 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -4,6 +4,9 @@ "description": "Mock your friends - Frontend", "private": true, "type": "module", + "engines": { + "node": ">=24.14.1 <25" + }, "scripts": { "dev": "vite", "build": "tsc -b && vite build",