everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
56 lines (54 loc) • 1.94 kB
JavaScript
import { existsSync } from "node:fs";
import { join } from "node:path";
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
//#region src/dev-logs.ts
const ESC = "\x1B";
const BEL = "\x07";
const ANSI_RE = new RegExp(`${ESC}\\[[0-?]*[ -/]*[@-~]|${ESC}\\][^${BEL}]*${BEL}`, "g");
const stripAnsi = (input) => input.replace(ANSI_RE, "");
function getBosDir(configDir) {
return join(configDir, ".bos");
}
function getLogsDir(configDir) {
return join(getBosDir(configDir), "logs");
}
function formatLogLine(entry) {
const ts = new Date(entry.timestamp).toISOString();
const prefix = entry.isError ? "ERR" : "OUT";
const clean = stripAnsi(entry.line);
return `[${ts}] [${entry.source}] [${prefix}] ${clean}`;
}
async function createDevLogger(configDir, description) {
const dir = getLogsDir(configDir);
if (!existsSync(dir)) await mkdir(dir, { recursive: true });
const now = /* @__PURE__ */ new Date();
const logFile = join(dir, `dev-${now.toISOString().replace(/[:.]/g, "-").slice(0, 19)}.log`);
const latestFile = join(dir, "dev-latest.log");
const header = `# everything-dev dev session: ${description}\n# Started: ${now.toISOString()}\n\n`;
await writeFile(logFile, header, "utf8");
await writeFile(latestFile, header, "utf8");
let chain = Promise.resolve();
const enqueue = (fn) => {
chain = chain.then(fn, fn);
return chain;
};
return {
logFile,
latestFile,
write: (entry) => enqueue(async () => {
const line = `${formatLogLine(entry)}\n`;
await appendFile(logFile, line);
await appendFile(latestFile, line);
}),
readLatest: async (opts) => {
const text = await readFile(latestFile, "utf8").catch(() => "");
const tail = opts?.tail;
if (!tail || tail <= 0) return text;
const lines = text.split("\n");
return lines.slice(Math.max(0, lines.length - tail)).join("\n");
}
};
}
//#endregion
export { createDevLogger };
//# sourceMappingURL=dev-logs.mjs.map