pino-testkit 10.4.5
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/.nojekyll +0 -0
- package/.prettierignore +1 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +30 -0
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/SECURITY.md +87 -0
- package/benchmarks/basic.bench.js +95 -0
- package/benchmarks/child-child.bench.js +52 -0
- package/benchmarks/child-creation.bench.js +73 -0
- package/benchmarks/child.bench.js +62 -0
- package/benchmarks/deep-object.bench.js +88 -0
- package/benchmarks/formatters.bench.js +50 -0
- package/benchmarks/internal/custom-levels.js +67 -0
- package/benchmarks/internal/just-pino-heavy.bench.js +76 -0
- package/benchmarks/internal/just-pino.bench.js +182 -0
- package/benchmarks/internal/parent-vs-child.bench.js +75 -0
- package/benchmarks/internal/redact.bench.js +86 -0
- package/benchmarks/long-string.bench.js +81 -0
- package/benchmarks/multi-arg.bench.js +193 -0
- package/benchmarks/multistream.js +98 -0
- package/benchmarks/object.bench.js +82 -0
- package/benchmarks/utils/generate-benchmark-doc.js +36 -0
- package/benchmarks/utils/runbench.js +138 -0
- package/benchmarks/utils/wrap-log-level.js +55 -0
- package/bin.js +6 -0
- package/browser.js +547 -0
- package/build/sync-version.js +25 -0
- package/docs/api.md +1593 -0
- package/docs/asynchronous.md +40 -0
- package/docs/benchmarks.md +55 -0
- package/docs/browser.md +278 -0
- package/docs/bundling.md +40 -0
- package/docs/child-loggers.md +95 -0
- package/docs/diagnostics.md +16 -0
- package/docs/ecosystem.md +86 -0
- package/docs/help.md +345 -0
- package/docs/lts.md +64 -0
- package/docs/pretty.md +35 -0
- package/docs/redaction.md +135 -0
- package/docs/transports.md +1376 -0
- package/docs/web.md +309 -0
- package/eslint.config.js +28 -0
- package/examples/basic.js +43 -0
- package/examples/transport.js +68 -0
- package/favicon.ico +0 -0
- package/file.js +12 -0
- package/inc-version.sh +42 -0
- package/index.html +55 -0
- package/lib/caller.js +30 -0
- package/lib/constants.js +28 -0
- package/lib/contract.js +8 -0
- package/lib/deprecations.js +8 -0
- package/lib/levels.js +241 -0
- package/lib/meta.js +3 -0
- package/lib/multistream.js +203 -0
- package/lib/proto.js +256 -0
- package/lib/redaction.js +114 -0
- package/lib/symbols.js +74 -0
- package/lib/time.js +39 -0
- package/lib/tools.js +427 -0
- package/lib/transport-stream.js +56 -0
- package/lib/transport.js +289 -0
- package/lib/worker.js +194 -0
- package/package.json +119 -0
- package/pino.d.ts +908 -0
- package/pino.js +240 -0
- package/test/basic.test.js +886 -0
- package/test/broken-pipe.test.js +59 -0
- package/test/browser-child.test.js +132 -0
- package/test/browser-disabled.test.js +87 -0
- package/test/browser-early-console-freeze.test.js +12 -0
- package/test/browser-is-level-enabled.test.js +101 -0
- package/test/browser-levels.test.js +241 -0
- package/test/browser-serializers.test.js +352 -0
- package/test/browser-timestamp.test.js +88 -0
- package/test/browser-transmit.test.js +417 -0
- package/test/browser.test.js +698 -0
- package/test/complex-objects.test.js +36 -0
- package/test/crlf.test.js +34 -0
- package/test/custom-levels.test.js +267 -0
- package/test/diagnostics.test.js +107 -0
- package/test/error-key.test.js +37 -0
- package/test/error.test.js +403 -0
- package/test/escaping.test.js +93 -0
- package/test/esm/esm.mjs +14 -0
- package/test/esm/index.test.js +21 -0
- package/test/esm/named-exports.mjs +29 -0
- package/test/exit.test.js +79 -0
- package/test/fixtures/broken-pipe/basic.js +9 -0
- package/test/fixtures/broken-pipe/destination.js +10 -0
- package/test/fixtures/broken-pipe/syncfalse.js +12 -0
- package/test/fixtures/console-transport.js +13 -0
- package/test/fixtures/crashing-transport.js +13 -0
- package/test/fixtures/default-exit.js +8 -0
- package/test/fixtures/destination-exit.js +8 -0
- package/test/fixtures/eval/index.js +13 -0
- package/test/fixtures/eval/node_modules/14-files.js +3 -0
- package/test/fixtures/eval/node_modules/2-files.js +3 -0
- package/test/fixtures/eval/node_modules/file1.js +5 -0
- package/test/fixtures/eval/node_modules/file10.js +5 -0
- package/test/fixtures/eval/node_modules/file11.js +5 -0
- package/test/fixtures/eval/node_modules/file12.js +5 -0
- package/test/fixtures/eval/node_modules/file13.js +5 -0
- package/test/fixtures/eval/node_modules/file14.js +11 -0
- package/test/fixtures/eval/node_modules/file2.js +5 -0
- package/test/fixtures/eval/node_modules/file3.js +5 -0
- package/test/fixtures/eval/node_modules/file4.js +5 -0
- package/test/fixtures/eval/node_modules/file5.js +5 -0
- package/test/fixtures/eval/node_modules/file6.js +5 -0
- package/test/fixtures/eval/node_modules/file7.js +5 -0
- package/test/fixtures/eval/node_modules/file8.js +5 -0
- package/test/fixtures/eval/node_modules/file9.js +5 -0
- package/test/fixtures/noop-transport.js +10 -0
- package/test/fixtures/pretty/null-prototype.js +8 -0
- package/test/fixtures/stdout-hack-protection.js +11 -0
- package/test/fixtures/syncfalse-child.js +6 -0
- package/test/fixtures/syncfalse-exit.js +9 -0
- package/test/fixtures/syncfalse-flush-exit.js +10 -0
- package/test/fixtures/syncfalse.js +6 -0
- package/test/fixtures/syntax-error-esm.mjs +2 -0
- package/test/fixtures/to-file-transport-with-transform.js +20 -0
- package/test/fixtures/to-file-transport.js +13 -0
- package/test/fixtures/to-file-transport.mjs +8 -0
- package/test/fixtures/transport/index.js +12 -0
- package/test/fixtures/transport/package.json +5 -0
- package/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
- package/test/fixtures/transport-exit-immediately.js +11 -0
- package/test/fixtures/transport-exit-on-ready.js +12 -0
- package/test/fixtures/transport-invalid-node-options.js +26 -0
- package/test/fixtures/transport-main.js +9 -0
- package/test/fixtures/transport-many-lines.js +29 -0
- package/test/fixtures/transport-preload-main.mjs +13 -0
- package/test/fixtures/transport-preload.mjs +13 -0
- package/test/fixtures/transport-string-stdout.js +9 -0
- package/test/fixtures/transport-transform.js +21 -0
- package/test/fixtures/transport-uses-pino-config.js +33 -0
- package/test/fixtures/transport-with-on-exit.js +12 -0
- package/test/fixtures/transport-worker-data.js +19 -0
- package/test/fixtures/transport-worker-name.js +24 -0
- package/test/fixtures/transport-worker.js +15 -0
- package/test/fixtures/transport-wrong-export-type.js +3 -0
- package/test/fixtures/ts/to-file-transport-native.mts +15 -0
- package/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
- package/test/fixtures/ts/to-file-transport.ts +11 -0
- package/test/fixtures/ts/transpile.cjs +36 -0
- package/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
- package/test/fixtures/ts/transport-exit-immediately.ts +10 -0
- package/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
- package/test/fixtures/ts/transport-main.ts +8 -0
- package/test/fixtures/ts/transport-string-stdout.ts +8 -0
- package/test/fixtures/ts/transport-worker.ts +14 -0
- package/test/formatters.test.js +364 -0
- package/test/helper.d.ts +4 -0
- package/test/helper.js +155 -0
- package/test/hooks.test.js +114 -0
- package/test/http.test.js +214 -0
- package/test/internals/version.test.js +17 -0
- package/test/is-level-enabled.test.js +179 -0
- package/test/jest/basic.spec.js +10 -0
- package/test/levels.test.js +810 -0
- package/test/metadata.test.js +120 -0
- package/test/mixin-merge-strategy.test.js +57 -0
- package/test/mixin.test.js +241 -0
- package/test/multistream.test.js +729 -0
- package/test/redact.test.js +893 -0
- package/test/serializers.test.js +257 -0
- package/test/stdout-protection.test.js +41 -0
- package/test/syncfalse.test.js +186 -0
- package/test/timestamp-nano.test.js +37 -0
- package/test/timestamp.test.js +124 -0
- package/test/transport/big.test.js +42 -0
- package/test/transport/bundlers-support.test.js +99 -0
- package/test/transport/caller.test.js +24 -0
- package/test/transport/core.test.js +733 -0
- package/test/transport/core.transpiled.test.ts +114 -0
- package/test/transport/crash.test.js +36 -0
- package/test/transport/module-link.test.js +241 -0
- package/test/transport/native-type-stripping.test.mjs +151 -0
- package/test/transport/node-options.test.js +116 -0
- package/test/transport/pipeline.test.js +137 -0
- package/test/transport/preload.test.js +54 -0
- package/test/transport/repl.test.js +15 -0
- package/test/transport/sync-false.test.js +67 -0
- package/test/transport/sync-true.test.js +57 -0
- package/test/transport/targets.test.js +48 -0
- package/test/transport/uses-pino-config.test.js +166 -0
- package/test/transport-stream.test.js +40 -0
- package/test/types/pino-import.test-d.cts +30 -0
- package/test/types/pino-multistream.test-d.ts +28 -0
- package/test/types/pino-top-export.test-d.ts +34 -0
- package/test/types/pino-transport.test-d.ts +156 -0
- package/test/types/pino-type-only.test-d.ts +75 -0
- package/test/types/pino.test-d.ts +683 -0
- package/test/types/pino.ts +91 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const test = require('node:test')
|
|
4
|
+
const assert = require('node:assert')
|
|
5
|
+
const { PassThrough } = require('node:stream')
|
|
6
|
+
|
|
7
|
+
const { sink, once } = require('./helper')
|
|
8
|
+
const pino = require('../')
|
|
9
|
+
|
|
10
|
+
test('Proxy and stream objects', async () => {
|
|
11
|
+
const s = new PassThrough()
|
|
12
|
+
s.resume()
|
|
13
|
+
s.write('', () => {})
|
|
14
|
+
const obj = { s, p: new Proxy({}, { get () { throw new Error('kaboom') } }) }
|
|
15
|
+
const stream = sink()
|
|
16
|
+
const instance = pino(stream)
|
|
17
|
+
instance.info({ obj })
|
|
18
|
+
|
|
19
|
+
const result = await once(stream, 'data')
|
|
20
|
+
|
|
21
|
+
assert.equal(result.obj, '[unable to serialize, circular reference is too complex to analyze]')
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('Proxy and stream objects', async () => {
|
|
25
|
+
const s = new PassThrough()
|
|
26
|
+
s.resume()
|
|
27
|
+
s.write('', () => {})
|
|
28
|
+
const obj = { s, p: new Proxy({}, { get () { throw new Error('kaboom') } }) }
|
|
29
|
+
const stream = sink()
|
|
30
|
+
const instance = pino(stream)
|
|
31
|
+
instance.info(obj)
|
|
32
|
+
|
|
33
|
+
const result = await once(stream, 'data')
|
|
34
|
+
|
|
35
|
+
assert.equal(result.p, '[unable to serialize, circular reference is too complex to analyze]')
|
|
36
|
+
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const test = require('node:test')
|
|
4
|
+
const assert = require('node:assert')
|
|
5
|
+
|
|
6
|
+
const writer = require('flush-write-stream')
|
|
7
|
+
const pino = require('../')
|
|
8
|
+
|
|
9
|
+
function capture () {
|
|
10
|
+
const ws = writer((chunk, enc, cb) => {
|
|
11
|
+
ws.data += chunk.toString()
|
|
12
|
+
cb()
|
|
13
|
+
})
|
|
14
|
+
ws.data = ''
|
|
15
|
+
return ws
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
test('pino uses LF by default', async () => {
|
|
19
|
+
const stream = capture()
|
|
20
|
+
const logger = pino(stream)
|
|
21
|
+
logger.info('foo')
|
|
22
|
+
logger.error('bar')
|
|
23
|
+
assert.ok(/foo[^\r\n]+\n[^\r\n]+bar[^\r\n]+\n/.test(stream.data))
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('pino can log CRLF', async () => {
|
|
27
|
+
const stream = capture()
|
|
28
|
+
const logger = pino({
|
|
29
|
+
crlf: true
|
|
30
|
+
}, stream)
|
|
31
|
+
logger.info('foo')
|
|
32
|
+
logger.error('bar')
|
|
33
|
+
assert.ok(/foo[^\n]+\r\n[^\n]+bar[^\n]+\r\n/.test(stream.data))
|
|
34
|
+
})
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
/* eslint no-prototype-builtins: 0 */
|
|
4
|
+
|
|
5
|
+
const test = require('node:test')
|
|
6
|
+
const assert = require('node:assert')
|
|
7
|
+
|
|
8
|
+
const { sink, once } = require('./helper')
|
|
9
|
+
const pino = require('../')
|
|
10
|
+
|
|
11
|
+
// Silence all warnings for this test
|
|
12
|
+
process.removeAllListeners('warning')
|
|
13
|
+
process.on('warning', () => {})
|
|
14
|
+
|
|
15
|
+
test('adds additional levels', async () => {
|
|
16
|
+
const stream = sink()
|
|
17
|
+
const logger = pino({
|
|
18
|
+
customLevels: {
|
|
19
|
+
foo: 35,
|
|
20
|
+
bar: 45
|
|
21
|
+
}
|
|
22
|
+
}, stream)
|
|
23
|
+
|
|
24
|
+
logger.foo('test')
|
|
25
|
+
const { level } = await once(stream, 'data')
|
|
26
|
+
assert.equal(level, 35)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('custom levels does not override default levels', async () => {
|
|
30
|
+
const stream = sink()
|
|
31
|
+
const logger = pino({
|
|
32
|
+
customLevels: {
|
|
33
|
+
foo: 35
|
|
34
|
+
}
|
|
35
|
+
}, stream)
|
|
36
|
+
|
|
37
|
+
logger.info('test')
|
|
38
|
+
const { level } = await once(stream, 'data')
|
|
39
|
+
assert.equal(level, 30)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('default levels can be redefined using custom levels', async () => {
|
|
43
|
+
const stream = sink()
|
|
44
|
+
const logger = pino({
|
|
45
|
+
customLevels: {
|
|
46
|
+
info: 35,
|
|
47
|
+
debug: 45
|
|
48
|
+
},
|
|
49
|
+
useOnlyCustomLevels: true
|
|
50
|
+
}, stream)
|
|
51
|
+
|
|
52
|
+
assert.equal(logger.hasOwnProperty('info'), true)
|
|
53
|
+
|
|
54
|
+
logger.info('test')
|
|
55
|
+
const { level } = await once(stream, 'data')
|
|
56
|
+
assert.equal(level, 35)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test('custom levels overrides default level label if use useOnlyCustomLevels', async () => {
|
|
60
|
+
const stream = sink()
|
|
61
|
+
const logger = pino({
|
|
62
|
+
customLevels: {
|
|
63
|
+
foo: 35
|
|
64
|
+
},
|
|
65
|
+
useOnlyCustomLevels: true,
|
|
66
|
+
level: 'foo'
|
|
67
|
+
}, stream)
|
|
68
|
+
|
|
69
|
+
assert.equal(logger.hasOwnProperty('info'), false)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test('custom levels overrides default level value if use useOnlyCustomLevels', async () => {
|
|
73
|
+
const stream = sink()
|
|
74
|
+
const logger = pino({
|
|
75
|
+
customLevels: {
|
|
76
|
+
foo: 35
|
|
77
|
+
},
|
|
78
|
+
useOnlyCustomLevels: true,
|
|
79
|
+
level: 35
|
|
80
|
+
}, stream)
|
|
81
|
+
|
|
82
|
+
assert.equal(logger.hasOwnProperty('info'), false)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
test('custom levels are inherited by children', async () => {
|
|
86
|
+
const stream = sink()
|
|
87
|
+
const logger = pino({
|
|
88
|
+
customLevels: {
|
|
89
|
+
foo: 35
|
|
90
|
+
}
|
|
91
|
+
}, stream)
|
|
92
|
+
|
|
93
|
+
logger.child({ childMsg: 'ok' }).foo('test')
|
|
94
|
+
const { msg, childMsg, level } = await once(stream, 'data')
|
|
95
|
+
assert.equal(level, 35)
|
|
96
|
+
assert.equal(childMsg, 'ok')
|
|
97
|
+
assert.equal(msg, 'test')
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
test('custom levels can be specified on child bindings', async () => {
|
|
101
|
+
const stream = sink()
|
|
102
|
+
const logger = pino(stream).child({
|
|
103
|
+
childMsg: 'ok'
|
|
104
|
+
}, {
|
|
105
|
+
customLevels: {
|
|
106
|
+
foo: 35
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
logger.foo('test')
|
|
111
|
+
const { msg, childMsg, level } = await once(stream, 'data')
|
|
112
|
+
assert.equal(level, 35)
|
|
113
|
+
assert.equal(childMsg, 'ok')
|
|
114
|
+
assert.equal(msg, 'test')
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
test('customLevels property child bindings does not get logged', async () => {
|
|
118
|
+
const stream = sink()
|
|
119
|
+
const logger = pino(stream).child({
|
|
120
|
+
childMsg: 'ok'
|
|
121
|
+
}, {
|
|
122
|
+
customLevels: {
|
|
123
|
+
foo: 35
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
logger.foo('test')
|
|
128
|
+
const { customLevels } = await once(stream, 'data')
|
|
129
|
+
assert.equal(customLevels, undefined)
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
test('throws when specifying pre-existing parent labels via child bindings', async () => {
|
|
133
|
+
const stream = sink()
|
|
134
|
+
assert.throws(
|
|
135
|
+
() => pino({
|
|
136
|
+
customLevels: {
|
|
137
|
+
foo: 35
|
|
138
|
+
}
|
|
139
|
+
}, stream).child({}, {
|
|
140
|
+
customLevels: {
|
|
141
|
+
foo: 45
|
|
142
|
+
}
|
|
143
|
+
}),
|
|
144
|
+
/levels cannot be overridden/
|
|
145
|
+
)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test('throws when specifying pre-existing parent values via child bindings', async () => {
|
|
149
|
+
const stream = sink()
|
|
150
|
+
assert.throws(
|
|
151
|
+
() => pino({
|
|
152
|
+
customLevels: {
|
|
153
|
+
foo: 35
|
|
154
|
+
}
|
|
155
|
+
}, stream).child({}, {
|
|
156
|
+
customLevels: {
|
|
157
|
+
bar: 35
|
|
158
|
+
}
|
|
159
|
+
}),
|
|
160
|
+
/pre-existing level values cannot be used for new levels/
|
|
161
|
+
)
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
test('throws when specifying core values via child bindings', async () => {
|
|
165
|
+
const stream = sink()
|
|
166
|
+
assert.throws(
|
|
167
|
+
() => pino(stream).child({}, {
|
|
168
|
+
customLevels: {
|
|
169
|
+
foo: 30
|
|
170
|
+
}
|
|
171
|
+
}),
|
|
172
|
+
/pre-existing level values cannot be used for new levels/
|
|
173
|
+
)
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
test('throws when useOnlyCustomLevels is set true without customLevels', async () => {
|
|
177
|
+
const stream = sink()
|
|
178
|
+
assert.throws(
|
|
179
|
+
() => pino({
|
|
180
|
+
useOnlyCustomLevels: true
|
|
181
|
+
}, stream),
|
|
182
|
+
/customLevels is required if useOnlyCustomLevels is set true/
|
|
183
|
+
)
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
test('custom level on one instance does not affect other instances', async () => {
|
|
187
|
+
pino({
|
|
188
|
+
customLevels: {
|
|
189
|
+
foo: 37
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
assert.equal(typeof pino().foo, 'undefined')
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
test('setting level below or at custom level will successfully log', async () => {
|
|
196
|
+
const stream = sink()
|
|
197
|
+
const instance = pino({ customLevels: { foo: 35 } }, stream)
|
|
198
|
+
instance.level = 'foo'
|
|
199
|
+
instance.info('nope')
|
|
200
|
+
instance.foo('bar')
|
|
201
|
+
const { msg } = await once(stream, 'data')
|
|
202
|
+
assert.equal(msg, 'bar')
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
test('custom level below level threshold will not log', async () => {
|
|
206
|
+
const stream = sink()
|
|
207
|
+
const instance = pino({ customLevels: { foo: 15 } }, stream)
|
|
208
|
+
instance.level = 'info'
|
|
209
|
+
instance.info('bar')
|
|
210
|
+
instance.foo('nope')
|
|
211
|
+
const { msg } = await once(stream, 'data')
|
|
212
|
+
assert.equal(msg, 'bar')
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
test('does not share custom level state across siblings', async () => {
|
|
216
|
+
const stream = sink()
|
|
217
|
+
const logger = pino(stream)
|
|
218
|
+
logger.child({}, {
|
|
219
|
+
customLevels: { foo: 35 }
|
|
220
|
+
})
|
|
221
|
+
assert.doesNotThrow(() => {
|
|
222
|
+
logger.child({}, {
|
|
223
|
+
customLevels: { foo: 35 }
|
|
224
|
+
})
|
|
225
|
+
})
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
test('custom level does not affect the levels serializer', async () => {
|
|
229
|
+
const stream = sink()
|
|
230
|
+
const logger = pino({
|
|
231
|
+
customLevels: {
|
|
232
|
+
foo: 35,
|
|
233
|
+
bar: 45
|
|
234
|
+
},
|
|
235
|
+
formatters: {
|
|
236
|
+
level (label, number) {
|
|
237
|
+
return { priority: number }
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}, stream)
|
|
241
|
+
|
|
242
|
+
logger.foo('test')
|
|
243
|
+
const { priority } = await once(stream, 'data')
|
|
244
|
+
assert.equal(priority, 35)
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
test('When useOnlyCustomLevels is set to true, the level formatter should only get custom levels', async () => {
|
|
248
|
+
const stream = sink()
|
|
249
|
+
const logger = pino({
|
|
250
|
+
customLevels: {
|
|
251
|
+
answer: 42
|
|
252
|
+
},
|
|
253
|
+
useOnlyCustomLevels: true,
|
|
254
|
+
level: 42,
|
|
255
|
+
formatters: {
|
|
256
|
+
level (label, number) {
|
|
257
|
+
assert.equal(label, 'answer')
|
|
258
|
+
assert.equal(number, 42)
|
|
259
|
+
return { level: number }
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}, stream)
|
|
263
|
+
|
|
264
|
+
logger.answer('test')
|
|
265
|
+
const { level } = await once(stream, 'data')
|
|
266
|
+
assert.equal(level, 42)
|
|
267
|
+
})
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const test = require('node:test')
|
|
4
|
+
const os = require('node:os')
|
|
5
|
+
const diagChan = require('node:diagnostics_channel')
|
|
6
|
+
const { AsyncLocalStorage } = require('node:async_hooks')
|
|
7
|
+
const { Writable } = require('node:stream')
|
|
8
|
+
const tspl = require('@matteo.collina/tspl')
|
|
9
|
+
const pino = require('../pino')
|
|
10
|
+
|
|
11
|
+
const hostname = os.hostname()
|
|
12
|
+
const { pid } = process
|
|
13
|
+
const AS_JSON_START = 'tracing:pino_asJson:start'
|
|
14
|
+
const AS_JSON_END = 'tracing:pino_asJson:end'
|
|
15
|
+
|
|
16
|
+
// Skip tests if diagnostics_channel.tracingChannel is not available (Node < 18.19)
|
|
17
|
+
const skip = typeof diagChan.tracingChannel !== 'function'
|
|
18
|
+
|
|
19
|
+
test.beforeEach(ctx => {
|
|
20
|
+
ctx.pino = {
|
|
21
|
+
ts: 1757512800000, // 2025-09-10T10:00:00.000-05:00
|
|
22
|
+
now: Date.now
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Date.now = () => ctx.pino.ts
|
|
26
|
+
|
|
27
|
+
ctx.pino.dest = new Writable({
|
|
28
|
+
objectMode: true,
|
|
29
|
+
write (data, enc, cb) {
|
|
30
|
+
cb()
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test.afterEach(ctx => {
|
|
36
|
+
Date.now = ctx.pino.now
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('asJson emits events', { skip }, async (t) => {
|
|
40
|
+
const plan = tspl(t, { plan: 8 })
|
|
41
|
+
const { dest } = t.pino
|
|
42
|
+
const logger = pino({}, dest)
|
|
43
|
+
const expectedArguments = [
|
|
44
|
+
{},
|
|
45
|
+
'testing',
|
|
46
|
+
30,
|
|
47
|
+
`,"time":${t.pino.ts}`
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
let startEvent
|
|
51
|
+
diagChan.subscribe(AS_JSON_START, startHandler)
|
|
52
|
+
diagChan.subscribe(AS_JSON_END, endHandler)
|
|
53
|
+
|
|
54
|
+
logger.info('testing')
|
|
55
|
+
await plan
|
|
56
|
+
|
|
57
|
+
diagChan.unsubscribe(AS_JSON_START, startHandler)
|
|
58
|
+
diagChan.unsubscribe(AS_JSON_END, endHandler)
|
|
59
|
+
|
|
60
|
+
function startHandler (event) {
|
|
61
|
+
startEvent = event
|
|
62
|
+
plan.equal(Object.prototype.toString.call(event.instance), '[object Pino]')
|
|
63
|
+
plan.equal(event.instance === logger, true)
|
|
64
|
+
plan.deepStrictEqual(Array.from(event.arguments ?? []), expectedArguments)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function endHandler (event) {
|
|
68
|
+
plan.equal(Object.prototype.toString.call(event.instance), '[object Pino]')
|
|
69
|
+
plan.equal(event.instance === logger, true)
|
|
70
|
+
plan.deepStrictEqual(Array.from(event.arguments ?? []), expectedArguments)
|
|
71
|
+
plan.equal(
|
|
72
|
+
event.result,
|
|
73
|
+
`{"level":30,"time":${t.pino.ts},"pid":${pid},"hostname":"${hostname}","msg":"testing"}\n`
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
plan.equal(event.arguments === startEvent.arguments, true, 'same event object is supplied to both events')
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
test('asJson context is not lost', { skip }, async (t) => {
|
|
81
|
+
const plan = tspl(t, { plan: 2 })
|
|
82
|
+
const { dest } = t.pino
|
|
83
|
+
const logger = pino({}, dest)
|
|
84
|
+
const asyncLocalStorage = new AsyncLocalStorage()
|
|
85
|
+
const localStore = { foo: 'bar' }
|
|
86
|
+
|
|
87
|
+
diagChan.subscribe(AS_JSON_START, startHandler)
|
|
88
|
+
diagChan.subscribe(AS_JSON_END, endHandler)
|
|
89
|
+
|
|
90
|
+
asyncLocalStorage.run(localStore, () => {
|
|
91
|
+
logger.info('testing')
|
|
92
|
+
})
|
|
93
|
+
await plan
|
|
94
|
+
|
|
95
|
+
diagChan.unsubscribe(AS_JSON_START, startHandler)
|
|
96
|
+
diagChan.unsubscribe(AS_JSON_END, endHandler)
|
|
97
|
+
|
|
98
|
+
function startHandler () {
|
|
99
|
+
const store = asyncLocalStorage.getStore()
|
|
100
|
+
plan.equal(store === localStore, true)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function endHandler () {
|
|
104
|
+
const store = asyncLocalStorage.getStore()
|
|
105
|
+
plan.equal(store === localStore, true)
|
|
106
|
+
}
|
|
107
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const test = require('node:test')
|
|
4
|
+
const assert = require('node:assert')
|
|
5
|
+
|
|
6
|
+
const { sink, once } = require('./helper')
|
|
7
|
+
const stdSerializers = require('pino-std-serializers')
|
|
8
|
+
const pino = require('../')
|
|
9
|
+
|
|
10
|
+
test('set the errorKey with error serializer', async () => {
|
|
11
|
+
const stream = sink()
|
|
12
|
+
const errorKey = 'error'
|
|
13
|
+
const instance = pino({
|
|
14
|
+
errorKey,
|
|
15
|
+
serializers: { [errorKey]: stdSerializers.err }
|
|
16
|
+
}, stream)
|
|
17
|
+
instance.error(new ReferenceError('test'))
|
|
18
|
+
const o = await once(stream, 'data')
|
|
19
|
+
assert.equal(typeof o[errorKey], 'object')
|
|
20
|
+
assert.equal(o[errorKey].type, 'ReferenceError')
|
|
21
|
+
assert.equal(o[errorKey].message, 'test')
|
|
22
|
+
assert.equal(typeof o[errorKey].stack, 'string')
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('set the errorKey without error serializer', async () => {
|
|
26
|
+
const stream = sink()
|
|
27
|
+
const errorKey = 'error'
|
|
28
|
+
const instance = pino({
|
|
29
|
+
errorKey
|
|
30
|
+
}, stream)
|
|
31
|
+
instance.error(new ReferenceError('test'))
|
|
32
|
+
const o = await once(stream, 'data')
|
|
33
|
+
assert.equal(typeof o[errorKey], 'object')
|
|
34
|
+
assert.equal(o[errorKey].type, 'ReferenceError')
|
|
35
|
+
assert.equal(o[errorKey].message, 'test')
|
|
36
|
+
assert.equal(typeof o[errorKey].stack, 'string')
|
|
37
|
+
})
|