#!/usr/bin/env node import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const projectRoot = path.join(__dirname, '..'); let preferredVersion; let supportedRange; try { preferredVersion = fs.readFileSync(path.join(projectRoot, '.nvmrc'), 'utf8').trim(); const packageJson = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8')); supportedRange = packageJson.engines?.node || preferredVersion; } catch (error) { console.error('错误: 无法读取 Node.js 版本配置'); process.exit(1); } const currentVersion = process.version.slice(1); // 移除版本号前的 'v' console.log(`检查 Node.js 版本...`); console.log(`当前版本: ${currentVersion}`); console.log(`推荐版本: ${preferredVersion}`); console.log(`支持范围: ${supportedRange}`); const parseVersion = (version) => { const match = String(version).trim().replace(/^v/, '').match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?/); if (!match) { throw new Error(`Invalid version: ${version}`); } return { major: Number(match[1]), minor: Number(match[2] || 0), patch: Number(match[3] || 0) }; }; const current = parseVersion(currentVersion); const compareVersions = (left, right) => { for (const key of ['major', 'minor', 'patch']) { if (left[key] > right[key]) return 1; if (left[key] < right[key]) return -1; } return 0; }; const satisfiesComparator = (version, comparator) => { const match = comparator.match(/^(>=|>|<=|<|=)?(.+)$/); const operator = match[1] || '='; const required = parseVersion(match[2]); const comparison = compareVersions(version, required); switch (operator) { case '>=': return comparison >= 0; case '>': return comparison > 0; case '<=': return comparison <= 0; case '<': return comparison < 0; case '=': return comparison === 0; default: return false; } }; const satisfiesRange = (version, range) => { return range .split('||') .some((rangePart) => rangePart .trim() .split(/\s+/) .filter(Boolean) .every((comparator) => satisfiesComparator(version, comparator)) ); }; if (!satisfiesRange(current, supportedRange)) { console.error(`\n错误: Node.js 版本不匹配!`); console.error(`本项目支持 Node.js ${supportedRange}`); console.error(`当前使用的是 Node.js ${currentVersion}`); console.error(`\n请尝试以下方法之一:`); console.error(`1. 如果已安装 nvm: 运行 'nvm install ${preferredVersion} && nvm use ${preferredVersion}'`); console.error(`2. 使用项目提供的辅助脚本: './scripts/use-node-version.sh node -v'`); console.error(`3. 从 https://nodejs.org/ 下载并安装 Node.js ${preferredVersion}`); process.exit(1); } console.log(`\n✓ Node.js 版本检查通过! (${currentVersion})`);