orcas-angular 1.0.0
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/LICENSE +159 -0
- package/README.md +17 -0
- package/async/README.md +46 -0
- package/async/async.ts +16 -0
- package/async/cancellation-token.ts +90 -0
- package/dev/README.md +41 -0
- package/dev/console-hook.ts +25 -0
- package/dev/debug.service.ts.example +29 -0
- package/framework/README.md +34 -0
- package/framework/services-init.ts +25 -0
- package/index.ts +21 -0
- package/localization/README.md +73 -0
- package/localization/localization.interface.ts +18 -0
- package/localization/localization.service.ts +131 -0
- package/localization/localize.pipe.ts +30 -0
- package/log/README.md +275 -0
- package/log/echo-provider.ts +27 -0
- package/log/echo.ts +635 -0
- package/log/index.ts +6 -0
- package/log/log-systems.ts +20 -0
- package/navigation/README.md +47 -0
- package/navigation/back-on-click.directive.ts +19 -0
- package/navigation/index.ts +3 -0
- package/navigation/navigation-stack.service.ts +33 -0
- package/package.json +29 -0
- package/storage/README.md +75 -0
- package/storage/capacitor-files.service.ts +38 -0
- package/storage/file-box.service.ts +112 -0
- package/storage/files.ts +42 -0
- package/storage/key-signals.ts +49 -0
- package/storage/local-storage-files.service.ts +49 -0
- package/storage/settings-signals.service.ts +24 -0
- package/storage/settings.service.ts +24 -0
- package/storage/tauri-files.service.ts +69 -0
- package/theme/README.md +44 -0
- package/theme/theme.service.ts +33 -0
- package/ui/README.md +42 -0
- package/ui/context-menu/context-button.component.ts +55 -0
- package/ui/context-menu/context-header.component.ts +15 -0
- package/ui/context-menu/context-menu-trigger.directive.ts +26 -0
- package/ui/context-menu/context-menu.component.ts +95 -0
- package/ui/context-menu/index.ts +4 -0
package/log/echo.ts
ADDED
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Echo - A flexible logging library
|
|
3
|
+
* TypeScript port of Echo.cs core functionality (excluding Unity-specific features)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Enums
|
|
8
|
+
// ============================================================================
|
|
9
|
+
|
|
10
|
+
export enum LogLevel {
|
|
11
|
+
None = 0,
|
|
12
|
+
Error = 1,
|
|
13
|
+
Warn = 2,
|
|
14
|
+
Info = 3,
|
|
15
|
+
Debug = 4
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
enum LogMode {
|
|
19
|
+
Always = 0,
|
|
20
|
+
Once = 1
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export enum SystemColor {
|
|
24
|
+
None,
|
|
25
|
+
LabelOnly,
|
|
26
|
+
LabelAndMessage
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Interfaces
|
|
31
|
+
// ============================================================================
|
|
32
|
+
|
|
33
|
+
export interface EchoLogWriter {
|
|
34
|
+
writeLog(level: LogLevel, system: string, message: string): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Configuration
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
export class LogWriterConfig {
|
|
42
|
+
timestamp: boolean = true;
|
|
43
|
+
levelLabels: boolean = true;
|
|
44
|
+
levelColors: boolean = true;
|
|
45
|
+
systemColor: SystemColor = SystemColor.LabelOnly;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Helpers
|
|
50
|
+
// ============================================================================
|
|
51
|
+
|
|
52
|
+
class Helpers {
|
|
53
|
+
static fnv1a32(str: string, hash: number = 2166136261): number {
|
|
54
|
+
for (let i = 0; i < str.length; i++) {
|
|
55
|
+
hash ^= str.charCodeAt(i);
|
|
56
|
+
hash = Math.imul(hash, 16777619);
|
|
57
|
+
}
|
|
58
|
+
return hash >>> 0; // Convert to unsigned 32-bit integer
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static getElementFromHash<T>(collection: T[], stringToHash: string): T {
|
|
62
|
+
const hash = Helpers.fnv1a32(stringToHash);
|
|
63
|
+
const index = hash % collection.length;
|
|
64
|
+
return collection[index];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
class WritersHelpers {
|
|
69
|
+
static getLevelLabel(level: LogLevel): string {
|
|
70
|
+
switch (level) {
|
|
71
|
+
case LogLevel.Debug: return "DEBUG";
|
|
72
|
+
case LogLevel.Info: return "INFO";
|
|
73
|
+
case LogLevel.Warn: return "WARN";
|
|
74
|
+
case LogLevel.Error: return "ERROR";
|
|
75
|
+
default: return "???";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
static readonly systemColors: string[] = [
|
|
80
|
+
"\x1b[31m", // Red
|
|
81
|
+
"\x1b[32m", // Green
|
|
82
|
+
"\x1b[34m", // Blue
|
|
83
|
+
"\x1b[33m", // Yellow
|
|
84
|
+
"\x1b[36m", // Cyan
|
|
85
|
+
"\x1b[35m" // Magenta
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
static readonly levelColors: Map<LogLevel, string> = new Map([
|
|
89
|
+
[LogLevel.Debug, "\x1b[37m"], // White
|
|
90
|
+
[LogLevel.Info, "\x1b[36m"], // Cyan
|
|
91
|
+
[LogLevel.Warn, "\x1b[33m"], // Yellow
|
|
92
|
+
[LogLevel.Error, "\x1b[31m"] // Red
|
|
93
|
+
]);
|
|
94
|
+
|
|
95
|
+
static readonly resetColor = "\x1b[0m";
|
|
96
|
+
static readonly grayColor = "\x1b[90m";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Internal Classes
|
|
101
|
+
// ============================================================================
|
|
102
|
+
|
|
103
|
+
class HashesManager {
|
|
104
|
+
private hashes: Set<number> = new Set();
|
|
105
|
+
|
|
106
|
+
tryAdd(system: string, message: string): boolean {
|
|
107
|
+
let hash = Helpers.fnv1a32(message);
|
|
108
|
+
hash = Helpers.fnv1a32(system, hash);
|
|
109
|
+
if (this.hashes.has(hash)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
this.hashes.add(hash);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
clear(): void {
|
|
117
|
+
this.hashes.clear();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
class LoggerCore {
|
|
122
|
+
private readonly logWriter: EchoLogWriter;
|
|
123
|
+
private readonly echoSettings: EchoSettings;
|
|
124
|
+
private readonly hashes: HashesManager;
|
|
125
|
+
|
|
126
|
+
constructor(config: EchoSettings, hashes: HashesManager, logger: EchoLogWriter) {
|
|
127
|
+
if (!config) throw new Error("config cannot be null");
|
|
128
|
+
if (!hashes) throw new Error("hashes cannot be null");
|
|
129
|
+
if (!logger) throw new Error("logger cannot be null");
|
|
130
|
+
|
|
131
|
+
this.echoSettings = config;
|
|
132
|
+
this.hashes = hashes;
|
|
133
|
+
this.logWriter = logger;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private isEnabled(system: string, level: LogLevel): boolean {
|
|
137
|
+
return level <= this.echoSettings.getSystemLevel(system);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private shouldLogOnce(system: string, message: string): boolean {
|
|
141
|
+
return this.hashes.tryAdd(system, message);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
clearHashes(): void {
|
|
145
|
+
this.hashes.clear();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private write(level: LogLevel, mode: LogMode, system: string, message: string): void {
|
|
149
|
+
if (mode === LogMode.Always || this.shouldLogOnce(system, message)) {
|
|
150
|
+
this.logWriter.writeLog(level, system, message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
writeIfEnabled(level: LogLevel, mode: LogMode, system: string, message: string): void {
|
|
155
|
+
if (this.isEnabled(system, level)) {
|
|
156
|
+
this.write(level, mode, system, message);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
writeIfEnabled1<T1>(level: LogLevel, mode: LogMode, system: string, format: string, param1: T1): void {
|
|
161
|
+
if (this.isEnabled(system, level)) {
|
|
162
|
+
const message = this.formatString1(format, param1);
|
|
163
|
+
this.write(level, mode, system, message);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
writeIfEnabled2<T1, T2>(level: LogLevel, mode: LogMode, system: string, format: string, param1: T1, param2: T2): void {
|
|
168
|
+
if (this.isEnabled(system, level)) {
|
|
169
|
+
const message = this.formatString2(format, param1, param2);
|
|
170
|
+
this.write(level, mode, system, message);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
writeIfEnabled3<T1, T2, T3>(level: LogLevel, mode: LogMode, system: string, format: string, param1: T1, param2: T2, param3: T3): void {
|
|
175
|
+
if (this.isEnabled(system, level)) {
|
|
176
|
+
const message = this.formatString3(format, param1, param2, param3);
|
|
177
|
+
this.write(level, mode, system, message);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
writeIfEnabled4<T1, T2, T3, T4>(level: LogLevel, mode: LogMode, system: string, format: string, param1: T1, param2: T2, param3: T3, param4: T4): void {
|
|
182
|
+
if (this.isEnabled(system, level)) {
|
|
183
|
+
const message = this.formatString4(format, param1, param2, param3, param4);
|
|
184
|
+
this.write(level, mode, system, message);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private formatString1<T1>(format: string, param1: T1): string {
|
|
189
|
+
return format.replace(/\{0\}/g, String(param1));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private formatString2<T1, T2>(format: string, param1: T1, param2: T2): string {
|
|
193
|
+
return format.replace(/\{0\}/g, String(param1)).replace(/\{1\}/g, String(param2));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private formatString3<T1, T2, T3>(format: string, param1: T1, param2: T2, param3: T3): string {
|
|
197
|
+
return format.replace(/\{0\}/g, String(param1)).replace(/\{1\}/g, String(param2)).replace(/\{2\}/g, String(param3));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private formatString4<T1, T2, T3, T4>(format: string, param1: T1, param2: T2, param3: T3, param4: T4): string {
|
|
201
|
+
return format.replace(/\{0\}/g, String(param1)).replace(/\{1\}/g, String(param2)).replace(/\{2\}/g, String(param3)).replace(/\{3\}/g, String(param4));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ============================================================================
|
|
206
|
+
// Public Classes
|
|
207
|
+
// ============================================================================
|
|
208
|
+
|
|
209
|
+
export class EchoSettings {
|
|
210
|
+
private systemLevels: Map<string, LogLevel> = new Map();
|
|
211
|
+
private _defaultLevel: LogLevel = LogLevel.Warn;
|
|
212
|
+
private updateCallbacks: (() => void)[] = [];
|
|
213
|
+
|
|
214
|
+
get defaultLevel(): LogLevel {
|
|
215
|
+
return this._defaultLevel;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
onUpdated(callback: () => void): void {
|
|
219
|
+
this.updateCallbacks.push(callback);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private triggerUpdate(): void {
|
|
223
|
+
for (const callback of this.updateCallbacks) {
|
|
224
|
+
callback();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
setSystemLevel(system: string, level: LogLevel): void {
|
|
229
|
+
this.throwIfInvalidSystem(system);
|
|
230
|
+
this.systemLevels.set(system, level);
|
|
231
|
+
this.triggerUpdate();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
clearSystemLevel(system: string): void {
|
|
235
|
+
this.throwIfInvalidSystem(system);
|
|
236
|
+
if (this.systemLevels.delete(system)) {
|
|
237
|
+
this.triggerUpdate();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
getSystemLevel(system: string): LogLevel {
|
|
242
|
+
this.throwIfInvalidSystem(system);
|
|
243
|
+
return this.systemLevels.get(system) ?? this._defaultLevel;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
tryGetSystemLevel(system: string): { success: boolean; level?: LogLevel } {
|
|
247
|
+
this.throwIfInvalidSystem(system);
|
|
248
|
+
const level = this.systemLevels.get(system);
|
|
249
|
+
return level !== undefined ? { success: true, level } : { success: false };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
clearSystemLevels(): void {
|
|
253
|
+
this.systemLevels.clear();
|
|
254
|
+
this.triggerUpdate();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
setDefaultLevel(level: LogLevel): void {
|
|
258
|
+
this._defaultLevel = level;
|
|
259
|
+
this.triggerUpdate();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
getAllSystemLevels(): ReadonlyMap<string, LogLevel> {
|
|
263
|
+
return this.systemLevels;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private throwIfInvalidSystem(system: string): void {
|
|
267
|
+
if (!system || system.length === 0) {
|
|
268
|
+
throw new Error("System name cannot be null or empty.");
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export class EchoLogger {
|
|
274
|
+
private readonly loggerCore: LoggerCore;
|
|
275
|
+
|
|
276
|
+
constructor(loggerCore: LoggerCore) {
|
|
277
|
+
if (!loggerCore) throw new Error("loggerCore cannot be null");
|
|
278
|
+
this.loggerCore = loggerCore;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Debug Methods
|
|
282
|
+
debug(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
283
|
+
if (param1 === undefined) {
|
|
284
|
+
this.loggerCore.writeIfEnabled(LogLevel.Debug, LogMode.Always, system, formatOrMessage);
|
|
285
|
+
} else if (param2 === undefined) {
|
|
286
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Debug, LogMode.Always, system, formatOrMessage, param1);
|
|
287
|
+
} else if (param3 === undefined) {
|
|
288
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Debug, LogMode.Always, system, formatOrMessage, param1, param2);
|
|
289
|
+
} else if (param4 === undefined) {
|
|
290
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Debug, LogMode.Always, system, formatOrMessage, param1, param2, param3);
|
|
291
|
+
} else {
|
|
292
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Debug, LogMode.Always, system, formatOrMessage, param1, param2, param3, param4);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
debug1(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
297
|
+
if (param1 === undefined) {
|
|
298
|
+
this.loggerCore.writeIfEnabled(LogLevel.Debug, LogMode.Once, system, formatOrMessage);
|
|
299
|
+
} else if (param2 === undefined) {
|
|
300
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Debug, LogMode.Once, system, formatOrMessage, param1);
|
|
301
|
+
} else if (param3 === undefined) {
|
|
302
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Debug, LogMode.Once, system, formatOrMessage, param1, param2);
|
|
303
|
+
} else if (param4 === undefined) {
|
|
304
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Debug, LogMode.Once, system, formatOrMessage, param1, param2, param3);
|
|
305
|
+
} else {
|
|
306
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Debug, LogMode.Once, system, formatOrMessage, param1, param2, param3, param4);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Info Methods
|
|
311
|
+
info(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
312
|
+
if (param1 === undefined) {
|
|
313
|
+
this.loggerCore.writeIfEnabled(LogLevel.Info, LogMode.Always, system, formatOrMessage);
|
|
314
|
+
} else if (param2 === undefined) {
|
|
315
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Info, LogMode.Always, system, formatOrMessage, param1);
|
|
316
|
+
} else if (param3 === undefined) {
|
|
317
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Info, LogMode.Always, system, formatOrMessage, param1, param2);
|
|
318
|
+
} else if (param4 === undefined) {
|
|
319
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Info, LogMode.Always, system, formatOrMessage, param1, param2, param3);
|
|
320
|
+
} else {
|
|
321
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Info, LogMode.Always, system, formatOrMessage, param1, param2, param3, param4);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
info1(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
326
|
+
if (param1 === undefined) {
|
|
327
|
+
this.loggerCore.writeIfEnabled(LogLevel.Info, LogMode.Once, system, formatOrMessage);
|
|
328
|
+
} else if (param2 === undefined) {
|
|
329
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Info, LogMode.Once, system, formatOrMessage, param1);
|
|
330
|
+
} else if (param3 === undefined) {
|
|
331
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Info, LogMode.Once, system, formatOrMessage, param1, param2);
|
|
332
|
+
} else if (param4 === undefined) {
|
|
333
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Info, LogMode.Once, system, formatOrMessage, param1, param2, param3);
|
|
334
|
+
} else {
|
|
335
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Info, LogMode.Once, system, formatOrMessage, param1, param2, param3, param4);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Warn Methods
|
|
340
|
+
warn(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
341
|
+
if (param1 === undefined) {
|
|
342
|
+
this.loggerCore.writeIfEnabled(LogLevel.Warn, LogMode.Always, system, formatOrMessage);
|
|
343
|
+
} else if (param2 === undefined) {
|
|
344
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Warn, LogMode.Always, system, formatOrMessage, param1);
|
|
345
|
+
} else if (param3 === undefined) {
|
|
346
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Warn, LogMode.Always, system, formatOrMessage, param1, param2);
|
|
347
|
+
} else if (param4 === undefined) {
|
|
348
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Warn, LogMode.Always, system, formatOrMessage, param1, param2, param3);
|
|
349
|
+
} else {
|
|
350
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Warn, LogMode.Always, system, formatOrMessage, param1, param2, param3, param4);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
warn1(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
355
|
+
if (param1 === undefined) {
|
|
356
|
+
this.loggerCore.writeIfEnabled(LogLevel.Warn, LogMode.Once, system, formatOrMessage);
|
|
357
|
+
} else if (param2 === undefined) {
|
|
358
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Warn, LogMode.Once, system, formatOrMessage, param1);
|
|
359
|
+
} else if (param3 === undefined) {
|
|
360
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Warn, LogMode.Once, system, formatOrMessage, param1, param2);
|
|
361
|
+
} else if (param4 === undefined) {
|
|
362
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Warn, LogMode.Once, system, formatOrMessage, param1, param2, param3);
|
|
363
|
+
} else {
|
|
364
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Warn, LogMode.Once, system, formatOrMessage, param1, param2, param3, param4);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Error Methods
|
|
369
|
+
error(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
370
|
+
if (param1 === undefined) {
|
|
371
|
+
this.loggerCore.writeIfEnabled(LogLevel.Error, LogMode.Always, system, formatOrMessage);
|
|
372
|
+
} else if (param2 === undefined) {
|
|
373
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Error, LogMode.Always, system, formatOrMessage, param1);
|
|
374
|
+
} else if (param3 === undefined) {
|
|
375
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Error, LogMode.Always, system, formatOrMessage, param1, param2);
|
|
376
|
+
} else if (param4 === undefined) {
|
|
377
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Error, LogMode.Always, system, formatOrMessage, param1, param2, param3);
|
|
378
|
+
} else {
|
|
379
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Error, LogMode.Always, system, formatOrMessage, param1, param2, param3, param4);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
error1(system: string, formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
384
|
+
if (param1 === undefined) {
|
|
385
|
+
this.loggerCore.writeIfEnabled(LogLevel.Error, LogMode.Once, system, formatOrMessage);
|
|
386
|
+
} else if (param2 === undefined) {
|
|
387
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Error, LogMode.Once, system, formatOrMessage, param1);
|
|
388
|
+
} else if (param3 === undefined) {
|
|
389
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Error, LogMode.Once, system, formatOrMessage, param1, param2);
|
|
390
|
+
} else if (param4 === undefined) {
|
|
391
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Error, LogMode.Once, system, formatOrMessage, param1, param2, param3);
|
|
392
|
+
} else {
|
|
393
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Error, LogMode.Once, system, formatOrMessage, param1, param2, param3, param4);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export class EchoSystemLogger {
|
|
399
|
+
private readonly loggerCore: LoggerCore;
|
|
400
|
+
private readonly system: string;
|
|
401
|
+
|
|
402
|
+
constructor(loggerCore: LoggerCore, system: string) {
|
|
403
|
+
if (!loggerCore) throw new Error("loggerCore cannot be null");
|
|
404
|
+
if (!system) throw new Error("system cannot be null");
|
|
405
|
+
this.loggerCore = loggerCore;
|
|
406
|
+
this.system = system;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Debug Methods
|
|
410
|
+
debug(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
411
|
+
if (param1 === undefined) {
|
|
412
|
+
this.loggerCore.writeIfEnabled(LogLevel.Debug, LogMode.Always, this.system, formatOrMessage);
|
|
413
|
+
} else if (param2 === undefined) {
|
|
414
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Debug, LogMode.Always, this.system, formatOrMessage, param1);
|
|
415
|
+
} else if (param3 === undefined) {
|
|
416
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Debug, LogMode.Always, this.system, formatOrMessage, param1, param2);
|
|
417
|
+
} else if (param4 === undefined) {
|
|
418
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Debug, LogMode.Always, this.system, formatOrMessage, param1, param2, param3);
|
|
419
|
+
} else {
|
|
420
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Debug, LogMode.Always, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
debug1(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
425
|
+
if (param1 === undefined) {
|
|
426
|
+
this.loggerCore.writeIfEnabled(LogLevel.Debug, LogMode.Once, this.system, formatOrMessage);
|
|
427
|
+
} else if (param2 === undefined) {
|
|
428
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Debug, LogMode.Once, this.system, formatOrMessage, param1);
|
|
429
|
+
} else if (param3 === undefined) {
|
|
430
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Debug, LogMode.Once, this.system, formatOrMessage, param1, param2);
|
|
431
|
+
} else if (param4 === undefined) {
|
|
432
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Debug, LogMode.Once, this.system, formatOrMessage, param1, param2, param3);
|
|
433
|
+
} else {
|
|
434
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Debug, LogMode.Once, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Info Methods
|
|
439
|
+
info(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
440
|
+
if (param1 === undefined) {
|
|
441
|
+
this.loggerCore.writeIfEnabled(LogLevel.Info, LogMode.Always, this.system, formatOrMessage);
|
|
442
|
+
} else if (param2 === undefined) {
|
|
443
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Info, LogMode.Always, this.system, formatOrMessage, param1);
|
|
444
|
+
} else if (param3 === undefined) {
|
|
445
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Info, LogMode.Always, this.system, formatOrMessage, param1, param2);
|
|
446
|
+
} else if (param4 === undefined) {
|
|
447
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Info, LogMode.Always, this.system, formatOrMessage, param1, param2, param3);
|
|
448
|
+
} else {
|
|
449
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Info, LogMode.Always, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
info1(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
454
|
+
if (param1 === undefined) {
|
|
455
|
+
this.loggerCore.writeIfEnabled(LogLevel.Info, LogMode.Once, this.system, formatOrMessage);
|
|
456
|
+
} else if (param2 === undefined) {
|
|
457
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Info, LogMode.Once, this.system, formatOrMessage, param1);
|
|
458
|
+
} else if (param3 === undefined) {
|
|
459
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Info, LogMode.Once, this.system, formatOrMessage, param1, param2);
|
|
460
|
+
} else if (param4 === undefined) {
|
|
461
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Info, LogMode.Once, this.system, formatOrMessage, param1, param2, param3);
|
|
462
|
+
} else {
|
|
463
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Info, LogMode.Once, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Warn Methods
|
|
468
|
+
warn(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
469
|
+
if (param1 === undefined) {
|
|
470
|
+
this.loggerCore.writeIfEnabled(LogLevel.Warn, LogMode.Always, this.system, formatOrMessage);
|
|
471
|
+
} else if (param2 === undefined) {
|
|
472
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Warn, LogMode.Always, this.system, formatOrMessage, param1);
|
|
473
|
+
} else if (param3 === undefined) {
|
|
474
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Warn, LogMode.Always, this.system, formatOrMessage, param1, param2);
|
|
475
|
+
} else if (param4 === undefined) {
|
|
476
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Warn, LogMode.Always, this.system, formatOrMessage, param1, param2, param3);
|
|
477
|
+
} else {
|
|
478
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Warn, LogMode.Always, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
warn1(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
483
|
+
if (param1 === undefined) {
|
|
484
|
+
this.loggerCore.writeIfEnabled(LogLevel.Warn, LogMode.Once, this.system, formatOrMessage);
|
|
485
|
+
} else if (param2 === undefined) {
|
|
486
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Warn, LogMode.Once, this.system, formatOrMessage, param1);
|
|
487
|
+
} else if (param3 === undefined) {
|
|
488
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Warn, LogMode.Once, this.system, formatOrMessage, param1, param2);
|
|
489
|
+
} else if (param4 === undefined) {
|
|
490
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Warn, LogMode.Once, this.system, formatOrMessage, param1, param2, param3);
|
|
491
|
+
} else {
|
|
492
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Warn, LogMode.Once, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Error Methods
|
|
497
|
+
error(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
498
|
+
if (param1 === undefined) {
|
|
499
|
+
this.loggerCore.writeIfEnabled(LogLevel.Error, LogMode.Always, this.system, formatOrMessage);
|
|
500
|
+
} else if (param2 === undefined) {
|
|
501
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Error, LogMode.Always, this.system, formatOrMessage, param1);
|
|
502
|
+
} else if (param3 === undefined) {
|
|
503
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Error, LogMode.Always, this.system, formatOrMessage, param1, param2);
|
|
504
|
+
} else if (param4 === undefined) {
|
|
505
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Error, LogMode.Always, this.system, formatOrMessage, param1, param2, param3);
|
|
506
|
+
} else {
|
|
507
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Error, LogMode.Always, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
error1(formatOrMessage: string, param1?: any, param2?: any, param3?: any, param4?: any): void {
|
|
512
|
+
if (param1 === undefined) {
|
|
513
|
+
this.loggerCore.writeIfEnabled(LogLevel.Error, LogMode.Once, this.system, formatOrMessage);
|
|
514
|
+
} else if (param2 === undefined) {
|
|
515
|
+
this.loggerCore.writeIfEnabled1(LogLevel.Error, LogMode.Once, this.system, formatOrMessage, param1);
|
|
516
|
+
} else if (param3 === undefined) {
|
|
517
|
+
this.loggerCore.writeIfEnabled2(LogLevel.Error, LogMode.Once, this.system, formatOrMessage, param1, param2);
|
|
518
|
+
} else if (param4 === undefined) {
|
|
519
|
+
this.loggerCore.writeIfEnabled3(LogLevel.Error, LogMode.Once, this.system, formatOrMessage, param1, param2, param3);
|
|
520
|
+
} else {
|
|
521
|
+
this.loggerCore.writeIfEnabled4(LogLevel.Error, LogMode.Once, this.system, formatOrMessage, param1, param2, param3, param4);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
export class Echo {
|
|
527
|
+
private readonly loggerCore: LoggerCore;
|
|
528
|
+
private readonly loggers: Map<string, EchoLogger | EchoSystemLogger> = new Map();
|
|
529
|
+
private readonly _settings: EchoSettings;
|
|
530
|
+
|
|
531
|
+
constructor(writer: EchoLogWriter) {
|
|
532
|
+
if (!writer) throw new Error("writer cannot be null");
|
|
533
|
+
const hashes = new HashesManager();
|
|
534
|
+
this._settings = new EchoSettings();
|
|
535
|
+
this.loggerCore = new LoggerCore(this._settings, hashes, writer);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
getLogger(): EchoLogger {
|
|
539
|
+
const key = "";
|
|
540
|
+
if (!this.loggers.has(key)) {
|
|
541
|
+
this.loggers.set(key, new EchoLogger(this.loggerCore));
|
|
542
|
+
}
|
|
543
|
+
return this.loggers.get(key) as EchoLogger;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
getSystemLogger(system: string): EchoSystemLogger {
|
|
547
|
+
if (!system || system.length === 0) {
|
|
548
|
+
throw new Error("System name cannot be null or empty.");
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
if (!this.loggers.has(system)) {
|
|
552
|
+
this.loggers.set(system, new EchoSystemLogger(this.loggerCore, system));
|
|
553
|
+
}
|
|
554
|
+
return this.loggers.get(system) as EchoSystemLogger;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
get settings(): EchoSettings {
|
|
558
|
+
return this._settings;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// ============================================================================
|
|
563
|
+
// Built-in Log Writers
|
|
564
|
+
// ============================================================================
|
|
565
|
+
|
|
566
|
+
class ConsoleLogWriter implements EchoLogWriter {
|
|
567
|
+
private readonly config: LogWriterConfig;
|
|
568
|
+
|
|
569
|
+
constructor(config: LogWriterConfig) {
|
|
570
|
+
if (!config) throw new Error("config cannot be null");
|
|
571
|
+
this.config = config;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
writeLog(level: LogLevel, system: string, message: string): void {
|
|
575
|
+
let output = "";
|
|
576
|
+
|
|
577
|
+
if (this.config.timestamp) {
|
|
578
|
+
const now = new Date();
|
|
579
|
+
const timestamp = this.formatTimestamp(now);
|
|
580
|
+
output += `${WritersHelpers.grayColor}[${timestamp}]${WritersHelpers.resetColor} `;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
if (this.config.levelLabels) {
|
|
584
|
+
const levelLabel = WritersHelpers.getLevelLabel(level);
|
|
585
|
+
if (this.config.levelColors) {
|
|
586
|
+
const color = WritersHelpers.levelColors.get(level) ?? "";
|
|
587
|
+
output += `${color}[${levelLabel}]${WritersHelpers.resetColor} `;
|
|
588
|
+
} else {
|
|
589
|
+
output += `[${levelLabel}] `;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
const systemColor = this.config.systemColor === SystemColor.LabelOnly ||
|
|
594
|
+
this.config.systemColor === SystemColor.LabelAndMessage
|
|
595
|
+
? Helpers.getElementFromHash(WritersHelpers.systemColors, system)
|
|
596
|
+
: "";
|
|
597
|
+
|
|
598
|
+
if (systemColor) {
|
|
599
|
+
output += `${systemColor}[${system}]${WritersHelpers.resetColor} `;
|
|
600
|
+
} else {
|
|
601
|
+
output += `[${system}] `;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
if (this.config.systemColor === SystemColor.LabelAndMessage && systemColor) {
|
|
605
|
+
output += `${systemColor}${message}${WritersHelpers.resetColor}`;
|
|
606
|
+
} else {
|
|
607
|
+
output += message;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
console.log(output);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
private formatTimestamp(date: Date): string {
|
|
614
|
+
const year = date.getFullYear();
|
|
615
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
616
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
617
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
618
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
619
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
620
|
+
const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
|
|
621
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// ============================================================================
|
|
626
|
+
// Public API Helpers
|
|
627
|
+
// ============================================================================
|
|
628
|
+
|
|
629
|
+
export class EchoConsole {
|
|
630
|
+
static new(config?: LogWriterConfig): Echo {
|
|
631
|
+
const writerConfig = config ?? new LogWriterConfig();
|
|
632
|
+
const writer = new ConsoleLogWriter(writerConfig);
|
|
633
|
+
return new Echo(writer);
|
|
634
|
+
}
|
|
635
|
+
}
|
package/log/index.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Echo logging library exports
|
|
3
|
+
*/
|
|
4
|
+
export { Echo, EchoLogger, EchoSystemLogger, EchoConsole, EchoSettings, LogLevel, SystemColor, LogWriterConfig } from './echo';
|
|
5
|
+
export { LogSystems } from './log-systems';
|
|
6
|
+
export { ECHO, ECHO_PROVIDER, echoFactory } from './echo-provider';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for Echo logging system names.
|
|
3
|
+
* Using constants ensures consistency and prevents typos.
|
|
4
|
+
*/
|
|
5
|
+
export class LogSystems {
|
|
6
|
+
/** System for profiling and performance measurements */
|
|
7
|
+
static readonly PROFILING = 'Profiling';
|
|
8
|
+
|
|
9
|
+
/** System for general application logs */
|
|
10
|
+
static readonly GENERAL = 'General';
|
|
11
|
+
|
|
12
|
+
/** System for Git-related operations */
|
|
13
|
+
static readonly GIT = 'Git';
|
|
14
|
+
|
|
15
|
+
/** System for UI and visual operations */
|
|
16
|
+
static readonly UI = 'UI';
|
|
17
|
+
|
|
18
|
+
/** System for repository operations */
|
|
19
|
+
static readonly REPOSITORY = 'Repository';
|
|
20
|
+
}
|