UNPKG

7.1 kBJavaScriptView Raw
1"use strict";
2var ConsoleLogger_1;
3Object.defineProperty(exports, "__esModule", { value: true });
4exports.ConsoleLogger = void 0;
5const tslib_1 = require("tslib");
6const injectable_decorator_1 = require("../decorators/core/injectable.decorator");
7const optional_decorator_1 = require("../decorators/core/optional.decorator");
8const cli_colors_util_1 = require("../utils/cli-colors.util");
9const shared_utils_1 = require("../utils/shared.utils");
10const utils_1 = require("./utils");
11const DEFAULT_LOG_LEVELS = [
12 'log',
13 'error',
14 'warn',
15 'debug',
16 'verbose',
17];
18let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger {
19 constructor(context, options = {}) {
20 this.context = context;
21 this.options = options;
22 if (!options.logLevels) {
23 options.logLevels = DEFAULT_LOG_LEVELS;
24 }
25 if (context) {
26 this.originalContext = context;
27 }
28 }
29 log(message, ...optionalParams) {
30 if (!this.isLevelEnabled('log')) {
31 return;
32 }
33 const { messages, context } = this.getContextAndMessagesToPrint([
34 message,
35 ...optionalParams,
36 ]);
37 this.printMessages(messages, context, 'log');
38 }
39 error(message, ...optionalParams) {
40 if (!this.isLevelEnabled('error')) {
41 return;
42 }
43 const { messages, context, stack } = this.getContextAndStackAndMessagesToPrint([message, ...optionalParams]);
44 this.printMessages(messages, context, 'error', 'stderr');
45 this.printStackTrace(stack);
46 }
47 warn(message, ...optionalParams) {
48 if (!this.isLevelEnabled('warn')) {
49 return;
50 }
51 const { messages, context } = this.getContextAndMessagesToPrint([
52 message,
53 ...optionalParams,
54 ]);
55 this.printMessages(messages, context, 'warn');
56 }
57 debug(message, ...optionalParams) {
58 if (!this.isLevelEnabled('debug')) {
59 return;
60 }
61 const { messages, context } = this.getContextAndMessagesToPrint([
62 message,
63 ...optionalParams,
64 ]);
65 this.printMessages(messages, context, 'debug');
66 }
67 verbose(message, ...optionalParams) {
68 if (!this.isLevelEnabled('verbose')) {
69 return;
70 }
71 const { messages, context } = this.getContextAndMessagesToPrint([
72 message,
73 ...optionalParams,
74 ]);
75 this.printMessages(messages, context, 'verbose');
76 }
77 /**
78 * Set log levels
79 * @param levels log levels
80 */
81 setLogLevels(levels) {
82 if (!this.options) {
83 this.options = {};
84 }
85 this.options.logLevels = levels;
86 }
87 /**
88 * Set logger context
89 * @param context context
90 */
91 setContext(context) {
92 this.context = context;
93 }
94 /**
95 * Resets the logger context to the value that was passed in the constructor.
96 */
97 resetContext() {
98 this.context = this.originalContext;
99 }
100 isLevelEnabled(level) {
101 var _a;
102 const logLevels = (_a = this.options) === null || _a === void 0 ? void 0 : _a.logLevels;
103 return utils_1.isLogLevelEnabled(level, logLevels);
104 }
105 getTimestamp() {
106 const localeStringOptions = {
107 year: 'numeric',
108 hour: 'numeric',
109 minute: 'numeric',
110 second: 'numeric',
111 day: '2-digit',
112 month: '2-digit',
113 };
114 return new Date(Date.now()).toLocaleString(undefined, localeStringOptions);
115 }
116 printMessages(messages, context = '', logLevel = 'log', writeStreamType) {
117 const color = this.getColorByLogLevel(logLevel);
118 messages.forEach(message => {
119 const output = shared_utils_1.isPlainObject(message)
120 ? `${color('Object:')}\n${JSON.stringify(message, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)}\n`
121 : color(message);
122 const pidMessage = color(`[Nest] ${process.pid} - `);
123 const contextMessage = context ? cli_colors_util_1.yellow(`[${context}] `) : '';
124 const timestampDiff = this.updateAndGetTimestampDiff();
125 const formattedLogLevel = color(logLevel.toUpperCase().padStart(7, ' '));
126 const computedMessage = `${pidMessage}${this.getTimestamp()} ${formattedLogLevel} ${contextMessage}${output}${timestampDiff}\n`;
127 process[writeStreamType !== null && writeStreamType !== void 0 ? writeStreamType : 'stdout'].write(computedMessage);
128 });
129 }
130 printStackTrace(stack) {
131 if (!stack) {
132 return;
133 }
134 process.stderr.write(`${stack}\n`);
135 }
136 updateAndGetTimestampDiff() {
137 var _a;
138 const includeTimestamp = ConsoleLogger_1.lastTimestampAt && ((_a = this.options) === null || _a === void 0 ? void 0 : _a.timestamp);
139 const result = includeTimestamp
140 ? cli_colors_util_1.yellow(` +${Date.now() - ConsoleLogger_1.lastTimestampAt}ms`)
141 : '';
142 ConsoleLogger_1.lastTimestampAt = Date.now();
143 return result;
144 }
145 getContextAndMessagesToPrint(args) {
146 if ((args === null || args === void 0 ? void 0 : args.length) <= 1) {
147 return { messages: args, context: this.context };
148 }
149 const lastElement = args[args.length - 1];
150 const isContext = typeof lastElement === 'string';
151 if (!isContext) {
152 return { messages: args, context: this.context };
153 }
154 return {
155 context: lastElement,
156 messages: args.slice(0, args.length - 1),
157 };
158 }
159 getContextAndStackAndMessagesToPrint(args) {
160 const { messages, context } = this.getContextAndMessagesToPrint(args);
161 if ((messages === null || messages === void 0 ? void 0 : messages.length) <= 1) {
162 return { messages, context };
163 }
164 const lastElement = messages[messages.length - 1];
165 const isStack = typeof lastElement === 'string';
166 if (!isStack) {
167 return { messages, context };
168 }
169 return {
170 stack: lastElement,
171 messages: messages.slice(0, messages.length - 1),
172 context,
173 };
174 }
175 getColorByLogLevel(level) {
176 switch (level) {
177 case 'debug':
178 return cli_colors_util_1.clc.magentaBright;
179 case 'warn':
180 return cli_colors_util_1.clc.yellow;
181 case 'error':
182 return cli_colors_util_1.clc.red;
183 case 'verbose':
184 return cli_colors_util_1.clc.cyanBright;
185 default:
186 return cli_colors_util_1.clc.green;
187 }
188 }
189};
190ConsoleLogger = ConsoleLogger_1 = tslib_1.__decorate([
191 injectable_decorator_1.Injectable(),
192 tslib_1.__param(0, optional_decorator_1.Optional()),
193 tslib_1.__param(1, optional_decorator_1.Optional()),
194 tslib_1.__metadata("design:paramtypes", [String, Object])
195], ConsoleLogger);
196exports.ConsoleLogger = ConsoleLogger;