diff --git a/package.json b/package.json index af4c79ad58..9cbb5ffa5b 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "private": true, "version": "4.10.0", "scripts": { + "preinstall": "node web/scripts/check-node-version.js", "build": "pnpm -r build", "build:watch": " pnpm -r --parallel build:watch", "dev": "pnpm -r dev", diff --git a/web/scripts/check-node-version.js b/web/scripts/check-node-version.js new file mode 100644 index 0000000000..8b54972ef0 --- /dev/null +++ b/web/scripts/check-node-version.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +function getRequiredVersion() { + const nvmrcPath = path.join(__dirname, '..', '..', '.nvmrc'); + return fs.readFileSync(nvmrcPath, 'utf8').trim(); +} + +function getCurrentVersion() { + return execSync('node -v', { encoding: 'utf8' }).trim().replace('v', ''); +} + +function checkNodeVersion() { + try { + const requiredVersion = getRequiredVersion(); + const currentVersion = getCurrentVersion(); + + const [reqMajor, reqMinor, reqPatch] = requiredVersion.split('.').map(Number); + const [curMajor, curMinor, curPatch] = currentVersion.split('.').map(Number); + + if (curMajor < reqMajor || + (curMajor === reqMajor && curMinor < reqMinor) || + (curMajor === reqMajor && curMinor === reqMinor && curPatch < reqPatch)) { + console.error(`\x1b[31mError: Node.js version ${requiredVersion} or higher is required.\x1b[0m`); + console.error(`\x1b[31mCurrent version: ${currentVersion}\x1b[0m`); + console.error(`\x1b[33mPlease install Node.js ${requiredVersion} or use nvm to switch versions.\x1b[0m`); + process.exit(1); + } + + console.log(`\x1b[32m✓ Node.js version ${currentVersion} meets requirement (>= ${requiredVersion})\x1b[0m`); + } catch (error) { + console.error('Error checking Node.js version:', error.message); + process.exit(1); + } +} + +checkNodeVersion(); \ No newline at end of file