UNPKG

alistair

Version:
107 lines (103 loc) 2.96 kB
import * as c from 'colorette'; import { inspect } from 'node:util'; // Copyright 2026 Alistair Smith https://github.com/alii/alistair var widestPrefix = 9; var widestPrefixAsIndent = " ".repeat(widestPrefix); function logger({ backend = console, indentString = widestPrefixAsIndent } = {}) { let indentLevel = 0; const getIntentText = (lastChar) => { let result = ""; for (let i = 0; i < indentLevel; i++) { const isLast = i === indentLevel - 1; if (isLast && lastChar) { result += indentString + lastChar; } else { result += indentString + "\u2502 "; } } return c.gray(result); }; function make(level, prefix) { return (...args) => { const indent = getIntentText(); const resultArgs = []; for (let i = 0; i < args.length; i++) { const arg = args[i]; if (typeof arg === "string") { resultArgs.push(arg); continue; } const inspected = inspect(arg, { colors: c.isColorSupported, depth: 10 }); const isError = arg instanceof Error; if (isError) { const colored = inspected.split("\n").map((line, index) => { if (index === 0) { return line; } return c.gray(line.trim()); }).join("\n"); resultArgs.push(colored); } else { resultArgs.push(inspected); } } const string = resultArgs.join(" "); let result = []; const split = string.split("\n"); for (let i = 0; i < split.length; i++) { const line = split[i]; if (i === 0) { result.push(indent + " " + prefix + " " + line); } else { result.push(indent + " " + widestPrefixAsIndent + " " + line); } } backend[level](result.join("\n")); }; } return { indent: (fn) => { indentLevel += 1; backend.info(getIntentText("\u250C\u2500")); fn(); backend.info(getIntentText("\u2514\u2500")); indentLevel -= 1; }, /** * Print an info message */ info: make("info", c.blue("info".padStart(widestPrefix))), /** * Print a success message */ success: make("info", c.greenBright("success".padStart(widestPrefix))), /** * Print a listening message */ listening: make("info", c.cyan("listening".padStart(widestPrefix))), /** * Print a debug message */ debug: make("debug", c.cyan(c.bold("debug".padStart(widestPrefix)))), /** * Print a fatal message */ fatal: make("error", c.red(c.bold("fatal".padStart(widestPrefix)))), /** * Print an error message */ error: make("error", c.red(c.bold("error".padStart(widestPrefix)))), /** * Print a warning message */ warn: make("warn", c.yellow(c.bold("warn".padStart(widestPrefix)))) }; } var log = logger(); export { log, logger };