diff --git a/apps/test-bot/src/app/events/clientReady/logger.ts b/apps/test-bot/src/app/events/clientReady/logger.ts new file mode 100644 index 00000000..76c8320f --- /dev/null +++ b/apps/test-bot/src/app/events/clientReady/logger.ts @@ -0,0 +1,7 @@ +import { EventHandler, Logger } from 'commandkit'; + +const handler: EventHandler<'clientReady'> = (client) => { + Logger.log(`Successfully logged in as ${client.user?.tag}`); +}; + +export default handler; diff --git a/apps/test-bot/src/app/events/ready/logger.ts b/apps/test-bot/src/app/events/ready/logger.ts deleted file mode 100644 index 0b2a23a7..00000000 --- a/apps/test-bot/src/app/events/ready/logger.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Logger } from 'commandkit'; -import { Client } from 'discord.js'; - -export default function ReadyEvent(client: Client) { - Logger.log(`Successfully logged in as ${client.user?.tag}`); -} diff --git a/apps/test-bot/src/events/clientReady/test.ts b/apps/test-bot/src/events/clientReady/test.ts new file mode 100644 index 00000000..200d7e7d --- /dev/null +++ b/apps/test-bot/src/events/clientReady/test.ts @@ -0,0 +1,9 @@ +import { type EventHandler, Logger } from 'commandkit'; + +export const once = true; + +const handler: EventHandler<'clientReady'> = (client, c, commandkit) => { + Logger.info`Ready from legacy event handler: ${client.user}`; +}; + +export default handler; diff --git a/apps/test-bot/src/events/ready/test.ts b/apps/test-bot/src/events/ready/test.ts deleted file mode 100644 index fcae89e0..00000000 --- a/apps/test-bot/src/events/ready/test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type EventHandler, Logger } from 'commandkit'; - -export const once = true; - -const handler: EventHandler<'ready'> = (client, c, commandkit) => { - Logger.log(`Ready from legacy event handler: ${client.user.username}`); -}; - -export default handler; diff --git a/apps/website/docs/api-reference/commandkit/classes/default-logger.mdx b/apps/website/docs/api-reference/commandkit/classes/default-logger.mdx index a8e6a717..72dafdb3 100644 --- a/apps/website/docs/api-reference/commandkit/classes/default-logger.mdx +++ b/apps/website/docs/api-reference/commandkit/classes/default-logger.mdx @@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription'; ## DefaultLogger - + Default logger implementation that logs messages to the console. It formats the log messages with timestamps, log levels, and context information. @@ -21,11 +21,21 @@ It formats the log messages with timestamps, log levels, and context information ```ts title="Signature" class DefaultLogger implements ILogger { constructor(stdout: = process.stdout, stderr: = process.stderr) - debug(args: any[]) => void; - error(args: any[]) => void; - log(args: any[]) => void; - info(args: any[]) => void; - warn(args: any[]) => void; + debug(message: any) => void; + debug(strings: TemplateStringsArray, values: any[]) => void; + debug(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + error(message: any) => void; + error(strings: TemplateStringsArray, values: any[]) => void; + error(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + log(message: any) => void; + log(strings: TemplateStringsArray, values: any[]) => void; + log(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + info(message: any) => void; + info(strings: TemplateStringsArray, values: any[]) => void; + info(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + warn(message: any) => void; + warn(strings: TemplateStringsArray, values: any[]) => void; + warn(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; } ``` * Implements: ILogger @@ -41,29 +51,79 @@ class DefaultLogger implements ILogger { Creates a new instance of DefaultLogger. ### debug - void`} /> + void`} /> Logs a debug message. +### debug + + void`} /> + + +### debug + + void`} /> + + ### error - void`} /> + void`} /> Logs an error message. +### error + + void`} /> + + +### error + + void`} /> + + ### log - void`} /> + void`} /> Logs a default message. +### log + + void`} /> + + +### log + + void`} /> + + ### info - void`} /> + void`} /> Logs an info message. +### info + + void`} /> + + +### info + + void`} /> + + ### warn - void`} /> + void`} /> Logs a warning message. +### warn + + void`} /> + + +### warn + + void`} /> + + diff --git a/apps/website/docs/api-reference/commandkit/classes/noop-logger.mdx b/apps/website/docs/api-reference/commandkit/classes/noop-logger.mdx index 1c90cb69..7793c4fa 100644 --- a/apps/website/docs/api-reference/commandkit/classes/noop-logger.mdx +++ b/apps/website/docs/api-reference/commandkit/classes/noop-logger.mdx @@ -19,11 +19,21 @@ Noop logger implementation that does nothing. ```ts title="Signature" class NoopLogger implements ILogger { - debug(args: any[]) => void; - error(args: any[]) => void; - log(args: any[]) => void; - info(args: any[]) => void; - warn(args: any[]) => void; + debug(message: any) => void; + debug(strings: TemplateStringsArray, values: any[]) => void; + debug(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + error(message: any) => void; + error(strings: TemplateStringsArray, values: any[]) => void; + error(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + log(message: any) => void; + log(strings: TemplateStringsArray, values: any[]) => void; + log(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + info(message: any) => void; + info(strings: TemplateStringsArray, values: any[]) => void; + info(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; + warn(message: any) => void; + warn(strings: TemplateStringsArray, values: any[]) => void; + warn(messageOrStrings: any | TemplateStringsArray, values: any[]) => void; } ``` * Implements: ILogger @@ -34,29 +44,79 @@ class NoopLogger implements ILogger { ### debug - void`} /> + void`} /> Logs a debug message. +### debug + + void`} /> + +Logs a debug message using template literals. +### debug + + void`} /> + + ### error - void`} /> + void`} /> Logs an error message. +### error + + void`} /> + +Logs an error message using template literals. +### error + + void`} /> + + ### log - void`} /> + void`} /> Logs a default message. +### log + + void`} /> + +Logs a default message using template literals. +### log + + void`} /> + + ### info - void`} /> + void`} /> Logs an info message. +### info + + void`} /> + +Logs an info message using template literals. +### info + + void`} /> + + ### warn - void`} /> + void`} /> Logs a warning message. +### warn + + void`} /> + +Logs a warning message using template literals. +### warn + + void`} /> + + diff --git a/apps/website/docs/api-reference/commandkit/interfaces/ilogger.mdx b/apps/website/docs/api-reference/commandkit/interfaces/ilogger.mdx index 83863ed3..e38486c7 100644 --- a/apps/website/docs/api-reference/commandkit/interfaces/ilogger.mdx +++ b/apps/website/docs/api-reference/commandkit/interfaces/ilogger.mdx @@ -19,11 +19,16 @@ ILogger interface for logging functionality. ```ts title="Signature" interface ILogger { - log(...args: any[]): void; - error(...args: any[]): void; - warn(...args: any[]): void; - info(...args: any[]): void; - debug(...args: any[]): void; + log(message: any): void; + log(strings: TemplateStringsArray, ...values: any[]): void; + error(message: any): void; + error(strings: TemplateStringsArray, ...values: any[]): void; + warn(message: any): void; + warn(strings: TemplateStringsArray, ...values: any[]): void; + info(message: any): void; + info(strings: TemplateStringsArray, ...values: any[]): void; + debug(message: any): void; + debug(strings: TemplateStringsArray, ...values: any[]): void; } ``` @@ -31,29 +36,54 @@ interface ILogger { ### log - void`} /> + void`} /> Logs a message with the default log level. +### log + + void`} /> + +Logs a message with the default log level using template literals. ### error - void`} /> + void`} /> Logs an error message. +### error + + void`} /> + +Logs an error message using template literals. ### warn - void`} /> + void`} /> Logs a warning message. +### warn + + void`} /> + +Logs a warning message using template literals. ### info - void`} /> + void`} /> Logs an informational message. +### info + + void`} /> + +Logs an informational message using template literals. ### debug - void`} /> + void`} /> Logs a debug message. +### debug + + void`} /> + +Logs a debug message using template literals. diff --git a/apps/website/docs/api-reference/commandkit/variables/logger.mdx b/apps/website/docs/api-reference/commandkit/variables/logger.mdx index ac72a4aa..86a51e73 100644 --- a/apps/website/docs/api-reference/commandkit/variables/logger.mdx +++ b/apps/website/docs/api-reference/commandkit/variables/logger.mdx @@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription'; ## Logger - + Default logger instance for CommandKit. This logger uses the DefaultLogger as its provider. The provider can be replaced with a custom logger implementation using the `configure` method. diff --git a/packages/commandkit/src/logger/DefaultLogger.ts b/packages/commandkit/src/logger/DefaultLogger.ts index 1dbbe94a..c791573d 100644 --- a/packages/commandkit/src/logger/DefaultLogger.ts +++ b/packages/commandkit/src/logger/DefaultLogger.ts @@ -1,6 +1,8 @@ import { getContext } from '../context/async-context'; import colors from '../utils/colors'; +import { COMMANDKIT_IS_DEV } from '../utils/constants'; import { ILogger } from './ILogger'; +import { inspect } from 'util'; /** * Log levels for the logger. @@ -132,7 +134,7 @@ export class DefaultLogger implements ILogger { return `${label}${colors.dim(BoxChars.vertical)} ${colors.dim(timestamp)}`; } - private _log(level: LogLevel, ...args: any[]): void { + private _log(level: LogLevel, message: any): void { const prefix = this._getPrefix(level); const context = this._getContext(); const colorFn = TextColorMap[level]; @@ -140,53 +142,139 @@ export class DefaultLogger implements ILogger { if (context) { this.logger.log( `${prefix}\n${context} ${colors.dim(BoxChars.corner)}`, - ...args.map((arg) => colorFn(arg)), + colorFn(message), ); } else { this.logger.log( `${prefix} ${colors.dim(BoxChars.corner)}`, - ...args.map((arg) => colorFn(arg)), + colorFn(message), + ); + } + } + + private _logTemplate( + level: LogLevel, + strings: TemplateStringsArray, + ...values: any[] + ): void { + const prefix = this._getPrefix(level); + const context = this._getContext(); + const colorFn = TextColorMap[level]; + + let result = ''; + for (let i = 0; i < strings.length; i++) { + result += strings[i]; + if (i < values.length) { + result += inspect(values[i], { + colors: COMMANDKIT_IS_DEV, + depth: 2, + }); + } + } + + if (context) { + this.logger.log( + `${prefix}\n${context} ${colors.dim(BoxChars.corner)}`, + colorFn(result), + ); + } else { + this.logger.log( + `${prefix} ${colors.dim(BoxChars.corner)}`, + colorFn(result), ); } } /** * Logs a debug message. - * @param args The message arguments to log. + * @param message The message to log. */ - public debug(...args: any[]): void { - this._log(LogLevel.DEBUG, ...args); + public debug(message: any): void; + public debug(strings: TemplateStringsArray, ...values: any[]): void; + public debug( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void { + if (this._isTemplateStringsArray(messageOrStrings)) { + this._logTemplate(LogLevel.DEBUG, messageOrStrings, ...values); + } else { + this._log(LogLevel.DEBUG, messageOrStrings); + } } /** * Logs an error message. - * @param args The message arguments to log. + * @param message The error message to log. */ - public error(...args: any[]): void { - this._log(LogLevel.ERROR, ...args); + public error(message: any): void; + public error(strings: TemplateStringsArray, ...values: any[]): void; + public error( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void { + if (this._isTemplateStringsArray(messageOrStrings)) { + this._logTemplate(LogLevel.ERROR, messageOrStrings, ...values); + } else { + this._log(LogLevel.ERROR, messageOrStrings); + } } /** * Logs a default message. - * @param args The message arguments to log. + * @param message The message to log. */ - public log(...args: any[]): void { - this._log(LogLevel.DEFAULT, ...args); + public log(message: any): void; + public log(strings: TemplateStringsArray, ...values: any[]): void; + public log( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void { + if (this._isTemplateStringsArray(messageOrStrings)) { + this._logTemplate(LogLevel.DEFAULT, messageOrStrings, ...values); + } else { + this._log(LogLevel.DEFAULT, messageOrStrings); + } } /** * Logs an info message. - * @param args The message arguments to log. + * @param message The informational message to log. */ - public info(...args: any[]): void { - this._log(LogLevel.INFO, ...args); + public info(message: any): void; + public info(strings: TemplateStringsArray, ...values: any[]): void; + public info( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void { + if (this._isTemplateStringsArray(messageOrStrings)) { + this._logTemplate(LogLevel.INFO, messageOrStrings, ...values); + } else { + this._log(LogLevel.INFO, messageOrStrings); + } } /** * Logs a warning message. - * @param args The message arguments to log. + * @param message The warning message to log. */ - public warn(...args: any[]): void { - this._log(LogLevel.WARN, ...args); + public warn(message: any): void; + public warn(strings: TemplateStringsArray, ...values: any[]): void; + public warn( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void { + if (this._isTemplateStringsArray(messageOrStrings)) { + this._logTemplate(LogLevel.WARN, messageOrStrings, ...values); + } else { + this._log(LogLevel.WARN, messageOrStrings); + } + } + + private _isTemplateStringsArray(value: any): value is TemplateStringsArray { + return ( + Array.isArray(value) && + 'raw' in value && + Array.isArray((value as any).raw) + ); } } diff --git a/packages/commandkit/src/logger/ILogger.ts b/packages/commandkit/src/logger/ILogger.ts index 460faaa3..b23e6cdd 100644 --- a/packages/commandkit/src/logger/ILogger.ts +++ b/packages/commandkit/src/logger/ILogger.ts @@ -4,27 +4,57 @@ export interface ILogger { /** * Logs a message with the default log level. - * @param args The message to log. + * @param message The message to log. */ - log(...args: any[]): void; + log(message: any): void; + /** + * Logs a message with the default log level using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. + */ + log(strings: TemplateStringsArray, ...values: any[]): void; /** * Logs an error message. - * @param args The error message to log. + * @param message The error message to log. */ - error(...args: any[]): void; + error(message: any): void; + /** + * Logs an error message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. + */ + error(strings: TemplateStringsArray, ...values: any[]): void; /** * Logs a warning message. - * @param args The warning message to log. + * @param message The warning message to log. + */ + warn(message: any): void; + /** + * Logs a warning message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. */ - warn(...args: any[]): void; + warn(strings: TemplateStringsArray, ...values: any[]): void; /** * Logs an informational message. - * @param args The informational message to log. + * @param message The informational message to log. + */ + info(message: any): void; + /** + * Logs an informational message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. */ - info(...args: any[]): void; + info(strings: TemplateStringsArray, ...values: any[]): void; /** * Logs a debug message. - * @param args The debug message to log. + * @param message The debug message to log. + */ + debug(message: any): void; + /** + * Logs a debug message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. */ - debug(...args: any[]): void; + debug(strings: TemplateStringsArray, ...values: any[]): void; } diff --git a/packages/commandkit/src/logger/Logger.ts b/packages/commandkit/src/logger/Logger.ts index 909f39ce..6b01e3f7 100644 --- a/packages/commandkit/src/logger/Logger.ts +++ b/packages/commandkit/src/logger/Logger.ts @@ -43,8 +43,9 @@ export function createLogger(options: CommandKitLoggerOptions): LoggerImpl { } as LoggerImpl; for (const method of methods) { - impl[method] = (...args: any[]) => { - opt.provider[method](...args); + impl[method] = (...message: any) => { + // @ts-ignore + opt.provider[method](...message); }; } diff --git a/packages/commandkit/src/logger/NoopLogger.ts b/packages/commandkit/src/logger/NoopLogger.ts index 13d21494..e23f4e17 100644 --- a/packages/commandkit/src/logger/NoopLogger.ts +++ b/packages/commandkit/src/logger/NoopLogger.ts @@ -6,31 +6,81 @@ import { ILogger } from './ILogger'; export class NoopLogger implements ILogger { /** * Logs a debug message. - * @param args The message arguments to log. + * @param message The message to log. */ - public debug(...args: any[]): void {} + public debug(message: any): void; + /** + * Logs a debug message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. + */ + public debug(strings: TemplateStringsArray, ...values: any[]): void; + public debug( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void {} /** * Logs an error message. - * @param args The message arguments to log. + * @param message The error message to log. */ - public error(...args: any[]): void {} + public error(message: any): void; + /** + * Logs an error message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. + */ + public error(strings: TemplateStringsArray, ...values: any[]): void; + public error( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void {} /** * Logs a default message. - * @param args The message arguments to log. + * @param message The message to log. + */ + public log(message: any): void; + /** + * Logs a default message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. */ - public log(...args: any[]): void {} + public log(strings: TemplateStringsArray, ...values: any[]): void; + public log( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void {} /** * Logs an info message. - * @param args The message arguments to log. + * @param message The informational message to log. + */ + public info(message: any): void; + /** + * Logs an info message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. */ - public info(...args: any[]): void {} + public info(strings: TemplateStringsArray, ...values: any[]): void; + public info( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void {} /** * Logs a warning message. - * @param args The message arguments to log. + * @param message The warning message to log. + */ + public warn(message: any): void; + /** + * Logs a warning message using template literals. + * @param strings The template literal strings. + * @param values The values to interpolate. */ - public warn(...args: any[]): void {} + public warn(strings: TemplateStringsArray, ...values: any[]): void; + public warn( + messageOrStrings: any | TemplateStringsArray, + ...values: any[] + ): void {} } diff --git a/packages/create-commandkit/templates/JavaScript/src/app/events/ready/log.js b/packages/create-commandkit/templates/JavaScript/src/app/events/clientReady/log.js similarity index 100% rename from packages/create-commandkit/templates/JavaScript/src/app/events/ready/log.js rename to packages/create-commandkit/templates/JavaScript/src/app/events/clientReady/log.js diff --git a/packages/create-commandkit/templates/TypeScript/src/app/events/ready/log.ts b/packages/create-commandkit/templates/TypeScript/src/app/events/clientReady/log.ts similarity index 100% rename from packages/create-commandkit/templates/TypeScript/src/app/events/ready/log.ts rename to packages/create-commandkit/templates/TypeScript/src/app/events/clientReady/log.ts