fastypest 1.5.1 → 1.5.3

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.
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get LOGGING_COLORS () {
13
+ return LOGGING_COLORS;
14
+ },
15
+ get LOGGING_DEFAULT_ENABLED () {
16
+ return LOGGING_DEFAULT_ENABLED;
17
+ },
18
+ get LOGGING_DETAIL_LEVELS () {
19
+ return LOGGING_DETAIL_LEVELS;
20
+ },
21
+ get LOGGING_LEVEL_ICONS () {
22
+ return LOGGING_LEVEL_ICONS;
23
+ },
24
+ get LOGGING_LEVEL_LABELS () {
25
+ return LOGGING_LEVEL_LABELS;
26
+ },
27
+ get LOGGING_LEVEL_SEQUENCE () {
28
+ return LOGGING_LEVEL_SEQUENCE;
29
+ },
30
+ get LOGGING_LEVEL_WEIGHTS () {
31
+ return LOGGING_LEVEL_WEIGHTS;
32
+ },
33
+ get LOGGING_TIMESTAMP_FORMAT () {
34
+ return LOGGING_TIMESTAMP_FORMAT;
35
+ },
36
+ get LogLevel () {
37
+ return LogLevel;
38
+ },
39
+ get LoggingDetailLevel () {
40
+ return LoggingDetailLevel;
41
+ }
42
+ });
43
+ var LogLevel = /*#__PURE__*/ function(LogLevel) {
44
+ LogLevel["Error"] = "error";
45
+ LogLevel["Warn"] = "warn";
46
+ LogLevel["Log"] = "notice";
47
+ LogLevel["Info"] = "info";
48
+ LogLevel["Debug"] = "debug";
49
+ LogLevel["Verbose"] = "verbose";
50
+ return LogLevel;
51
+ }({});
52
+ var LoggingDetailLevel = /*#__PURE__*/ function(LoggingDetailLevel) {
53
+ LoggingDetailLevel["Simple"] = "simple";
54
+ LoggingDetailLevel["Detailed"] = "detailed";
55
+ return LoggingDetailLevel;
56
+ }({});
57
+ const LOGGING_DEFAULT_ENABLED = false;
58
+ const LOGGING_TIMESTAMP_FORMAT = "YYYY-MM-DD HH:mm:ss";
59
+ const LOGGING_LEVEL_WEIGHTS = {
60
+ ["error"]: 0,
61
+ ["warn"]: 1,
62
+ ["notice"]: 2,
63
+ ["info"]: 3,
64
+ ["debug"]: 4,
65
+ ["verbose"]: 5
66
+ };
67
+ const LOGGING_LEVEL_SEQUENCE = [
68
+ "error",
69
+ "warn",
70
+ "notice",
71
+ "info",
72
+ "debug",
73
+ "verbose"
74
+ ];
75
+ const LOGGING_DETAIL_LEVELS = {
76
+ ["simple"]: [
77
+ "error",
78
+ "warn",
79
+ "notice",
80
+ "info"
81
+ ],
82
+ ["detailed"]: [
83
+ ...LOGGING_LEVEL_SEQUENCE
84
+ ]
85
+ };
86
+ const LOGGING_COLORS = {
87
+ ["error"]: "bold red",
88
+ ["warn"]: "bold yellow",
89
+ ["notice"]: "bold green",
90
+ ["info"]: "bold cyan",
91
+ ["debug"]: "bold magenta",
92
+ ["verbose"]: "bold blue"
93
+ };
94
+ const LOGGING_LEVEL_ICONS = {
95
+ ["error"]: "❌",
96
+ ["warn"]: "⚠️",
97
+ ["notice"]: "🟢",
98
+ ["info"]: "💡",
99
+ ["debug"]: "🧭",
100
+ ["verbose"]: "🌀"
101
+ };
102
+ const LOGGING_LEVEL_LABELS = {
103
+ ["error"]: "ERROR",
104
+ ["warn"]: "WARN",
105
+ ["notice"]: "LOG",
106
+ ["info"]: "INFO",
107
+ ["debug"]: "DEBUG",
108
+ ["verbose"]: "VERBOSE"
109
+ };
110
+
111
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/logging/constants.ts"],"sourcesContent":["export enum LogLevel {\n Error = \"error\",\n Warn = \"warn\",\n Log = \"notice\",\n Info = \"info\",\n Debug = \"debug\",\n Verbose = \"verbose\",\n}\n\nexport enum LoggingDetailLevel {\n Simple = \"simple\",\n Detailed = \"detailed\",\n}\n\nexport const LOGGING_DEFAULT_ENABLED = false;\nexport const LOGGING_TIMESTAMP_FORMAT = \"YYYY-MM-DD HH:mm:ss\";\n\nexport const LOGGING_LEVEL_WEIGHTS: Record<LogLevel, number> = {\n [LogLevel.Error]: 0,\n [LogLevel.Warn]: 1,\n [LogLevel.Log]: 2,\n [LogLevel.Info]: 3,\n [LogLevel.Debug]: 4,\n [LogLevel.Verbose]: 5,\n};\n\nexport const LOGGING_LEVEL_SEQUENCE: LogLevel[] = [\n LogLevel.Error,\n LogLevel.Warn,\n LogLevel.Log,\n LogLevel.Info,\n LogLevel.Debug,\n LogLevel.Verbose,\n];\n\nexport const LOGGING_DETAIL_LEVELS: Record<LoggingDetailLevel, LogLevel[]> = {\n [LoggingDetailLevel.Simple]: [\n LogLevel.Error,\n LogLevel.Warn,\n LogLevel.Log,\n LogLevel.Info,\n ],\n [LoggingDetailLevel.Detailed]: [...LOGGING_LEVEL_SEQUENCE],\n};\n\nexport const LOGGING_COLORS: Record<LogLevel, string> = {\n [LogLevel.Error]: \"bold red\",\n [LogLevel.Warn]: \"bold yellow\",\n [LogLevel.Log]: \"bold green\",\n [LogLevel.Info]: \"bold cyan\",\n [LogLevel.Debug]: \"bold magenta\",\n [LogLevel.Verbose]: \"bold blue\",\n};\n\nexport const LOGGING_LEVEL_ICONS: Record<LogLevel, string> = {\n [LogLevel.Error]: \"❌\",\n [LogLevel.Warn]: \"⚠️\",\n [LogLevel.Log]: \"🟢\",\n [LogLevel.Info]: \"💡\",\n [LogLevel.Debug]: \"🧭\",\n [LogLevel.Verbose]: \"🌀\",\n};\n\nexport const LOGGING_LEVEL_LABELS: Record<LogLevel, string> = {\n [LogLevel.Error]: \"ERROR\",\n [LogLevel.Warn]: \"WARN\",\n [LogLevel.Log]: \"LOG\",\n [LogLevel.Info]: \"INFO\",\n [LogLevel.Debug]: \"DEBUG\",\n [LogLevel.Verbose]: \"VERBOSE\",\n};\n\nexport type LoggingOptions = {\n enabled?: boolean;\n levels?: LogLevel[];\n detail?: LoggingDetailLevel;\n};\n\nexport type ResolvedLoggingOptions = {\n enabled: boolean;\n levels?: LogLevel[];\n detail?: LoggingDetailLevel;\n};\n"],"names":["LOGGING_COLORS","LOGGING_DEFAULT_ENABLED","LOGGING_DETAIL_LEVELS","LOGGING_LEVEL_ICONS","LOGGING_LEVEL_LABELS","LOGGING_LEVEL_SEQUENCE","LOGGING_LEVEL_WEIGHTS","LOGGING_TIMESTAMP_FORMAT","LogLevel","LoggingDetailLevel"],"mappings":";;;;;;;;;;;QA6CaA;eAAAA;;QA/BAC;eAAAA;;QAqBAC;eAAAA;;QAmBAC;eAAAA;;QASAC;eAAAA;;QArCAC;eAAAA;;QATAC;eAAAA;;QAFAC;eAAAA;;QAfDC;eAAAA;;QASAC;eAAAA;;;AATL,IAAA,AAAKD,kCAAAA;;;;;;;WAAAA;;AASL,IAAA,AAAKC,4CAAAA;;;WAAAA;;AAKL,MAAMR,0BAA0B;AAChC,MAAMM,2BAA2B;AAEjC,MAAMD,wBAAkD;IAC7D,SAAgB,EAAE;IAClB,QAAe,EAAE;IACjB,UAAc,EAAE;IAChB,QAAe,EAAE;IACjB,SAAgB,EAAE;IAClB,WAAkB,EAAE;AACtB;AAEO,MAAMD,yBAAqC;;;;;;;CAOjD;AAEM,MAAMH,wBAAgE;IAC3E,UAA2B,EAAE;;;;;KAK5B;IACD,YAA6B,EAAE;WAAIG;KAAuB;AAC5D;AAEO,MAAML,iBAA2C;IACtD,SAAgB,EAAE;IAClB,QAAe,EAAE;IACjB,UAAc,EAAE;IAChB,QAAe,EAAE;IACjB,SAAgB,EAAE;IAClB,WAAkB,EAAE;AACtB;AAEO,MAAMG,sBAAgD;IAC3D,SAAgB,EAAE;IAClB,QAAe,EAAE;IACjB,UAAc,EAAE;IAChB,QAAe,EAAE;IACjB,SAAgB,EAAE;IAClB,WAAkB,EAAE;AACtB;AAEO,MAAMC,uBAAiD;IAC5D,SAAgB,EAAE;IAClB,QAAe,EAAE;IACjB,UAAc,EAAE;IAChB,QAAe,EAAE;IACjB,SAAgB,EAAE;IAClB,WAAkB,EAAE;AACtB"}
@@ -0,0 +1,2 @@
1
+ export { configureLogging, createScopedLogger, ScopedLogger, getLoggingOptions, } from "./logger";
2
+ export { LogLevel, LOGGING_DEFAULT_ENABLED, LOGGING_LEVEL_LABELS, LOGGING_LEVEL_SEQUENCE, LOGGING_DETAIL_LEVELS, LoggingDetailLevel, type LoggingOptions, type ResolvedLoggingOptions, } from "./constants";
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get LOGGING_DEFAULT_ENABLED () {
13
+ return _constants.LOGGING_DEFAULT_ENABLED;
14
+ },
15
+ get LOGGING_DETAIL_LEVELS () {
16
+ return _constants.LOGGING_DETAIL_LEVELS;
17
+ },
18
+ get LOGGING_LEVEL_LABELS () {
19
+ return _constants.LOGGING_LEVEL_LABELS;
20
+ },
21
+ get LOGGING_LEVEL_SEQUENCE () {
22
+ return _constants.LOGGING_LEVEL_SEQUENCE;
23
+ },
24
+ get LogLevel () {
25
+ return _constants.LogLevel;
26
+ },
27
+ get LoggingDetailLevel () {
28
+ return _constants.LoggingDetailLevel;
29
+ },
30
+ get ScopedLogger () {
31
+ return _logger.ScopedLogger;
32
+ },
33
+ get configureLogging () {
34
+ return _logger.configureLogging;
35
+ },
36
+ get createScopedLogger () {
37
+ return _logger.createScopedLogger;
38
+ },
39
+ get getLoggingOptions () {
40
+ return _logger.getLoggingOptions;
41
+ }
42
+ });
43
+ const _logger = require("./logger");
44
+ const _constants = require("./constants");
45
+
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/logging/index.ts"],"sourcesContent":["export {\n configureLogging,\n createScopedLogger,\n ScopedLogger,\n getLoggingOptions,\n} from \"./logger\";\nexport {\n LogLevel,\n LOGGING_DEFAULT_ENABLED,\n LOGGING_LEVEL_LABELS,\n LOGGING_LEVEL_SEQUENCE,\n LOGGING_DETAIL_LEVELS,\n LoggingDetailLevel,\n type LoggingOptions,\n type ResolvedLoggingOptions,\n} from \"./constants\";\n"],"names":["LOGGING_DEFAULT_ENABLED","LOGGING_DETAIL_LEVELS","LOGGING_LEVEL_LABELS","LOGGING_LEVEL_SEQUENCE","LogLevel","LoggingDetailLevel","ScopedLogger","configureLogging","createScopedLogger","getLoggingOptions"],"mappings":";;;;;;;;;;;QAQEA;eAAAA,kCAAuB;;QAGvBC;eAAAA,gCAAqB;;QAFrBC;eAAAA,+BAAoB;;QACpBC;eAAAA,iCAAsB;;QAHtBC;eAAAA,mBAAQ;;QAKRC;eAAAA,6BAAkB;;QATlBC;eAAAA,oBAAY;;QAFZC;eAAAA,wBAAgB;;QAChBC;eAAAA,0BAAkB;;QAElBC;eAAAA,yBAAiB;;;wBACZ;2BAUA"}
@@ -0,0 +1,32 @@
1
+ import { LogLevel, type LoggingOptions, type ResolvedLoggingOptions } from "./constants";
2
+ type LogDetail = string | number | boolean | bigint | Date | Error | null | undefined;
3
+ type LogDetailsInput = LogDetail | LogDetail[];
4
+ type TimerEmitter = (level: LogLevel, message: string, details: LogDetail[]) => void;
5
+ export declare const configureLogging: (options?: LoggingOptions) => ResolvedLoggingOptions;
6
+ export declare class LoggerTimer {
7
+ private readonly label;
8
+ private readonly emit;
9
+ private readonly start;
10
+ private lastMark;
11
+ private finished;
12
+ constructor(label: string, emit: TimerEmitter);
13
+ mark(message: string, level?: LogLevel, ...details: LogDetailsInput[]): void;
14
+ end(message?: string, level?: LogLevel, ...details: LogDetailsInput[]): void;
15
+ }
16
+ export declare class ScopedLogger {
17
+ private readonly scope;
18
+ private readonly localOptions?;
19
+ constructor(scope: string, localOptions?: LoggingOptions | undefined);
20
+ error(message: string, ...details: LogDetailsInput[]): void;
21
+ warn(message: string, ...details: LogDetailsInput[]): void;
22
+ log(message: string, ...details: LogDetailsInput[]): void;
23
+ info(message: string, ...details: LogDetailsInput[]): void;
24
+ debug(message: string, ...details: LogDetailsInput[]): void;
25
+ verbose(message: string, ...details: LogDetailsInput[]): void;
26
+ timer(label: string): LoggerTimer;
27
+ formatDuration(durationMs: number): string;
28
+ private write;
29
+ }
30
+ export declare const createScopedLogger: (scope: string, options?: LoggingOptions) => ScopedLogger;
31
+ export declare const getLoggingOptions: () => ResolvedLoggingOptions;
32
+ export {};
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get LoggerTimer () {
13
+ return LoggerTimer;
14
+ },
15
+ get ScopedLogger () {
16
+ return ScopedLogger;
17
+ },
18
+ get configureLogging () {
19
+ return configureLogging;
20
+ },
21
+ get createScopedLogger () {
22
+ return createScopedLogger;
23
+ },
24
+ get getLoggingOptions () {
25
+ return getLoggingOptions;
26
+ }
27
+ });
28
+ const _nodeperf_hooks = require("node:perf_hooks");
29
+ const _winston = require("winston");
30
+ const _constants = require("./constants");
31
+ function _define_property(obj, key, value) {
32
+ if (key in obj) {
33
+ Object.defineProperty(obj, key, {
34
+ value: value,
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true
38
+ });
39
+ } else {
40
+ obj[key] = value;
41
+ }
42
+ return obj;
43
+ }
44
+ const LOG_FIELD_LABEL = "label";
45
+ const LOG_FIELD_MESSAGE = "message";
46
+ const LOG_FIELD_LEVEL = "level";
47
+ const LOG_FIELD_TIMESTAMP = "timestamp";
48
+ const LOG_FIELD_DETAILS = "details";
49
+ const ANSI_ESCAPE_PATTERN = /\u001b\[[0-9;]*m/g;
50
+ const DETAIL_SEPARATOR = " · ";
51
+ const DETAIL_PREFIX = " — ";
52
+ const MILLISECONDS_IN_SECOND = 1000;
53
+ const SECONDS_IN_MINUTE = 60;
54
+ const MINUTES_IN_HOUR = 60;
55
+ const MILLISECONDS_IN_MINUTE = MILLISECONDS_IN_SECOND * SECONDS_IN_MINUTE;
56
+ const MILLISECONDS_IN_HOUR = MILLISECONDS_IN_MINUTE * MINUTES_IN_HOUR;
57
+ const DECIMAL_PRECISION_SHORT = 2;
58
+ const DECIMAL_PRECISION_LONG = 1;
59
+ const LOGGING_LEVELS_KEY = "levels";
60
+ const LOGGING_DETAIL_KEY = "detail";
61
+ const formatDetailValue = (detail)=>{
62
+ if (detail === undefined) {
63
+ return undefined;
64
+ }
65
+ if (detail === null) {
66
+ return "null";
67
+ }
68
+ if (detail instanceof Date) {
69
+ return detail.toISOString();
70
+ }
71
+ if (detail instanceof Error) {
72
+ return detail.message;
73
+ }
74
+ if (typeof detail === "boolean") {
75
+ return detail ? "yes" : "no";
76
+ }
77
+ return String(detail);
78
+ };
79
+ const trimDecimals = (value)=>{
80
+ if (Number.isInteger(value)) {
81
+ return value.toString();
82
+ }
83
+ return value.toString();
84
+ };
85
+ const formatSeconds = (seconds)=>{
86
+ const precision = seconds < 10 ? DECIMAL_PRECISION_SHORT : DECIMAL_PRECISION_LONG;
87
+ const rounded = Number(seconds.toFixed(precision));
88
+ return `${trimDecimals(rounded)}s`;
89
+ };
90
+ const formatDurationText = (durationMs)=>{
91
+ if (durationMs <= 0) {
92
+ return "0ms";
93
+ }
94
+ const segments = [];
95
+ const hours = Math.floor(durationMs / MILLISECONDS_IN_HOUR);
96
+ let remaining = durationMs - hours * MILLISECONDS_IN_HOUR;
97
+ const minutes = Math.floor(remaining / MILLISECONDS_IN_MINUTE);
98
+ remaining -= minutes * MILLISECONDS_IN_MINUTE;
99
+ const seconds = remaining / MILLISECONDS_IN_SECOND;
100
+ const wholeSeconds = Math.floor(seconds);
101
+ const leftoverMs = Math.round(remaining - wholeSeconds * MILLISECONDS_IN_SECOND);
102
+ if (hours > 0) {
103
+ segments.push(`${hours}h`);
104
+ }
105
+ if (minutes > 0) {
106
+ segments.push(`${minutes}m`);
107
+ }
108
+ if (hours > 0 || minutes > 0) {
109
+ if (wholeSeconds > 0) {
110
+ segments.push(`${wholeSeconds}s`);
111
+ }
112
+ if (segments.length === 0 || leftoverMs > 0) {
113
+ if (leftoverMs > 0) {
114
+ segments.push(`${leftoverMs}ms`);
115
+ }
116
+ }
117
+ } else if (seconds >= 1) {
118
+ segments.push(formatSeconds(seconds));
119
+ } else {
120
+ segments.push(`${Math.round(durationMs)}ms`);
121
+ }
122
+ return segments.join(" ");
123
+ };
124
+ const extractLevel = (info)=>{
125
+ const levelText = info[LOG_FIELD_LEVEL] ?? info.level;
126
+ if (!levelText) {
127
+ return undefined;
128
+ }
129
+ const normalized = levelText.replace(ANSI_ESCAPE_PATTERN, "").toLowerCase();
130
+ return normalized in _constants.LOGGING_LEVEL_WEIGHTS ? normalized : undefined;
131
+ };
132
+ const formatDetails = (details)=>{
133
+ const formatted = details.map((detail)=>formatDetailValue(detail)).filter((value)=>Boolean(value && value.length > 0));
134
+ if (formatted.length === 0) {
135
+ return undefined;
136
+ }
137
+ return formatted.join(DETAIL_SEPARATOR);
138
+ };
139
+ const formatLogMessage = (info)=>{
140
+ const label = info[LOG_FIELD_LABEL];
141
+ const timestamp = info[LOG_FIELD_TIMESTAMP];
142
+ const level = extractLevel(info);
143
+ const fallbackLevel = info.level.replace(ANSI_ESCAPE_PATTERN, "").toUpperCase();
144
+ const message = info[LOG_FIELD_MESSAGE] ? String(info[LOG_FIELD_MESSAGE]) : info.message;
145
+ const levelLabel = level ? _constants.LOGGING_LEVEL_LABELS[level] : fallbackLevel;
146
+ const levelIcon = level ? `${_constants.LOGGING_LEVEL_ICONS[level]} ` : "";
147
+ const detailText = info[LOG_FIELD_DETAILS] ? String(info[LOG_FIELD_DETAILS]) : "";
148
+ const formattedDetails = detailText ? `${DETAIL_PREFIX}${detailText}` : "";
149
+ const timestampText = timestamp ? `${timestamp} ` : "";
150
+ return `${timestampText}${levelIcon}[${label ?? ""}] ${levelLabel} ${message}${formattedDetails}`;
151
+ };
152
+ (0, _winston.addColors)(_constants.LOGGING_COLORS);
153
+ const baseLogger = (0, _winston.createLogger)({
154
+ levels: _constants.LOGGING_LEVEL_WEIGHTS,
155
+ level: _constants.LogLevel.Verbose,
156
+ format: _winston.format.combine(_winston.format.timestamp({
157
+ format: _constants.LOGGING_TIMESTAMP_FORMAT
158
+ }), _winston.format.colorize({
159
+ all: true
160
+ }), _winston.format.printf((info)=>formatLogMessage(info))),
161
+ transports: [
162
+ new _winston.transports.Console()
163
+ ],
164
+ silent: false
165
+ });
166
+ let globalOptions = {
167
+ enabled: _constants.LOGGING_DEFAULT_ENABLED,
168
+ levels: undefined,
169
+ detail: undefined
170
+ };
171
+ const resolveEnabled = (enabled, hasOptions)=>{
172
+ if (enabled !== undefined) {
173
+ return enabled;
174
+ }
175
+ if (hasOptions) {
176
+ return true;
177
+ }
178
+ return _constants.LOGGING_DEFAULT_ENABLED;
179
+ };
180
+ const normalizeLevels = (levels)=>{
181
+ if (!levels || levels.length === 0) {
182
+ return undefined;
183
+ }
184
+ const unique = Array.from(new Set(levels));
185
+ return unique.length > 0 ? unique : undefined;
186
+ };
187
+ const hasLevelsOption = (options)=>{
188
+ if (!options) {
189
+ return false;
190
+ }
191
+ return Object.prototype.hasOwnProperty.call(options, LOGGING_LEVELS_KEY);
192
+ };
193
+ const resolveLoggingOptions = (options)=>{
194
+ const hasOptions = Boolean(options);
195
+ const enabled = resolveEnabled(options?.enabled, hasOptions);
196
+ if (!enabled) {
197
+ return {
198
+ enabled,
199
+ levels: undefined,
200
+ detail: undefined
201
+ };
202
+ }
203
+ return {
204
+ enabled,
205
+ levels: normalizeLevels(options?.levels),
206
+ detail: options?.detail
207
+ };
208
+ };
209
+ const getDetailLevels = (detail)=>{
210
+ if (!detail) {
211
+ return undefined;
212
+ }
213
+ return _constants.LOGGING_DETAIL_LEVELS[detail];
214
+ };
215
+ const shouldLog = (level, options)=>{
216
+ if (!options.enabled) {
217
+ return false;
218
+ }
219
+ const detailLevels = getDetailLevels(options.detail);
220
+ const hasDetailFilter = detailLevels && detailLevels.length > 0;
221
+ const hasLevelFilter = options.levels && options.levels.length > 0;
222
+ if (!hasDetailFilter && !hasLevelFilter) {
223
+ return true;
224
+ }
225
+ if (hasDetailFilter && !detailLevels.includes(level)) {
226
+ return false;
227
+ }
228
+ if (hasLevelFilter && !options.levels.includes(level)) {
229
+ return false;
230
+ }
231
+ return true;
232
+ };
233
+ const mergeOptions = (local)=>{
234
+ if (!local) {
235
+ return globalOptions;
236
+ }
237
+ const resolvedLocal = resolveLoggingOptions(local);
238
+ const hasLocalLevels = hasLevelsOption(local);
239
+ const hasLocalDetail = Object.prototype.hasOwnProperty.call(local, LOGGING_DETAIL_KEY);
240
+ const ignoreGlobalLevels = hasLocalDetail && !hasLocalLevels;
241
+ return {
242
+ enabled: resolvedLocal.enabled,
243
+ levels: hasLocalLevels ? resolvedLocal.levels : ignoreGlobalLevels ? undefined : globalOptions.levels,
244
+ detail: hasLocalDetail ? resolvedLocal.detail : globalOptions.detail
245
+ };
246
+ };
247
+ const normalizeDetails = (input)=>{
248
+ return input.flatMap((entry)=>{
249
+ if (Array.isArray(entry)) {
250
+ return entry;
251
+ }
252
+ return [
253
+ entry
254
+ ];
255
+ });
256
+ };
257
+ const logWithDetails = (level, scope, message, details, options)=>{
258
+ if (!shouldLog(level, options)) {
259
+ return;
260
+ }
261
+ const formattedDetails = formatDetails(details);
262
+ const logPayload = {
263
+ level,
264
+ message,
265
+ [LOG_FIELD_LABEL]: scope
266
+ };
267
+ if (formattedDetails) {
268
+ logPayload[LOG_FIELD_DETAILS] = formattedDetails;
269
+ }
270
+ baseLogger.log(logPayload);
271
+ };
272
+ const configureLogging = (options)=>{
273
+ globalOptions = resolveLoggingOptions(options);
274
+ return globalOptions;
275
+ };
276
+ class LoggerTimer {
277
+ mark(message, level = _constants.LogLevel.Debug, ...details) {
278
+ if (this.finished) {
279
+ return;
280
+ }
281
+ const now = _nodeperf_hooks.performance.now();
282
+ const totalElapsed = now - this.start;
283
+ const segmentElapsed = now - this.lastMark;
284
+ this.lastMark = now;
285
+ const timerDetails = [
286
+ `${this.label} total ${formatDurationText(totalElapsed)}`
287
+ ];
288
+ if (segmentElapsed > 0 && segmentElapsed !== totalElapsed) {
289
+ timerDetails.push(`segment ${formatDurationText(segmentElapsed)}`);
290
+ }
291
+ const normalized = normalizeDetails(details);
292
+ this.emit(level, message, [
293
+ ...timerDetails,
294
+ ...normalized
295
+ ]);
296
+ }
297
+ end(message, level = _constants.LogLevel.Info, ...details) {
298
+ if (this.finished) {
299
+ return;
300
+ }
301
+ const totalElapsed = _nodeperf_hooks.performance.now() - this.start;
302
+ const normalized = normalizeDetails(details);
303
+ const timerDetails = [
304
+ `${this.label} total ${formatDurationText(totalElapsed)}`
305
+ ];
306
+ this.emit(level, message ?? `${this.label} completed`, [
307
+ ...timerDetails,
308
+ ...normalized
309
+ ]);
310
+ this.finished = true;
311
+ }
312
+ constructor(label, emit){
313
+ _define_property(this, "label", void 0);
314
+ _define_property(this, "emit", void 0);
315
+ _define_property(this, "start", void 0);
316
+ _define_property(this, "lastMark", void 0);
317
+ _define_property(this, "finished", void 0);
318
+ this.label = label;
319
+ this.emit = emit;
320
+ this.start = _nodeperf_hooks.performance.now();
321
+ this.lastMark = this.start;
322
+ this.finished = false;
323
+ }
324
+ }
325
+ class ScopedLogger {
326
+ error(message, ...details) {
327
+ this.write(_constants.LogLevel.Error, message, details);
328
+ }
329
+ warn(message, ...details) {
330
+ this.write(_constants.LogLevel.Warn, message, details);
331
+ }
332
+ log(message, ...details) {
333
+ this.write(_constants.LogLevel.Log, message, details);
334
+ }
335
+ info(message, ...details) {
336
+ this.write(_constants.LogLevel.Info, message, details);
337
+ }
338
+ debug(message, ...details) {
339
+ this.write(_constants.LogLevel.Debug, message, details);
340
+ }
341
+ verbose(message, ...details) {
342
+ this.write(_constants.LogLevel.Verbose, message, details);
343
+ }
344
+ timer(label) {
345
+ return new LoggerTimer(label, (level, message, details)=>{
346
+ this.write(level, message, details);
347
+ });
348
+ }
349
+ formatDuration(durationMs) {
350
+ return formatDurationText(durationMs);
351
+ }
352
+ write(level, message, details) {
353
+ const normalized = normalizeDetails(details);
354
+ logWithDetails(level, this.scope, message, normalized, mergeOptions(this.localOptions));
355
+ }
356
+ constructor(scope, localOptions){
357
+ _define_property(this, "scope", void 0);
358
+ _define_property(this, "localOptions", void 0);
359
+ this.scope = scope;
360
+ this.localOptions = localOptions;
361
+ }
362
+ }
363
+ const createScopedLogger = (scope, options)=>new ScopedLogger(scope, options);
364
+ const getLoggingOptions = ()=>({
365
+ ...globalOptions,
366
+ levels: globalOptions.levels ? [
367
+ ...globalOptions.levels
368
+ ] : undefined
369
+ });
370
+
371
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/logging/logger.ts"],"sourcesContent":["import { performance } from \"node:perf_hooks\";\nimport { addColors, createLogger, format, transports } from \"winston\";\nimport {\n LOGGING_COLORS,\n LOGGING_DEFAULT_ENABLED,\n LOGGING_DETAIL_LEVELS,\n LOGGING_LEVEL_ICONS,\n LOGGING_LEVEL_LABELS,\n LOGGING_LEVEL_WEIGHTS,\n LOGGING_TIMESTAMP_FORMAT,\n LogLevel,\n LoggingDetailLevel,\n type LoggingOptions,\n type ResolvedLoggingOptions,\n} from \"./constants\";\n\nconst LOG_FIELD_LABEL = \"label\";\nconst LOG_FIELD_MESSAGE = \"message\";\nconst LOG_FIELD_LEVEL = \"level\";\nconst LOG_FIELD_TIMESTAMP = \"timestamp\";\nconst LOG_FIELD_DETAILS = \"details\";\nconst ANSI_ESCAPE_PATTERN = /\\u001b\\[[0-9;]*m/g;\nconst DETAIL_SEPARATOR = \" · \";\nconst DETAIL_PREFIX = \" — \";\nconst MILLISECONDS_IN_SECOND = 1000;\nconst SECONDS_IN_MINUTE = 60;\nconst MINUTES_IN_HOUR = 60;\nconst MILLISECONDS_IN_MINUTE = MILLISECONDS_IN_SECOND * SECONDS_IN_MINUTE;\nconst MILLISECONDS_IN_HOUR = MILLISECONDS_IN_MINUTE * MINUTES_IN_HOUR;\nconst DECIMAL_PRECISION_SHORT = 2;\nconst DECIMAL_PRECISION_LONG = 1;\nconst LOGGING_LEVELS_KEY: keyof LoggingOptions = \"levels\";\nconst LOGGING_DETAIL_KEY: keyof LoggingOptions = \"detail\";\n\nconst formatDetailValue = (detail: LogDetail): string | undefined => {\n if (detail === undefined) {\n return undefined;\n }\n if (detail === null) {\n return \"null\";\n }\n if (detail instanceof Date) {\n return detail.toISOString();\n }\n if (detail instanceof Error) {\n return detail.message;\n }\n if (typeof detail === \"boolean\") {\n return detail ? \"yes\" : \"no\";\n }\n return String(detail);\n};\n\nconst trimDecimals = (value: number): string => {\n if (Number.isInteger(value)) {\n return value.toString();\n }\n return value.toString();\n};\n\nconst formatSeconds = (seconds: number): string => {\n const precision = seconds < 10 ? DECIMAL_PRECISION_SHORT : DECIMAL_PRECISION_LONG;\n const rounded = Number(seconds.toFixed(precision));\n return `${trimDecimals(rounded)}s`;\n};\n\nconst formatDurationText = (durationMs: number): string => {\n if (durationMs <= 0) {\n return \"0ms\";\n }\n const segments: string[] = [];\n const hours = Math.floor(durationMs / MILLISECONDS_IN_HOUR);\n let remaining = durationMs - hours * MILLISECONDS_IN_HOUR;\n const minutes = Math.floor(remaining / MILLISECONDS_IN_MINUTE);\n remaining -= minutes * MILLISECONDS_IN_MINUTE;\n const seconds = remaining / MILLISECONDS_IN_SECOND;\n const wholeSeconds = Math.floor(seconds);\n const leftoverMs = Math.round(remaining - wholeSeconds * MILLISECONDS_IN_SECOND);\n\n if (hours > 0) {\n segments.push(`${hours}h`);\n }\n if (minutes > 0) {\n segments.push(`${minutes}m`);\n }\n if (hours > 0 || minutes > 0) {\n if (wholeSeconds > 0) {\n segments.push(`${wholeSeconds}s`);\n }\n if (segments.length === 0 || leftoverMs > 0) {\n if (leftoverMs > 0) {\n segments.push(`${leftoverMs}ms`);\n }\n }\n } else if (seconds >= 1) {\n segments.push(formatSeconds(seconds));\n } else {\n segments.push(`${Math.round(durationMs)}ms`);\n }\n return segments.join(\" \");\n};\n\ntype LogDetail = string | number | boolean | bigint | Date | Error | null | undefined;\n\ntype LogDetailsInput = LogDetail | LogDetail[];\n\ntype LoggerInfo = Record<string, unknown> & {\n level: string;\n message: string;\n [LOG_FIELD_DETAILS]?: string;\n};\n\ntype LoggerPayload = LoggerInfo & {\n [LOG_FIELD_LABEL]: string;\n};\n\ntype TimerEmitter = (level: LogLevel, message: string, details: LogDetail[]) => void;\n\nconst extractLevel = (info: LoggerInfo): LogLevel | undefined => {\n const levelText = (info[LOG_FIELD_LEVEL] as string | undefined) ?? info.level;\n if (!levelText) {\n return undefined;\n }\n const normalized = levelText.replace(ANSI_ESCAPE_PATTERN, \"\").toLowerCase();\n return normalized in LOGGING_LEVEL_WEIGHTS ? (normalized as LogLevel) : undefined;\n};\n\nconst formatDetails = (details: LogDetail[]): string | undefined => {\n const formatted = details\n .map((detail) => formatDetailValue(detail))\n .filter((value): value is string => Boolean(value && value.length > 0));\n if (formatted.length === 0) {\n return undefined;\n }\n return formatted.join(DETAIL_SEPARATOR);\n};\n\nconst formatLogMessage = (info: LoggerInfo): string => {\n const label = info[LOG_FIELD_LABEL] as string | undefined;\n const timestamp = info[LOG_FIELD_TIMESTAMP] as string | undefined;\n const level = extractLevel(info);\n const fallbackLevel = info.level.replace(ANSI_ESCAPE_PATTERN, \"\").toUpperCase();\n const message = info[LOG_FIELD_MESSAGE] ? String(info[LOG_FIELD_MESSAGE]) : info.message;\n const levelLabel = level ? LOGGING_LEVEL_LABELS[level] : fallbackLevel;\n const levelIcon = level ? `${LOGGING_LEVEL_ICONS[level]} ` : \"\";\n const detailText = info[LOG_FIELD_DETAILS] ? String(info[LOG_FIELD_DETAILS]) : \"\";\n const formattedDetails = detailText ? `${DETAIL_PREFIX}${detailText}` : \"\";\n const timestampText = timestamp ? `${timestamp} ` : \"\";\n return `${timestampText}${levelIcon}[${label ?? \"\"}] ${levelLabel} ${message}${formattedDetails}`;\n};\n\naddColors(LOGGING_COLORS);\n\nconst baseLogger = createLogger({\n levels: LOGGING_LEVEL_WEIGHTS,\n level: LogLevel.Verbose,\n format: format.combine(\n format.timestamp({ format: LOGGING_TIMESTAMP_FORMAT }),\n format.colorize({ all: true }),\n format.printf((info: unknown) => formatLogMessage(info as LoggerInfo))\n ),\n transports: [new transports.Console()],\n silent: false,\n});\n\nlet globalOptions: ResolvedLoggingOptions = {\n enabled: LOGGING_DEFAULT_ENABLED,\n levels: undefined,\n detail: undefined,\n};\n\nconst resolveEnabled = (enabled: boolean | undefined, hasOptions: boolean): boolean => {\n if (enabled !== undefined) {\n return enabled;\n }\n if (hasOptions) {\n return true;\n }\n return LOGGING_DEFAULT_ENABLED;\n};\n\nconst normalizeLevels = (levels?: LogLevel[]): LogLevel[] | undefined => {\n if (!levels || levels.length === 0) {\n return undefined;\n }\n const unique = Array.from(new Set(levels));\n return unique.length > 0 ? unique : undefined;\n};\n\nconst hasLevelsOption = (options?: LoggingOptions): boolean => {\n if (!options) {\n return false;\n }\n return Object.prototype.hasOwnProperty.call(options, LOGGING_LEVELS_KEY);\n};\n\nconst resolveLoggingOptions = (options?: LoggingOptions): ResolvedLoggingOptions => {\n const hasOptions = Boolean(options);\n const enabled = resolveEnabled(options?.enabled, hasOptions);\n if (!enabled) {\n return { enabled, levels: undefined, detail: undefined };\n }\n return {\n enabled,\n levels: normalizeLevels(options?.levels),\n detail: options?.detail,\n };\n};\n\nconst getDetailLevels = (\n detail: LoggingDetailLevel | undefined\n): LogLevel[] | undefined => {\n if (!detail) {\n return undefined;\n }\n return LOGGING_DETAIL_LEVELS[detail];\n};\n\nconst shouldLog = (level: LogLevel, options: ResolvedLoggingOptions): boolean => {\n if (!options.enabled) {\n return false;\n }\n const detailLevels = getDetailLevels(options.detail);\n const hasDetailFilter = detailLevels && detailLevels.length > 0;\n const hasLevelFilter = options.levels && options.levels.length > 0;\n if (!hasDetailFilter && !hasLevelFilter) {\n return true;\n }\n if (hasDetailFilter && !detailLevels!.includes(level)) {\n return false;\n }\n if (hasLevelFilter && !options.levels!.includes(level)) {\n return false;\n }\n return true;\n};\n\nconst mergeOptions = (local?: LoggingOptions): ResolvedLoggingOptions => {\n if (!local) {\n return globalOptions;\n }\n const resolvedLocal = resolveLoggingOptions(local);\n const hasLocalLevels = hasLevelsOption(local);\n const hasLocalDetail = Object.prototype.hasOwnProperty.call(\n local,\n LOGGING_DETAIL_KEY\n );\n const ignoreGlobalLevels = hasLocalDetail && !hasLocalLevels;\n return {\n enabled: resolvedLocal.enabled,\n levels: hasLocalLevels\n ? resolvedLocal.levels\n : ignoreGlobalLevels\n ? undefined\n : globalOptions.levels,\n detail: hasLocalDetail ? resolvedLocal.detail : globalOptions.detail,\n };\n};\n\nconst normalizeDetails = (input: LogDetailsInput[]): LogDetail[] => {\n return input.flatMap((entry) => {\n if (Array.isArray(entry)) {\n return entry;\n }\n return [entry];\n });\n};\n\nconst logWithDetails = (\n level: LogLevel,\n scope: string,\n message: string,\n details: LogDetail[],\n options: ResolvedLoggingOptions\n): void => {\n if (!shouldLog(level, options)) {\n return;\n }\n const formattedDetails = formatDetails(details);\n const logPayload: LoggerPayload = {\n level,\n message,\n [LOG_FIELD_LABEL]: scope,\n };\n if (formattedDetails) {\n logPayload[LOG_FIELD_DETAILS] = formattedDetails;\n }\n baseLogger.log(logPayload);\n};\n\nexport const configureLogging = (options?: LoggingOptions): ResolvedLoggingOptions => {\n globalOptions = resolveLoggingOptions(options);\n return globalOptions;\n};\n\nexport class LoggerTimer {\n private readonly start = performance.now();\n private lastMark = this.start;\n private finished = false;\n\n constructor(\n private readonly label: string,\n private readonly emit: TimerEmitter\n ) {}\n\n public mark(message: string, level: LogLevel = LogLevel.Debug, ...details: LogDetailsInput[]): void {\n if (this.finished) {\n return;\n }\n const now = performance.now();\n const totalElapsed = now - this.start;\n const segmentElapsed = now - this.lastMark;\n this.lastMark = now;\n const timerDetails: LogDetail[] = [\n `${this.label} total ${formatDurationText(totalElapsed)}`,\n ];\n if (segmentElapsed > 0 && segmentElapsed !== totalElapsed) {\n timerDetails.push(`segment ${formatDurationText(segmentElapsed)}`);\n }\n const normalized = normalizeDetails(details);\n this.emit(level, message, [...timerDetails, ...normalized]);\n }\n\n public end(\n message?: string,\n level: LogLevel = LogLevel.Info,\n ...details: LogDetailsInput[]\n ): void {\n if (this.finished) {\n return;\n }\n const totalElapsed = performance.now() - this.start;\n const normalized = normalizeDetails(details);\n const timerDetails: LogDetail[] = [`${this.label} total ${formatDurationText(totalElapsed)}`];\n this.emit(level, message ?? `${this.label} completed`, [...timerDetails, ...normalized]);\n this.finished = true;\n }\n}\n\nexport class ScopedLogger {\n constructor(private readonly scope: string, private readonly localOptions?: LoggingOptions) {}\n\n public error(message: string, ...details: LogDetailsInput[]): void {\n this.write(LogLevel.Error, message, details);\n }\n\n public warn(message: string, ...details: LogDetailsInput[]): void {\n this.write(LogLevel.Warn, message, details);\n }\n\n public log(message: string, ...details: LogDetailsInput[]): void {\n this.write(LogLevel.Log, message, details);\n }\n\n public info(message: string, ...details: LogDetailsInput[]): void {\n this.write(LogLevel.Info, message, details);\n }\n\n public debug(message: string, ...details: LogDetailsInput[]): void {\n this.write(LogLevel.Debug, message, details);\n }\n\n public verbose(message: string, ...details: LogDetailsInput[]): void {\n this.write(LogLevel.Verbose, message, details);\n }\n\n public timer(label: string): LoggerTimer {\n return new LoggerTimer(label, (level, message, details) => {\n this.write(level, message, details);\n });\n }\n\n public formatDuration(durationMs: number): string {\n return formatDurationText(durationMs);\n }\n\n private write(level: LogLevel, message: string, details: LogDetailsInput[]): void {\n const normalized = normalizeDetails(details);\n logWithDetails(level, this.scope, message, normalized, mergeOptions(this.localOptions));\n }\n}\n\nexport const createScopedLogger = (scope: string, options?: LoggingOptions): ScopedLogger =>\n new ScopedLogger(scope, options);\n\nexport const getLoggingOptions = (): ResolvedLoggingOptions => ({\n ...globalOptions,\n levels: globalOptions.levels ? [...globalOptions.levels] : undefined,\n});\n"],"names":["LoggerTimer","ScopedLogger","configureLogging","createScopedLogger","getLoggingOptions","LOG_FIELD_LABEL","LOG_FIELD_MESSAGE","LOG_FIELD_LEVEL","LOG_FIELD_TIMESTAMP","LOG_FIELD_DETAILS","ANSI_ESCAPE_PATTERN","DETAIL_SEPARATOR","DETAIL_PREFIX","MILLISECONDS_IN_SECOND","SECONDS_IN_MINUTE","MINUTES_IN_HOUR","MILLISECONDS_IN_MINUTE","MILLISECONDS_IN_HOUR","DECIMAL_PRECISION_SHORT","DECIMAL_PRECISION_LONG","LOGGING_LEVELS_KEY","LOGGING_DETAIL_KEY","formatDetailValue","detail","undefined","Date","toISOString","Error","message","String","trimDecimals","value","Number","isInteger","toString","formatSeconds","seconds","precision","rounded","toFixed","formatDurationText","durationMs","segments","hours","Math","floor","remaining","minutes","wholeSeconds","leftoverMs","round","push","length","join","extractLevel","info","levelText","level","normalized","replace","toLowerCase","LOGGING_LEVEL_WEIGHTS","formatDetails","details","formatted","map","filter","Boolean","formatLogMessage","label","timestamp","fallbackLevel","toUpperCase","levelLabel","LOGGING_LEVEL_LABELS","levelIcon","LOGGING_LEVEL_ICONS","detailText","formattedDetails","timestampText","addColors","LOGGING_COLORS","baseLogger","createLogger","levels","LogLevel","Verbose","format","combine","LOGGING_TIMESTAMP_FORMAT","colorize","all","printf","transports","Console","silent","globalOptions","enabled","LOGGING_DEFAULT_ENABLED","resolveEnabled","hasOptions","normalizeLevels","unique","Array","from","Set","hasLevelsOption","options","Object","prototype","hasOwnProperty","call","resolveLoggingOptions","getDetailLevels","LOGGING_DETAIL_LEVELS","shouldLog","detailLevels","hasDetailFilter","hasLevelFilter","includes","mergeOptions","local","resolvedLocal","hasLocalLevels","hasLocalDetail","ignoreGlobalLevels","normalizeDetails","input","flatMap","entry","isArray","logWithDetails","scope","logPayload","log","mark","Debug","finished","now","performance","totalElapsed","start","segmentElapsed","lastMark","timerDetails","emit","end","Info","error","write","warn","Warn","Log","debug","verbose","timer","formatDuration","localOptions"],"mappings":"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"}