UNPKG

@mesh-tech/mesh-cli

Version:

CLI for Mesh platform development utilities

52 lines (51 loc) 1.63 kB
import chalk from "chalk"; export function logPrefix(opts) { const enabled = opts.envFlag === "1" || (opts.envFlag !== "0" && !opts.isTTY); return enabled ? `[${opts.now.toISOString().slice(11, 19)}] ` : ""; } function prefix() { return chalk.dim(logPrefix({ isTTY: !!process.stderr.isTTY, envFlag: process.env.MESH_LOG_TIMESTAMPS, now: new Date(), })); } export function logInfo(message) { console.error(prefix() + chalk.blue("ℹ"), message); } export function logSuccess(message) { console.error(prefix() + chalk.green("✓"), message); } export function logWarn(message) { console.error(prefix() + chalk.yellow("⚠"), message); } export function logError(message) { console.error(prefix() + chalk.red("✗"), message); } export function formatElapsed(ms) { const totalSec = Math.max(0, Math.round(ms / 1000)); const h = Math.floor(totalSec / 3600); const m = Math.floor((totalSec % 3600) / 60); const s = totalSec % 60; if (h > 0) return `${h}h ${m}m`; if (m > 0) return `${m}m ${s}s`; return `${s}s`; } export function startHeartbeat(label, intervalMs = 15_000) { const startedAt = Date.now(); let lastOutputAt = startedAt; const timer = setInterval(() => { if (Date.now() - lastOutputAt < intervalMs) return; logInfo(`… still working: ${label} (${formatElapsed(Date.now() - startedAt)} elapsed)`); }, intervalMs); timer.unref?.(); return { stop: () => clearInterval(timer), touch: () => { lastOutputAt = Date.now(); }, }; }