#!/usr/bin/env node "use strict"; /** * dev:hot 启动入口。 * * 目标: * - 不改动 desktop:hot 的默认行为。 * - 使用 cargo-watch 自动重编译并重启 mnote-web。 * - 通过 MNOTE_WEB_DEV_HOT_RELOAD 启用页面端轻量 reload 轮询。 */ const { spawn } = require("node:child_process"); const fs = require("node:fs"); const path = require("node:path"); const rootDir = path.resolve(__dirname, ".."); const desktopHotPath = path.join(rootDir, "scripts", "desktop-hot.js"); function cargoWatchCommand(env = process.env) { const extraArgs = String(env.MNOTE_WEB_DEV_HOT_CARGO_WATCH_ARGS || "").trim(); const watchArgs = [ "-w crates/mnote-web/src", "-w crates/mnote-web/Cargo.toml", "-w Cargo.toml", "-x \"run -p mnote-web --bin mnote-web\"", ]; if (extraArgs) watchArgs.unshift(extraArgs); return `cargo watch ${watchArgs.join(" ")}`; } function buildDevHotEnv(baseEnv = process.env) { return { ...baseEnv, MNOTE_WEB_DEV_HOT_RELOAD: "1", MNOTE_WEB_CMD: String(baseEnv.MNOTE_WEB_CMD || "").trim() || cargoWatchCommand(baseEnv), }; } function main() { if (!fs.existsSync(desktopHotPath)) { throw new Error(`缺少 desktop-hot 入口:${desktopHotPath}`); } const child = spawn(process.execPath, [desktopHotPath], { cwd: rootDir, env: buildDevHotEnv(process.env), stdio: "inherit", }); child.on("exit", (code, signal) => { if (signal) { process.kill(process.pid, signal); return; } process.exit(code ?? 0); }); child.on("error", (error) => { console.error(`[dev-hot] 启动失败:${error.message}`); process.exit(1); }); } if (require.main === module) { main(); } module.exports = { buildDevHotEnv, cargoWatchCommand, };