@mesh-tech/mesh-cli
Version:
CLI for Mesh platform development utilities
52 lines (51 loc) • 1.63 kB
JavaScript
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();
},
};
}