mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 12:22:14 +03:00
71 lines
2.0 KiB
JavaScript
71 lines
2.0 KiB
JavaScript
import { execFile } from "node:child_process";
|
|
import { t } from "../i18n.mjs";
|
|
|
|
function parsePort(value, fallback) {
|
|
const parsed = parseInt(String(value), 10);
|
|
return Number.isFinite(parsed) && parsed > 0 && parsed <= 65535 ? parsed : fallback;
|
|
}
|
|
|
|
export function registerDashboard(program) {
|
|
program
|
|
.command("dashboard")
|
|
.description(t("dashboard.description"))
|
|
.option("--url", t("dashboard.urlOnly"))
|
|
.option("--port <port>", "Port the server is running on")
|
|
.option("--tui", t("dashboard.tui") || "Open interactive TUI dashboard (terminal UI)")
|
|
.action(async (opts, cmd) => {
|
|
if (opts.tui) {
|
|
const globalOpts = cmd.optsWithGlobals();
|
|
const port = parsePort(opts.port ?? process.env.PORT ?? "20128", 20128);
|
|
const baseUrl = globalOpts.baseUrl ?? `http://localhost:${port}`;
|
|
const apiKey = globalOpts.apiKey ?? null;
|
|
const { startInteractiveTui } = await import("../tui/Dashboard.jsx");
|
|
await startInteractiveTui({ port, baseUrl, apiKey });
|
|
return;
|
|
}
|
|
const exitCode = await runDashboardCommand(opts);
|
|
if (exitCode !== 0) process.exit(exitCode);
|
|
});
|
|
}
|
|
|
|
export async function runDashboardCommand(opts = {}) {
|
|
const port = parsePort(opts.port ?? process.env.PORT ?? "20128", 20128);
|
|
const dashboardUrl = `http://localhost:${port}`;
|
|
|
|
if (opts.url) {
|
|
console.log(dashboardUrl);
|
|
return 0;
|
|
}
|
|
|
|
console.log(t("dashboard.opening", { url: dashboardUrl }));
|
|
|
|
try {
|
|
const open = await import("open");
|
|
await open.default(dashboardUrl);
|
|
} catch {
|
|
await openFallback(dashboardUrl);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function openFallback(url) {
|
|
return new Promise((resolve) => {
|
|
const { platform } = process;
|
|
let cmd, args;
|
|
|
|
if (platform === "darwin") {
|
|
cmd = "open";
|
|
args = [url];
|
|
} else if (platform === "win32") {
|
|
cmd = "cmd";
|
|
args = ["/c", "start", "", url];
|
|
} else {
|
|
cmd = "xdg-open";
|
|
args = [url];
|
|
}
|
|
|
|
execFile(cmd, args, { stdio: "ignore" }, () => resolve());
|
|
});
|
|
}
|