summaryrefslogtreecommitdiff
path: root/u/trace/logger.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-06-20 14:53:38 -0700
committerElizabeth Hunt <me@liz.coffee>2025-06-20 14:53:38 -0700
commitd4791f3d357634daf506fb8f91cc5332a794c421 (patch)
tree1bb01d2d4d8fa74d83bb6f99f2c8aa4146ca2d11 /u/trace/logger.ts
parentd7e8d31c94cd713a2f4cf799e20e993acc69e361 (diff)
downloadci-d4791f3d357634daf506fb8f91cc5332a794c421.tar.gz
ci-d4791f3d357634daf506fb8f91cc5332a794c421.zip
Move to nodejs
Diffstat (limited to 'u/trace/logger.ts')
-rw-r--r--u/trace/logger.ts169
1 files changed, 76 insertions, 93 deletions
diff --git a/u/trace/logger.ts b/u/trace/logger.ts
index d8392eb..91432fe 100644
--- a/u/trace/logger.ts
+++ b/u/trace/logger.ts
@@ -1,112 +1,95 @@
-import {
- isDebug,
- type ITrace,
- type ITraceWith,
- type Supplier,
-} from "@emprespresso/pengueno";
+import { isDebug, type ITrace, type ITraceWith, type Supplier } from '@emprespresso/pengueno';
export type LogTraceSupplier = ITraceWith<Supplier<string> | Error>;
const defaultTrace = () => `TimeStamp = ${new Date().toISOString()}`;
export class LogTrace implements ITrace<LogTraceSupplier> {
- constructor(
- private readonly logger: ILogger = new LoggerImpl(),
- private readonly traces: Array<LogTraceSupplier> = [defaultTrace],
- private readonly defaultLevel: LogLevel = LogLevel.INFO,
- private readonly allowedLevels: Supplier<
- Array<LogLevel>
- > = defaultAllowedLevels,
- ) {}
+ constructor(
+ private readonly logger: ILogger = new LoggerImpl(),
+ private readonly traces: Array<LogTraceSupplier> = [defaultTrace],
+ private readonly defaultLevel: LogLevel = LogLevel.INFO,
+ private readonly allowedLevels: Supplier<Array<LogLevel>> = defaultAllowedLevels,
+ ) {}
- public addTrace(trace: LogTraceSupplier): ITrace<LogTraceSupplier> {
- return new LogTrace(
- this.logger,
- this.traces.concat(trace),
- this.defaultLevel,
- this.allowedLevels,
- );
- }
+ public addTrace(trace: LogTraceSupplier): ITrace<LogTraceSupplier> {
+ return new LogTrace(this.logger, this.traces.concat(trace), this.defaultLevel, this.allowedLevels);
+ }
- public trace(trace: LogTraceSupplier) {
- const { traces, level: _level } = this.foldTraces(
- this.traces.concat(trace),
- );
- if (!this.allowedLevels().includes(_level)) return;
+ public trace(trace: LogTraceSupplier) {
+ const { traces, level: _level } = this.foldTraces(this.traces.concat(trace));
+ if (!this.allowedLevels().includes(_level)) return;
- const level = _level === LogLevel.UNKNOWN ? this.defaultLevel : _level;
- this.logger.log(level, ...traces);
- }
+ const level = _level === LogLevel.UNKNOWN ? this.defaultLevel : _level;
+ this.logger.log(level, ...traces);
+ }
- private foldTraces(_traces: Array<LogTraceSupplier>) {
- const _logTraces = _traces.map((trace) =>
- typeof trace === "function" ? trace() : trace,
- );
- const _level = _logTraces
- .filter((trace) => isLogLevel(trace))
- .reduce((acc, level) => Math.max(logLevelOrder.indexOf(level), acc), -1);
- const level = logLevelOrder[_level] ?? LogLevel.UNKNOWN;
+ private foldTraces(_traces: Array<LogTraceSupplier>) {
+ const _logTraces = _traces.map((trace) => (typeof trace === 'function' ? trace() : trace));
+ const _level = _logTraces
+ .filter((trace) => isLogLevel(trace))
+ .reduce((acc, level) => Math.max(logLevelOrder.indexOf(level), acc), -1);
+ const level = logLevelOrder[_level] ?? LogLevel.UNKNOWN;
- const traces = _logTraces.filter((trace) => !isLogLevel(trace)).map((trace) => {
- if (typeof trace === 'object') {
- return `TracedException.Name = ${trace.name}, TracedException.Message = ${trace.message}, TracedException.Stack = ${trace.stack}`
- }
- return trace;
- });
- return {
- level,
- traces,
- };
- }
+ const traces = _logTraces
+ .filter((trace) => !isLogLevel(trace))
+ .map((trace) => {
+ if (typeof trace === 'object') {
+ return `TracedException.Name = ${trace.name}, TracedException.Message = ${trace.message}, TracedException.Stack = ${trace.stack}`;
+ }
+ return trace;
+ });
+ return {
+ level,
+ traces,
+ };
+ }
}
export enum LogLevel {
- UNKNOWN = "UNKNOWN",
- INFO = "INFO",
- WARN = "WARN",
- DEBUG = "DEBUG",
- ERROR = "ERROR",
- SYS = "SYS",
+ UNKNOWN = 'UNKNOWN',
+ INFO = 'INFO',
+ WARN = 'WARN',
+ DEBUG = 'DEBUG',
+ ERROR = 'ERROR',
+ SYS = 'SYS',
}
-const logLevelOrder: Array<LogLevel> = [
- LogLevel.DEBUG,
- LogLevel.INFO,
- LogLevel.WARN,
- LogLevel.ERROR,
- LogLevel.SYS,
-];
+const logLevelOrder: Array<LogLevel> = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR, LogLevel.SYS];
export const isLogLevel = (l: unknown): l is LogLevel =>
- typeof l === "string" && logLevelOrder.some((level) => level === l);
-
+ typeof l === 'string' && logLevelOrder.some((level) => level === l);
const defaultAllowedLevels = () =>
- [
- LogLevel.UNKNOWN,
- ...(isDebug() ? [LogLevel.DEBUG] : []),
- LogLevel.INFO,
- LogLevel.WARN,
- LogLevel.ERROR,
- LogLevel.SYS,
- ] as Array<LogLevel>;
+ [
+ LogLevel.UNKNOWN,
+ ...(isDebug() ? [LogLevel.DEBUG] : []),
+ LogLevel.INFO,
+ LogLevel.WARN,
+ LogLevel.ERROR,
+ LogLevel.SYS,
+ ] as Array<LogLevel>;
export interface ILogger {
- readonly log: (level: LogLevel, ...args: string[]) => void;
+ readonly log: (level: LogLevel, ...args: string[]) => void;
}
class LoggerImpl implements ILogger {
private readonly textEncoder = new TextEncoder();
public log(level: LogLevel, ...trace: string[]) {
- const message = JSON.stringify({
- level,
- trace,
- }, null, 4);
+ const message = JSON.stringify(
+ {
+ level,
+ trace,
+ },
+ null,
+ 4,
+ );
const styled = `${this.getStyle(level)}${message}${ANSI.RESET}\n`;
- this.getStream(level).writeSync(this.textEncoder.encode(styled));
+ this.getStream(level)(this.textEncoder.encode(styled));
}
private getStream(level: LogLevel) {
if (level === LogLevel.ERROR) {
- return Deno.stderr;
+ return console.error;
}
- return Deno.stdout;
+ return console.log;
}
private getStyle(level: LogLevel) {
@@ -127,17 +110,17 @@ class LoggerImpl implements ILogger {
}
export const ANSI = {
- RESET: "\x1b[0m",
- BOLD: "\x1b[1m",
- DIM: "\x1b[2m",
- RED: "\x1b[31m",
- GREEN: "\x1b[32m",
- YELLOW: "\x1b[33m",
- BLUE: "\x1b[34m",
- MAGENTA: "\x1b[35m",
- CYAN: "\x1b[36m",
- WHITE: "\x1b[37m",
- BRIGHT_RED: "\x1b[91m",
- BRIGHT_YELLOW: "\x1b[93m",
- GRAY: "\x1b[90m",
+ RESET: '\x1b[0m',
+ BOLD: '\x1b[1m',
+ DIM: '\x1b[2m',
+ RED: '\x1b[31m',
+ GREEN: '\x1b[32m',
+ YELLOW: '\x1b[33m',
+ BLUE: '\x1b[34m',
+ MAGENTA: '\x1b[35m',
+ CYAN: '\x1b[36m',
+ WHITE: '\x1b[37m',
+ BRIGHT_RED: '\x1b[91m',
+ BRIGHT_YELLOW: '\x1b[93m',
+ GRAY: '\x1b[90m',
};