alistair
Version:
107 lines (103 loc) • 2.96 kB
JavaScript
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 };