@foxford/logger 1.0.2 → 1.2.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.
Files changed (6) hide show
  1. package/browser.js +306 -400
  2. package/browser.mjs +309 -399
  3. package/index.d.ts +170 -11
  4. package/node.js +271 -373
  5. package/node.mjs +274 -372
  6. package/package.json +12 -11
package/node.mjs CHANGED
@@ -1,422 +1,324 @@
1
- import log from 'loglevel';
2
- import chalk from 'chalk';
3
-
4
- /**
5
- * Генерирует hex-код цвета на основе строки, избегая оттенков красного
6
- * @param {string} str - Строка, для которой нужно сгенерировать цвет
7
- * @returns {string} - Hex-код цвета
8
- */
1
+ import log from "loglevel";
2
+ import chalk from "chalk";
9
3
  function generateHexByString(str) {
10
- // Генерируем новый цвет
11
- let hash = 0;
12
- for (let i = 0; i < str.length; i++) {
13
- hash = str.charCodeAt(i) + ((hash << 5) - hash);
14
- }
15
- // Используем HSL для контроля оттенка
16
- const hue = Math.abs(hash) % 300; // Расширяем диапазон, исключая только часть красного (300-360)
17
- const saturation = 60 + (Math.abs(hash) % 40); // От 60% до 100%
18
- const lightness = 30 + (Math.abs(hash) % 40); // От 30% до 70%
19
- // Конвертируем HSL в RGB
20
- const chroma = ((1 - Math.abs((2 * lightness) / 100 - 1)) * saturation) / 100;
21
- const huePrime = hue / 60;
22
- const x = chroma * (1 - Math.abs((huePrime % 2) - 1));
23
- let r1 = 0, g1 = 0, b1 = 0;
24
- if (huePrime >= 0 && huePrime < 1) {
25
- [r1, g1, b1] = [chroma, x, 0];
26
- }
27
- else if (huePrime >= 1 && huePrime < 2) {
28
- [r1, g1, b1] = [x, chroma, 0];
29
- }
30
- else if (huePrime >= 2 && huePrime < 3) {
31
- [r1, g1, b1] = [0, chroma, x];
32
- }
33
- else if (huePrime >= 3 && huePrime < 4) {
34
- [r1, g1, b1] = [0, x, chroma];
35
- }
36
- else if (huePrime >= 4 && huePrime < 5) {
37
- [r1, g1, b1] = [x, 0, chroma];
38
- }
39
- else {
40
- [r1, g1, b1] = [chroma, 0, x];
41
- }
42
- const m = lightness / 100 - chroma / 2;
43
- const [r, g, b] = [r1, g1, b1].map((v) => Math.round((v + m) * 255));
44
- // Добавляем проверку и значения по умолчанию
45
- const rValue = r !== null && r !== void 0 ? r : 0;
46
- const gValue = g !== null && g !== void 0 ? g : 0;
47
- const bValue = b !== null && b !== void 0 ? b : 0;
48
- const color = `#${((rValue << 16) | (gValue << 8) | bValue).toString(16).padStart(6, '0')}`;
49
- return color;
4
+ let hash = 0;
5
+ for (let i = 0; i < str.length; i++) {
6
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
7
+ }
8
+ const hue = Math.abs(hash) % 300;
9
+ const saturation = 60 + Math.abs(hash) % 40;
10
+ const lightness = 30 + Math.abs(hash) % 40;
11
+ const chroma = (1 - Math.abs(2 * lightness / 100 - 1)) * saturation / 100;
12
+ const huePrime = hue / 60;
13
+ const x = chroma * (1 - Math.abs(huePrime % 2 - 1));
14
+ let r1 = 0, g1 = 0, b1 = 0;
15
+ if (huePrime >= 0 && huePrime < 1) {
16
+ [r1, g1, b1] = [chroma, x, 0];
17
+ } else if (huePrime >= 1 && huePrime < 2) {
18
+ [r1, g1, b1] = [x, chroma, 0];
19
+ } else if (huePrime >= 2 && huePrime < 3) {
20
+ [r1, g1, b1] = [0, chroma, x];
21
+ } else if (huePrime >= 3 && huePrime < 4) {
22
+ [r1, g1, b1] = [0, x, chroma];
23
+ } else if (huePrime >= 4 && huePrime < 5) {
24
+ [r1, g1, b1] = [x, 0, chroma];
25
+ } else {
26
+ [r1, g1, b1] = [chroma, 0, x];
27
+ }
28
+ const m = lightness / 100 - chroma / 2;
29
+ const [r, g, b] = [r1, g1, b1].map((v) => Math.round((v + m) * 255));
30
+ const rValue = r ?? 0;
31
+ const gValue = g ?? 0;
32
+ const bValue = b ?? 0;
33
+ const color = `#${(rValue << 16 | gValue << 8 | bValue).toString(16).padStart(6, "0")}`;
34
+ return color;
50
35
  }
