Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 33 additions & 32 deletions src/helpers/logger.mts
Original file line number Diff line number Diff line change
@@ -1,32 +1,18 @@
import type { Get } from "type-fest";

import type { TContext } from "./context.mts";
import type { TBlackHole } from "./utilities.mts";

// eslint-disable-next-line @typescript-eslint/no-empty-object-type
export interface ReplacementLogger {
// intentionally left empty
// for use with declaration merging
}

export type GetLogger =
Get<ReplacementLogger, "logger"> extends object ? Get<ReplacementLogger, "logger"> : ILogger;

export type LogStreamTarget = (message: string, data: object) => TBlackHole;

export type DigitalAlchemyLogger = {
addTarget: (logger: GetLogger | LogStreamTarget) => void;
addTarget: (logger: LogStreamTarget) => void;
/**
* Create a new logger instance for a given context
*/
context: (context: string | TContext) => ILogger;
/**
* Retrieve a reference to the base logger used to emit from
*/
getBaseLogger: () => Record<
keyof GetLogger,
(context: TContext, ...data: Parameters<TLoggerFunction>) => void
>;
getBaseLogger: () => ILogger;
getPrettyFormat: () => boolean;
/**
* exposed for testing
Expand All @@ -37,44 +23,59 @@ export type DigitalAlchemyLogger = {
*
* Note: Extension still handles LOG_LEVEL logic
*/
setBaseLogger: (base: GetLogger) => GetLogger;
setBaseLogger: (base: ILogger) => ILogger;
/**
* Set the enabled/disabled state of the message pretty formatting logic
*/
setPrettyFormat: (state: boolean) => boolean;
/**
* Logger instance of last resort
*/
systemLogger: GetLogger;
systemLogger: ILogger;
/**
* exposed for testing
*/
updateShouldLog: () => void;
};

export interface ExtraLoggerArgs {
string: string;
boolean: boolean;
number: number;
}

export type LoggerArgs = ExtraLoggerArgs[keyof ExtraLoggerArgs];

export type TLoggerFunction =
| ((message: string, ...arguments_: unknown[]) => void)
| ((object: object, message?: string, ...arguments_: unknown[]) => void);
| ((message: string, ...arguments_: LoggerArgs[]) => void)
| ((object: object, message?: string, ...arguments_: LoggerArgs[]) => void);

// export type InternalRewriteLoggerFn = (
// context: TContext,
// ...data: Parameters<TLoggerFunction>
// ) => void;

// export type InternalRewriteLogger = Record<keyof ILogger, InternalRewriteLoggerFn>;

export interface ILogger {
debug(...arguments_: Parameters<TLoggerFunction>): void;
debug(message: string, ...arguments_: unknown[]): void;
debug(object: object, message?: string, ...arguments_: unknown[]): void;
debug(message: string, ...arguments_: LoggerArgs[]): void;
debug(object: object, message?: string, ...arguments_: LoggerArgs[]): void;
error(...arguments_: Parameters<TLoggerFunction>): void;
error(message: string, ...arguments_: unknown[]): void;
error(object: object, message?: string, ...arguments_: unknown[]): void;
error(message: string, ...arguments_: LoggerArgs[]): void;
error(object: object, message?: string, ...arguments_: LoggerArgs[]): void;
fatal(...arguments_: Parameters<TLoggerFunction>): void;
fatal(message: string, ...arguments_: unknown[]): void;
fatal(object: object, message?: string, ...arguments_: unknown[]): void;
fatal(message: string, ...arguments_: LoggerArgs[]): void;
fatal(object: object, message?: string, ...arguments_: LoggerArgs[]): void;
info(...arguments_: Parameters<TLoggerFunction>): void;
info(message: string, ...arguments_: unknown[]): void;
info(object: object, message?: string, ...arguments_: unknown[]): void;
info(message: string, ...arguments_: LoggerArgs[]): void;
info(object: object, message?: string, ...arguments_: LoggerArgs[]): void;
trace(...arguments_: Parameters<TLoggerFunction>): void;
trace(message: string, ...arguments_: unknown[]): void;
trace(object: object, message?: string, ...arguments_: unknown[]): void;
trace(message: string, ...arguments_: LoggerArgs[]): void;
trace(object: object, message?: string, ...arguments_: LoggerArgs[]): void;
warn(...arguments_: Parameters<TLoggerFunction>): void;
warn(message: string, ...arguments_: unknown[]): void;
warn(object: object, message?: string, ...arguments_: unknown[]): void;
warn(message: string, ...arguments_: LoggerArgs[]): void;
warn(object: object, message?: string, ...arguments_: LoggerArgs[]): void;
}
export type TConfigLogLevel = keyof ILogger | "silent";

Expand Down
12 changes: 6 additions & 6 deletions src/helpers/wiring.mts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import type { TContext } from "./context.mts";
import type { CronExpression, ScheduleRemove } from "./cron.mts";
import { BootstrapException } from "./errors.mts";
import type { TLifecycleBase } from "./lifecycle.mts";
import type { GetLogger, TConfigLogLevel } from "./logger.mts";
import type { ILogger, TConfigLogLevel } from "./logger.mts";
import type { TBlackHole } from "./utilities.mts";

export type TServiceReturn<OBJECT extends object = object> = void | OBJECT;
Expand Down Expand Up @@ -150,7 +150,7 @@ export interface AsyncLogData {
/**
* thread local child logger
*/
logger?: GetLogger;
logger?: ILogger;
}

export interface AsyncLocalData {
Expand Down Expand Up @@ -196,7 +196,7 @@ export type TServiceParams = {
/**
* context aware logger instance
*/
logger: GetLogger;
logger: ILogger;
/**
* run commands on intervals & schedules
*
Expand Down Expand Up @@ -363,7 +363,7 @@ export type BootstrapOptions = {
/**
* use this logger, instead of the baked in one. Maybe you want some custom transports or something? Put your customized thing here
*/
customLogger?: GetLogger;
customLogger?: ILogger;

/**
* fine tine the built in logger
Expand Down Expand Up @@ -482,7 +482,7 @@ export type ApplicationDefinition<
C extends OptionalModuleConfiguration,
> = ApplicationConfigurationOptions<S, C> &
Wire & {
logger: GetLogger;
logger: ILogger;
type: "application";
booted: boolean;
bootstrap: (options?: BootstrapOptions) => Promise<TServiceParams>;
Expand All @@ -493,7 +493,7 @@ export type TLibrary = LibraryDefinition<ServiceMap, OptionalModuleConfiguration
// #MARK: buildSortOrder
export function buildSortOrder<S extends ServiceMap, C extends OptionalModuleConfiguration>(
app: ApplicationDefinition<S, C>,
logger: GetLogger,
logger: ILogger,
) {
if (is.empty(app.libraries)) {
return [];
Expand Down
5 changes: 4 additions & 1 deletion src/services/configuration.service.mts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,10 @@ export function Configuration({

// modern problems require modern solutions
let logger: ILogger;
lifecycle.onPreInit(() => (logger = internal.boilerplate.logger.context(context)));
lifecycle.onPreInit(
() => (logger = internal.boilerplate.logger.context(context)),
Number.NEGATIVE_INFINITY,
);
const configDefinitions: KnownConfigs = new Map();
const configuration: PartialConfiguration = {};
const loaded = new Set<string>();
Expand Down
Loading