@rb-games/core 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-5BLUF2HG.js +25 -0
- package/dist/chunk-5BLUF2HG.js.map +1 -0
- package/dist/chunk-DOHQE2YZ.js +392 -0
- package/dist/chunk-DOHQE2YZ.js.map +1 -0
- package/dist/chunk-FOZO6TLY.js +673 -0
- package/dist/chunk-FOZO6TLY.js.map +1 -0
- package/dist/chunk-G3PMV62Z.js +33 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-KOHCRCV3.js +490 -0
- package/dist/chunk-KOHCRCV3.js.map +1 -0
- package/dist/chunk-MI6BP7A6.js +11 -0
- package/dist/chunk-MI6BP7A6.js.map +1 -0
- package/dist/chunk-NQMORMNP.js +15 -0
- package/dist/chunk-NQMORMNP.js.map +1 -0
- package/dist/chunk-RAEOBW6E.js +133 -0
- package/dist/chunk-RAEOBW6E.js.map +1 -0
- package/dist/chunk-UE7T7Z45.js +884 -0
- package/dist/chunk-UE7T7Z45.js.map +1 -0
- package/dist/devtools/index.js +2 -882
- package/dist/devtools/index.js.map +1 -1
- package/dist/engine/index.js +6 -1267
- package/dist/engine/index.js.map +1 -1
- package/dist/filters/index.js +1 -1
- package/dist/helpers/index.js +6 -35
- package/dist/helpers/index.js.map +1 -1
- package/dist/i18n/index.js +4 -525
- package/dist/i18n/index.js.map +1 -1
- package/dist/layout/index.js +2 -671
- package/dist/layout/index.js.map +1 -1
- package/dist/particle/index.js +1 -6
- package/dist/particle/index.js.map +1 -1
- package/dist/plugins/Plugin.types.d.ts +4 -2
- package/dist/plugins/Plugin.types.d.ts.map +1 -1
- package/dist/plugins/index.js +6 -521
- package/dist/plugins/index.js.map +1 -1
- package/dist/state-machine/index.js +1 -1
- package/dist/store/index.js +1 -1
- package/dist/ui/index.js +5 -531
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/index.js +4 -897
- package/dist/utils/index.js.map +1 -1
- package/dist/vite/index.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// utils/ObjectUtils.ts
|
|
2
|
+
function getNestedValue(obj, path) {
|
|
3
|
+
return path.split(".").reduce((current, key) => current == null ? void 0 : current[key], obj);
|
|
4
|
+
}
|
|
5
|
+
function setNestedValue(obj, path, value) {
|
|
6
|
+
const keys = path.split(".");
|
|
7
|
+
const lastKey = keys.pop();
|
|
8
|
+
const target = keys.reduce((current, key) => {
|
|
9
|
+
if (current[key] === void 0 || current[key] === null) {
|
|
10
|
+
current[key] = {};
|
|
11
|
+
}
|
|
12
|
+
return current[key];
|
|
13
|
+
}, obj);
|
|
14
|
+
target[lastKey] = value;
|
|
15
|
+
}
|
|
16
|
+
function hasNestedProperty(obj, path) {
|
|
17
|
+
return getNestedValue(obj, path) !== void 0;
|
|
18
|
+
}
|
|
19
|
+
function deepClone(obj) {
|
|
20
|
+
return structuredClone(obj);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { deepClone, getNestedValue, hasNestedProperty, setNestedValue };
|
|
24
|
+
//# sourceMappingURL=chunk-5BLUF2HG.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-5BLUF2HG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../utils/ObjectUtils.ts"],"names":[],"mappings":";AAkBO,SAAS,cAAA,CAAe,KAAU,IAAA,EAAmB;AAC1D,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,EAAS,GAAA,KAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,GAAA,CAAA,EAAM,GAAG,CAAA;AACrE;AAiBO,SAAS,cAAA,CAAe,GAAA,EAAU,IAAA,EAAc,KAAA,EAAkB;AACvE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,SAAS,GAAA,KAAQ;AAC3C,IAAA,IAAI,QAAQ,GAAG,CAAA,KAAM,UAAa,OAAA,CAAQ,GAAG,MAAM,IAAA,EAAM;AACvD,MAAA,OAAA,CAAQ,GAAG,IAAI,EAAC;AAAA,IAClB;AACA,IAAA,OAAO,QAAQ,GAAG,CAAA;AAAA,EACpB,GAAG,GAAG,CAAA;AACN,EAAA,MAAA,CAAO,OAAO,CAAA,GAAI,KAAA;AACpB;AAgBO,SAAS,iBAAA,CAAkB,KAAU,IAAA,EAAuB;AACjE,EAAA,OAAO,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA,KAAM,MAAA;AACvC;AAeO,SAAS,UAAa,GAAA,EAAW;AACtC,EAAA,OAAO,gBAAgB,GAAG,CAAA;AAC5B","file":"chunk-5BLUF2HG.js","sourcesContent":["/**\n * Utility functions for object manipulation and property access.\n */\n\n/**\n * Gets a nested property value from an object using a dot-separated path.\n * \n * @param obj - The source object\n * @param path - Dot-separated path to the nested property (e.g., 'user.profile.name')\n * @returns The value at the specified path, or undefined if any part of the path doesn't exist\n * \n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * const name = getNestedValue(obj, 'user.profile.name'); // Returns 'John'\n * const age = getNestedValue(obj, 'user.profile.age'); // Returns undefined\n * ```\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * Sets a nested property value in an object using a dot-separated path.\n * Creates intermediate objects if they don't exist.\n * \n * @param obj - The target object\n * @param path - Dot-separated path to the nested property (e.g., 'user.profile.name')\n * @param value - The value to set\n * \n * @example\n * ```typescript\n * const obj = {};\n * setNestedValue(obj, 'user.profile.name', 'John');\n * // Result: { user: { profile: { name: 'John' } } }\n * ```\n */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current, key) => {\n if (current[key] === undefined || current[key] === null) {\n current[key] = {};\n }\n return current[key];\n }, obj);\n target[lastKey] = value;\n}\n\n/**\n * Checks if a nested property exists in an object using a dot-separated path.\n * \n * @param obj - The object to check\n * @param path - Dot-separated path to the nested property\n * @returns true if the property exists, false otherwise\n * \n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * const hasName = hasNestedProperty(obj, 'user.profile.name'); // Returns true\n * const hasAge = hasNestedProperty(obj, 'user.profile.age'); // Returns false\n * ```\n */\nexport function hasNestedProperty(obj: any, path: string): boolean {\n return getNestedValue(obj, path) !== undefined;\n}\n\n/**\n * Deep clones an object using structured cloning.\n * \n * @param obj - The object to clone\n * @returns A deep copy of the object\n * \n * @example\n * ```typescript\n * const original = { user: { profile: { name: 'John' } } };\n * const cloned = deepClone(original);\n * cloned.user.profile.name = 'Jane'; // Doesn't affect original\n * ```\n */\nexport function deepClone<T>(obj: T): T {\n return structuredClone(obj);\n}"]}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
// utils/Logger.ts
|
|
2
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
3
|
+
LogLevel2[LogLevel2["ERROR"] = 0] = "ERROR";
|
|
4
|
+
LogLevel2[LogLevel2["WARN"] = 1] = "WARN";
|
|
5
|
+
LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
|
|
6
|
+
LogLevel2[LogLevel2["DEBUG"] = 3] = "DEBUG";
|
|
7
|
+
LogLevel2[LogLevel2["TRACE"] = 4] = "TRACE";
|
|
8
|
+
return LogLevel2;
|
|
9
|
+
})(LogLevel || {});
|
|
10
|
+
var Logger = class _Logger {
|
|
11
|
+
static instance;
|
|
12
|
+
config;
|
|
13
|
+
// Terminal colors (for Node.js environment)
|
|
14
|
+
terminalColors = {
|
|
15
|
+
reset: "\x1B[0m",
|
|
16
|
+
red: "\x1B[31m",
|
|
17
|
+
yellow: "\x1B[33m",
|
|
18
|
+
blue: "\x1B[34m",
|
|
19
|
+
green: "\x1B[32m",
|
|
20
|
+
gray: "\x1B[90m",
|
|
21
|
+
cyan: "\x1B[36m",
|
|
22
|
+
magenta: "\x1B[35m",
|
|
23
|
+
white: "\x1B[37m"
|
|
24
|
+
};
|
|
25
|
+
// Browser console colors (using CSS)
|
|
26
|
+
browserColors = {
|
|
27
|
+
timestamp: "color: gray",
|
|
28
|
+
context: "color: cyan; font-weight: bold",
|
|
29
|
+
message: "color: white",
|
|
30
|
+
error: "color: red; font-weight: bold",
|
|
31
|
+
warn: "color: orange; font-weight: bold",
|
|
32
|
+
info: "color: dodgerblue; font-weight: bold",
|
|
33
|
+
debug: "color: green",
|
|
34
|
+
trace: "color: gray"
|
|
35
|
+
};
|
|
36
|
+
levelLabels = {
|
|
37
|
+
[0 /* ERROR */]: "ERROR",
|
|
38
|
+
[1 /* WARN */]: "WARN",
|
|
39
|
+
[2 /* INFO */]: "INFO",
|
|
40
|
+
[3 /* DEBUG */]: "DEBUG",
|
|
41
|
+
[4 /* TRACE */]: "TRACE"
|
|
42
|
+
};
|
|
43
|
+
levelColors = {
|
|
44
|
+
[0 /* ERROR */]: this.terminalColors.red,
|
|
45
|
+
[1 /* WARN */]: this.terminalColors.yellow,
|
|
46
|
+
[2 /* INFO */]: this.terminalColors.blue,
|
|
47
|
+
[3 /* DEBUG */]: this.terminalColors.green,
|
|
48
|
+
[4 /* TRACE */]: this.terminalColors.gray
|
|
49
|
+
};
|
|
50
|
+
levelBrowserColors = {
|
|
51
|
+
[0 /* ERROR */]: this.browserColors.error,
|
|
52
|
+
[1 /* WARN */]: this.browserColors.warn,
|
|
53
|
+
[2 /* INFO */]: this.browserColors.info,
|
|
54
|
+
[3 /* DEBUG */]: this.browserColors.debug,
|
|
55
|
+
[4 /* TRACE */]: this.browserColors.trace
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Private constructor for singleton pattern
|
|
59
|
+
*/
|
|
60
|
+
constructor() {
|
|
61
|
+
var _a;
|
|
62
|
+
this.config = {
|
|
63
|
+
level: 3 /* DEBUG */,
|
|
64
|
+
// Default log level
|
|
65
|
+
enabled: true,
|
|
66
|
+
// Logging enabled by default
|
|
67
|
+
showTimestamp: false,
|
|
68
|
+
// Show timestamps by default
|
|
69
|
+
showColors: true
|
|
70
|
+
// Show colors by default
|
|
71
|
+
};
|
|
72
|
+
if ((_a = import.meta.env) == null ? void 0 : _a.DEV) {
|
|
73
|
+
console.warn(
|
|
74
|
+
"[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\nDevTools \u2192 Settings (F1) \u2192 Ignore List \u2192 Add pattern: /Logger\\.ts$"
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the singleton instance of the Logger
|
|
80
|
+
*/
|
|
81
|
+
static getInstance() {
|
|
82
|
+
if (!_Logger.instance) {
|
|
83
|
+
_Logger.instance = new _Logger();
|
|
84
|
+
}
|
|
85
|
+
return _Logger.instance;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Configure the logger
|
|
89
|
+
* @param config Configuration options
|
|
90
|
+
*/
|
|
91
|
+
configure(config) {
|
|
92
|
+
this.config = { ...this.config, ...config };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Enable or disable logging
|
|
96
|
+
* @param enabled Whether logging is enabled
|
|
97
|
+
*/
|
|
98
|
+
setEnabled(enabled) {
|
|
99
|
+
this.config.enabled = enabled;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Set the log level
|
|
103
|
+
* @param level The log level to set
|
|
104
|
+
*/
|
|
105
|
+
setLevel(level) {
|
|
106
|
+
this.config.level = level;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get the current log level
|
|
110
|
+
*/
|
|
111
|
+
getLevel() {
|
|
112
|
+
return this.config.level;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Log an error message
|
|
116
|
+
* @param message The message to log
|
|
117
|
+
* @param args Additional arguments to log
|
|
118
|
+
*/
|
|
119
|
+
error(message, ...args) {
|
|
120
|
+
this.log(0 /* ERROR */, message, ...args);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Log a warning message
|
|
124
|
+
* @param message The message to log
|
|
125
|
+
* @param args Additional arguments to log
|
|
126
|
+
*/
|
|
127
|
+
warn(message, ...args) {
|
|
128
|
+
this.log(1 /* WARN */, message, ...args);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Log an info message
|
|
132
|
+
* @param message The message to log
|
|
133
|
+
* @param args Additional arguments to log
|
|
134
|
+
*/
|
|
135
|
+
info(message, ...args) {
|
|
136
|
+
this.log(2 /* INFO */, message, ...args);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Log a debug message
|
|
140
|
+
* @param message The message to log
|
|
141
|
+
* @param args Additional arguments to log
|
|
142
|
+
*/
|
|
143
|
+
debug(message, ...args) {
|
|
144
|
+
this.log(3 /* DEBUG */, message, ...args);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Log a trace message
|
|
148
|
+
* @param message The message to log
|
|
149
|
+
* @param args Additional arguments to log
|
|
150
|
+
*/
|
|
151
|
+
trace(message, ...args) {
|
|
152
|
+
this.log(4 /* TRACE */, message, ...args);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Log a message with a specific log level
|
|
156
|
+
* @param level The log level
|
|
157
|
+
* @param message The message to log
|
|
158
|
+
* @param args Additional arguments to log
|
|
159
|
+
*/
|
|
160
|
+
log(level, message, ...args) {
|
|
161
|
+
if (!this.config.enabled || level > this.config.level) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (!this.shouldLogMessage(message)) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const isBrowser = typeof window !== "undefined";
|
|
168
|
+
if (isBrowser && this.config.showColors) {
|
|
169
|
+
this.logBrowser(level, message, ...args);
|
|
170
|
+
} else {
|
|
171
|
+
this.logTerminal(level, message, ...args);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
extractContext(message) {
|
|
175
|
+
const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
|
|
176
|
+
if (!contextMatch) {
|
|
177
|
+
return {
|
|
178
|
+
context: "",
|
|
179
|
+
messageContent: message
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
context: contextMatch[1],
|
|
184
|
+
messageContent: contextMatch[2]
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
matchesFilter(value, matchers) {
|
|
188
|
+
if (!(matchers == null ? void 0 : matchers.length)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
return matchers.some((matcher) => {
|
|
192
|
+
if (typeof matcher === "string") {
|
|
193
|
+
return value.includes(matcher);
|
|
194
|
+
}
|
|
195
|
+
matcher.lastIndex = 0;
|
|
196
|
+
return matcher.test(value);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
shouldLogMessage(message) {
|
|
200
|
+
var _a, _b;
|
|
201
|
+
const filter = this.config.filter;
|
|
202
|
+
if (!filter) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
const hasFilters = Boolean(((_a = filter.contexts) == null ? void 0 : _a.length) || ((_b = filter.messages) == null ? void 0 : _b.length));
|
|
206
|
+
if (!hasFilters) {
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
const { context, messageContent } = this.extractContext(message);
|
|
210
|
+
const contextMatches = this.matchesFilter(context, filter.contexts);
|
|
211
|
+
const messageMatches = this.matchesFilter(messageContent, filter.messages);
|
|
212
|
+
const matches = contextMatches || messageMatches;
|
|
213
|
+
return filter.mode === "exclude" ? !matches : matches;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Log a message in terminal/node environment
|
|
217
|
+
*/
|
|
218
|
+
logTerminal(level, message, ...args) {
|
|
219
|
+
let timestamp = "";
|
|
220
|
+
let levelStr = "";
|
|
221
|
+
let contextPart = "";
|
|
222
|
+
const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
|
|
223
|
+
let messageContent = message;
|
|
224
|
+
if (contextMatch) {
|
|
225
|
+
contextPart = `[${contextMatch[1]}] `;
|
|
226
|
+
messageContent = contextMatch[2];
|
|
227
|
+
}
|
|
228
|
+
if (this.config.showTimestamp) {
|
|
229
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
230
|
+
timestamp = `[${now}] `;
|
|
231
|
+
}
|
|
232
|
+
levelStr = `[${this.levelLabels[level]}] `;
|
|
233
|
+
if (this.config.showColors) {
|
|
234
|
+
const levelColor = this.levelColors[level];
|
|
235
|
+
const contextColor = this.terminalColors.cyan;
|
|
236
|
+
const timestampColor = this.terminalColors.gray;
|
|
237
|
+
const messageColor = this.terminalColors.white;
|
|
238
|
+
timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;
|
|
239
|
+
levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;
|
|
240
|
+
if (contextPart) {
|
|
241
|
+
contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;
|
|
242
|
+
}
|
|
243
|
+
messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;
|
|
244
|
+
}
|
|
245
|
+
const formattedMessage = timestamp + levelStr + contextPart + messageContent;
|
|
246
|
+
switch (level) {
|
|
247
|
+
case 0 /* ERROR */:
|
|
248
|
+
console.error(formattedMessage, ...args);
|
|
249
|
+
break;
|
|
250
|
+
case 1 /* WARN */:
|
|
251
|
+
console.warn(formattedMessage, ...args);
|
|
252
|
+
break;
|
|
253
|
+
case 2 /* INFO */:
|
|
254
|
+
console.info(formattedMessage, ...args);
|
|
255
|
+
break;
|
|
256
|
+
case 3 /* DEBUG */:
|
|
257
|
+
case 4 /* TRACE */:
|
|
258
|
+
default:
|
|
259
|
+
console.log(formattedMessage, ...args);
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Log a message in browser environment with CSS styling
|
|
265
|
+
*/
|
|
266
|
+
logBrowser(level, message, ...args) {
|
|
267
|
+
const contextMatch = message.match(/^\[([^\]]+)\]\s(.*)$/);
|
|
268
|
+
let context = "";
|
|
269
|
+
let messageContent = message;
|
|
270
|
+
if (contextMatch) {
|
|
271
|
+
context = contextMatch[1];
|
|
272
|
+
messageContent = contextMatch[2];
|
|
273
|
+
}
|
|
274
|
+
let format = "";
|
|
275
|
+
const formatArgs = [];
|
|
276
|
+
if (this.config.showTimestamp) {
|
|
277
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
278
|
+
format += "%c[" + now + "] ";
|
|
279
|
+
formatArgs.push(this.browserColors.timestamp);
|
|
280
|
+
}
|
|
281
|
+
format += "%c[" + this.levelLabels[level] + "] ";
|
|
282
|
+
formatArgs.push(this.levelBrowserColors[level]);
|
|
283
|
+
if (context) {
|
|
284
|
+
format += "%c[" + context + "] ";
|
|
285
|
+
formatArgs.push(this.browserColors.context);
|
|
286
|
+
}
|
|
287
|
+
format += "%c" + messageContent;
|
|
288
|
+
formatArgs.push(this.browserColors.message);
|
|
289
|
+
switch (level) {
|
|
290
|
+
case 0 /* ERROR */:
|
|
291
|
+
console.error(format, ...formatArgs, ...args);
|
|
292
|
+
break;
|
|
293
|
+
case 1 /* WARN */:
|
|
294
|
+
console.warn(format, ...formatArgs, ...args);
|
|
295
|
+
break;
|
|
296
|
+
case 2 /* INFO */:
|
|
297
|
+
console.info(format, ...formatArgs, ...args);
|
|
298
|
+
break;
|
|
299
|
+
case 3 /* DEBUG */:
|
|
300
|
+
case 4 /* TRACE */:
|
|
301
|
+
default:
|
|
302
|
+
console.log(format, ...formatArgs, ...args);
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Creates a context-specific logger.
|
|
308
|
+
*
|
|
309
|
+
* Context loggers automatically prefix all log messages with a context tag.
|
|
310
|
+
* Commonly used in plugins and classes to identify log sources.
|
|
311
|
+
*
|
|
312
|
+
* @param context - Context name (e.g., 'MyPlugin', 'SceneManager')
|
|
313
|
+
* @returns ContextLogger instance
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* class DisplayPlugin {
|
|
318
|
+
* private logger = logger.createContextLogger('DisplayPlugin');
|
|
319
|
+
*
|
|
320
|
+
* initialize() {
|
|
321
|
+
* this.logger.info('Initializing display');
|
|
322
|
+
* // Output: [INFO] [DisplayPlugin] Initializing display
|
|
323
|
+
* }
|
|
324
|
+
* }
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
createContextLogger(context) {
|
|
328
|
+
return new ContextLogger(this, context);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
var ContextLogger = class {
|
|
332
|
+
logger;
|
|
333
|
+
context;
|
|
334
|
+
constructor(logger2, context) {
|
|
335
|
+
this.logger = logger2;
|
|
336
|
+
this.context = context;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Log an error message
|
|
340
|
+
* @param message The message to log
|
|
341
|
+
* @param args Additional arguments to log
|
|
342
|
+
*/
|
|
343
|
+
error(message, ...args) {
|
|
344
|
+
this.logger.error(`[${this.context}] ${message}`, ...args);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Log a warning message
|
|
348
|
+
* @param message The message to log
|
|
349
|
+
* @param args Additional arguments to log
|
|
350
|
+
*/
|
|
351
|
+
warn(message, ...args) {
|
|
352
|
+
this.logger.warn(`[${this.context}] ${message}`, ...args);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Log an info message
|
|
356
|
+
* @param message The message to log
|
|
357
|
+
* @param args Additional arguments to log
|
|
358
|
+
*/
|
|
359
|
+
info(message, ...args) {
|
|
360
|
+
this.logger.info(`[${this.context}] ${message}`, ...args);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Log a debug message
|
|
364
|
+
* @param message The message to log
|
|
365
|
+
* @param args Additional arguments to log
|
|
366
|
+
*/
|
|
367
|
+
debug(message, ...args) {
|
|
368
|
+
this.logger.debug(`[${this.context}] ${message}`, ...args);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Log a trace message
|
|
372
|
+
* @param message The message to log
|
|
373
|
+
* @param args Additional arguments to log
|
|
374
|
+
*/
|
|
375
|
+
trace(message, ...args) {
|
|
376
|
+
this.logger.trace(`[${this.context}] ${message}`, ...args);
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
var logger = Logger.getInstance();
|
|
380
|
+
var contextLoggers = /* @__PURE__ */ new Map();
|
|
381
|
+
function getLogger(context) {
|
|
382
|
+
let cached = contextLoggers.get(context);
|
|
383
|
+
if (!cached) {
|
|
384
|
+
cached = new ContextLogger(logger, context);
|
|
385
|
+
contextLoggers.set(context, cached);
|
|
386
|
+
}
|
|
387
|
+
return cached;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
export { ContextLogger, LogLevel, Logger, getLogger, logger };
|
|
391
|
+
//# sourceMappingURL=chunk-DOHQE2YZ.js.map
|
|
392
|
+
//# sourceMappingURL=chunk-DOHQE2YZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../utils/Logger.ts"],"names":["LogLevel","logger"],"mappings":";AAiBO,IAAK,QAAA,qBAAAA,SAAAA,KAAL;AAEL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAEA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAEA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAVU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AA2HL,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EAClB,OAAe,QAAA;AAAA,EACP,MAAA;AAAA;AAAA,EAGS,cAAA,GAAiB;AAAA,IAChC,KAAA,EAAO,SAAA;AAAA,IACP,GAAA,EAAK,UAAA;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,UAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA;AAAA,EAGiB,aAAA,GAAgB;AAAA,IAC/B,SAAA,EAAW,aAAA;AAAA,IACX,OAAA,EAAS,gCAAA;AAAA,IACT,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,+BAAA;AAAA,IACP,IAAA,EAAM,kCAAA;AAAA,IACN,IAAA,EAAM,sCAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EAEiB,WAAA,GAAc;AAAA,IAC7B,CAAC,gBAAiB,OAAA;AAAA,IAClB,CAAC,eAAgB,MAAA;AAAA,IACjB,CAAC,eAAgB,MAAA;AAAA,IACjB,CAAC,gBAAiB,OAAA;AAAA,IAClB,CAAC,gBAAiB;AAAA,GACpB;AAAA,EAEiB,WAAA,GAAc;AAAA,IAC7B,CAAC,CAAA,eAAiB,IAAA,CAAK,cAAA,CAAe,GAAA;AAAA,IACtC,CAAC,CAAA,cAAgB,IAAA,CAAK,cAAA,CAAe,MAAA;AAAA,IACrC,CAAC,CAAA,cAAgB,IAAA,CAAK,cAAA,CAAe,IAAA;AAAA,IACrC,CAAC,CAAA,eAAiB,IAAA,CAAK,cAAA,CAAe,KAAA;AAAA,IACtC,CAAC,CAAA,eAAiB,IAAA,CAAK,cAAA,CAAe;AAAA,GACxC;AAAA,EAEiB,kBAAA,GAAqB;AAAA,IACpC,CAAC,CAAA,eAAiB,IAAA,CAAK,aAAA,CAAc,KAAA;AAAA,IACrC,CAAC,CAAA,cAAgB,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,IACpC,CAAC,CAAA,cAAgB,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,IACpC,CAAC,CAAA,eAAiB,IAAA,CAAK,aAAA,CAAc,KAAA;AAAA,IACrC,CAAC,CAAA,eAAiB,IAAA,CAAK,aAAA,CAAc;AAAA,GACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAc;AApMxB,IAAA,IAAA,EAAA;AAsMI,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,KAAA,EAAO,CAAA;AAAA;AAAA,MACP,OAAA,EAAS,IAAA;AAAA;AAAA,MACT,aAAA,EAAe,KAAA;AAAA;AAAA,MACf,UAAA,EAAY;AAAA;AAAA,KACd;AAEA,IAAA,IAAA,CAAK,EAAA,GAAA,MAAA,CAAA,IAAA,CAA4C,GAAA,KAA5C,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiD,GAAA,EAAK;AACzD,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,WAAA,GAAsB;AAClC,IAAA,IAAI,CAAC,QAAO,QAAA,EAAU;AACpB,MAAA,OAAA,CAAO,QAAA,GAAW,IAAI,OAAA,EAAO;AAAA,IAC/B;AACA,IAAA,OAAO,OAAA,CAAO,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,MAAA,EAAqC;AACpD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,OAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,OAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,KAAA,EAAuB;AACrC,IAAA,IAAA,CAAK,OAAO,KAAA,GAAQ,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,GAAqB;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,GAAA,CAAI,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAmB;AAElE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,KAAA,GAAQ,IAAA,CAAK,OAAO,KAAA,EAAO;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACnC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,MAAA,KAAW,WAAA;AAEpC,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACvC,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,eAAe,OAAA,EAA8D;AACnF,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,sBAAsB,CAAA;AAEzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,aAAa,CAAC,CAAA;AAAA,MACvB,cAAA,EAAgB,aAAa,CAAC;AAAA,KAChC;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,OAAe,QAAA,EAA2C;AAC9E,IAAA,IAAI,EAAC,qCAAU,MAAA,CAAA,EAAQ;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY;AAChC,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,OAAO,KAAA,CAAM,SAAS,OAAO,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,MAAA,OAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iBAAiB,OAAA,EAA0B;AApWrD,IAAA,IAAA,EAAA,EAAA,EAAA;AAqWI,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAE3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,UAAQ,EAAA,GAAA,MAAA,CAAO,QAAA,KAAP,mBAAiB,MAAA,MAAA,CAAU,EAAA,GAAA,MAAA,CAAO,QAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,MAAA,CAAM,CAAA;AAE7E,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA,CAAK,eAAe,OAAO,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAO,QAAQ,CAAA;AAClE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,OAAO,QAAQ,CAAA;AACzE,IAAA,MAAM,UAAU,cAAA,IAAkB,cAAA;AAElC,IAAA,OAAO,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,CAAC,OAAA,GAAU,OAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAmB;AAE1E,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,WAAA,GAAc,EAAA;AAGlB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,sBAAsB,CAAA;AACzD,IAAA,IAAI,cAAA,GAAiB,OAAA;AAErB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,WAAA,GAAc,CAAA,CAAA,EAAI,YAAA,CAAa,CAAC,CAAC,CAAA,EAAA,CAAA;AACjC,MAAA,cAAA,GAAiB,aAAa,CAAC,CAAA;AAAA,IACjC;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,SAAA,GAAY,IAAI,GAAG,CAAA,EAAA,CAAA;AAAA,IACrB;AAGA,IAAA,QAAA,GAAW,CAAA,CAAA,EAAI,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA,EAAA,CAAA;AAGtC,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACzC,MAAA,MAAM,YAAA,GAAe,KAAK,cAAA,CAAe,IAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,CAAe,IAAA;AAC3C,MAAA,MAAM,YAAA,GAAe,KAAK,cAAA,CAAe,KAAA;AAEzC,MAAA,SAAA,GAAY,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AACrE,MAAA,QAAA,GAAW,GAAG,UAAU,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAE/D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,GAAc,GAAG,YAAY,CAAA,EAAG,WAAW,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAAA,MACzE;AAEA,MAAA,cAAA,GAAiB,GAAG,YAAY,CAAA,EAAG,cAAc,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,gBAAA,GAAmB,SAAA,GAAY,QAAA,GAAW,WAAA,GAAc,cAAA;AAG9D,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,KAAA,CAAM,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACvC,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,CAAA;AAAA,MACL,KAAK,CAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACrC,QAAA;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,CAAW,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAmB;AAEzE,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,sBAAsB,CAAA;AACzD,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,cAAA,GAAiB,OAAA;AAErB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,GAAU,aAAa,CAAC,CAAA;AACxB,MAAA,cAAA,GAAiB,aAAa,CAAC,CAAA;AAAA,IACjC;AAGA,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,MAAM,aAAuB,EAAC;AAG9B,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,MAAA,IAAU,QAAQ,GAAA,GAAM,IAAA;AACxB,MAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAA,IAAU,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AAC5C,IAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAG9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,IAAU,QAAQ,OAAA,GAAU,IAAA;AAC5B,MAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAAA,IAC5C;AAGA,IAAA,MAAA,IAAU,IAAA,GAAO,cAAA;AACjB,IAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAG1C,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,CAAA;AAAA,MACL,KAAK,CAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC1C,QAAA;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBO,oBAAoB,OAAA,EAAgC;AACzD,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAAA,EACxC;AACF;AAoCO,IAAM,gBAAN,MAAoB;AAAA,EACjB,MAAA;AAAA,EACA,OAAA;AAAA,EAER,WAAA,CAAYC,SAAgB,OAAA,EAAiB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAASA,OAAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3D;AACF;AAGO,IAAM,MAAA,GAAS,OAAO,WAAA;AAG7B,IAAM,cAAA,uBAAqB,GAAA,EAA2B;AAqB/C,SAAS,UAAU,OAAA,EAAgC;AACxD,EAAA,IAAI,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAA;AAC1C,IAAA,cAAA,CAAe,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT","file":"chunk-DOHQE2YZ.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Log levels for filtering log output.\n *\n * Lower numeric values have higher priority.\n * Setting a log level will show that level and all higher priority levels.\n *\n * @example\n * ```typescript\n * // Set to INFO level\n * logger.setLevel(LogLevel.INFO);\n * // Will show: ERROR, WARN, INFO\n * // Will hide: DEBUG, TRACE\n * ```\n *\n * @public\n */\nexport enum LogLevel {\n /** Critical errors (always shown) */\n ERROR = 0,\n /** Warnings (shown at WARN level and above) */\n WARN = 1,\n /** Informational messages (shown at INFO level and above) */\n INFO = 2,\n /** Debug messages (shown at DEBUG level and above) */\n DEBUG = 3,\n /** Trace messages (most verbose, shown only at TRACE level) */\n TRACE = 4,\n}\n\nexport type LoggerFilterMatcher = string | RegExp;\n\nexport interface LoggerFilterConfig {\n contexts?: LoggerFilterMatcher[];\n messages?: LoggerFilterMatcher[];\n mode?: 'include' | 'exclude';\n}\n\n/**\n * Configuration options for the Logger.\n *\n * @public\n */\nexport interface LoggerConfig {\n /** Minimum log level to display */\n level: LogLevel;\n /** Whether logging is enabled */\n enabled: boolean;\n /** Whether to show timestamps in logs */\n showTimestamp: boolean;\n /** Whether to show colors in logs */\n showColors: boolean;\n filter?: LoggerFilterConfig;\n}\n\n/**\n * Singleton logger for centralized logging.\n *\n * Logger provides a unified logging system with:\n * - Multiple log levels (ERROR, WARN, INFO, DEBUG, TRACE)\n * - Colored output (browser and terminal)\n * - Timestamps\n * - Context-based sub-loggers\n * - Environment detection (browser vs Node.js)\n *\n * ## Features\n *\n * - **Singleton Pattern**: Single instance across the application\n * - **Log Levels**: Filter logs by severity\n * - **Colored Output**: CSS colors in browser, ANSI colors in terminal\n * - **Context Loggers**: Create sub-loggers with context prefixes\n * - **Timestamps**: Optional ISO timestamp display\n * - **Environment Aware**: Automatically detects browser vs Node.js\n *\n * ## Log Levels\n *\n * - **ERROR** (0): Critical errors\n * - **WARN** (1): Warnings\n * - **INFO** (2): Informational messages (default)\n * - **DEBUG** (3): Debug information\n * - **TRACE** (4): Detailed trace information\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { logger, LogLevel } from '@rb-games/core/utils';\n *\n * // Configure logger\n * logger.configure({\n * level: LogLevel.DEBUG,\n * showTimestamp: true,\n * showColors: true\n * });\n *\n * // Log messages\n * logger.error('Critical error occurred');\n * logger.warn('This is a warning');\n * logger.info('Application started');\n * logger.debug('Debug information', { data: 'value' });\n * logger.trace('Detailed trace');\n * ```\n *\n * @example\n * Context loggers (used in plugins):\n * ```typescript\n * class MyPlugin {\n * private logger = logger.createContextLogger('MyPlugin');\n *\n * initialize() {\n * this.logger.info('Plugin initialized');\n * // Output: [2024-01-01T12:00:00.000Z] [INFO] [MyPlugin] Plugin initialized\n * }\n *\n * doSomething() {\n * this.logger.debug('Doing something', { value: 42 });\n * // Output: [2024-01-01T12:00:00.000Z] [DEBUG] [MyPlugin] Doing something { value: 42 }\n * }\n * }\n * ```\n *\n * @example\n * Production configuration:\n * ```typescript\n * // In production, only show errors and warnings\n * if (process.env.NODE_ENV === 'production') {\n * logger.setLevel(LogLevel.WARN);\n * } else {\n * logger.setLevel(LogLevel.DEBUG);\n * }\n * ```\n *\n * @example\n * Disable logging:\n * ```typescript\n * logger.setEnabled(false);\n * ```\n *\n * @category Utils\n * @public\n */\nexport class Logger {\n private static instance: Logger;\n private config: LoggerConfig;\n\n // Terminal colors (for Node.js environment)\n private readonly terminalColors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n green: '\\x1b[32m',\n gray: '\\x1b[90m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n white: '\\x1b[37m',\n };\n\n // Browser console colors (using CSS)\n private readonly browserColors = {\n timestamp: 'color: gray',\n context: 'color: cyan; font-weight: bold',\n message: 'color: white',\n error: 'color: red; font-weight: bold',\n warn: 'color: orange; font-weight: bold',\n info: 'color: dodgerblue; font-weight: bold',\n debug: 'color: green',\n trace: 'color: gray',\n };\n\n private readonly levelLabels = {\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.TRACE]: 'TRACE',\n };\n\n private readonly levelColors = {\n [LogLevel.ERROR]: this.terminalColors.red,\n [LogLevel.WARN]: this.terminalColors.yellow,\n [LogLevel.INFO]: this.terminalColors.blue,\n [LogLevel.DEBUG]: this.terminalColors.green,\n [LogLevel.TRACE]: this.terminalColors.gray,\n };\n\n private readonly levelBrowserColors = {\n [LogLevel.ERROR]: this.browserColors.error,\n [LogLevel.WARN]: this.browserColors.warn,\n [LogLevel.INFO]: this.browserColors.info,\n [LogLevel.DEBUG]: this.browserColors.debug,\n [LogLevel.TRACE]: this.browserColors.trace,\n };\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Default configuration\n this.config = {\n level: LogLevel.DEBUG, // Default log level\n enabled: true, // Logging enabled by default\n showTimestamp: false, // Show timestamps by default\n showColors: true, // Show colors by default\n };\n\n if ((import.meta as { env?: { DEV?: boolean } }).env?.DEV) {\n console.warn(\n '[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\\n' +\n 'DevTools → Settings (F1) → Ignore List → Add pattern: /Logger\\\\.ts$',\n );\n }\n }\n\n /**\n * Get the singleton instance of the Logger\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n /**\n * Configure the logger\n * @param config Configuration options\n */\n public configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Enable or disable logging\n * @param enabled Whether logging is enabled\n */\n public setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n }\n\n /**\n * Set the log level\n * @param level The log level to set\n */\n public setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n /**\n * Get the current log level\n */\n public getLevel(): LogLevel {\n return this.config.level;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, message, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, message, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, message, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, message, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.log(LogLevel.TRACE, message, ...args);\n }\n\n /**\n * Log a message with a specific log level\n * @param level The log level\n * @param message The message to log\n * @param args Additional arguments to log\n */\n private log(level: LogLevel, message: string, ...args: any[]): void {\n // Only log if enabled and the log level is sufficient\n if (!this.config.enabled || level > this.config.level) {\n return;\n }\n\n if (!this.shouldLogMessage(message)) {\n return;\n }\n\n // Check if we're in a browser environment\n const isBrowser = typeof window !== 'undefined';\n\n if (isBrowser && this.config.showColors) {\n this.logBrowser(level, message, ...args);\n } else {\n this.logTerminal(level, message, ...args);\n }\n }\n\n private extractContext(message: string): { context: string; messageContent: string } {\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n\n if (!contextMatch) {\n return {\n context: '',\n messageContent: message,\n };\n }\n\n return {\n context: contextMatch[1],\n messageContent: contextMatch[2],\n };\n }\n\n private matchesFilter(value: string, matchers?: LoggerFilterMatcher[]): boolean {\n if (!matchers?.length) {\n return false;\n }\n\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n\n matcher.lastIndex = 0;\n return matcher.test(value);\n });\n }\n\n private shouldLogMessage(message: string): boolean {\n const filter = this.config.filter;\n\n if (!filter) {\n return true;\n }\n\n const hasFilters = Boolean(filter.contexts?.length || filter.messages?.length);\n\n if (!hasFilters) {\n return true;\n }\n\n const { context, messageContent } = this.extractContext(message);\n const contextMatches = this.matchesFilter(context, filter.contexts);\n const messageMatches = this.matchesFilter(messageContent, filter.messages);\n const matches = contextMatches || messageMatches;\n\n return filter.mode === 'exclude' ? !matches : matches;\n }\n\n /**\n * Log a message in terminal/node environment\n */\n private logTerminal(level: LogLevel, message: string, ...args: any[]): void {\n // Prepare log prefix\n let timestamp = '';\n let levelStr = '';\n let contextPart = '';\n\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let messageContent = message;\n\n if (contextMatch) {\n contextPart = `[${contextMatch[1]}] `;\n messageContent = contextMatch[2];\n }\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n timestamp = `[${now}] `;\n }\n\n // Add log level\n levelStr = `[${this.levelLabels[level]}] `;\n\n // Format with colors if enabled\n if (this.config.showColors) {\n const levelColor = this.levelColors[level];\n const contextColor = this.terminalColors.cyan;\n const timestampColor = this.terminalColors.gray;\n const messageColor = this.terminalColors.white;\n\n timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;\n levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;\n\n if (contextPart) {\n contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;\n }\n\n messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;\n }\n\n const formattedMessage = timestamp + levelStr + contextPart + messageContent;\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args);\n break;\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args);\n break;\n case LogLevel.INFO:\n console.info(formattedMessage, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(formattedMessage, ...args);\n break;\n }\n }\n\n /**\n * Log a message in browser environment with CSS styling\n */\n private logBrowser(level: LogLevel, message: string, ...args: any[]): void {\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let context = '';\n let messageContent = message;\n\n if (contextMatch) {\n context = contextMatch[1];\n messageContent = contextMatch[2];\n }\n\n // Create CSS styled format string\n let format = '';\n const formatArgs: string[] = [];\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n format += '%c[' + now + '] ';\n formatArgs.push(this.browserColors.timestamp);\n }\n\n // Add log level with style\n format += '%c[' + this.levelLabels[level] + '] ';\n formatArgs.push(this.levelBrowserColors[level]);\n\n // Add context if present\n if (context) {\n format += '%c[' + context + '] ';\n formatArgs.push(this.browserColors.context);\n }\n\n // Add the actual message\n format += '%c' + messageContent;\n formatArgs.push(this.browserColors.message);\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(format, ...formatArgs, ...args);\n break;\n case LogLevel.WARN:\n console.warn(format, ...formatArgs, ...args);\n break;\n case LogLevel.INFO:\n console.info(format, ...formatArgs, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(format, ...formatArgs, ...args);\n break;\n }\n }\n\n /**\n * Creates a context-specific logger.\n *\n * Context loggers automatically prefix all log messages with a context tag.\n * Commonly used in plugins and classes to identify log sources.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns ContextLogger instance\n *\n * @example\n * ```typescript\n * class DisplayPlugin {\n * private logger = logger.createContextLogger('DisplayPlugin');\n *\n * initialize() {\n * this.logger.info('Initializing display');\n * // Output: [INFO] [DisplayPlugin] Initializing display\n * }\n * }\n * ```\n */\n public createContextLogger(context: string): ContextLogger {\n return new ContextLogger(this, context);\n }\n}\n\n/**\n * Context-specific logger that prefixes all messages.\n *\n * ContextLogger wraps the main Logger and automatically adds a context prefix\n * to all log messages. This makes it easy to identify which component or plugin\n * generated a log message.\n *\n * ## Usage\n *\n * Create context loggers using `logger.createContextLogger(context)`.\n * All log methods (error, warn, info, debug, trace) are available.\n *\n * @example\n * ```typescript\n * class ResourcePlugin {\n * private logger = logger.createContextLogger('ResourcePlugin');\n *\n * async loadAssets() {\n * this.logger.info('Loading assets...');\n * // Output: [INFO] [ResourcePlugin] Loading assets...\n *\n * try {\n * await this.load();\n * this.logger.info('Assets loaded successfully');\n * } catch (error) {\n * this.logger.error('Failed to load assets', error);\n * }\n * }\n * }\n * ```\n *\n * @category Utils\n * @public\n */\nexport class ContextLogger {\n private logger: Logger;\n private context: string;\n\n constructor(logger: Logger, context: string) {\n this.logger = logger;\n this.context = context;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.logger.error(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.logger.warn(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.logger.info(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.logger.debug(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.logger.trace(`[${this.context}] ${message}`, ...args);\n }\n}\n\n// Export a default instance for convenience\nexport const logger = Logger.getInstance();\n\n// Cached context loggers for inline usage\nconst contextLoggers = new Map<string, ContextLogger>();\n\n/**\n * Get or create a cached context logger.\n * Same context string always returns the same instance.\n *\n * Preferred over class property pattern for easier tree-shaking\n * and production stripping.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns Cached ContextLogger instance\n *\n * @example\n * ```typescript\n * import { getLogger } from '@rb-games/core/utils';\n *\n * // No class property needed - use inline\n * getLogger('MyClass').info('message');\n * getLogger('MyClass').debug('data', { x: 1 });\n * ```\n */\nexport function getLogger(context: string): ContextLogger {\n let cached = contextLoggers.get(context);\n if (!cached) {\n cached = new ContextLogger(logger, context);\n contextLoggers.set(context, cached);\n }\n return cached;\n}\n"]}
|