51
-
52
- /**
53
- * Кеш для хранения сгенерированных цветов
54
- * могут быть заранее предустановлены по имени логгера
55
- **/
56
36
  const colorCache = {};
57
- /** Цвета для различных уровней логирования */
58
37
  const levelColors = {
59
- TRACE: chalk.gray,
60
- LOG: chalk.cyan,
61
- DEBUG: chalk.cyan,
62
- INFO: chalk.green,
63
- WARN: chalk.yellow,
64
- ERROR: chalk.red,
38
+ DEBUG: chalk.cyan,
39
+ ERROR: chalk.red,
40
+ INFO: chalk.green,
41
+ LOG: chalk.cyan,
42
+ TRACE: chalk.gray,
43
+ WARN: chalk.yellow
65
44
  };
66
- // Хранилище для значений debug в памяти
67
- const debugStorage = new Set();
68
- /**
69
- * Генерирует hex-код цвета на основе строки, избегая оттенков красного
70
- * @param {string} str - Строка, для которой нужно сгенерировать цвет
71
- * @returns {string} - Hex-код цвета
72
- */
45
+ const debugStorage = /* @__PURE__ */ new Set();
73
46
  function stringToColorCode(str) {
74
- var _a;
75
- // Если цвет уже есть в кеше, возвращаем его
76
- if (str in colorCache) {
77
- return (_a = colorCache[str]) !== null && _a !== void 0 ? _a : 'inherit';
78
- }
79
- const color = generateHexByString(str);
80
- // Сохраняем цвет в кеш
81
- colorCache[str] = color;
82
- return color;
47
+ if (str in colorCache) {
48
+ return colorCache[str] ?? "inherit";
49
+ }
50
+ const color = generateHexByString(str);
51
+ colorCache[str] = color;
52
+ return color;
83
53
  }
