liangjing-lint-start
Version:
增强版 React/TypeScript 项目 lint 和 prettier 配置工具 - 支持智能检测、多框架、配置预设
248 lines (220 loc) • 8.14 kB
JavaScript
const fs = require("fs");
const path = require("path");
const child_process = require("child_process");
// 获取 Node 版本
function getNodeMajorVersion() {
const version = process.version;
const match = version.match(/v(\d+)/);
return match ? parseInt(match[1], 10) : 12;
}
// 检查并安装 inquirer
let inquirer;
(async () => {
const nodeMajor = getNodeMajorVersion();
let inquirerVersion = nodeMajor < 14 ? "8" : "9";
try {
inquirer = require("inquirer");
} catch (e) {
// 只装 inquirer,不写入 package.json,不理会 peer/engines
console.log(
`\n📦 正在安装兼容的 inquirer 版本: inquirer@${inquirerVersion} ...`
);
try {
if (fs.existsSync("yarn.lock")) {
child_process.execSync(
`yarn add inquirer@${inquirerVersion} --dev --ignore-scripts --ignore-engines --no-lockfile --silent`,
{ stdio: "inherit" }
);
} else {
child_process.execSync(
`npm install inquirer@${inquirerVersion} --no-save --ignore-scripts --legacy-peer-deps --silent`,
{ stdio: "inherit" }
);
}
inquirer = require("inquirer");
console.log("✅ inquirer 安装成功!");
} catch (err) {
console.error(
"❌ inquirer 安装失败,请手动安装: inquirer@" + inquirerVersion
);
process.exit(1);
}
}
})();
// 用户输入函数(使用 inquirer)
function getUserInput(prompt, defaultValue) {
defaultValue = defaultValue || "";
if (!inquirer) inquirer = require("inquirer");
return inquirer
.prompt([
{
type: "input",
name: "result",
message: prompt,
default: defaultValue,
},
])
.then(function (res) {
return res.result;
});
}
// 显示版本对比信息
function showVersionComparison() {
console.log("\n📊 版本功能对比:");
console.log("┌─────────────────────┬─────────────┬─────────────┐");
console.log("│ 功能特性 │ 增强版 │ 原版 │");
console.log("├─────────────────────┼─────────────┼─────────────┤");
console.log("│ 智能项目检测 │ ✅ │ ❌ │");
console.log("│ 多配置预设 │ ✅ │ ❌ │");
console.log("│ 进度可视化 │ ✅ │ ❌ │");
console.log("│ VSCode 自动配置 │ ✅ │ ❌ │");
console.log("│ 多框架支持 │ ✅ │ ❌ │");
console.log("│ TSLint 支持 │ ✅ │ ❌ │");
console.log("│ 脚本自动添加 │ ✅ │ ❌ │");
console.log("│ 错误恢复建议 │ ✅ │ ❌ │");
console.log("│ Node 12 兼容 │ ✅ │ ✅ │");
console.log("│ 稳定性 │ 良好 │ 极佳 │");
console.log("└─────────────────────┴─────────────┴─────────────┘");
console.log("\n💡 建议:");
console.log(" • 新项目或追求最佳体验 → 选择增强版");
console.log(" • 生产环境或追求稳定性 → 选择原版");
}
// 获取合适的增强版入口文件
function getEnhancedEntryFile() {
const nodeVersion = getNodeMajorVersion();
if (nodeVersion >= 16) {
return "enhanced-cli.js";
} else {
return "enhanced-cli-node12.js";
}
}
// 显示 Node 版本信息
function showNodeVersionInfo() {
const nodeVersion = getNodeMajorVersion();
console.log("\n🔍 系统信息:");
console.log(" Node.js 版本: " + process.version);
if (nodeVersion >= 16) {
console.log(" ✅ 支持所有功能,将使用现代语法版本");
} else if (nodeVersion >= 12) {
console.log(" ✅ 兼容模式,将使用 Node 12 兼容版本");
} else {
console.log(" ⚠️ 版本较低,建议升级到 Node 12+ 以获得最佳体验");
}
}
// 执行选择的版本
async function executeVersion(choice) {
let scriptPath;
let versionName;
if (choice === "enhanced") {
scriptPath = path.join(__dirname, getEnhancedEntryFile());
versionName = "增强版";
} else {
scriptPath = path.join(__dirname, "index.js");
versionName = "原版";
}
console.log("\n🚀 启动 " + versionName + " 配置工具...");
console.log("─".repeat(50));
// 检查文件是否存在
if (!fs.existsSync(scriptPath)) {
console.error("❌ 错误:找不到 " + versionName + " 入口文件");
console.error(" 文件路径:" + scriptPath);
process.exit(1);
}
try {
// 使用 spawn 而不是 exec 来保持交互性
const child = child_process.spawn("node", [scriptPath], {
stdio: "inherit",
cwd: process.cwd(),
});
child.on("exit", function (code) {
if (code !== 0) {
console.error("\n❌ " + versionName + " 执行失败,退出码:" + code);
process.exit(code);
}
});
child.on("error", function (error) {
console.error("\n❌ 启动 " + versionName + " 时出错:" + error.message);
process.exit(1);
});
} catch (error) {
console.error("\n❌ 执行 " + versionName + " 时出错:" + error.message);
process.exit(1);
}
}
// 主函数
async function main() {
try {
// 检查是否有命令行参数直接指定版本
const args = process.argv.slice(2);
if (args.includes("--enhanced") || args.includes("-e")) {
showNodeVersionInfo();
await executeVersion("enhanced");
return;
}
if (args.includes("--legacy") || args.includes("-l")) {
await executeVersion("legacy");
return;
}
if (args.includes("--help") || args.includes("-h")) {
console.log("\n🚀 liangjing-lint-start 使用说明");
console.log("\n命令行选项:");
console.log(" --enhanced, -e 直接使用增强版");
console.log(" --legacy, -l 直接使用原版");
console.log(" --help, -h 显示帮助信息");
console.log("\n交互式使用:");
console.log(" npx liangjing-lint-start");
return;
}
// 交互式选择
while (true) {
console.log("\n🚀 欢迎使用 liangjing-lint-start 配置工具!");
showNodeVersionInfo();
if (!inquirer) inquirer = require("inquirer");
const versionChoice = await inquirer.prompt([
{
type: "list",
name: "version",
message: "请选择要使用的版本:",
choices: [
{
name: "🔥 增强版 - 智能检测、多预设、VSCode集成(推荐)",
value: "enhanced",
},
{ name: "📦 原版 - 经典版本,稳定可靠", value: "legacy" },
{ name: "❓ 查看版本对比", value: "compare" },
],
default: "enhanced",
},
]);
if (versionChoice.version === "compare") {
showVersionComparison();
await getUserInput("\n按回车键继续选择...", "");
continue;
} else {
await executeVersion(versionChoice.version);
return;
}
}
} catch (error) {
console.error("\n❌ 程序执行出错:" + error.message);
process.exit(1);
}
}
// 处理进程信号
process.on("SIGINT", function () {
console.log("\n\n👋 用户取消操作,退出程序");
process.exit(0);
});
process.on("SIGTERM", function () {
console.log("\n\n👋 程序被终止,退出");
process.exit(0);
});
// 启动程序
if (require.main === module) {
main().catch(function (error) {
console.error("❌ 未捕获的错误:" + error.message);
process.exit(1);
});
}
module.exports = { main: main, getNodeMajorVersion: getNodeMajorVersion };