@nxtedition/logger 1.0.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/lib/logger.d.ts +9 -0
- package/lib/logger.js +83 -0
- package/lib/platform.d.ts +65 -0
- package/lib/platform.js +38 -0
- package/lib/serializers.d.ts +12 -0
- package/lib/serializers.js +353 -0
- package/package.json +23 -0
package/lib/logger.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Logger as PinoLogger, LoggerOptions as PinoLoggerOptions } from 'pino';
|
|
2
|
+
import type { SonicBoom } from 'sonic-boom';
|
|
3
|
+
export type Logger = PinoLogger;
|
|
4
|
+
interface LoggerOptions extends PinoLoggerOptions {
|
|
5
|
+
flushInterval?: number;
|
|
6
|
+
stream?: SonicBoom | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function createLogger({ level, flushInterval, stream, ...options }?: LoggerOptions, onTerminate?: unknown): Logger;
|
|
9
|
+
export {};
|
package/lib/logger.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { isMainThread } from 'node:worker_threads'
|
|
2
|
+
import serializers from './serializers.js'
|
|
3
|
+
import pino from 'pino'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const isProduction = process.env.NODE_ENV === 'production'
|
|
15
|
+
|
|
16
|
+
export function createLogger(
|
|
17
|
+
{
|
|
18
|
+
level = isProduction ? 'debug' : 'trace',
|
|
19
|
+
flushInterval = 1e3,
|
|
20
|
+
stream,
|
|
21
|
+
...options
|
|
22
|
+
} = {},
|
|
23
|
+
onTerminate ,
|
|
24
|
+
) {
|
|
25
|
+
if (!stream) {
|
|
26
|
+
if (
|
|
27
|
+
process.stdout.write !== process.stdout.constructor.prototype.write ||
|
|
28
|
+
process.stdout.fd == null
|
|
29
|
+
) {
|
|
30
|
+
stream = pino.destination(process.stdout)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (stream) {
|
|
35
|
+
// Do nothing...
|
|
36
|
+
} else if (!isProduction) {
|
|
37
|
+
stream = pino.destination({ fd: process.stdout.fd ?? 1, sync: true, fsync: false })
|
|
38
|
+
} else if (!isMainThread) {
|
|
39
|
+
// TODO (perf): Async mode doesn't work super well in workers.
|
|
40
|
+
stream = pino.destination({ fd: 1, sync: true, fsync: false })
|
|
41
|
+
} else {
|
|
42
|
+
stream = pino.destination({
|
|
43
|
+
sync: false,
|
|
44
|
+
fsync: false,
|
|
45
|
+
minLength: 4 * 1024,
|
|
46
|
+
maxWrite: 32 * 1024,
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
let flushing = 0
|
|
50
|
+
const onFlush = () => {
|
|
51
|
+
flushing--
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const flushTimeout = setInterval(() => {
|
|
55
|
+
if (flushing >= 10) {
|
|
56
|
+
try {
|
|
57
|
+
logger.warn('logger is flushing too slow')
|
|
58
|
+
stream?.flushSync()
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.error(err)
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
flushing++
|
|
64
|
+
stream?.flush(onFlush)
|
|
65
|
+
}
|
|
66
|
+
flushTimeout.refresh()
|
|
67
|
+
}, flushInterval).unref()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const logger = pino(
|
|
71
|
+
{
|
|
72
|
+
level,
|
|
73
|
+
...options,
|
|
74
|
+
serializers: {
|
|
75
|
+
...serializers,
|
|
76
|
+
...options.serializers,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
stream,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
return logger
|
|
83
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export declare const SIGNALS: {
|
|
2
|
+
129: string;
|
|
3
|
+
130: string;
|
|
4
|
+
131: string;
|
|
5
|
+
132: string;
|
|
6
|
+
133: string;
|
|
7
|
+
134: string;
|
|
8
|
+
135: string;
|
|
9
|
+
136: string;
|
|
10
|
+
137: string;
|
|
11
|
+
138: string;
|
|
12
|
+
139: string;
|
|
13
|
+
140: string;
|
|
14
|
+
141: string;
|
|
15
|
+
142: string;
|
|
16
|
+
143: string;
|
|
17
|
+
144: string;
|
|
18
|
+
145: string;
|
|
19
|
+
146: string;
|
|
20
|
+
147: string;
|
|
21
|
+
148: string;
|
|
22
|
+
149: string;
|
|
23
|
+
150: string;
|
|
24
|
+
151: string;
|
|
25
|
+
152: string;
|
|
26
|
+
153: string;
|
|
27
|
+
154: string;
|
|
28
|
+
155: string;
|
|
29
|
+
156: string;
|
|
30
|
+
157: string;
|
|
31
|
+
158: string;
|
|
32
|
+
159: string;
|
|
33
|
+
} | {
|
|
34
|
+
129?: undefined;
|
|
35
|
+
130?: undefined;
|
|
36
|
+
131?: undefined;
|
|
37
|
+
132?: undefined;
|
|
38
|
+
133?: undefined;
|
|
39
|
+
134?: undefined;
|
|
40
|
+
135?: undefined;
|
|
41
|
+
136?: undefined;
|
|
42
|
+
137?: undefined;
|
|
43
|
+
138?: undefined;
|
|
44
|
+
139?: undefined;
|
|
45
|
+
140?: undefined;
|
|
46
|
+
141?: undefined;
|
|
47
|
+
142?: undefined;
|
|
48
|
+
143?: undefined;
|
|
49
|
+
144?: undefined;
|
|
50
|
+
145?: undefined;
|
|
51
|
+
146?: undefined;
|
|
52
|
+
147?: undefined;
|
|
53
|
+
148?: undefined;
|
|
54
|
+
149?: undefined;
|
|
55
|
+
150?: undefined;
|
|
56
|
+
151?: undefined;
|
|
57
|
+
152?: undefined;
|
|
58
|
+
153?: undefined;
|
|
59
|
+
154?: undefined;
|
|
60
|
+
155?: undefined;
|
|
61
|
+
156?: undefined;
|
|
62
|
+
157?: undefined;
|
|
63
|
+
158?: undefined;
|
|
64
|
+
159?: undefined;
|
|
65
|
+
};
|
package/lib/platform.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const SIGNALS =
|
|
2
|
+
typeof process === 'object'
|
|
3
|
+
? process.platform === 'linux'
|
|
4
|
+
? {
|
|
5
|
+
129: 'SIGHUP', // 1
|
|
6
|
+
130: 'SIGINT', // 2
|
|
7
|
+
131: 'SIGQUIT', // 3
|
|
8
|
+
132: 'SIGILL', // 4
|
|
9
|
+
133: 'SIGTRAP', // 5
|
|
10
|
+
134: 'SIGABRT', // 6
|
|
11
|
+
135: 'SIGBUS', // 7
|
|
12
|
+
136: 'SIGFPE', // 8
|
|
13
|
+
137: 'SIGKILL', // 9
|
|
14
|
+
138: 'SIGUSR1', // 10
|
|
15
|
+
139: 'SIGSEGV', // 11
|
|
16
|
+
140: 'SIGUSR2', // 12
|
|
17
|
+
141: 'SIGPIPE', // 13
|
|
18
|
+
142: 'SIGALRM', // 14
|
|
19
|
+
143: 'SIGTERM', // 15
|
|
20
|
+
144: 'SIGSTKFLT', // 16
|
|
21
|
+
145: 'SIGCHLD', // 17
|
|
22
|
+
146: 'SIGCONT', // 18
|
|
23
|
+
147: 'SIGSTOP', // 19
|
|
24
|
+
148: 'SIGTSTP', // 20
|
|
25
|
+
149: 'SIGTTIN', // 21
|
|
26
|
+
150: 'SIGTTOU', // 22
|
|
27
|
+
151: 'SIGURG', // 23
|
|
28
|
+
152: 'SIGXCPU', // 24
|
|
29
|
+
153: 'SIGXFSZ', // 25
|
|
30
|
+
154: 'SIGVTALRM', // 26
|
|
31
|
+
155: 'SIGPROF', // 27
|
|
32
|
+
156: 'SIGWINCH', // 28
|
|
33
|
+
157: 'SIGIO', // 29
|
|
34
|
+
158: 'SIGPWR', // 30
|
|
35
|
+
159: 'SIGSYS', // 31
|
|
36
|
+
}
|
|
37
|
+
: {}
|
|
38
|
+
: {}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare namespace _default {
|
|
2
|
+
function err(err: any): any;
|
|
3
|
+
function error(err: any): any;
|
|
4
|
+
function errors(err: any): any;
|
|
5
|
+
function socket(socket: any): any;
|
|
6
|
+
function req(req: any): any;
|
|
7
|
+
function ureq(ureq: any): any;
|
|
8
|
+
function res(res: any): any;
|
|
9
|
+
function ures(ures: any): any;
|
|
10
|
+
}
|
|
11
|
+
export default _default;
|
|
12
|
+
export const rawSymbol: unique symbol;
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { SIGNALS } from './platform.ts'
|
|
2
|
+
import { parseHeaders } from '@nxtedition/nxt-undici'
|
|
3
|
+
import requestTarget from 'request-target'
|
|
4
|
+
import querystring from 'fast-querystring'
|
|
5
|
+
|
|
6
|
+
function getHeader(obj, key) {
|
|
7
|
+
return !obj || !key
|
|
8
|
+
? undefined
|
|
9
|
+
: obj.headers?.[key] || obj.headers?.get?.(key) || obj.getHeader?.(key)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getHeaders(obj) {
|
|
13
|
+
if (!obj) {
|
|
14
|
+
return undefined
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (obj.getHeaders) {
|
|
18
|
+
return obj.getHeaders()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (obj.headers) {
|
|
22
|
+
return Array.isArray(obj.headers) ? parseHeaders(obj.headers) : obj.headers
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (obj.headers?.entries) {
|
|
26
|
+
return Object.fromEntries(obj.headers.entries())
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getUrl(obj) {
|
|
33
|
+
if (!obj) {
|
|
34
|
+
return undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const { origin, path, hostname, protocol, port, url } = obj
|
|
38
|
+
|
|
39
|
+
if (typeof url === 'string' && url) {
|
|
40
|
+
return url
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const href = url?.href
|
|
44
|
+
if (typeof href === 'string' && href) {
|
|
45
|
+
return href
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (origin && (!path || typeof path === 'string')) {
|
|
49
|
+
if (typeof origin === 'object') {
|
|
50
|
+
return `${origin.protocol || 'http:'}//${origin.hostname}:${origin.port || { 'http:': 80, 'https:': 443 }[origin.protocol]}${path || ''}`
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (typeof origin === 'string') {
|
|
54
|
+
if (path?.startsWith('/') && origin.endsWith('/')) {
|
|
55
|
+
return `${origin.slice(0, -1)}${path || ''}`
|
|
56
|
+
} else {
|
|
57
|
+
return `${origin}${path || ''}`
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (typeof hostname === 'string') {
|
|
63
|
+
return `${protocol || 'http:'}//${hostname}:${port || { 'http:': 80, 'https:': 443 }[protocol || 'http:']}${path || ''}`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (typeof path === 'string' && path) {
|
|
67
|
+
return path
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return null
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function getTarget(obj) {
|
|
74
|
+
if (!obj) {
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
if (obj.target) {
|
|
80
|
+
return obj.target
|
|
81
|
+
}
|
|
82
|
+
if (typeof obj.url === 'string') {
|
|
83
|
+
return requestTarget(
|
|
84
|
+
obj.headers ? obj : { url: obj.url, headers: obj.headers ?? {}, socket: obj.socket },
|
|
85
|
+
)
|
|
86
|
+
} else {
|
|
87
|
+
const { origin, path, hostname, protocol, port, search, query } = obj
|
|
88
|
+
return {
|
|
89
|
+
origin,
|
|
90
|
+
protocol: protocol || undefined,
|
|
91
|
+
hostname: hostname || undefined,
|
|
92
|
+
port: port || undefined,
|
|
93
|
+
pathname: path || undefined,
|
|
94
|
+
search:
|
|
95
|
+
search ||
|
|
96
|
+
(typeof query === 'object' && query != null ? querystring.stringify(query) : undefined),
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
return undefined
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// TODO(fix): What if url is instanceof URL?
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export default {
|
|
107
|
+
err: (err) => errSerializer(err),
|
|
108
|
+
error: (err) => errSerializer(err),
|
|
109
|
+
errors: (err) => errSerializer(err),
|
|
110
|
+
socket: (socket) =>
|
|
111
|
+
socket && {
|
|
112
|
+
id: socket.id || undefined,
|
|
113
|
+
version: socket.version || undefined,
|
|
114
|
+
user: socket.user || undefined,
|
|
115
|
+
userAgent: socket.userAgent || undefined,
|
|
116
|
+
remoteAddress: socket.remoteAddress || undefined,
|
|
117
|
+
headers: socket.headers,
|
|
118
|
+
},
|
|
119
|
+
req: (req) =>
|
|
120
|
+
req && {
|
|
121
|
+
id: req.id || getHeader(req, 'request-id'),
|
|
122
|
+
httpVersion: req.httpVersion,
|
|
123
|
+
method: req.method,
|
|
124
|
+
target: getTarget(req),
|
|
125
|
+
url: getUrl(req),
|
|
126
|
+
headers: getHeaders(req),
|
|
127
|
+
timing: req.timing,
|
|
128
|
+
bytesRead: req.bytesRead >= 0 ? req.bytesRead : undefined,
|
|
129
|
+
bytesReadPerSecond:
|
|
130
|
+
req.bytesReadPerSecond ??
|
|
131
|
+
(req.timing?.end > 0 && req.bytesRead > 0
|
|
132
|
+
? (req.bytesRead * 1e3) / req.timing.end
|
|
133
|
+
: undefined),
|
|
134
|
+
remoteAddress: req.socket?.remoteAddress,
|
|
135
|
+
remotePort: req.socket?.remotePort,
|
|
136
|
+
aborted: req.aborted,
|
|
137
|
+
closed: req.closed,
|
|
138
|
+
destroyed: req.destroyed,
|
|
139
|
+
},
|
|
140
|
+
ureq: (ureq) =>
|
|
141
|
+
ureq && {
|
|
142
|
+
id: ureq.id || getHeader(ureq, 'request-id'),
|
|
143
|
+
httpVersion: ureq.httpVersion,
|
|
144
|
+
method: ureq.method,
|
|
145
|
+
target: getTarget(ureq),
|
|
146
|
+
url: getUrl(ureq),
|
|
147
|
+
headers: getHeaders(ureq),
|
|
148
|
+
timing: ureq.timing,
|
|
149
|
+
bytesWritten: ureq.bytesWritten,
|
|
150
|
+
bytesReadPerSecond:
|
|
151
|
+
ureq.bytesWrittenPerSecond ??
|
|
152
|
+
(ureq.timing && ureq.timing.data > 0 && ureq.timing.end > 0
|
|
153
|
+
? (ureq.bytesWritten * 1e3) / (ureq.timing.end - ureq.timing.data)
|
|
154
|
+
: undefined),
|
|
155
|
+
body: typeof ureq.body === 'string' ? ureq.body : undefined,
|
|
156
|
+
},
|
|
157
|
+
res: (res) =>
|
|
158
|
+
res && {
|
|
159
|
+
id: res.id || getHeader(res, 'request-id') || getHeader(res.req, 'request-id'),
|
|
160
|
+
httpVersion: res.httpVersion,
|
|
161
|
+
headers: getHeaders(res),
|
|
162
|
+
statusCode: res.statusCode || res.status,
|
|
163
|
+
timing: res.timing,
|
|
164
|
+
bytesWritten: res.bytesWritten >= 0 ? res.bytesWritten : undefined,
|
|
165
|
+
bytesWrittenPerSecond:
|
|
166
|
+
res.bytesWrittenPerSecond ??
|
|
167
|
+
(res.timing?.end > 0 && res.bytesWritten > 0
|
|
168
|
+
? (res.bytesWritten * 1e3) / res.timing.end
|
|
169
|
+
: undefined),
|
|
170
|
+
headersSent: res.headersSent,
|
|
171
|
+
aborted: res.aborted,
|
|
172
|
+
closed: res.closed,
|
|
173
|
+
destroyed: res.destroyed,
|
|
174
|
+
},
|
|
175
|
+
ures: (ures) =>
|
|
176
|
+
ures && {
|
|
177
|
+
id: ures.id || getHeader(ures, 'request-id') || getHeader(ures.req, 'request-id'),
|
|
178
|
+
httpVersion: ures.httpVersion,
|
|
179
|
+
headers: getHeaders(ures),
|
|
180
|
+
statusCode: ures.statusCode ?? ures.status,
|
|
181
|
+
timing: ures.timing,
|
|
182
|
+
bytesRead: ures.bytesRead,
|
|
183
|
+
bytesReadPerSecond:
|
|
184
|
+
ures.bytesReadPerSecond ??
|
|
185
|
+
(ures.timing && ures.timing.data > 0 && ures.timing.end > 0
|
|
186
|
+
? (ures.bytesRead * 1e3) / (ures.timing.end - ures.timing.data)
|
|
187
|
+
: undefined),
|
|
188
|
+
body: typeof ures.body === 'string' ? ures.body : undefined,
|
|
189
|
+
},
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// TODO (fix): Merge with errros/serializeError.
|
|
193
|
+
// Note that 'data' here should be string while in "serializeError" it should be object.
|
|
194
|
+
// Maybe we should rename serializeError to makeErrorObject or somehting??
|
|
195
|
+
|
|
196
|
+
// Based on: https://github.com/pinojs/pino-std-serializers
|
|
197
|
+
|
|
198
|
+
const seen = Symbol('circular-ref-tag')
|
|
199
|
+
export const rawSymbol = Symbol('pino-raw-err-ref')
|
|
200
|
+
|
|
201
|
+
const pinoErrProto = Object.create(
|
|
202
|
+
{},
|
|
203
|
+
{
|
|
204
|
+
type: {
|
|
205
|
+
enumerable: true,
|
|
206
|
+
writable: true,
|
|
207
|
+
value: undefined,
|
|
208
|
+
},
|
|
209
|
+
message: {
|
|
210
|
+
enumerable: true,
|
|
211
|
+
writable: true,
|
|
212
|
+
value: undefined,
|
|
213
|
+
},
|
|
214
|
+
stack: {
|
|
215
|
+
enumerable: true,
|
|
216
|
+
writable: true,
|
|
217
|
+
value: undefined,
|
|
218
|
+
},
|
|
219
|
+
errors: {
|
|
220
|
+
enumerable: true,
|
|
221
|
+
writable: true,
|
|
222
|
+
value: undefined,
|
|
223
|
+
},
|
|
224
|
+
raw: {
|
|
225
|
+
enumerable: false,
|
|
226
|
+
get: function () {
|
|
227
|
+
return this[rawSymbol]
|
|
228
|
+
},
|
|
229
|
+
set: function (val) {
|
|
230
|
+
this[rawSymbol] = val
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
)
|
|
235
|
+
Object.defineProperty(pinoErrProto, rawSymbol, {
|
|
236
|
+
writable: true,
|
|
237
|
+
value: {},
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
function errSerializer(err) {
|
|
241
|
+
if (Array.isArray(err)) {
|
|
242
|
+
return err.length === 0 ? undefined : errSerializer({ message: '', errors: err })
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (!isErrorLike(err)) {
|
|
246
|
+
return undefined
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const errors = Array.isArray(err?.errors)
|
|
250
|
+
? err.errors.map((err) => errSerializer(err)).filter(Boolean)
|
|
251
|
+
: null
|
|
252
|
+
|
|
253
|
+
if (err.message === '' && errors != null && errors.length === 0) {
|
|
254
|
+
return undefined
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (err.message === '' && errors != null && errors.length === 1) {
|
|
258
|
+
return errSerializer(err.errors[0])
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
err[seen] = undefined // tag to prevent re-looking at this
|
|
262
|
+
const _err = Object.create(pinoErrProto)
|
|
263
|
+
_err.type =
|
|
264
|
+
Object.prototype.toString.call(err.constructor) === '[object Function]'
|
|
265
|
+
? err.constructor.name
|
|
266
|
+
: err.name
|
|
267
|
+
_err.name = err.name
|
|
268
|
+
_err.message = err.message
|
|
269
|
+
_err.stack = err.stack
|
|
270
|
+
|
|
271
|
+
if (errors != null) {
|
|
272
|
+
_err.errors = errors
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (isErrorLike(err.cause) && !Object.prototype.hasOwnProperty.call(err.cause, seen)) {
|
|
276
|
+
_err.cause = errSerializer(err.cause)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
for (const key in err) {
|
|
280
|
+
if (_err[key] === undefined) {
|
|
281
|
+
const val = err[key]
|
|
282
|
+
if (isErrorLike(val)) {
|
|
283
|
+
if (!Object.prototype.hasOwnProperty.call(val, seen)) {
|
|
284
|
+
_err[key] = errSerializer(val)
|
|
285
|
+
}
|
|
286
|
+
} else if (typeof val === 'bigint') {
|
|
287
|
+
_err[key] = `${val.toString()}`
|
|
288
|
+
} else if (val != null && !/^[A-Z0-9_]+$/.test(key)) {
|
|
289
|
+
_err[key] = val
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (_err.data != null && typeof _err.data !== 'string') {
|
|
295
|
+
try {
|
|
296
|
+
_err.data = JSON.stringify(_err.data, (k, v) => (typeof v === 'bigint' ? v.toString() : v), 2)
|
|
297
|
+
} catch {
|
|
298
|
+
// Do nothing...
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (_err.body != null && typeof _err.body !== 'string') {
|
|
303
|
+
try {
|
|
304
|
+
_err.body = JSON.stringify(_err.body, (k, v) => (typeof v === 'bigint' ? v.toString() : v), 2)
|
|
305
|
+
} catch {
|
|
306
|
+
// Do nothing...
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (_err.meta != null && typeof _err.meta !== 'string') {
|
|
311
|
+
try {
|
|
312
|
+
_err.meta = JSON.stringify(_err.meta, (k, v) => (typeof v === 'bigint' ? v.toString() : v), 2)
|
|
313
|
+
} catch {
|
|
314
|
+
// Do nothing...
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (_err.code != null && typeof _err.code !== 'string') {
|
|
319
|
+
_err.code = String(_err.code)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (_err.emitter != null && typeof _err.emitter === 'object') {
|
|
323
|
+
_err.emitter = undefined
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (_err.statusCode == null && _err.status != null) {
|
|
327
|
+
_err.statusCode = Number(_err.status) || undefined
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (_err.signalCode == null && _err.signal != null) {
|
|
331
|
+
_err.signalCode = SIGNALS[_err._signal] ?? _err._signal
|
|
332
|
+
} else if (_err.signalCode != null) {
|
|
333
|
+
_err.signalCode = SIGNALS[_err.signalCode] ?? _err.signalCode
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (_err.exitCode == null && _err.code != null && /^([A-Z]+|[a-z]+|[0-9]+)$/.test(_err.code)) {
|
|
337
|
+
_err.exitCode = String(_err.code)
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
delete err[seen] // clean up tag in case err is serialized again later
|
|
341
|
+
_err.raw = err
|
|
342
|
+
return _err
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const isErrorLike = (err) => {
|
|
346
|
+
return (
|
|
347
|
+
err &&
|
|
348
|
+
(typeof err.message === 'string' ||
|
|
349
|
+
typeof err.status === 'number' ||
|
|
350
|
+
typeof err.statusCode === 'number' ||
|
|
351
|
+
typeof err.code === 'string')
|
|
352
|
+
)
|
|
353
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nxtedition/logger",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib"
|
|
9
|
+
],
|
|
10
|
+
"license": "UNLICENSED",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "rimraf lib && mkdir -p lib && cp src/*.js lib/ && tsc && for f in src/*.ts; do [[ \"$f\" == *.test.ts ]] || { amaroc \"$f\" && mv \"${f%.ts}.js\" lib/; }; done",
|
|
13
|
+
"prepublishOnly": "yarn build",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"test": "node --test",
|
|
16
|
+
"test:ci": "node --test"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"fast-querystring": "^1.1.2",
|
|
20
|
+
"pino": "^10.3.1",
|
|
21
|
+
"request-target": "^1.0.2"
|
|
22
|
+
}
|
|
23
|
+
}
|