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