@cichol/logger 4.4.2 → 4.5.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/dists/classes/logger.d.ts +32 -0
- package/dists/formatters/command-line.d.ts +2 -0
- package/dists/formatters/morgan.d.ts +7 -0
- package/dists/handlers/debug.d.ts +5 -0
- package/dists/handlers/error.d.ts +13 -0
- package/dists/handlers/fatal.d.ts +4 -0
- package/dists/handlers/http.d.ts +5 -0
- package/dists/handlers/index.d.ts +12 -0
- package/dists/handlers/info.d.ts +5 -0
- package/dists/handlers/notice.d.ts +5 -0
- package/dists/handlers/query.d.ts +13 -0
- package/dists/handlers/verbose.d.ts +5 -0
- package/dists/handlers/warning.d.ts +5 -0
- package/dists/helpers/color-scheme.d.ts +12 -0
- package/dists/helpers/constants.d.ts +18 -0
- package/dists/helpers/label-decorator.d.ts +2 -0
- package/dists/helpers/logging-level.d.ts +13 -0
- package/dists/index.cjs +543 -0
- package/dists/index.d.ts +1 -0
- package/dists/index.js +523 -0
- package/package.json +18 -11
- package/releases/cjs.js +0 -543
- package/releases/esm.js +0 -523
- /package/{types/classes/logger.d.ts → dists/classes/logger.d.cts} +0 -0
- /package/{types/formatters/command-line.d.ts → dists/formatters/command-line.d.cts} +0 -0
- /package/{types/formatters/morgan.d.ts → dists/formatters/morgan.d.cts} +0 -0
- /package/{types/handlers/debug.d.ts → dists/handlers/debug.d.cts} +0 -0
- /package/{types/handlers/error.d.ts → dists/handlers/error.d.cts} +0 -0
- /package/{types/handlers/fatal.d.ts → dists/handlers/fatal.d.cts} +0 -0
- /package/{types/handlers/http.d.ts → dists/handlers/http.d.cts} +0 -0
- /package/{types/handlers/index.d.ts → dists/handlers/index.d.cts} +0 -0
- /package/{types/handlers/info.d.ts → dists/handlers/info.d.cts} +0 -0
- /package/{types/handlers/notice.d.ts → dists/handlers/notice.d.cts} +0 -0
- /package/{types/handlers/query.d.ts → dists/handlers/query.d.cts} +0 -0
- /package/{types/handlers/verbose.d.ts → dists/handlers/verbose.d.cts} +0 -0
- /package/{types/handlers/warning.d.ts → dists/handlers/warning.d.cts} +0 -0
- /package/{types/helpers/color-scheme.d.ts → dists/helpers/color-scheme.d.cts} +0 -0
- /package/{types/helpers/constants.d.ts → dists/helpers/constants.d.cts} +0 -0
- /package/{types/helpers/label-decorator.d.ts → dists/helpers/label-decorator.d.cts} +0 -0
- /package/{types/helpers/logging-level.d.ts → dists/helpers/logging-level.d.cts} +0 -0
- /package/{types/index.d.ts → dists/index.d.cts} +0 -0
package/dists/index.js
ADDED
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import _Symbol from 'core-js-pure/stable/symbol/index.js';
|
|
2
|
+
import _filterInstanceProperty from 'core-js-pure/stable/instance/filter.js';
|
|
3
|
+
import _mapInstanceProperty from 'core-js-pure/stable/instance/map.js';
|
|
4
|
+
import _trimInstanceProperty from 'core-js-pure/stable/instance/trim.js';
|
|
5
|
+
import 'reflect-metadata';
|
|
6
|
+
import { STATUS_CODES, IncomingMessage, ServerResponse } from 'http';
|
|
7
|
+
import { PassThrough } from 'stream';
|
|
8
|
+
import Promise$1 from 'bluebird';
|
|
9
|
+
import lodash from 'lodash';
|
|
10
|
+
import morgan from 'morgan';
|
|
11
|
+
import * as winston from 'winston';
|
|
12
|
+
import { format } from 'winston';
|
|
13
|
+
import _findInstanceProperty from 'core-js-pure/stable/instance/find.js';
|
|
14
|
+
import _Reflect$apply from 'core-js-pure/stable/reflect/apply.js';
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import rTracer from 'cls-rtracer';
|
|
17
|
+
import { DateTime } from 'luxon';
|
|
18
|
+
import _Map from 'core-js-pure/stable/map/index.js';
|
|
19
|
+
import process, { version, env } from 'process';
|
|
20
|
+
import _Symbol$for from 'core-js-pure/stable/symbol/for.js';
|
|
21
|
+
import _startsWithInstanceProperty from 'core-js-pure/stable/instance/starts-with.js';
|
|
22
|
+
import _sliceInstanceProperty from 'core-js-pure/stable/instance/slice.js';
|
|
23
|
+
import path from 'path';
|
|
24
|
+
import highlight from 'cli-highlight';
|
|
25
|
+
import prettyBytes from 'pretty-bytes';
|
|
26
|
+
import prettyMs from 'pretty-ms';
|
|
27
|
+
import cluster from 'cluster';
|
|
28
|
+
import 'worker_threads';
|
|
29
|
+
|
|
30
|
+
const LoggingLevel = {
|
|
31
|
+
// Critical levels. (It will crash the process)
|
|
32
|
+
Fatal: 0,
|
|
33
|
+
Error: 1,
|
|
34
|
+
// Warning levels. (It just report warning information, not crash the process)
|
|
35
|
+
Warning: 2,
|
|
36
|
+
// Regular level and aliases.
|
|
37
|
+
Notice: 3,
|
|
38
|
+
Info: 3,
|
|
39
|
+
// Maybe sensitive levels. (In general, does not useful)
|
|
40
|
+
Http: 4,
|
|
41
|
+
Query: 4,
|
|
42
|
+
// Loud levels.
|
|
43
|
+
Verbose: 5,
|
|
44
|
+
Debug: 5
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Constants.
|
|
48
|
+
const colorizerMap = new _Map();
|
|
49
|
+
|
|
50
|
+
// Helpers.
|
|
51
|
+
function createScheme(options) {
|
|
52
|
+
const nextIndex = colorizerMap.size;
|
|
53
|
+
const colorizer = chalk.bgHex(options.background).hex(options.foreground);
|
|
54
|
+
colorizerMap.set(nextIndex, colorizer);
|
|
55
|
+
return nextIndex;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Color definitions.
|
|
59
|
+
const ColorValue = {
|
|
60
|
+
// Basic colors.
|
|
61
|
+
White: '#FFFFFF',
|
|
62
|
+
Gray: '#808080',
|
|
63
|
+
Black: '#000000',
|
|
64
|
+
// Specialized colors.
|
|
65
|
+
Critical: '#D63031',
|
|
66
|
+
Warning: '#FDCB6E',
|
|
67
|
+
Regular: '#0984E3',
|
|
68
|
+
Http: '#6AB04C',
|
|
69
|
+
Query: '#399AF3'
|
|
70
|
+
};
|
|
71
|
+
const ColorScheme = {
|
|
72
|
+
Critical: createScheme({
|
|
73
|
+
background: ColorValue.Critical,
|
|
74
|
+
foreground: ColorValue.Black
|
|
75
|
+
}),
|
|
76
|
+
Warning: createScheme({
|
|
77
|
+
background: ColorValue.Warning,
|
|
78
|
+
foreground: ColorValue.Black
|
|
79
|
+
}),
|
|
80
|
+
Regular: createScheme({
|
|
81
|
+
background: ColorValue.Regular,
|
|
82
|
+
foreground: ColorValue.White
|
|
83
|
+
}),
|
|
84
|
+
Http: createScheme({
|
|
85
|
+
background: ColorValue.Http,
|
|
86
|
+
foreground: ColorValue.Black
|
|
87
|
+
}),
|
|
88
|
+
Query: createScheme({
|
|
89
|
+
background: ColorValue.Query,
|
|
90
|
+
foreground: ColorValue.Black
|
|
91
|
+
}),
|
|
92
|
+
Loud: createScheme({
|
|
93
|
+
background: ColorValue.Black,
|
|
94
|
+
foreground: ColorValue.Gray
|
|
95
|
+
})
|
|
96
|
+
};
|
|
97
|
+
function getChalkOf(colorSet) {
|
|
98
|
+
return colorizerMap.get(colorSet) ?? chalk;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* eslint-enable no-use-before-define */
|
|
102
|
+
|
|
103
|
+
// Node.js built-in APIs.
|
|
104
|
+
|
|
105
|
+
// Constants.
|
|
106
|
+
const {
|
|
107
|
+
isTTY
|
|
108
|
+
} = process.stdout;
|
|
109
|
+
const isNotOnCLI = !isTTY;
|
|
110
|
+
function decorateLabel(label, scheme) {
|
|
111
|
+
if (isNotOnCLI) {
|
|
112
|
+
return label;
|
|
113
|
+
}
|
|
114
|
+
const chalk = getChalkOf(scheme);
|
|
115
|
+
const decoratedLabel = chalk.bold(` ${label} `);
|
|
116
|
+
return decoratedLabel;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Type definitions.
|
|
120
|
+
|
|
121
|
+
// Constants.
|
|
122
|
+
const rootPath = process.cwd();
|
|
123
|
+
const conjunction = ` ${chalk.blue('──')} `;
|
|
124
|
+
const splat = _Symbol$for('splat');
|
|
125
|
+
|
|
126
|
+
// Handler metadata.
|
|
127
|
+
const name$8 = 'error';
|
|
128
|
+
const level$8 = LoggingLevel.Error;
|
|
129
|
+
const label$8 = decorateLabel('ERROR', ColorScheme.Critical);
|
|
130
|
+
function mapLocationOfErrorThrown(filename) {
|
|
131
|
+
let target = path.relative(rootPath, filename);
|
|
132
|
+
if (_startsWithInstanceProperty(target).call(target, 'node_modules')) {
|
|
133
|
+
target = chalk.gray(target).replace(/node_modules[\\/]([^\\/]+)(.*)/, (matches, moduleName, trailing) => `node_modules${path.sep}${chalk.bold.underline(moduleName)}${chalk.gray(trailing)}` // eslint-disable-line max-len
|
|
134
|
+
);
|
|
135
|
+
} else {
|
|
136
|
+
target = `${chalk.gray(path.dirname(target) + path.sep)}${chalk.bold.underline(path.basename(target))}`;
|
|
137
|
+
}
|
|
138
|
+
return target;
|
|
139
|
+
}
|
|
140
|
+
function handle$1(data) {
|
|
141
|
+
var _context, _context2, _context3;
|
|
142
|
+
const {
|
|
143
|
+
[splat]: [error] = []
|
|
144
|
+
} = data;
|
|
145
|
+
if (!(error instanceof Error)) {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
const {
|
|
149
|
+
name,
|
|
150
|
+
message,
|
|
151
|
+
stack: rawStack = ''
|
|
152
|
+
} = error;
|
|
153
|
+
const stack = _mapInstanceProperty(_context = _mapInstanceProperty(_context2 = _mapInstanceProperty(_context3 = _sliceInstanceProperty(rawStack).call(rawStack, name.length + message.length + 3).split('\n')).call(_context3, line => line.replace(/^\s+at /g, ''))).call(_context2, line => path.isAbsolute(line) ? `<anonymous>${conjunction}${mapLocationOfErrorThrown(line)}` : line)).call(_context, line => line.replace(/^(.+) \((.+)\)$/, (matches, contextName, rawLocation) => {
|
|
154
|
+
let location;
|
|
155
|
+
if (rawLocation === '<anonymous>') {
|
|
156
|
+
location = chalk.gray(rawLocation);
|
|
157
|
+
} else {
|
|
158
|
+
const [filename, line, column] = rawLocation.split(':');
|
|
159
|
+
if (path.isAbsolute(filename)) {
|
|
160
|
+
const target = mapLocationOfErrorThrown(path.relative(rootPath, filename));
|
|
161
|
+
const trailing = chalk.gray(`:${line}:${column}`);
|
|
162
|
+
location = target + trailing;
|
|
163
|
+
} else {
|
|
164
|
+
location = chalk.gray(`https://github.com/${chalk.bold.underline('nodejs')}/node/blob/${version}/lib/${filename}#L${line}`); // eslint-disable-line max-len
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return `${contextName}${conjunction}${location}`;
|
|
168
|
+
})).join('\n');
|
|
169
|
+
const label = decorateLabel(name, ColorScheme.Critical);
|
|
170
|
+
const payload = `${message}\n\n${stack}\n`;
|
|
171
|
+
return {
|
|
172
|
+
label,
|
|
173
|
+
payload
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
var ErrorHandler = /*#__PURE__*/Object.freeze({
|
|
178
|
+
__proto__: null,
|
|
179
|
+
default: handle$1,
|
|
180
|
+
label: label$8,
|
|
181
|
+
level: level$8,
|
|
182
|
+
name: name$8
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Local helpers.
|
|
186
|
+
|
|
187
|
+
// Handler metadata.
|
|
188
|
+
const name$7 = 'fatal';
|
|
189
|
+
const level$7 = LoggingLevel.Fatal;
|
|
190
|
+
const label$7 = decorateLabel('FATAL', ColorScheme.Critical);
|
|
191
|
+
|
|
192
|
+
var FatalHandler = /*#__PURE__*/Object.freeze({
|
|
193
|
+
__proto__: null,
|
|
194
|
+
default: handle$1,
|
|
195
|
+
label: label$7,
|
|
196
|
+
level: level$7,
|
|
197
|
+
name: name$7
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// Local helpers.
|
|
201
|
+
|
|
202
|
+
// Handler metadata.
|
|
203
|
+
const name$6 = 'warning';
|
|
204
|
+
const level$6 = LoggingLevel.Warning;
|
|
205
|
+
const label$6 = decorateLabel('WARNING', ColorScheme.Warning);
|
|
206
|
+
var warning = null;
|
|
207
|
+
|
|
208
|
+
var WarningHandler = /*#__PURE__*/Object.freeze({
|
|
209
|
+
__proto__: null,
|
|
210
|
+
default: warning,
|
|
211
|
+
label: label$6,
|
|
212
|
+
level: level$6,
|
|
213
|
+
name: name$6
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// Local helpers.
|
|
217
|
+
|
|
218
|
+
// Handler metadata.
|
|
219
|
+
const name$5 = 'notice';
|
|
220
|
+
const level$5 = LoggingLevel.Notice;
|
|
221
|
+
const label$5 = decorateLabel('NOTICE', ColorScheme.Regular);
|
|
222
|
+
var notice = null;
|
|
223
|
+
|
|
224
|
+
var NoticeHandler = /*#__PURE__*/Object.freeze({
|
|
225
|
+
__proto__: null,
|
|
226
|
+
default: notice,
|
|
227
|
+
label: label$5,
|
|
228
|
+
level: level$5,
|
|
229
|
+
name: name$5
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
// Local helpers.
|
|
233
|
+
|
|
234
|
+
// Handler metadata.
|
|
235
|
+
const name$4 = 'info';
|
|
236
|
+
const level$4 = LoggingLevel.Info;
|
|
237
|
+
const label$4 = decorateLabel('INFO', ColorScheme.Regular);
|
|
238
|
+
var info = null;
|
|
239
|
+
|
|
240
|
+
var InfoHandler = /*#__PURE__*/Object.freeze({
|
|
241
|
+
__proto__: null,
|
|
242
|
+
default: info,
|
|
243
|
+
label: label$4,
|
|
244
|
+
level: level$4,
|
|
245
|
+
name: name$4
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// Local helpers.
|
|
249
|
+
|
|
250
|
+
// Handler metadata.
|
|
251
|
+
const name$3 = 'http';
|
|
252
|
+
const level$3 = LoggingLevel.Http;
|
|
253
|
+
const label$3 = decorateLabel('HTTP', ColorScheme.Http);
|
|
254
|
+
var http = null;
|
|
255
|
+
|
|
256
|
+
var HttpHandler = /*#__PURE__*/Object.freeze({
|
|
257
|
+
__proto__: null,
|
|
258
|
+
default: http,
|
|
259
|
+
label: label$3,
|
|
260
|
+
level: level$3,
|
|
261
|
+
name: name$3
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Highlight.js
|
|
265
|
+
|
|
266
|
+
// Type definitions.
|
|
267
|
+
|
|
268
|
+
// Handler metadata.
|
|
269
|
+
const name$2 = 'query';
|
|
270
|
+
const level$2 = LoggingLevel.Query;
|
|
271
|
+
const label$2 = decorateLabel('QUERY', ColorScheme.Query);
|
|
272
|
+
function handle(data) {
|
|
273
|
+
const payload = highlight(data.message, {
|
|
274
|
+
language: 'sql'
|
|
275
|
+
});
|
|
276
|
+
return {
|
|
277
|
+
label: label$2,
|
|
278
|
+
payload
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
var QueryHandler = /*#__PURE__*/Object.freeze({
|
|
283
|
+
__proto__: null,
|
|
284
|
+
default: handle,
|
|
285
|
+
label: label$2,
|
|
286
|
+
level: level$2,
|
|
287
|
+
name: name$2
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// Local helpers.
|
|
291
|
+
|
|
292
|
+
// Handler metadata.
|
|
293
|
+
const name$1 = 'verbose';
|
|
294
|
+
const level$1 = LoggingLevel.Verbose;
|
|
295
|
+
const label$1 = decorateLabel('VERBOSE', ColorScheme.Loud);
|
|
296
|
+
var verbose = null;
|
|
297
|
+
|
|
298
|
+
var VerboseHandler = /*#__PURE__*/Object.freeze({
|
|
299
|
+
__proto__: null,
|
|
300
|
+
default: verbose,
|
|
301
|
+
label: label$1,
|
|
302
|
+
level: level$1,
|
|
303
|
+
name: name$1
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
// Local helpers.
|
|
307
|
+
|
|
308
|
+
// Handler metadata.
|
|
309
|
+
const name = 'debug';
|
|
310
|
+
const level = LoggingLevel.Debug;
|
|
311
|
+
const label = decorateLabel('DEBUG', ColorScheme.Loud);
|
|
312
|
+
var debug = null;
|
|
313
|
+
|
|
314
|
+
var DebugHandler = /*#__PURE__*/Object.freeze({
|
|
315
|
+
__proto__: null,
|
|
316
|
+
default: debug,
|
|
317
|
+
label: label,
|
|
318
|
+
level: level,
|
|
319
|
+
name: name
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// Handler implementations.
|
|
323
|
+
const handlers = [FatalHandler, ErrorHandler, WarningHandler, NoticeHandler, InfoHandler, HttpHandler, QueryHandler, VerboseHandler, DebugHandler];
|
|
324
|
+
|
|
325
|
+
var formatForCLI = format.printf(data => {
|
|
326
|
+
const timestamp = chalk.gray(DateTime.now().toISO({
|
|
327
|
+
includeOffset: true
|
|
328
|
+
}));
|
|
329
|
+
const handler = _findInstanceProperty(handlers).call(handlers, ({
|
|
330
|
+
name
|
|
331
|
+
}) => name === data.level);
|
|
332
|
+
const fallback = {
|
|
333
|
+
label: handler?.label,
|
|
334
|
+
payload: data.message
|
|
335
|
+
};
|
|
336
|
+
const performHandle = handler?.default ?? (() => fallback);
|
|
337
|
+
|
|
338
|
+
// Execute handler and then, get decorated payload.
|
|
339
|
+
const {
|
|
340
|
+
label,
|
|
341
|
+
payload
|
|
342
|
+
} = _Reflect$apply(performHandle, undefined, [data]) ?? fallback;
|
|
343
|
+
let extraFingerprint;
|
|
344
|
+
if (handler?.level === LoggingLevel.Http) {
|
|
345
|
+
extraFingerprint = data.transactionId ? `(Transaction-ID = ${data.transactionId})` : `(Request-ID = ${rTracer.id()})`;
|
|
346
|
+
}
|
|
347
|
+
return `${label} ${timestamp}${extraFingerprint ? ` ${extraFingerprint}` : ''}\n${payload}`;
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// Node.js built-in APIs.
|
|
351
|
+
|
|
352
|
+
// Type definitions.
|
|
353
|
+
const ExecutionMode = {
|
|
354
|
+
DevelopmentMode: 'development',
|
|
355
|
+
ProductionMode: 'production'
|
|
356
|
+
};
|
|
357
|
+
const ClusteringMode = {
|
|
358
|
+
MasterProcess: 0,
|
|
359
|
+
WorkerProcess: 1
|
|
360
|
+
};
|
|
361
|
+
// Exportings.
|
|
362
|
+
const executionMode = env.NODE_ENV ?? ExecutionMode.DevelopmentMode;
|
|
363
|
+
cluster.isPrimary ?? cluster.isMaster ? ClusteringMode.MasterProcess : ClusteringMode.WorkerProcess;
|
|
364
|
+
|
|
365
|
+
// Node.js built-in APIs.
|
|
366
|
+
|
|
367
|
+
// Type definitions.
|
|
368
|
+
|
|
369
|
+
// Helpers.
|
|
370
|
+
function decorateStatusCode(statusCode) {
|
|
371
|
+
const groupOfCode = Math.floor(Number(statusCode) / 100) * 100;
|
|
372
|
+
const baseMessage = `${statusCode} ${STATUS_CODES[statusCode]}`;
|
|
373
|
+
switch (groupOfCode) {
|
|
374
|
+
case 200:
|
|
375
|
+
{
|
|
376
|
+
return chalk.green(baseMessage);
|
|
377
|
+
}
|
|
378
|
+
case 300:
|
|
379
|
+
{
|
|
380
|
+
return chalk.magenta(baseMessage);
|
|
381
|
+
}
|
|
382
|
+
case 400:
|
|
383
|
+
case 500:
|
|
384
|
+
{
|
|
385
|
+
return chalk.red(baseMessage);
|
|
386
|
+
}
|
|
387
|
+
default:
|
|
388
|
+
{
|
|
389
|
+
return chalk.gray(baseMessage);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
function formatForMorgan(tokens, request, response) {
|
|
394
|
+
function _(token, ...subArgs) {
|
|
395
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
396
|
+
return tokens[token](request, response, ...subArgs);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Raw values.
|
|
400
|
+
const method = _('method');
|
|
401
|
+
const URL = _('url');
|
|
402
|
+
const httpVersion = `HTTP/${_('http-version')}`;
|
|
403
|
+
const statusCode = Number(_('status'));
|
|
404
|
+
const contentLength = Number(_('res', 'content-length') ?? -1);
|
|
405
|
+
const responseTime = Number(_('response-time') ?? -1);
|
|
406
|
+
|
|
407
|
+
// Decorated values.
|
|
408
|
+
const $method = chalk.bold(method);
|
|
409
|
+
const $version = chalk.rgb(98, 177, 255)(httpVersion);
|
|
410
|
+
const $statusCode = decorateStatusCode(statusCode);
|
|
411
|
+
const $contentLength = contentLength >= 0 ? prettyBytes(contentLength) : '? B';
|
|
412
|
+
const $responseTime = responseTime >= 0 ? prettyMs(responseTime) : '';
|
|
413
|
+
|
|
414
|
+
// Additional information.
|
|
415
|
+
const metadata = `(${$contentLength}, ${$responseTime})`;
|
|
416
|
+
return [`→ ${$method} ${URL} ${$version}`, `← ${$version} ${$statusCode} ${metadata}`].join('\n');
|
|
417
|
+
}
|
|
418
|
+
var formatForMorgan$1 = executionMode === ExecutionMode.DevelopmentMode ? formatForMorgan : morgan.combined;
|
|
419
|
+
|
|
420
|
+
var _context, _context2;
|
|
421
|
+
|
|
422
|
+
// Type definitions.
|
|
423
|
+
|
|
424
|
+
// Transports.
|
|
425
|
+
const {
|
|
426
|
+
Console: ConsoleTransport
|
|
427
|
+
} = winston.transports;
|
|
428
|
+
|
|
429
|
+
// Keys in order to access private properties.
|
|
430
|
+
const KeyOfInstance = _Symbol('@cichol/logger::classes/logger::Instance');
|
|
431
|
+
const KeyOfPassport = _Symbol('@cichol/logger::classes/logger::Passport');
|
|
432
|
+
class Logger {
|
|
433
|
+
#logger = winston.createLogger({
|
|
434
|
+
levels: _filterInstanceProperty(_context = _mapInstanceProperty(_context2 = lodash(handlers)).call(_context2, ({
|
|
435
|
+
name,
|
|
436
|
+
level
|
|
437
|
+
}) => [name, level])).call(_context, ([, level]) => typeof level === 'number').fromPairs().value(),
|
|
438
|
+
level: executionMode === ExecutionMode.ProductionMode ? 'http' : 'verbose',
|
|
439
|
+
transports: [new ConsoleTransport({
|
|
440
|
+
format: formatForCLI
|
|
441
|
+
})],
|
|
442
|
+
exitOnError: false
|
|
443
|
+
});
|
|
444
|
+
#morgan = morgan(formatForMorgan$1, {
|
|
445
|
+
stream: new PassThrough({
|
|
446
|
+
objectMode: true
|
|
447
|
+
}).on('data', data => {
|
|
448
|
+
this.log('http', _trimInstanceProperty(data).call(data));
|
|
449
|
+
})
|
|
450
|
+
});
|
|
451
|
+
constructor(passport) {
|
|
452
|
+
if (passport !== KeyOfPassport) {
|
|
453
|
+
throw new ReferenceError('Logger class cannot be constructed in directly');
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
static get instance() {
|
|
457
|
+
if (this !== Logger) {
|
|
458
|
+
throw new ReferenceError('Logger class is not inheritable');
|
|
459
|
+
}
|
|
460
|
+
if (Reflect.hasOwnMetadata(KeyOfInstance, Logger)) {
|
|
461
|
+
return Reflect.getOwnMetadata(KeyOfInstance, Logger);
|
|
462
|
+
}
|
|
463
|
+
const instance = new Logger(KeyOfPassport);
|
|
464
|
+
try {
|
|
465
|
+
return instance;
|
|
466
|
+
} finally {
|
|
467
|
+
Reflect.defineMetadata(KeyOfInstance, instance, Logger);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Logging message with specific level.
|
|
473
|
+
*
|
|
474
|
+
* @param level
|
|
475
|
+
* @param message
|
|
476
|
+
* @param args Additional metadata.
|
|
477
|
+
*/
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Logging HTTP I/O.
|
|
481
|
+
*
|
|
482
|
+
* @param request Node.js built-in `IncomingMessage` instance from `http` module.
|
|
483
|
+
* @param response Node.js built-in `ServerResponse` instance from `http` module.
|
|
484
|
+
*/
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Logging errors in detail.
|
|
488
|
+
*
|
|
489
|
+
* @param error
|
|
490
|
+
*/
|
|
491
|
+
|
|
492
|
+
log(...args) {
|
|
493
|
+
const logger = this.#logger;
|
|
494
|
+
const morgan = this.#morgan;
|
|
495
|
+
switch (true) {
|
|
496
|
+
case args.length >= 2 && args[0] instanceof IncomingMessage && args[1] instanceof ServerResponse:
|
|
497
|
+
{
|
|
498
|
+
const [request, response] = args;
|
|
499
|
+
return Promise$1.fromCallback(callback => morgan(request, response, callback));
|
|
500
|
+
}
|
|
501
|
+
case args.length >= 1 && args[0] instanceof Error:
|
|
502
|
+
{
|
|
503
|
+
const [error, ...data] = args;
|
|
504
|
+
|
|
505
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
506
|
+
logger.log('error', error.message, error, ...data);
|
|
507
|
+
return undefined;
|
|
508
|
+
}
|
|
509
|
+
default:
|
|
510
|
+
{
|
|
511
|
+
const [level, message, ...data] = args;
|
|
512
|
+
|
|
513
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
514
|
+
logger.log(level, message, ...data);
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
var logger = Logger.instance;
|
|
521
|
+
|
|
522
|
+
export { logger as default };
|
|
523
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZXMvaGVscGVycy9sb2dnaW5nLWxldmVsLnRzIiwiLi4vc291cmNlcy9oZWxwZXJzL2NvbG9yLXNjaGVtZS50cyIsIi4uL3NvdXJjZXMvaGVscGVycy9sYWJlbC1kZWNvcmF0b3IudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL2Vycm9yLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9mYXRhbC50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvd2FybmluZy50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvbm90aWNlLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9pbmZvLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9odHRwLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9xdWVyeS50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvdmVyYm9zZS50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvZGVidWcudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL2luZGV4LnRzIiwiLi4vc291cmNlcy9mb3JtYXR0ZXJzL2NvbW1hbmQtbGluZS50cyIsIi4uL3NvdXJjZXMvaGVscGVycy9jb25zdGFudHMudHMiLCIuLi9zb3VyY2VzL2Zvcm1hdHRlcnMvbW9yZ2FuLnRzIiwiLi4vc291cmNlcy9jbGFzc2VzL2xvZ2dlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBMb2dnaW5nTGV2ZWwgPSB7XG4gICAgLy8gQ3JpdGljYWwgbGV2ZWxzLiAoSXQgd2lsbCBjcmFzaCB0aGUgcHJvY2VzcylcbiAgICBGYXRhbDogMCxcbiAgICBFcnJvcjogMSxcblxuICAgIC8vIFdhcm5pbmcgbGV2ZWxzLiAoSXQganVzdCByZXBvcnQgd2FybmluZyBpbmZvcm1hdGlvbiwgbm90IGNyYXNoIHRoZSBwcm9jZXNzKVxuICAgIFdhcm5pbmc6IDIsXG5cbiAgICAvLyBSZWd1bGFyIGxldmVsIGFuZCBhbGlhc2VzLlxuICAgIE5vdGljZTogMyxcbiAgICBJbmZvOiAzLFxuXG4gICAgLy8gTWF5YmUgc2Vuc2l0aXZlIGxldmVscy4gKEluIGdlbmVyYWwsIGRvZXMgbm90IHVzZWZ1bClcbiAgICBIdHRwOiA0LFxuICAgIFF1ZXJ5OiA0LFxuXG4gICAgLy8gTG91ZCBsZXZlbHMuXG4gICAgVmVyYm9zZTogNSxcbiAgICBEZWJ1ZzogNVxufSBhcyBjb25zdDtcblxudHlwZSBMb2dnaW5nTGV2ZWwgPSB0eXBlb2YgTG9nZ2luZ0xldmVsW2tleW9mIHR5cGVvZiBMb2dnaW5nTGV2ZWxdO1xuXG5leHBvcnQgZGVmYXVsdCBMb2dnaW5nTGV2ZWw7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuXG4vLyBUaGlyZC1wYXJ0eSBtb2R1bGVzLlxuaW1wb3J0IGNoYWxrLCB7IHR5cGUgQ2hhbGtJbnN0YW5jZSB9IGZyb20gJ2NoYWxrJztcblxuLy8gQ29uc3RhbnRzLlxuY29uc3QgY29sb3JpemVyTWFwID0gbmV3IE1hcDxudW1iZXIsIENoYWxrSW5zdGFuY2U+KCk7XG5cbi8vIEhlbHBlcnMuXG5mdW5jdGlvbiBjcmVhdGVTY2hlbWUob3B0aW9uczogeyBiYWNrZ3JvdW5kOiBDb2xvclZhbHVlLCBmb3JlZ3JvdW5kOiBDb2xvclZhbHVlIH0pOiBudW1iZXIge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IGNvbG9yaXplck1hcC5zaXplO1xuICAgIGNvbnN0IGNvbG9yaXplciA9IGNoYWxrLmJnSGV4KG9wdGlvbnMuYmFja2dyb3VuZCkuaGV4KG9wdGlvbnMuZm9yZWdyb3VuZCk7XG5cbiAgICBjb2xvcml6ZXJNYXAuc2V0KG5leHRJbmRleCwgY29sb3JpemVyKTtcblxuICAgIHJldHVybiBuZXh0SW5kZXg7XG59XG5cbi8vIENvbG9yIGRlZmluaXRpb25zLlxuY29uc3QgQ29sb3JWYWx1ZSA9IHtcbiAgICAvLyBCYXNpYyBjb2xvcnMuXG4gICAgV2hpdGU6ICcjRkZGRkZGJyxcbiAgICBHcmF5OiAnIzgwODA4MCcsXG4gICAgQmxhY2s6ICcjMDAwMDAwJyxcblxuICAgIC8vIFNwZWNpYWxpemVkIGNvbG9ycy5cbiAgICBDcml0aWNhbDogJyNENjMwMzEnLFxuICAgIFdhcm5pbmc6ICcjRkRDQjZFJyxcbiAgICBSZWd1bGFyOiAnIzA5ODRFMycsXG4gICAgSHR0cDogJyM2QUIwNEMnLFxuICAgIFF1ZXJ5OiAnIzM5OUFGMydcbn0gYXMgY29uc3Q7XG5cbnR5cGUgQ29sb3JWYWx1ZSA9IHR5cGVvZiBDb2xvclZhbHVlW2tleW9mIHR5cGVvZiBDb2xvclZhbHVlXTtcblxuY29uc3QgQ29sb3JTY2hlbWUgPSB7XG4gICAgQ3JpdGljYWw6IGNyZWF0ZVNjaGVtZSh7XG4gICAgICAgIGJhY2tncm91bmQ6IENvbG9yVmFsdWUuQ3JpdGljYWwsXG4gICAgICAgIGZvcmVncm91bmQ6IENvbG9yVmFsdWUuQmxhY2tcbiAgICB9KSxcblxuICAgIFdhcm5pbmc6IGNyZWF0ZVNjaGVtZSh7XG4gICAgICAgIGJhY2tncm91bmQ6IENvbG9yVmFsdWUuV2FybmluZyxcbiAgICAgICAgZm9yZWdyb3VuZDogQ29sb3JWYWx1ZS5CbGFja1xuICAgIH0pLFxuXG4gICAgUmVndWxhcjogY3JlYXRlU2NoZW1lKHtcbiAgICAgICAgYmFja2dyb3VuZDogQ29sb3JWYWx1ZS5SZWd1bGFyLFxuICAgICAgICBmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLldoaXRlXG4gICAgfSksXG5cbiAgICBIdHRwOiBjcmVhdGVTY2hlbWUoe1xuICAgICAgICBiYWNrZ3JvdW5kOiBDb2xvclZhbHVlLkh0dHAsXG4gICAgICAgIGZvcmVncm91bmQ6IENvbG9yVmFsdWUuQmxhY2tcbiAgICB9KSxcblxuICAgIFF1ZXJ5OiBjcmVhdGVTY2hlbWUoe1xuICAgICAgICBiYWNrZ3JvdW5kOiBDb2xvclZhbHVlLlF1ZXJ5LFxuICAgICAgICBmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrXG4gICAgfSksXG5cbiAgICBMb3VkOiBjcmVhdGVTY2hlbWUoe1xuICAgICAgICBiYWNrZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuICAgICAgICBmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkdyYXlcbiAgICB9KVxufSBhcyBjb25zdDtcblxudHlwZSBDb2xvclNjaGVtZSA9IHR5cGVvZiBDb2xvclNjaGVtZVtrZXlvZiB0eXBlb2YgQ29sb3JTY2hlbWVdO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbGtPZihjb2xvclNldDogQ29sb3JTY2hlbWUpOiBDaGFsa0luc3RhbmNlIHtcbiAgICByZXR1cm4gY29sb3JpemVyTWFwLmdldChjb2xvclNldCkgPz8gY2hhbGs7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yU2NoZW1lO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4iLCIvLyBOb2RlLmpzIGJ1aWx0LWluIEFQSXMuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBDb2xvclNjaGVtZSwgeyBnZXRDaGFsa09mIH0gZnJvbSAnLi9jb2xvci1zY2hlbWUnO1xuXG4vLyBDb25zdGFudHMuXG5jb25zdCB7IGlzVFRZIH0gPSBwcm9jZXNzLnN0ZG91dDtcbmNvbnN0IGlzTm90T25DTEkgPSAhaXNUVFk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlY29yYXRlTGFiZWw8VCBleHRlbmRzIHN0cmluZz4obGFiZWw6IFQsIHNjaGVtZTogQ29sb3JTY2hlbWUpOiBUIHtcbiAgICBpZiAoaXNOb3RPbkNMSSkge1xuICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbGsgPSBnZXRDaGFsa09mKHNjaGVtZSk7XG4gICAgY29uc3QgZGVjb3JhdGVkTGFiZWwgPSBjaGFsay5ib2xkKGAgJHtsYWJlbH0gYCk7XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkTGFiZWwgYXMgVDtcbn1cbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHByb2Nlc3MsIHsgdmVyc2lvbiB9IGZyb20gJ3Byb2Nlc3MnO1xuXG4vLyBUaGlyZC1wYXJ0eSBtb2R1bGVzLlxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSc7XG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcic7XG5cbi8vIFR5cGUgZGVmaW5pdGlvbnMuXG50eXBlIExvZ2dpbmdEYXRhID0geyBsZXZlbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcgfSAmIFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PjtcbnR5cGUgSGFuZGxlZERhdGEgPSB7IGxhYmVsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZyB9O1xuXG4vLyBDb25zdGFudHMuXG5jb25zdCByb290UGF0aCA9IHByb2Nlc3MuY3dkKCk7XG5jb25zdCBjb25qdW5jdGlvbiA9IGAgJHtjaGFsay5ibHVlKCfilIDilIAnKX0gYDtcbmNvbnN0IHNwbGF0OiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sLmZvcignc3BsYXQnKTtcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ2Vycm9yJztcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5FcnJvcjtcbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ0VSUk9SJywgQ29sb3JTY2hlbWUuQ3JpdGljYWwpO1xuXG5mdW5jdGlvbiBtYXBMb2NhdGlvbk9mRXJyb3JUaHJvd24oZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHRhcmdldCA9IHBhdGgucmVsYXRpdmUocm9vdFBhdGgsIGZpbGVuYW1lKTtcblxuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnbm9kZV9tb2R1bGVzJykpIHtcbiAgICAgICAgdGFyZ2V0ID0gY2hhbGsuZ3JheSh0YXJnZXQpLnJlcGxhY2UoXG4gICAgICAgICAgICAvbm9kZV9tb2R1bGVzW1xcXFwvXShbXlxcXFwvXSspKC4qKS8sXG4gICAgICAgICAgICAobWF0Y2hlcywgbW9kdWxlTmFtZTogc3RyaW5nLCB0cmFpbGluZzogc3RyaW5nKSA9PiBgbm9kZV9tb2R1bGVzJHtwYXRoLnNlcH0ke2NoYWxrLmJvbGQudW5kZXJsaW5lKG1vZHVsZU5hbWUpfSR7Y2hhbGsuZ3JheSh0cmFpbGluZyl9YCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBgJHtjaGFsay5ncmF5KHBhdGguZGlybmFtZSh0YXJnZXQpICsgcGF0aC5zZXApfSR7Y2hhbGsuYm9sZC51bmRlcmxpbmUocGF0aC5iYXNlbmFtZSh0YXJnZXQpKX1gO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhbmRsZShkYXRhOiBMb2dnaW5nRGF0YSk6IEhhbmRsZWREYXRhIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IFtzcGxhdF06IFsgZXJyb3IgXSA9IFtdIH0gPSBkYXRhIGFzIGFueTtcblxuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlLCBzdGFjazogcmF3U3RhY2sgPSAnJyB9ID0gZXJyb3I7XG5cbiAgICBjb25zdCBzdGFjayA9IHJhd1N0YWNrXG4gICAgICAgIC5zbGljZShuYW1lLmxlbmd0aCArIG1lc3NhZ2UubGVuZ3RoICsgMylcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKGxpbmUgPT4gbGluZS5yZXBsYWNlKC9eXFxzK2F0IC9nLCAnJykpXG4gICAgICAgIC5tYXAobGluZSA9PiAocGF0aC5pc0Fic29sdXRlKGxpbmUpID8gYDxhbm9ueW1vdXM+JHtjb25qdW5jdGlvbn0ke21hcExvY2F0aW9uT2ZFcnJvclRocm93bihsaW5lKX1gIDogbGluZSkpXG4gICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnJlcGxhY2UoL14oLispIFxcKCguKylcXCkkLywgKG1hdGNoZXMsIGNvbnRleHROYW1lOiBzdHJpbmcsIHJhd0xvY2F0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBsb2NhdGlvbjtcblxuICAgICAgICAgICAgaWYgKHJhd0xvY2F0aW9uID09PSAnPGFub255bW91cz4nKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSBjaGFsay5ncmF5KHJhd0xvY2F0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgWyBmaWxlbmFtZSwgbGluZSwgY29sdW1uIF0gPSByYXdMb2NhdGlvbi5zcGxpdCgnOicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbWFwTG9jYXRpb25PZkVycm9yVGhyb3duKHBhdGgucmVsYXRpdmUocm9vdFBhdGgsIGZpbGVuYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWlsaW5nID0gY2hhbGsuZ3JheShgOiR7bGluZX06JHtjb2x1bW59YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSB0YXJnZXQgKyB0cmFpbGluZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGNoYWxrLmdyYXkoYGh0dHBzOi8vZ2l0aHViLmNvbS8ke2NoYWxrLmJvbGQudW5kZXJsaW5lKCdub2RlanMnKX0vbm9kZS9ibG9iLyR7dmVyc2lvbn0vbGliLyR7ZmlsZW5hbWV9I0wke2xpbmV9YCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGAke2NvbnRleHROYW1lfSR7Y29uanVuY3Rpb259JHtsb2NhdGlvbn1gO1xuICAgICAgICB9KSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKG5hbWUsIENvbG9yU2NoZW1lLkNyaXRpY2FsKTtcbiAgICBjb25zdCBwYXlsb2FkID0gYCR7bWVzc2FnZX1cXG5cXG4ke3N0YWNrfVxcbmA7XG5cbiAgICByZXR1cm4geyBsYWJlbCwgcGF5bG9hZCB9O1xufVxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSc7XG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcic7XG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdmYXRhbCc7XG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuRmF0YWw7XG5leHBvcnQgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKCdGQVRBTCcsIENvbG9yU2NoZW1lLkNyaXRpY2FsKTtcblxuZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vZXJyb3InO1xuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSc7XG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcic7XG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICd3YXJuaW5nJztcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5XYXJuaW5nO1xuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnV0FSTklORycsIENvbG9yU2NoZW1lLldhcm5pbmcpO1xuXG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSc7XG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcic7XG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdub3RpY2UnO1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLk5vdGljZTtcbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ05PVElDRScsIENvbG9yU2NoZW1lLlJlZ3VsYXIpO1xuXG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSc7XG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcic7XG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdpbmZvJztcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5JbmZvO1xuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnSU5GTycsIENvbG9yU2NoZW1lLlJlZ3VsYXIpO1xuXG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSc7XG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcic7XG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdodHRwJztcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5IdHRwO1xuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnSFRUUCcsIENvbG9yU2NoZW1lLkh0dHApO1xuXG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiLy8gSGlnaGxpZ2h0LmpzXG5pbXBvcnQgaGlnaGxpZ2h0IGZyb20gJ2NsaS1oaWdobGlnaHQnO1xuXG4vLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnO1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJztcbmltcG9ydCBkZWNvcmF0ZUxhYmVsIGZyb20gJy4uL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yJztcblxuLy8gVHlwZSBkZWZpbml0aW9ucy5cbnR5cGUgTG9nZ2luZ0RhdGEgPSB7IGxldmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyB9ICYgUmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+O1xudHlwZSBIYW5kbGVkRGF0YSA9IHsgbGFiZWw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nIH07XG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdxdWVyeSc7XG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuUXVlcnk7XG5leHBvcnQgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKCdRVUVSWScsIENvbG9yU2NoZW1lLlF1ZXJ5KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFuZGxlKGRhdGE6IExvZ2dpbmdEYXRhKTogSGFuZGxlZERhdGEgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBheWxvYWQgPSBoaWdobGlnaHQoZGF0YS5tZXNzYWdlLCB7IGxhbmd1YWdlOiAnc3FsJyB9KTtcblxuICAgIHJldHVybiB7IGxhYmVsLCBwYXlsb2FkIH07XG59XG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnO1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJztcbmltcG9ydCBkZWNvcmF0ZUxhYmVsIGZyb20gJy4uL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yJztcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ3ZlcmJvc2UnO1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLlZlcmJvc2U7XG5leHBvcnQgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKCdWRVJCT1NFJywgQ29sb3JTY2hlbWUuTG91ZCk7XG5cbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnO1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJztcbmltcG9ydCBkZWNvcmF0ZUxhYmVsIGZyb20gJy4uL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yJztcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ2RlYnVnJztcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5EZWJ1ZztcbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ0RFQlVHJywgQ29sb3JTY2hlbWUuTG91ZCk7XG5cbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCIvLyBIYW5kbGVyIGltcGxlbWVudGF0aW9ucy5cbmltcG9ydCAqIGFzIEZhdGFsSGFuZGxlciBmcm9tICcuL2ZhdGFsJztcbmltcG9ydCAqIGFzIEVycm9ySGFuZGxlciBmcm9tICcuL2Vycm9yJztcbmltcG9ydCAqIGFzIFdhcm5pbmdIYW5kbGVyIGZyb20gJy4vd2FybmluZyc7XG5pbXBvcnQgKiBhcyBOb3RpY2VIYW5kbGVyIGZyb20gJy4vbm90aWNlJztcbmltcG9ydCAqIGFzIEluZm9IYW5kbGVyIGZyb20gJy4vaW5mbyc7XG5pbXBvcnQgKiBhcyBIdHRwSGFuZGxlciBmcm9tICcuL2h0dHAnO1xuaW1wb3J0ICogYXMgUXVlcnlIYW5kbGVyIGZyb20gJy4vcXVlcnknO1xuaW1wb3J0ICogYXMgVmVyYm9zZUhhbmRsZXIgZnJvbSAnLi92ZXJib3NlJztcbmltcG9ydCAqIGFzIERlYnVnSGFuZGxlciBmcm9tICcuL2RlYnVnJztcblxuY29uc3QgaGFuZGxlcnMgPSBbXG4gICAgRmF0YWxIYW5kbGVyLFxuICAgIEVycm9ySGFuZGxlcixcbiAgICBXYXJuaW5nSGFuZGxlcixcbiAgICBOb3RpY2VIYW5kbGVyLFxuICAgIEluZm9IYW5kbGVyLFxuICAgIEh0dHBIYW5kbGVyLFxuICAgIFF1ZXJ5SGFuZGxlcixcbiAgICBWZXJib3NlSGFuZGxlcixcbiAgICBEZWJ1Z0hhbmRsZXJcbl07XG5cbmV4cG9ydCB0eXBlIExvZ2dpbmdMZXZlbE5hbWUgPSAodHlwZW9mIGhhbmRsZXJzIGV4dGVuZHMgKGluZmVyIFQpW10gPyBUIDogbmV2ZXIpWyduYW1lJ107XG5leHBvcnQgZGVmYXVsdCBoYW5kbGVycztcbiIsIi8vIFRoaXJkLXBhcnR5IG1vZHVsZXMuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHJUcmFjZXIgZnJvbSAnY2xzLXJ0cmFjZXInO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd3aW5zdG9uJztcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJztcblxuLy8gSGFuZGxlciBpbXBsZW1lbnRhdGlvbnMuXG5pbXBvcnQgaGFuZGxlcnMgZnJvbSAnLi4vaGFuZGxlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXQucHJpbnRmKGRhdGEgPT4ge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGNoYWxrLmdyYXkoRGF0ZVRpbWUubm93KCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiB0cnVlIH0pKTtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGRhdGEubGV2ZWwpO1xuICAgIGNvbnN0IGZhbGxiYWNrID0geyBsYWJlbDogaGFuZGxlcj8ubGFiZWwsIHBheWxvYWQ6IGRhdGEubWVzc2FnZSB9O1xuICAgIGNvbnN0IHBlcmZvcm1IYW5kbGUgPSBoYW5kbGVyPy5kZWZhdWx0ID8/ICgoKTogdHlwZW9mIGZhbGxiYWNrID0+IGZhbGxiYWNrKTtcblxuICAgIC8vIEV4ZWN1dGUgaGFuZGxlciBhbmQgdGhlbiwgZ2V0IGRlY29yYXRlZCBwYXlsb2FkLlxuICAgIGNvbnN0IHsgbGFiZWwsIHBheWxvYWQgfSA9IFJlZmxlY3QuYXBwbHkocGVyZm9ybUhhbmRsZSwgdW5kZWZpbmVkLCBbIGRhdGEgXSkgPz8gZmFsbGJhY2s7XG5cbiAgICBsZXQgZXh0cmFGaW5nZXJwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGhhbmRsZXI/LmxldmVsID09PSBMb2dnaW5nTGV2ZWwuSHR0cCkge1xuICAgICAgICBleHRyYUZpbmdlcnByaW50ID0gZGF0YS50cmFuc2FjdGlvbklkXG4gICAgICAgICAgICA/IGAoVHJhbnNhY3Rpb24tSUQgPSAke2RhdGEudHJhbnNhY3Rpb25JZCBhcyBzdHJpbmd9KWBcbiAgICAgICAgICAgIDogYChSZXF1ZXN0LUlEID0gJHtyVHJhY2VyLmlkKCkgYXMgc3RyaW5nfSlgO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtsYWJlbCBhcyBzdHJpbmd9ICR7dGltZXN0YW1wfSR7ZXh0cmFGaW5nZXJwcmludCA/IGAgJHtleHRyYUZpbmdlcnByaW50fWAgOiAnJ31cXG4ke3BheWxvYWQgYXMgc3RyaW5nfWA7XG59KTtcbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCBjbHVzdGVyIGZyb20gJ2NsdXN0ZXInO1xuaW1wb3J0IHsgZW52IGFzIGVudmlyb25tZW50cyB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHsgaXNNYWluVGhyZWFkIH0gZnJvbSAnd29ya2VyX3RocmVhZHMnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zLlxuZXhwb3J0IGNvbnN0IEV4ZWN1dGlvbk1vZGUgPSB7XG4gICAgRGV2ZWxvcG1lbnRNb2RlOiAnZGV2ZWxvcG1lbnQnLFxuICAgIFByb2R1Y3Rpb25Nb2RlOiAncHJvZHVjdGlvbidcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBDbHVzdGVyaW5nTW9kZSA9IHtcbiAgICBNYXN0ZXJQcm9jZXNzOiAwLFxuICAgIFdvcmtlclByb2Nlc3M6IDFcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBUaHJlYWRpbmdNb2RlID0ge1xuICAgIE1haW5UaHJlYWQ6IDAsXG4gICAgV29ya2VyVGhyZWFkOiAxXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFeGVjdXRpb25Nb2RlID0gdHlwZW9mIEV4ZWN1dGlvbk1vZGVba2V5b2YgdHlwZW9mIEV4ZWN1dGlvbk1vZGVdO1xuZXhwb3J0IHR5cGUgQ2x1c3RlcmluZ01vZGUgPSB0eXBlb2YgQ2x1c3RlcmluZ01vZGVba2V5b2YgdHlwZW9mIENsdXN0ZXJpbmdNb2RlXTtcbmV4cG9ydCB0eXBlIFRocmVhZGluZ01vZGUgPSB0eXBlb2YgVGhyZWFkaW5nTW9kZVtrZXlvZiB0eXBlb2YgVGhyZWFkaW5nTW9kZV07XG5cbi8vIEV4cG9ydGluZ3MuXG5leHBvcnQgY29uc3QgZXhlY3V0aW9uTW9kZSA9IGVudmlyb25tZW50cy5OT0RFX0VOViBhcyBFeGVjdXRpb25Nb2RlID8/IEV4ZWN1dGlvbk1vZGUuRGV2ZWxvcG1lbnRNb2RlO1xuXG5leHBvcnQgY29uc3QgY2x1c3RlcmluZ01vZGU6IENsdXN0ZXJpbmdNb2RlID0gY2x1c3Rlci5pc1ByaW1hcnkgPz8gY2x1c3Rlci5pc01hc3RlclxuICAgID8gQ2x1c3RlcmluZ01vZGUuTWFzdGVyUHJvY2Vzc1xuICAgIDogQ2x1c3RlcmluZ01vZGUuV29ya2VyUHJvY2VzcztcblxuZXhwb3J0IGNvbnN0IHRocmVhZGluZ01vZGU6IFRocmVhZGluZ01vZGUgPSBpc01haW5UaHJlYWRcbiAgICA/IFRocmVhZGluZ01vZGUuTWFpblRocmVhZFxuICAgIDogVGhyZWFkaW5nTW9kZS5Xb3JrZXJUaHJlYWQ7XG4iLCIvLyBOb2RlLmpzIGJ1aWx0LWluIEFQSXMuXG5pbXBvcnQge1xuICAgIFNUQVRVU19DT0RFUyxcbiAgICBJbmNvbWluZ01lc3NhZ2UgYXMgSHR0cFJlcXVlc3QsXG4gICAgU2VydmVyUmVzcG9uc2UgYXMgSHR0cFJlc3BvbnNlXG59IGZyb20gJ2h0dHAnO1xuXG4vLyBUaGlyZC1wYXJ0eSBtb2R1bGVzLlxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBtb3JnYW4gZnJvbSAnbW9yZ2FuJztcbmltcG9ydCBwcmV0dHlCeXRlcyBmcm9tICdwcmV0dHktYnl0ZXMnO1xuaW1wb3J0IHByZXR0eU1zIGZyb20gJ3ByZXR0eS1tcyc7XG5cbi8vIExvY2FsIGhlbHBlcnMuXG5pbXBvcnQgeyBFeGVjdXRpb25Nb2RlLCBleGVjdXRpb25Nb2RlIH0gZnJvbSAnLi4vaGVscGVycy9jb25zdGFudHMnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zLlxuZGVjbGFyZSBtb2R1bGUgJ21vcmdhbicge1xuICAgIGNvbnN0IGNvbWJpbmVkOiBtb3JnYW4uRm9ybWF0Rm47XG59XG5cbmludGVyZmFjZSBUb2tlbkluZGV4ZXIge1xuICAgIFt0b2tlbk5hbWU6IHN0cmluZ106IChcbiAgICAgICAgcmVxdWVzdDogSHR0cFJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UsXG4gICAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8vIEhlbHBlcnMuXG5mdW5jdGlvbiBkZWNvcmF0ZVN0YXR1c0NvZGUoc3RhdHVzQ29kZToga2V5b2YgdHlwZW9mIFNUQVRVU19DT0RFUyk6IHN0cmluZyB7XG4gICAgY29uc3QgZ3JvdXBPZkNvZGUgPSBNYXRoLmZsb29yKE51bWJlcihzdGF0dXNDb2RlKSAvIDEwMCkgKiAxMDA7XG4gICAgY29uc3QgYmFzZU1lc3NhZ2UgPSBgJHtzdGF0dXNDb2RlfSAke1NUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSBhcyBzdHJpbmd9YDtcblxuICAgIHN3aXRjaCAoZ3JvdXBPZkNvZGUpIHtcbiAgICBjYXNlIDIwMDoge1xuICAgICAgICByZXR1cm4gY2hhbGsuZ3JlZW4oYmFzZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNhc2UgMzAwOiB7XG4gICAgICAgIHJldHVybiBjaGFsay5tYWdlbnRhKGJhc2VNZXNzYWdlKTtcbiAgICB9XG4gICAgY2FzZSA0MDA6XG4gICAgY2FzZSA1MDA6IHtcbiAgICAgICAgcmV0dXJuIGNoYWxrLnJlZChiYXNlTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hhbGsuZ3JheShiYXNlTWVzc2FnZSk7XG4gICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Rm9yTW9yZ2FuKHRva2VuczogYW55LCByZXF1ZXN0OiBIdHRwUmVxdWVzdCwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZSk6IHN0cmluZyB7XG4gICAgZnVuY3Rpb24gXyh0b2tlbjogc3RyaW5nLCAuLi5zdWJBcmdzOiBhbnlbXSk6IHN0cmluZyB8IHZvaWQge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICByZXR1cm4gKHRva2VucyBhcyBUb2tlbkluZGV4ZXIpW3Rva2VuXShyZXF1ZXN0LCByZXNwb25zZSwgLi4uc3ViQXJncyk7XG4gICAgfVxuXG4gICAgLy8gUmF3IHZhbHVlcy5cbiAgICBjb25zdCBtZXRob2QgPSBfKCdtZXRob2QnKTtcbiAgICBjb25zdCBVUkwgPSBfKCd1cmwnKTtcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IGBIVFRQLyR7XygnaHR0cC12ZXJzaW9uJykgYXMgc3RyaW5nfWA7XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IE51bWJlcihfKCdzdGF0dXMnKSk7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IE51bWJlcihfKCdyZXMnLCAnY29udGVudC1sZW5ndGgnKSA/PyAtMSk7XG4gICAgY29uc3QgcmVzcG9uc2VUaW1lID0gTnVtYmVyKF8oJ3Jlc3BvbnNlLXRpbWUnKSA/PyAtMSk7XG5cbiAgICAvLyBEZWNvcmF0ZWQgdmFsdWVzLlxuICAgIGNvbnN0ICRtZXRob2QgPSBjaGFsay5ib2xkKG1ldGhvZCk7XG4gICAgY29uc3QgJHZlcnNpb24gPSBjaGFsay5yZ2IoOTgsIDE3NywgMjU1KShodHRwVmVyc2lvbik7XG4gICAgY29uc3QgJHN0YXR1c0NvZGUgPSBkZWNvcmF0ZVN0YXR1c0NvZGUoc3RhdHVzQ29kZSk7XG4gICAgY29uc3QgJGNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoID49IDAgPyBwcmV0dHlCeXRlcyhjb250ZW50TGVuZ3RoKSA6ICc/IEInO1xuICAgIGNvbnN0ICRyZXNwb25zZVRpbWUgPSByZXNwb25zZVRpbWUgPj0gMCA/IHByZXR0eU1zKHJlc3BvbnNlVGltZSkgOiAnJztcblxuICAgIC8vIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAgY29uc3QgbWV0YWRhdGEgPSBgKCR7JGNvbnRlbnRMZW5ndGh9LCAkeyRyZXNwb25zZVRpbWV9KWA7XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBg4oaSICR7JG1ldGhvZH0gJHtVUkwgYXMgc3RyaW5nfSAkeyR2ZXJzaW9ufWAsXG4gICAgICAgIGDihpAgJHskdmVyc2lvbn0gJHskc3RhdHVzQ29kZX0gJHttZXRhZGF0YX1gXG4gICAgXS5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXhlY3V0aW9uTW9kZSA9PT0gRXhlY3V0aW9uTW9kZS5EZXZlbG9wbWVudE1vZGUgPyBmb3JtYXRGb3JNb3JnYW4gOiBtb3JnYW4uY29tYmluZWQ7XG4iLCJpbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBOb2RlLmpzIGJ1aWx0LWluIEFQSXMuXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgYXMgSHR0cFJlcXVlc3QsIFNlcnZlclJlc3BvbnNlIGFzIEh0dHBSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuXG4vLyBUaGlyZC1wYXJ0eSBtb2R1bGVzLlxuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZGFzaCBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vcmdhbiBmcm9tICdtb3JnYW4nO1xuaW1wb3J0IHR5cGUgeyBsZXZlbCBhcyBMb2dnaW5nTGV2ZWwgfSBmcm9tICd3aW5zdG9uJztcbmltcG9ydCAqIGFzIHdpbnN0b24gZnJvbSAnd2luc3Rvbic7XG5pbXBvcnQgeyBMb2dnZXIgYXMgQmFzZUxvZ2dlciB9IGZyb20gJ3dpbnN0b24nO1xuXG4vLyBGb3JtYXR0ZXJzLlxuaW1wb3J0IGZvcm1hdEZvckNMSSBmcm9tICcuLi9mb3JtYXR0ZXJzL2NvbW1hbmQtbGluZSc7XG5pbXBvcnQgZm9ybWF0Rm9yTW9yZ2FuIGZyb20gJy4uL2Zvcm1hdHRlcnMvbW9yZ2FuJztcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCB7IEV4ZWN1dGlvbk1vZGUsIGV4ZWN1dGlvbk1vZGUgfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0YW50cyc7XG5cbi8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zLlxuaW1wb3J0IHR5cGUgeyBMb2dnaW5nTGV2ZWxOYW1lIH0gZnJvbSAnLi4vaGFuZGxlcnMnO1xuaW1wb3J0IGhhbmRsZXJzIGZyb20gJy4uL2hhbmRsZXJzJztcblxuLy8gVHlwZSBkZWZpbml0aW9ucy5cbnR5cGUgTW9yZ2FuID0gKHJlcTogSHR0cFJlcXVlc3QsIHJlczogSHR0cFJlc3BvbnNlLCBuZXh0OiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCkgPT4gdm9pZDtcblxuLy8gVHJhbnNwb3J0cy5cbmNvbnN0IHsgQ29uc29sZTogQ29uc29sZVRyYW5zcG9ydCB9ID0gd2luc3Rvbi50cmFuc3BvcnRzO1xuXG4vLyBLZXlzIGluIG9yZGVyIHRvIGFjY2VzcyBwcml2YXRlIHByb3BlcnRpZXMuXG5jb25zdCBLZXlPZkluc3RhbmNlOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdAY2ljaG9sL2xvZ2dlcjo6Y2xhc3Nlcy9sb2dnZXI6Okluc3RhbmNlJyk7XG5jb25zdCBLZXlPZlBhc3Nwb3J0OiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdAY2ljaG9sL2xvZ2dlcjo6Y2xhc3Nlcy9sb2dnZXI6OlBhc3Nwb3J0Jyk7XG5cbmNsYXNzIExvZ2dlciB7XG4gICAgI2xvZ2dlcjogQmFzZUxvZ2dlciA9IHdpbnN0b24uY3JlYXRlTG9nZ2VyKHtcbiAgICAgICAgbGV2ZWxzOiBsb2Rhc2goaGFuZGxlcnMpXG4gICAgICAgICAgICAubWFwKCh7IG5hbWUsIGxldmVsIH0pID0+IFsgbmFtZSwgbGV2ZWwgXSlcbiAgICAgICAgICAgIC5maWx0ZXIoKFsgLCBsZXZlbCBdKSA9PiB0eXBlb2YgbGV2ZWwgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgLmZyb21QYWlycygpXG4gICAgICAgICAgICAudmFsdWUoKSxcblxuICAgICAgICBsZXZlbDogKGV4ZWN1dGlvbk1vZGUgPT09IEV4ZWN1dGlvbk1vZGUuUHJvZHVjdGlvbk1vZGUgPyAnaHR0cCcgOiAndmVyYm9zZScpIGFzIHR5cGVvZiBMb2dnaW5nTGV2ZWwsXG5cbiAgICAgICAgdHJhbnNwb3J0czogW1xuICAgICAgICAgICAgbmV3IENvbnNvbGVUcmFuc3BvcnQoeyBmb3JtYXQ6IGZvcm1hdEZvckNMSSB9KVxuICAgICAgICBdLFxuXG4gICAgICAgIGV4aXRPbkVycm9yOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgI21vcmdhbjogTW9yZ2FuID0gbW9yZ2FuKGZvcm1hdEZvck1vcmdhbiwge1xuICAgICAgICBzdHJlYW06IG5ldyBQYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSkub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnaHR0cCcsIGRhdGEudHJpbSgpKTtcbiAgICAgICAgfSlcbiAgICB9KSBhcyBNb3JnYW47XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhc3Nwb3J0OiB0eXBlb2YgS2V5T2ZQYXNzcG9ydCkge1xuICAgICAgICBpZiAocGFzc3BvcnQgIT09IEtleU9mUGFzc3BvcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignTG9nZ2VyIGNsYXNzIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBpbiBkaXJlY3RseScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgaW5zdGFuY2UoKTogTG9nZ2VyIHtcbiAgICAgICAgaWYgKHRoaXMgIT09IExvZ2dlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdMb2dnZXIgY2xhc3MgaXMgbm90IGluaGVyaXRhYmxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShLZXlPZkluc3RhbmNlLCBMb2dnZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShLZXlPZkluc3RhbmNlLCBMb2dnZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTG9nZ2VyKEtleU9mUGFzc3BvcnQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEtleU9mSW5zdGFuY2UsIGluc3RhbmNlLCBMb2dnZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nZ2luZyBtZXNzYWdlIHdpdGggc3BlY2lmaWMgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWxcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgICAqIEBwYXJhbSBhcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gICAgICovXG4gICAgcHVibGljIGxvZyhsZXZlbDogTG9nZ2luZ0xldmVsTmFtZSwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIEhUVFAgSS9PLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgTm9kZS5qcyBidWlsdC1pbiBgSW5jb21pbmdNZXNzYWdlYCBpbnN0YW5jZSBmcm9tIGBodHRwYCBtb2R1bGUuXG4gICAgICogQHBhcmFtIHJlc3BvbnNlIE5vZGUuanMgYnVpbHQtaW4gYFNlcnZlclJlc3BvbnNlYCBpbnN0YW5jZSBmcm9tIGBodHRwYCBtb2R1bGUuXG4gICAgICovXG4gICAgcHVibGljIGxvZyhyZXF1ZXN0OiBIdHRwUmVxdWVzdCwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZSk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIGVycm9ycyBpbiBkZXRhaWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9nKGVycm9yOiBFcnJvcik6IHZvaWQ7XG5cbiAgICBwdWJsaWMgbG9nKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBsb2dnZXIgPSB0aGlzLiNsb2dnZXI7XG4gICAgICAgIGNvbnN0IG1vcmdhbiA9IHRoaXMuI21vcmdhbjtcblxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgY2FzZSAoYXJncy5sZW5ndGggPj0gMiAmJiBhcmdzWzBdIGluc3RhbmNlb2YgSHR0cFJlcXVlc3QgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSk6IHtcbiAgICAgICAgICAgIGNvbnN0IFsgcmVxdWVzdCwgcmVzcG9uc2UgXSA9IGFyZ3MgYXMgWyBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIF07XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmZyb21DYWxsYmFjazx2b2lkPihjYWxsYmFjayA9PiBtb3JnYW4ocmVxdWVzdCwgcmVzcG9uc2UsIGNhbGxiYWNrKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIChhcmdzLmxlbmd0aCA+PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBFcnJvcik6IHtcbiAgICAgICAgICAgIGNvbnN0IFsgZXJyb3IsIC4uLmRhdGEgXSA9IGFyZ3MgYXMgWyBFcnJvciwgLi4uYW55W10gXTtcblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICAgICAgICAgIGxvZ2dlci5sb2coJ2Vycm9yJywgZXJyb3IubWVzc2FnZSwgZXJyb3IsIC4uLmRhdGEpO1xuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3QgWyBsZXZlbCwgbWVzc2FnZSwgLi4uZGF0YSBdID0gYXJncyBhcyBbIHR5cGVvZiBMb2dnaW5nTGV2ZWwsIHN0cmluZywgLi4uYW55W10gXTtcblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICAgICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIG1lc3NhZ2UsIC4uLmRhdGEpO1xuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dlci5pbnN0YW5jZTtcbiJdLCJuYW1lcyI6WyJMb2dnaW5nTGV2ZWwiLCJGYXRhbCIsIkVycm9yIiwiV2FybmluZyIsIk5vdGljZSIsIkluZm8iLCJIdHRwIiwiUXVlcnkiLCJWZXJib3NlIiwiRGVidWciLCJjb2xvcml6ZXJNYXAiLCJfTWFwIiwiY3JlYXRlU2NoZW1lIiwib3B0aW9ucyIsIm5leHRJbmRleCIsInNpemUiLCJjb2xvcml6ZXIiLCJjaGFsayIsImJnSGV4IiwiYmFja2dyb3VuZCIsImhleCIsImZvcmVncm91bmQiLCJzZXQiLCJDb2xvclZhbHVlIiwiV2hpdGUiLCJHcmF5IiwiQmxhY2siLCJDcml0aWNhbCIsIlJlZ3VsYXIiLCJDb2xvclNjaGVtZSIsIkxvdWQiLCJnZXRDaGFsa09mIiwiY29sb3JTZXQiLCJnZXQiLCJpc1RUWSIsInByb2Nlc3MiLCJzdGRvdXQiLCJpc05vdE9uQ0xJIiwiZGVjb3JhdGVMYWJlbCIsImxhYmVsIiwic2NoZW1lIiwiZGVjb3JhdGVkTGFiZWwiLCJib2xkIiwicm9vdFBhdGgiLCJjd2QiLCJjb25qdW5jdGlvbiIsImJsdWUiLCJzcGxhdCIsIl9TeW1ib2wkZm9yIiwibmFtZSIsImxldmVsIiwibWFwTG9jYXRpb25PZkVycm9yVGhyb3duIiwiZmlsZW5hbWUiLCJ0YXJnZXQiLCJwYXRoIiwicmVsYXRpdmUiLCJfc3RhcnRzV2l0aEluc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwiZ3JheSIsInJlcGxhY2UiLCJtYXRjaGVzIiwibW9kdWxlTmFtZSIsInRyYWlsaW5nIiwic2VwIiwidW5kZXJsaW5lIiwiZGlybmFtZSIsImJhc2VuYW1lIiwiaGFuZGxlIiwiZGF0YSIsIl9jb250ZXh0IiwiX2NvbnRleHQyIiwiX2NvbnRleHQzIiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJtZXNzYWdlIiwic3RhY2siLCJyYXdTdGFjayIsIl9tYXBJbnN0YW5jZVByb3BlcnR5IiwiX3NsaWNlSW5zdGFuY2VQcm9wZXJ0eSIsImxlbmd0aCIsInNwbGl0IiwibGluZSIsImlzQWJzb2x1dGUiLCJjb250ZXh0TmFtZSIsInJhd0xvY2F0aW9uIiwibG9jYXRpb24iLCJjb2x1bW4iLCJ2ZXJzaW9uIiwiam9pbiIsInBheWxvYWQiLCJoaWdobGlnaHQiLCJsYW5ndWFnZSIsImhhbmRsZXJzIiwiRmF0YWxIYW5kbGVyIiwiRXJyb3JIYW5kbGVyIiwiV2FybmluZ0hhbmRsZXIiLCJOb3RpY2VIYW5kbGVyIiwiSW5mb0hhbmRsZXIiLCJIdHRwSGFuZGxlciIsIlF1ZXJ5SGFuZGxlciIsIlZlcmJvc2VIYW5kbGVyIiwiRGVidWdIYW5kbGVyIiwiZm9ybWF0IiwicHJpbnRmIiwidGltZXN0YW1wIiwiRGF0ZVRpbWUiLCJub3ciLCJ0b0lTTyIsImluY2x1ZGVPZmZzZXQiLCJoYW5kbGVyIiwiX2ZpbmRJbnN0YW5jZVByb3BlcnR5IiwiZmFsbGJhY2siLCJwZXJmb3JtSGFuZGxlIiwiZGVmYXVsdCIsIl9SZWZsZWN0JGFwcGx5IiwiZXh0cmFGaW5nZXJwcmludCIsInRyYW5zYWN0aW9uSWQiLCJyVHJhY2VyIiwiaWQiLCJFeGVjdXRpb25Nb2RlIiwiRGV2ZWxvcG1lbnRNb2RlIiwiUHJvZHVjdGlvbk1vZGUiLCJDbHVzdGVyaW5nTW9kZSIsIk1hc3RlclByb2Nlc3MiLCJXb3JrZXJQcm9jZXNzIiwiZXhlY3V0aW9uTW9kZSIsImVudmlyb25tZW50cyIsIk5PREVfRU5WIiwiY2x1c3RlciIsImlzUHJpbWFyeSIsImlzTWFzdGVyIiwiZGVjb3JhdGVTdGF0dXNDb2RlIiwic3RhdHVzQ29kZSIsImdyb3VwT2ZDb2RlIiwiTWF0aCIsImZsb29yIiwiTnVtYmVyIiwiYmFzZU1lc3NhZ2UiLCJTVEFUVVNfQ09ERVMiLCJncmVlbiIsIm1hZ2VudGEiLCJyZWQiLCJmb3JtYXRGb3JNb3JnYW4iLCJ0b2tlbnMiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJfIiwidG9rZW4iLCJzdWJBcmdzIiwibWV0aG9kIiwiVVJMIiwiaHR0cFZlcnNpb24iLCJjb250ZW50TGVuZ3RoIiwicmVzcG9uc2VUaW1lIiwiJG1ldGhvZCIsIiR2ZXJzaW9uIiwicmdiIiwiJHN0YXR1c0NvZGUiLCIkY29udGVudExlbmd0aCIsInByZXR0eUJ5dGVzIiwiJHJlc3BvbnNlVGltZSIsInByZXR0eU1zIiwibWV0YWRhdGEiLCJtb3JnYW4iLCJjb21iaW5lZCIsIkNvbnNvbGUiLCJDb25zb2xlVHJhbnNwb3J0Iiwid2luc3RvbiIsInRyYW5zcG9ydHMiLCJLZXlPZkluc3RhbmNlIiwiX1N5bWJvbCIsIktleU9mUGFzc3BvcnQiLCJMb2dnZXIiLCJjcmVhdGVMb2dnZXIiLCJsZXZlbHMiLCJfZmlsdGVySW5zdGFuY2VQcm9wZXJ0eSIsImxvZGFzaCIsImZyb21QYWlycyIsInZhbHVlIiwiZm9ybWF0Rm9yQ0xJIiwiZXhpdE9uRXJyb3IiLCJzdHJlYW0iLCJQYXNzVGhyb3VnaCIsIm9iamVjdE1vZGUiLCJvbiIsImxvZyIsIl90cmltSW5zdGFuY2VQcm9wZXJ0eSIsImNvbnN0cnVjdG9yIiwicGFzc3BvcnQiLCJSZWZlcmVuY2VFcnJvciIsImluc3RhbmNlIiwiUmVmbGVjdCIsImhhc093bk1ldGFkYXRhIiwiZ2V0T3duTWV0YWRhdGEiLCJkZWZpbmVNZXRhZGF0YSIsImFyZ3MiLCJsb2dnZXIiLCJIdHRwUmVxdWVzdCIsIkh0dHBSZXNwb25zZSIsIlByb21pc2UiLCJmcm9tQ2FsbGJhY2siLCJjYWxsYmFj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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cichol/logger",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "A logger based on `winston` for personal projects.",
|
|
5
5
|
"homepage": "https://github.com/morrighan/packages",
|
|
6
6
|
"bugs": {
|
|
@@ -12,15 +12,22 @@
|
|
|
12
12
|
"email": "contact@cichol.com",
|
|
13
13
|
"url": "https://www.cichol.com/"
|
|
14
14
|
},
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"lib": "releases"
|
|
20
|
-
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dists/index.cjs",
|
|
17
|
+
"module": "./dists/index.js",
|
|
18
|
+
"types": "./dists/index.d.ts",
|
|
21
19
|
"exports": {
|
|
22
|
-
"
|
|
23
|
-
|
|
20
|
+
".": {
|
|
21
|
+
"import": {
|
|
22
|
+
"default": "./dists/index.js",
|
|
23
|
+
"types": "./dists/index.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"default": "./dists/index.cjs",
|
|
27
|
+
"types": "./dists/index.d.cts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"./package.json": "./package.json"
|
|
24
31
|
},
|
|
25
32
|
"repository": {
|
|
26
33
|
"type": "git",
|
|
@@ -29,14 +36,14 @@
|
|
|
29
36
|
},
|
|
30
37
|
"scripts": {
|
|
31
38
|
"build": "npm run build:tsc",
|
|
32
|
-
"build:tsc": "npx tsc --project sources --outDir
|
|
39
|
+
"build:tsc": "npx tsc --project sources --outDir dists"
|
|
33
40
|
},
|
|
34
41
|
"dependencies": {
|
|
35
42
|
"bluebird": "^3.7.2",
|
|
36
43
|
"chalk": "^5.3.0",
|
|
37
44
|
"cli-highlight": "^2.1.11",
|
|
38
45
|
"cls-rtracer": "^2.6.3",
|
|
39
|
-
"core-js-pure": "^3.
|
|
46
|
+
"core-js-pure": "^3.39.0",
|
|
40
47
|
"lodash": "^4.17.21",
|
|
41
48
|
"luxon": "^3.5.0",
|
|
42
49
|
"morgan": "^1.10.0",
|