1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-12-09 16:21:51 +00:00

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.
This commit is contained in:
Даниїл Григор'єв 2025-07-18 14:37:30 +03:00
parent ce1cab3065
commit 2240c00090
No known key found for this signature in database
GPG Key ID: B890DF16341D8C1D
13 changed files with 78 additions and 126 deletions

View File

@ -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);
// }
}
}

60
src/js/core/logging.ts Normal file
View File

@ -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;
}

View File

@ -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(

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";