84
- /**
85
- * Форматирует сообщение лога
86
- * @param {string} level - Уровень лога
87
- * @param {string} name - Имя логгера
88
- * @param {Date} timestamp - Временная метка
89
- * @returns {string} Отформатированное сообщение
90
- */
91
54
  function formatter(level, name, timestamp) {
92
- const levelColor = levelColors[level.toUpperCase()] || chalk.gray;
93
- let date;
94
- let nameHex;
95
- let loggerName;
96
- let loggerLevel;
97
- switch (name) {
98
- // предустановленнный цветовой шаблон по имени логгера
99
- case 'critical':
100
- date = chalk.red(`[${timestamp.toISOString()}]`);
101
- loggerName = chalk.red(`[${name}]`);
102
- loggerLevel = chalk.red(`[${level}]`);
103
- break;
104
- default:
105
- date = chalk.gray(`[${timestamp.toISOString()}]`);
106
- nameHex = stringToColorCode(name);
107
- loggerName = chalk.hex(nameHex)(`[${name}]`);
108
- loggerLevel = levelColor(`[${level}]`);
109
- break;
110
- }
111
- return `${date} ${loggerLevel} ${loggerName} ${chalk.cyan('•')}`;
55
+ const levelColor = levelColors[level.toUpperCase()] || chalk.gray;
56
+ let date;
57
+ let nameHex;
58
+ let loggerName;
59
+ let loggerLevel;
60
+ switch (name) {
61
+ // предустановленнный цветовой шаблон по имени логгера
62
+ case "critical":
63
+ date = chalk.red(`[${timestamp.toISOString()}]`);
64
+ loggerName = chalk.red(`[${name}]`);
65
+ loggerLevel = chalk.red(`[${level}]`);
66
+ break;
67
+ default:
68
+ date = chalk.gray(`[${timestamp.toISOString()}]`);
69
+ nameHex = stringToColorCode(name);
70
+ loggerName = chalk.hex(nameHex)(`[${name}]`);
71
+ loggerLevel = levelColor(`[${level}]`);
72
+ break;
73
+ }
74
+ return `${date} ${loggerLevel} ${loggerName} ${chalk.cyan("•")}`;
112
75
  }
113
- /**
114
- * Получает текущее значение debug
115
- * @returns {string | undefined} Строка с debug значениями или undefined, если значений нет
116
- */
117
76
  function getDebugValue() {
118
- const value = Array.from(debugStorage).join(',');
119
- return value.length ? value : undefined;
77
+ const value = Array.from(debugStorage).join(",");
78
+ return value.length ? value : void 0;
120
79
  }
121
- /**
122
- * Устанавливает значение debug
123
- * @param {string | null} value - Новое значение debug
124
- */
125
80
  function setDebugValue(value) {
126
- if (value === null || value === undefined) {
127
- debugStorage.clear();
128
- }
129
- else {
130
- debugStorage.add(value.trim());
131
- }
81
+ if (value === null || value === void 0) {
82
+ debugStorage.clear();
83
+ } else {
84
+ debugStorage.add(value.trim());
85
+ }
132
86
  }
133
- /**
134
- * Функция для подписки на изменения значения debug
135
- * @param {function} callback - Функция, вызываемая при изменении значения debug
136
- * @returns {function} Функция для отписки от изменений
137
- */
138
87
  function onDebugValueChange(_callback) {
139
- // TODO: Implement debug value change listener
140
- return () => { };
88
+ return () => {
89
+ };
141
90
  }
142
91
  if (process.env.DEBUG) {
143
- setDebugValue(process.env.DEBUG);
92
+ setDebugValue(process.env.DEBUG);
144
93
  }
145
94
  const environment = {
146
- getDebugValue,
147
- setDebugValue,
148
- formatter,
149
- onDebugValueChange,
95
+ formatter,
96
+ getDebugValue,
97
+ onDebugValueChange,
98
+ setDebugValue
150
99
  };
151
-
152
- /**
153
- * Генерирует UUID версии 4.
154
- * @returns {string} Строка, представляющая UUID версии 4.
155
- */
156
100
  function generateUUIDv4() {
157
- return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (char) => (parseInt(char, 10) ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (parseInt(char, 10) / 4)))).toString(16));
101
+ return "10000000-1000-4000-8000-100000000000".replace(
102
+ /[018]/g,
103
+ (char) => (
104
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
105
+ (parseInt(char, 10) ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> parseInt(char, 10) / 4).toString(
106
+ 16
107
+ )
108
+ )
109
+ );
158
110
  }
159
-
160
- /* eslint-disable @typescript-eslint/no-unsafe-function-type */
161
- const loggerCache = new Map();
162
- const previousLevels = new Map();
111
+ const loggerCache = /* @__PURE__ */ new Map();
112
+ const previousLevels = /* @__PURE__ */ new Map();
163
113
  let isInitialized = false;
