From 2240c0009077e918e891240a357039a1519f6b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D1=97=D0=BB=20=D0=93=D1=80=D0=B8?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=27=D1=94=D0=B2?= Date: Fri, 18 Jul 2025 14:37:30 +0300 Subject: [PATCH] Introduce new Logger implementation Remove old Logger class and replace it with a new implementation that keeps the location of the log calls (for display in devtools). Remove internals of the old implementation and their one external usage. --- src/js/core/logging.js | 111 -------------------------- src/js/core/logging.ts | 60 ++++++++++++++ src/js/game/hud/parts/base_toolbar.js | 8 +- src/js/savegame/schemas/1001.js | 6 +- src/js/savegame/schemas/1002.js | 3 +- src/js/savegame/schemas/1003.js | 2 +- src/js/savegame/schemas/1004.js | 2 +- src/js/savegame/schemas/1005.js | 2 +- src/js/savegame/schemas/1006.js | 2 +- src/js/savegame/schemas/1007.js | 2 +- src/js/savegame/schemas/1008.js | 2 +- src/js/savegame/schemas/1009.js | 2 +- src/js/savegame/schemas/1010.js | 2 +- 13 files changed, 78 insertions(+), 126 deletions(-) delete mode 100644 src/js/core/logging.js create mode 100644 src/js/core/logging.ts diff --git a/src/js/core/logging.js b/src/js/core/logging.js deleted file mode 100644 index 9eced81f..00000000 --- a/src/js/core/logging.js +++ /dev/null @@ -1,111 +0,0 @@ -import { globalConfig } from "../core/config"; - -/* -Logging functions -- To be extended -*/ - -/** - * Base logger class - */ -class Logger { - constructor(context) { - this.context = context; - } - - debug(...args) { - globalDebug(this.context, ...args); - } - - log(...args) { - globalLog(this.context, ...args); - } - - warn(...args) { - globalWarn(this.context, ...args); - } - - error(...args) { - globalError(this.context, ...args); - } -} - -export function createLogger(context) { - return new Logger(context); -} - -export function globalDebug(context, ...args) { - if (G_IS_DEV) { - logInternal(context, console.log, prepareArgsForLogging(args)); - } -} - -export function globalLog(context, ...args) { - logInternal(context, console.log, prepareArgsForLogging(args)); -} - -export function globalWarn(context, ...args) { - logInternal(context, console.warn, prepareArgsForLogging(args)); -} - -export function globalError(context, ...args) { - args = prepareArgsForLogging(args); - logInternal(context, console.error, args); -} - -function prepareArgsForLogging(args) { - let result = []; - for (let i = 0; i < args.length; ++i) { - result.push(args[i]); - } - return result; -} - -export function logSection(name, color) { - while (name.length <= 14) { - name = " " + name + " "; - } - name = name.padEnd(19, " "); - - const lineCss = - "letter-spacing: -3px; color: " + color + "; font-size: 6px; background: #eee; color: #eee;"; - const line = "%c----------------------------"; - console.log("\n" + line + " %c" + name + " " + line + "\n", lineCss, "color: " + color, lineCss); -} - -function extractHandleContext(handle) { - let context = handle || "unknown"; - if (handle && handle.constructor && handle.constructor.name) { - context = handle.constructor.name; - if (context === "String") { - context = handle; - } - } - - if (handle && handle.name) { - context = handle.name; - } - return context + ""; -} - -function logInternal(handle, consoleMethod, args) { - const context = extractHandleContext(handle).padEnd(20, " "); - const labelColor = handle && handle.LOG_LABEL_COLOR ? handle.LOG_LABEL_COLOR : "#aaa"; - - if (G_IS_DEV && globalConfig.debug.logTimestamps) { - const timestamp = "⏱ %c" + (Math.floor(performance.now()) + "").padEnd(6, " ") + ""; - consoleMethod.call( - console, - timestamp + " %c" + context, - "color: #7f7;", - "color: " + labelColor + ";", - ...args - ); - } else { - // if (G_IS_DEV && !globalConfig.debug.disableLoggingLogSources) { - consoleMethod.call(console, "%c" + context, "color: " + labelColor, ...args); - // } else { - // consoleMethod.call(console, ...args); - // } - } -} diff --git a/src/js/core/logging.ts b/src/js/core/logging.ts new file mode 100644 index 00000000..3e958789 --- /dev/null +++ b/src/js/core/logging.ts @@ -0,0 +1,60 @@ +export class Logger { + /** + * A simple {@link console} wrapper that retains the location of log calls. + * @param context Label to be displayed in each log message + * @param color Optional label color override + * @param debug Whether to log {@link Logger.debug} messages + */ + constructor(context: string, color = "#aaa", debug = G_IS_DEV) { + const label = "%c" + context.padEnd(20, " "); + const style = `color: ${color}`; + + if (debug) { + this.debug = console.debug.bind(console, label, style); + } + + this.log = console.log.bind(console, label, style); + this.warn = console.warn.bind(console, label, style); + this.error = console.error.bind(console, label, style); + } + + // @ts-expect-error parameters are actually used + debug(...args: unknown[]) {} + // @ts-expect-error same + log(...args: unknown[]) {} + // @ts-expect-error same + warn(...args: unknown[]) {} + // @ts-expect-error same + error(...args: unknown[]) {} +} + +/** + * @deprecated Use the {@link Logger} constructor instead + * @param handle Object to be used as the logger label + * @returns A {@link Logger} instance + */ +export function createLogger(handle: unknown) { + const context = extractHandleContext(handle); + return new Logger(context); +} + +export function logSection(name, color) { + while (name.length <= 14) { + name = " " + name + " "; + } + name = name.padEnd(19, " "); + + const lineCss = + "letter-spacing: -3px; color: " + color + "; font-size: 6px; background: #eee; color: #eee;"; + const line = "%c----------------------------"; + console.log("\n" + line + " %c" + name + " " + line + "\n", lineCss, "color: " + color, lineCss); +} + +function extractHandleContext(handle: unknown) { + handle ??= "unknown"; + if (typeof handle === "string") { + return handle; + } + + return handle.constructor.name; +} diff --git a/src/js/game/hud/parts/base_toolbar.js b/src/js/game/hud/parts/base_toolbar.js index 0a3dc5e5..e0d4259f 100644 --- a/src/js/game/hud/parts/base_toolbar.js +++ b/src/js/game/hud/parts/base_toolbar.js @@ -1,5 +1,5 @@ import { gMetaBuildingRegistry } from "../../../core/global_registries"; -import { globalWarn } from "../../../core/logging"; +import { Logger } from "../../../core/logging"; import { STOP_PROPAGATION } from "../../../core/signal"; import { makeDiv, safeModulo } from "../../../core/utils"; import { MetaBlockBuilding } from "../../buildings/block"; @@ -12,6 +12,8 @@ import { GameRoot } from "../../root"; import { BaseHUDPart } from "../base_hud_part"; import { DynamicDomAttach } from "../dynamic_dom_attach"; +const logger = new Logger("hud/base_toolbar"); + export class HUDBaseToolbar extends BaseHUDPart { /** * @param {GameRoot} root @@ -106,7 +108,9 @@ export class HUDBaseToolbar extends BaseHUDPart { const binding = actionMapper.getBinding(rawBinding); binding.add(() => this.selectBuildingForPlacement(metaBuilding)); } else { - globalWarn("Building has no keybinding:", metaBuilding.getId()); + // FIXME: This check shouldn't be here. Once registries rework is done, + // check for keybindings while finalizing the buildings registry + logger.warn("Building has no keybinding:", metaBuilding.getId()); } const itemContainer = makeDiv( diff --git a/src/js/savegame/schemas/1001.js b/src/js/savegame/schemas/1001.js index 1d4ef5c0..8a4601e1 100644 --- a/src/js/savegame/schemas/1001.js +++ b/src/js/savegame/schemas/1001.js @@ -1,7 +1,7 @@ -import { SavegameInterface_V1000 } from "./1000.js"; -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { T } from "../../translations.js"; -import { TypeVector, TypeNumber, TypeString, TypeNullable } from "../serialization_data_types.js"; +import { TypeNumber, TypeVector } from "../serialization_data_types.js"; +import { SavegameInterface_V1000 } from "./1000.js"; import schema from "./1001.json"; diff --git a/src/js/savegame/schemas/1002.js b/src/js/savegame/schemas/1002.js index a8aad488..0a94001f 100644 --- a/src/js/savegame/schemas/1002.js +++ b/src/js/savegame/schemas/1002.js @@ -1,5 +1,4 @@ -import { createLogger } from "../../core/logging.js"; -import { T } from "../../translations.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1001 } from "./1001.js"; import schema from "./1002.json"; diff --git a/src/js/savegame/schemas/1003.js b/src/js/savegame/schemas/1003.js index dbe51899..b463b017 100644 --- a/src/js/savegame/schemas/1003.js +++ b/src/js/savegame/schemas/1003.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1002 } from "./1002.js"; import schema from "./1003.json"; diff --git a/src/js/savegame/schemas/1004.js b/src/js/savegame/schemas/1004.js index 9cf4e12a..801ea138 100644 --- a/src/js/savegame/schemas/1004.js +++ b/src/js/savegame/schemas/1004.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1003 } from "./1003.js"; import schema from "./1004.json"; diff --git a/src/js/savegame/schemas/1005.js b/src/js/savegame/schemas/1005.js index d793dfa5..cde7cc2c 100644 --- a/src/js/savegame/schemas/1005.js +++ b/src/js/savegame/schemas/1005.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1004 } from "./1004.js"; import schema from "./1005.json"; diff --git a/src/js/savegame/schemas/1006.js b/src/js/savegame/schemas/1006.js index be6b5c0c..be38fa8a 100644 --- a/src/js/savegame/schemas/1006.js +++ b/src/js/savegame/schemas/1006.js @@ -1,5 +1,5 @@ import { gMetaBuildingRegistry } from "../../core/global_registries"; -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { getCodeFromBuildingData } from "../../game/building_codes.js"; import { enumBalancerVariants, MetaBalancerBuilding } from "../../game/buildings/balancer.js"; import { MetaBeltBuilding } from "../../game/buildings/belt.js"; diff --git a/src/js/savegame/schemas/1007.js b/src/js/savegame/schemas/1007.js index 91388006..64550e93 100644 --- a/src/js/savegame/schemas/1007.js +++ b/src/js/savegame/schemas/1007.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1006 } from "./1006.js"; import schema from "./1007.json"; diff --git a/src/js/savegame/schemas/1008.js b/src/js/savegame/schemas/1008.js index 227aa7b9..c89e99d7 100644 --- a/src/js/savegame/schemas/1008.js +++ b/src/js/savegame/schemas/1008.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1007 } from "./1007.js"; import schema from "./1008.json"; diff --git a/src/js/savegame/schemas/1009.js b/src/js/savegame/schemas/1009.js index ca86ed8e..0dd97937 100644 --- a/src/js/savegame/schemas/1009.js +++ b/src/js/savegame/schemas/1009.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { RegularGameMode } from "../../game/modes/regular.js"; import { SavegameInterface_V1008 } from "./1008.js"; diff --git a/src/js/savegame/schemas/1010.js b/src/js/savegame/schemas/1010.js index e70ba8bc..52ec81e4 100644 --- a/src/js/savegame/schemas/1010.js +++ b/src/js/savegame/schemas/1010.js @@ -1,4 +1,4 @@ -import { createLogger } from "../../core/logging.js"; +import { createLogger } from "../../core/logging"; import { SavegameInterface_V1009 } from "./1009.js"; import schema from "./1010.json";