Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 332x 332x 332x 74x 332x 332x 332x 945x | import type { Logger, LogLevel } from '../definition.ts';
import type { BaseLoggerOptions } from '../implementation/base-logger.ts';
import { BaseLogger } from '../implementation/base-logger.ts';
import type { LogSink } from './sink.ts';
/**
* Creates a logger that emits entries to the specified log sink.
*
* This is the core logger factory function that powers all other logger creation functions. It accepts either a sink
* function directly or a full LogSink object with optional flush/close methods.
*
* @example Basic usage with sink function
*
* ```ts
* import { emitter } from 'emitnlog/logger';
*
* const logger = emitter.createLogger('info', (level, message, args) => {
* console.log(`[${level.toUpperCase()}] ${message}`, ...args);
* });
*
* logger.i`Hello world`;
* ```
*
* @example Usage with full LogSink object
*
* ```ts
* import { emitter } from 'emitnlog/logger';
*
* const sink = emitter.consoleLogSink();
* const logger = emitter.createLogger('info', sink);
* logger.i`Hello world`;
* ```
*
* @param level The minimum log level or a function that returns the level
* @param logSink The sink function or LogSink object to emit entries to
* @param options Additional logger configuration options
* @returns A logger instance that emits to the specified sink
*/
export function createLogger(
level: LogLevel | 'off' | (() => LogLevel | 'off'),
logSink: LogSink['sink'],
options?: BaseLoggerOptions,
): Logger;
export function createLogger<S extends LogSink>(
level: LogLevel | 'off' | (() => LogLevel | 'off'),
logSink: S,
options?: BaseLoggerOptions,
): Exclude<Logger, 'flush' | 'close'> & Pick<S, 'flush' | 'close'>;
export function createLogger(
level: LogLevel | 'off' | (() => LogLevel | 'off'),
logSink: LogSink | LogSink['sink'],
options?: BaseLoggerOptions,
): Logger {
return new EmitterLogger(level, logSink, options);
}
class EmitterLogger extends BaseLogger {
private readonly logSink: LogSink;
public readonly flush: (() => void | Promise<void>) | undefined;
public readonly close: (() => void | Promise<void>) | undefined;
public constructor(
level: LogLevel | 'off' | (() => LogLevel | 'off'),
logSink: LogSink | LogSink['sink'],
options?: BaseLoggerOptions,
) {
super(level, options);
if (typeof logSink === 'function') {
logSink = { sink: logSink };
}
this.logSink = logSink;
this.flush = logSink.flush && (() => logSink.flush?.());
this.close = logSink.close && (() => logSink.close?.());
}
protected override emit(level: LogLevel, message: string, args: readonly unknown[]): void {
this.logSink.sink(level, message, args);
}
}
|