164
- /**
165
- * Создает экземпляр HierarchicalLogger
166
- * @param fullName Имя логгера
167
- * @param parent Родительский логгер (если есть)
168
- */
169
114
  function createHierarchicalLogger(originalGetLogger, fullName, parent) {
170
- const loggerId = generateUUIDv4();
171
- const baseLogger = originalGetLogger(fullName);
172
- const name = parent ? fullName.slice(parent.getFullName().length + 1) : fullName;
173
- const hierarchicalLogger = Object.assign(Object.assign({}, baseLogger), { id: loggerId, parent: parent !== null && parent !== void 0 ? parent : null, children: new Set(), name: name, debugEnabled: false, isDebugEnabled() {
174
- return this.debugEnabled;
175
- },
176
- getDebugPattern() {
177
- var _a;
178
- return (_a = environment.getDebugValue()) !== null && _a !== void 0 ? _a : null;
179
- },
180
- // Добавим вспомогательный метод для получения полного имени логгера
181
- getFullName() {
182
- if (!this.parent) {
183
- return this.name;
184
- }
185
- const parentFullName = this.parent.getFullName();
186
- return parentFullName ? `${parentFullName}:${this.name}` : this.name;
187
- },
188
- setDebug(enabled) {
189
- this.debugEnabled = enabled;
190
- const parentLevel = this.parent ? this.parent.getLevel() : undefined;
191
- const currentPatterns = (environment.getDebugValue() || '').split(',').filter(Boolean);
192
- const fullName = this.getFullName();
193
- if (enabled) {
194
- if (!previousLevels.has(this.id)) {
195
- previousLevels.set(this.id, baseLogger.getLevel());
196
- }
197
- baseLogger.setLevel(log.levels.TRACE, false);
198
- // Если включаем отладку
199
- if (!currentPatterns.some((pattern) => fullName === pattern || `${fullName}:*` === pattern)) {
200
- // Удаляем все дочерние паттерны, если они есть
201
- const childrenPatterns = currentPatterns.filter((pattern) => pattern.startsWith(`${fullName}:`));
202
- childrenPatterns.forEach((pattern) => {
203
- const index = currentPatterns.indexOf(pattern);
204
- if (index !== -1) {
205
- currentPatterns.splice(index, 1);
206
- }
207
- });
208
- // Добавляем новый паттерн без ':*'
209
- currentPatterns.push(fullName);
210
- }
211
- }
212
- else {
213
- let newLevel;
214
- if (parentLevel !== undefined) {
215
- // Используем уровень родительского логгера, если он существует
216
- newLevel = parentLevel;
217
- }
218
- else {
219
- // Если родительского логгера нет, используем предыдущий сохраненный уровень или уровень по умолчанию
220
- newLevel = previousLevels.get(this.id) || log.levels.WARN;
221
- }
222
- baseLogger.setLevel(newLevel, false);
223
- previousLevels.delete(this.id);
224
- // Если выключаем отладку
225
- const index = currentPatterns.findIndex((pattern) => pattern === fullName || pattern === `${fullName}:*`);
226
- if (index !== -1) {
227
- currentPatterns.splice(index, 1);
228
- }
229
- }
230
- // Оптимизируем паттерны
231
- const optimizedPatterns = optimizePatterns(currentPatterns);
232
- // Сохраняем оптимизированные паттерны
233
- environment.setDebugValue(optimizedPatterns.join(',') || null);
234
- },
235
- getLogger(name) {
236
- const childLogger = createHierarchicalLogger(originalGetLogger, `${fullName}:${name}`, this);
237
- this.children.add(childLogger);
238
- return childLogger;
239
- },
240
- setLevel(level) {
241
- baseLogger.setLevel(level, false);
242
- // Обновляем уровень для всех дочерних логгеров
243
- this.children.forEach((child) => child.setLevel(level, false));
244
- // Если логгер в режиме отладки, сохраняем новый уровень
245
- if (this.isDebugEnabled()) {
246
- previousLevels.set(loggerId, level);
247
- }
248
- } });
249
- const originalFactory = baseLogger.methodFactory;
250
- // Переопределяем методы логирования для учета режима отладки
251
- const logMethods = ['trace', 'debug', 'info', 'warn', 'error', 'log'];
252
- logMethods.forEach((method) => {
253
- const originalMethod = originalFactory(method, baseLogger.getLevel(), fullName);
254
- hierarchicalLogger[method] = function (...args) {
255
- var _a;
256
- const debugEnabled = this.isDebugEnabled();
257
- const messageLevel = (_a = log.levels[method.toUpperCase()]) !== null && _a !== void 0 ? _a : 0;
258
- const currentLevel = baseLogger.getLevel();
259
- if (debugEnabled || messageLevel >= currentLevel) {
260
- return originalMethod.apply(baseLogger, args);
115
+ const loggerId = generateUUIDv4();
116
+ const baseLogger = originalGetLogger(fullName);
117
+ const name = parent ? fullName.slice(parent.getFullName().length + 1) : fullName;
118
+ const hierarchicalLogger = {
119
+ ...baseLogger,
120
+ children: /* @__PURE__ */ new Set(),
121
+ debugEnabled: false,
122
+ getDebugPattern() {
123
+ return environment.getDebugValue() ?? null;
124
+ },
125
+ // Добавим вспомогательный метод для получения полного имени логгера
126
+ getFullName() {
127
+ if (!this.parent) {
128
+ return this.name;
129
+ }
130
+ const parentFullName = this.parent.getFullName();
131
+ return parentFullName ? `${parentFullName}:${this.name}` : this.name;
132
+ },
133
+ getLogger(name2) {
134
+ for (const child of this.children) {
135
+ if (child.name === name2) {
136
+ return child;
137
+ }
138
+ }
139
+ const childLogger = createHierarchicalLogger(originalGetLogger, `${fullName}:${name2}`, this);
140
+ this.children.add(childLogger);
141
+ return childLogger;
142
+ },
143
+ id: loggerId,
144
+ isDebugEnabled() {
145
+ return this.debugEnabled;
146
+ },
147
+ name,
148
+ parent: parent ?? null,
149
+ setDebug(enabled) {
150
+ this.debugEnabled = enabled;
151
+ const parentLevel = this.parent ? this.parent.getLevel() : void 0;
152
+ const currentPatterns = (environment.getDebugValue() || "").split(",").filter(Boolean);
153
+ const fullName2 = this.getFullName();
154
+ if (enabled) {
155
+ if (!previousLevels.has(this.id)) {
156
+ previousLevels.set(this.id, baseLogger.getLevel());
157
+ }
158
+ baseLogger.setLevel(log.levels.TRACE, false);
159
+ if (!currentPatterns.some((pattern) => fullName2 === pattern || `${fullName2}:*` === pattern)) {
160
+ const childrenPatterns = currentPatterns.filter((pattern) => pattern.startsWith(`${fullName2}:`));
161
+ childrenPatterns.forEach((pattern) => {
162
+ const index = currentPatterns.indexOf(pattern);
163
+ if (index !== -1) {
164
+ currentPatterns.splice(index, 1);
261
165
  }
262
- };
263
- });
264
- loggerCache.set(loggerId, hierarchicalLogger);
265
- if (!isInitialized) {
266
- isInitialized = true;
267
- initializeDebugPatterns();
268
- }
269
- else {
270
- const debugPattern = environment.getDebugValue() || '';
271
- const patterns = debugPattern
272
- .split(',')
273
- .map((p) => p.trim())
274
- .filter(Boolean);
275
- configureLogger(hierarchicalLogger, patterns);
166
+ });
167
+ currentPatterns.push(fullName2);
168
+ }
169
+ } else {
170
+ let newLevel;
171
+ if (parentLevel !== void 0) {
172
+ newLevel = parentLevel;
173
+ } else {
174
+ newLevel = previousLevels.get(this.id) || log.levels.WARN;
175
+ }
176
+ baseLogger.setLevel(newLevel, false);
177
+ previousLevels.delete(this.id);
178
+ const index = currentPatterns.findIndex((pattern) => pattern === fullName2 || pattern === `${fullName2}:*`);
179
+ if (index !== -1) {
180
+ currentPatterns.splice(index, 1);
181
+ }
182
+ }
183
+ const optimizedPatterns = optimizePatterns(currentPatterns);
184
+ environment.setDebugValue(optimizedPatterns.join(",") || null);
185
+ },
186
+ setLevel(level) {
187
+ baseLogger.setLevel(level, false);
188
+ this.children.forEach((child) => child.setLevel(level, false));
189
+ if (this.isDebugEnabled()) {
190
+ previousLevels.set(loggerId, level);
191
+ }
276
192
  }
277
- return hierarchicalLogger;
193
+ };
194
+ const originalFactory = baseLogger.methodFactory;
195
+ const logMethods = ["trace", "debug", "info", "warn", "error", "log"];
196
+ logMethods.forEach((method) => {
197
+ const originalMethod = originalFactory(method, baseLogger.getLevel(), fullName);
198
+ hierarchicalLogger[method] = function(...args) {
199
+ const debugEnabled = this.isDebugEnabled();
200
+ const messageLevel = log.levels[method.toUpperCase()] ?? 0;
201
+ const currentLevel = baseLogger.getLevel();
202
+ if (debugEnabled || messageLevel >= currentLevel) {
203
+ return originalMethod.apply(baseLogger, args);
204
+ }
205
+ };
206
+ });
207
+ loggerCache.set(loggerId, hierarchicalLogger);
208
+ if (!isInitialized) {
209
+ isInitialized = true;
210
+ initializeDebugPatterns();
211
+ } else {
212
+ const debugPattern = environment.getDebugValue() || "";
213
+ const patterns = debugPattern.split(",").map((p) => p.trim()).filter(Boolean);
214
+ configureLogger(hierarchicalLogger, patterns);
215
+ }
216
+ return hierarchicalLogger;
278
217
  }
279
- /**
280
- * Оптимизирует паттерны отладки
281
- * @param patterns Массив паттернов отладки
282
- * @returns Оптимизированный массив паттернов
283
- */
284
218
  function optimizePatterns(patterns) {
285
- const optimized = new Set();
286
- // Сортируем паттерны от более общих к более конкретным
287
- patterns.sort((a, b) => a.split(':').length - b.split(':').length);
288
- for (const pattern of patterns) {
289
- let isRedundant = false;
290
- for (const existingPattern of optimized) {
291
- if (pattern === existingPattern || pattern.startsWith(existingPattern + ':')) {
292
- isRedundant = true;
293
- break;
294
- }
295
- }
296
- if (!isRedundant) {
297
- optimized.add(pattern);
298
- }
219
+ const optimized = /* @__PURE__ */ new Set();
220
+ patterns.sort((a, b) => a.split(":").length - b.split(":").length);
221
+ for (const pattern of patterns) {
222
+ let isRedundant = false;
223
+ for (const existingPattern of optimized) {
224
+ if (pattern === existingPattern || pattern.startsWith(existingPattern + ":")) {
225
+ isRedundant = true;
226
+ break;
227
+ }
228
+ }
229
+ if (!isRedundant) {
230
+ optimized.add(pattern);
299
231
  }
300
- return Array.from(optimized);
232
+ }
233
+ return Array.from(optimized);
301
234
  }
302
- /**
303
- * Проверяет, должен ли логгер быть в режиме отладки
304
- * @param fullName Полное имя логгера
305
- * @param patterns Массив паттернов отладки
306
- * @returns true, если логгер должен быть в режиме отладки
307
- */
308
235
  function shouldEnableDebug(fullName, patterns) {
309
- return patterns.some((pattern) => {
310
- if (pattern === '*')
311
- return true;
312
- if (fullName === pattern)
313
- return true;
314
- if (pattern.endsWith(':*')) {
315
- const patternPrefix = pattern.slice(0, -2);
316
- return fullName.startsWith(patternPrefix + ':');
317
- }
318
- return false;
319
- });
236
+ return patterns.some((pattern) => {
237
+ if (pattern === "*") return true;
238
+ if (fullName === pattern) return true;
239
+ if (pattern.endsWith(":*")) {
240
+ const patternPrefix = pattern.slice(0, -2);
241
+ return fullName.startsWith(patternPrefix + ":");
242
+ }
243
+ return false;
244
+ });
320
245
  }
321
- /**
322
- * Настраивает логгер в соответствии с текущими паттернами отладки
323
- * @param logger Логгер для настройки
324
- * @param patterns Массив паттернов отладки
325
- */
326
246
  function configureLogger(logger, patterns) {
327
- const fullName = logger.getFullName();
328
- const debugEnabled = shouldEnableDebug(fullName, patterns);
329
- logger.debugEnabled = debugEnabled;
330
- if (debugEnabled) {
331
- logger.setLevel(previousLevels.get(logger.id) || log.levels.TRACE);
332
- }
333
- else {
334
- logger.setLevel(previousLevels.get(logger.id) || log.levels.WARN);
335
- }
247
+ const fullName = logger.getFullName();
248
+ const debugEnabled = shouldEnableDebug(fullName, patterns);
249
+ logger.debugEnabled = debugEnabled;
250
+ if (debugEnabled) {
251
+ logger.setLevel(previousLevels.get(logger.id) || log.levels.TRACE);
252
+ } else {
253
+ logger.setLevel(previousLevels.get(logger.id) || log.levels.WARN);
254
+ }
336
255
  }
337
- /**
338
- * Инициализирует паттерны отладки из environment
339
- */
340
256
  function initializeDebugPatterns() {
341
- const debugPattern = environment.getDebugValue() || '';
342
- const patterns = debugPattern
343
- .split(',')
344
- .map((p) => p.trim())
345
- .filter(Boolean);
346
- // Создаем Set для отслеживания уже обработанных логгеров
347
- const processedLoggers = new Set();
348
- function processLogger(logger) {
349
- if (processedLoggers.has(logger.id))
350
- return;
351
- processedLoggers.add(logger.id);
352
- configureLogger(logger, patterns);
353
- // Обрабатываем дочерние логгеры
354
- logger.children.forEach(processLogger);
355
- }
356
- // Обрабатываем все существующие логгеры
357
- loggerCache.forEach(processLogger);
358
- // Обрабатываем все существующие логгеры
359
- Array.from(loggerCache).forEach(([, logger]) => {
360
- processLogger(logger);
361
- });
257
+ const debugPattern = environment.getDebugValue() || "";
258
+ const patterns = debugPattern.split(",").map((p) => p.trim()).filter(Boolean);
259
+ const processedLoggers = /* @__PURE__ */ new Set();
260
+ function processLogger(logger) {
261
+ if (processedLoggers.has(logger.id)) return;
262
+ processedLoggers.add(logger.id);
263
+ configureLogger(logger, patterns);
264
+ logger.children.forEach(processLogger);
265
+ }
266
+ loggerCache.forEach(processLogger);
267
+ Array.from(loggerCache).forEach(([, logger]) => {
268
+ processLogger(logger);
269
+ });
362
270
  }
363
- /**
364
- * Плагин иерархического логгера для loglevel
365
- */
366
271
  const hierarchicalPlugin = {
367
- apply(rootLogger) {
368
- // Переопределяем метод getLogger корневого логгера
369
- const originalGetLogger = rootLogger.getLogger.bind(rootLogger);
370
- rootLogger.getLogger = (name) => {
371
- return createHierarchicalLogger(originalGetLogger, name);
372
- };
373
- },
272
+ apply(rootLogger) {
273
+ const originalGetLogger = rootLogger.getLogger.bind(rootLogger);
274
+ const rootChildren = /* @__PURE__ */ new Map();
275
+ rootLogger.getLogger = (name) => {
276
+ let logger = rootChildren.get(name);
277
+ if (!logger) {
278
+ logger = createHierarchicalLogger(originalGetLogger, name);
279
+ rootChildren.set(name, logger);
280
+ }
281
+ return logger;
282
+ };
283
+ }
374
284
  };
375
-
376
285
  const defaultOptions = {
377
- format: (level, name, timestamp) => `[${timestamp.toISOString()}] [${level}] [${name}]`,
286
+ format: (level, name, timestamp) => `[${timestamp.toISOString()}] [${level}] [${name}]`
378
287
  };
379
- /**
380
- * Плагин для добавления префикса к логам
381
- * @param logger Инстанс логгера
382
- * @param options Опции плагина
383
- */
384
288
  function prefix(logger, options = {}) {
385
- const mergedOptions = Object.assign(Object.assign({}, defaultOptions), options);
386
- const originalFactory = logger.methodFactory;
387
- logger.methodFactory = function (methodName, logLevel, loggerName) {
388
- const rawMethod = originalFactory(methodName, logLevel, loggerName);
389
- return function (...args) {
390
- const level = methodName.toUpperCase();
391
- const timestamp = new Date();
392
- const prefix = mergedOptions.format(level, typeof loggerName === 'string' ? loggerName : '', timestamp);
393
- if (Array.isArray(prefix)) {
394
- rawMethod.apply(this, [...prefix, ...args]);
395
- }
396
- else {
397
- rawMethod.apply(this, [prefix, ...args]);
398
- }
399
- };
289
+ const mergedOptions = { ...defaultOptions, ...options };
290
+ const originalFactory = logger.methodFactory;
291
+ logger.methodFactory = function(methodName, logLevel, loggerName) {
292
+ const rawMethod = originalFactory(methodName, logLevel, loggerName);
293
+ return function(...args) {
294
+ const level = methodName.toUpperCase();
295
+ const timestamp = /* @__PURE__ */ new Date();
296
+ const prefix2 = mergedOptions.format(level, typeof loggerName === "string" ? loggerName : "", timestamp);
297
+ if (Array.isArray(prefix2)) {
298
+ rawMethod.apply(this, [...prefix2, ...args]);
299
+ } else {
300
+ rawMethod.apply(this, [prefix2, ...args]);
301
+ }
400
302
  };
401
- return logger;
303
+ };
304
+ return logger;
402
305
  }
403
306
  const prefixPlugin = {
404
- apply(rootLogger, options = {}) {
405
- prefix(rootLogger, options);
406
- },
307
+ apply(rootLogger, options = {}) {
308
+ prefix(rootLogger, options);
309
+ }
407
310
  };
408
-
409
- // Применяем плагины
410
311
  hierarchicalPlugin.apply(log);
411
312
  prefixPlugin.apply(log, {
412
- format: (level, name, timestamp) => {
413
- return environment.formatter(level, name, timestamp);
414
- },
313
+ format: (level, name, timestamp) => {
314
+ return environment.formatter(level, name, timestamp);
315
+ }
415
316
  });
416
- // сброс левела чтобы игнорировать запись в сторадже в браузерной имплементации
417
317
  log.resetLevel();
418
- // Пересоздаем методы логгера
419
318
  log.rebuild();
420
319
  const extendedLog = Object.assign(log, {});
421
-
422
- export { hierarchicalPlugin, extendedLog as log, prefixPlugin };
320
+ export {
321
+ hierarchicalPlugin,
322
+ extendedLog as log,
323
+ prefixPlugin
324
+ };