chalk-config 0.0.1-security → 2.14.7

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.

Potentially problematic release.


This version of chalk-config might be problematic. Click here for more details.

Files changed (200) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +8 -0
  3. package/.github/dependabot.yml +13 -0
  4. package/.github/workflows/bench.yml +61 -0
  5. package/.github/workflows/ci.yml +88 -0
  6. package/.github/workflows/lock-threads.yml +30 -0
  7. package/.github/workflows/target-main.yml +23 -0
  8. package/.nojekyll +0 -0
  9. package/.prettierignore +1 -0
  10. package/.taprc.yaml +8 -0
  11. package/CNAME +1 -0
  12. package/CONTRIBUTING.md +30 -0
  13. package/LICENSE +21 -0
  14. package/README.md +159 -3
  15. package/SECURITY.md +68 -0
  16. package/benchmarks/basic.bench.js +95 -0
  17. package/benchmarks/child-child.bench.js +52 -0
  18. package/benchmarks/child-creation.bench.js +73 -0
  19. package/benchmarks/child.bench.js +62 -0
  20. package/benchmarks/deep-object.bench.js +88 -0
  21. package/benchmarks/formatters.bench.js +50 -0
  22. package/benchmarks/internal/custom-levels.js +67 -0
  23. package/benchmarks/internal/just-pino-heavy.bench.js +76 -0
  24. package/benchmarks/internal/just-pino.bench.js +182 -0
  25. package/benchmarks/internal/parent-vs-child.bench.js +75 -0
  26. package/benchmarks/internal/redact.bench.js +86 -0
  27. package/benchmarks/long-string.bench.js +81 -0
  28. package/benchmarks/multi-arg.bench.js +193 -0
  29. package/benchmarks/multistream.js +98 -0
  30. package/benchmarks/object.bench.js +82 -0
  31. package/benchmarks/utils/generate-benchmark-doc.js +36 -0
  32. package/benchmarks/utils/runbench.js +138 -0
  33. package/benchmarks/utils/wrap-log-level.js +55 -0
  34. package/bin.js +6 -0
  35. package/browser.js +484 -0
  36. package/build/sync-version.js +10 -0
  37. package/docs/api.md +1487 -0
  38. package/docs/asynchronous.md +40 -0
  39. package/docs/benchmarks.md +55 -0
  40. package/docs/browser.md +227 -0
  41. package/docs/bundling.md +40 -0
  42. package/docs/child-loggers.md +95 -0
  43. package/docs/ecosystem.md +84 -0
  44. package/docs/help.md +345 -0
  45. package/docs/lts.md +64 -0
  46. package/docs/pretty.md +35 -0
  47. package/docs/redaction.md +135 -0
  48. package/docs/transports.md +1238 -0
  49. package/docs/web.md +269 -0
  50. package/docsify/sidebar.md +26 -0
  51. package/examples/basic.js +43 -0
  52. package/examples/transport.js +68 -0
  53. package/favicon-16x16.png +0 -0
  54. package/favicon-32x32.png +0 -0
  55. package/favicon.ico +0 -0
  56. package/file.js +12 -0
  57. package/inc-version.sh +42 -0
  58. package/index.html +55 -0
  59. package/lib/caller.js +30 -0
  60. package/lib/constants.js +28 -0
  61. package/lib/deprecations.js +8 -0
  62. package/lib/levels.js +241 -0
  63. package/lib/meta.js +3 -0
  64. package/lib/multistream.js +188 -0
  65. package/lib/proto.js +234 -0
  66. package/lib/redaction.js +118 -0
  67. package/lib/symbols.js +74 -0
  68. package/lib/time.js +11 -0
  69. package/lib/tools.js +394 -0
  70. package/lib/transport-stream.js +56 -0
  71. package/lib/transport.js +167 -0
  72. package/lib/worker.js +194 -0
  73. package/lib/writer.js +42 -0
  74. package/package.json +118 -3
  75. package/pino-banner.png +0 -0
  76. package/pino-logo-hire.png +0 -0
  77. package/pino-tree.png +0 -0
  78. package/pino.d.ts +889 -0
  79. package/pino.js +236 -0
  80. package/pretty-demo.png +0 -0
  81. package/test/basic.test.js +874 -0
  82. package/test/broken-pipe.test.js +57 -0
  83. package/test/browser-child.test.js +132 -0
  84. package/test/browser-disabled.test.js +87 -0
  85. package/test/browser-early-console-freeze.test.js +12 -0
  86. package/test/browser-levels.test.js +241 -0
  87. package/test/browser-serializers.test.js +352 -0
  88. package/test/browser-timestamp.test.js +88 -0
  89. package/test/browser-transmit.test.js +417 -0
  90. package/test/browser.test.js +659 -0
  91. package/test/complex-objects.test.js +34 -0
  92. package/test/crlf.test.js +32 -0
  93. package/test/custom-levels.test.js +253 -0
  94. package/test/error.test.js +398 -0
  95. package/test/errorKey.test.js +34 -0
  96. package/test/escaping.test.js +91 -0
  97. package/test/esm/esm.mjs +12 -0
  98. package/test/esm/index.test.js +34 -0
  99. package/test/esm/named-exports.mjs +27 -0
  100. package/test/exit.test.js +77 -0
  101. package/test/fixtures/broken-pipe/basic.js +9 -0
  102. package/test/fixtures/broken-pipe/destination.js +10 -0
  103. package/test/fixtures/broken-pipe/syncfalse.js +12 -0
  104. package/test/fixtures/console-transport.js +13 -0
  105. package/test/fixtures/default-exit.js +8 -0
  106. package/test/fixtures/destination-exit.js +8 -0
  107. package/test/fixtures/eval/index.js +13 -0
  108. package/test/fixtures/eval/node_modules/14-files.js +3 -0
  109. package/test/fixtures/eval/node_modules/2-files.js +3 -0
  110. package/test/fixtures/eval/node_modules/file1.js +5 -0
  111. package/test/fixtures/eval/node_modules/file10.js +5 -0
  112. package/test/fixtures/eval/node_modules/file11.js +5 -0
  113. package/test/fixtures/eval/node_modules/file12.js +5 -0
  114. package/test/fixtures/eval/node_modules/file13.js +5 -0
  115. package/test/fixtures/eval/node_modules/file14.js +11 -0
  116. package/test/fixtures/eval/node_modules/file2.js +5 -0
  117. package/test/fixtures/eval/node_modules/file3.js +5 -0
  118. package/test/fixtures/eval/node_modules/file4.js +5 -0
  119. package/test/fixtures/eval/node_modules/file5.js +5 -0
  120. package/test/fixtures/eval/node_modules/file6.js +5 -0
  121. package/test/fixtures/eval/node_modules/file7.js +5 -0
  122. package/test/fixtures/eval/node_modules/file8.js +5 -0
  123. package/test/fixtures/eval/node_modules/file9.js +5 -0
  124. package/test/fixtures/noop-transport.js +10 -0
  125. package/test/fixtures/pretty/null-prototype.js +8 -0
  126. package/test/fixtures/stdout-hack-protection.js +11 -0
  127. package/test/fixtures/syncfalse-child.js +6 -0
  128. package/test/fixtures/syncfalse-exit.js +9 -0
  129. package/test/fixtures/syncfalse-flush-exit.js +10 -0
  130. package/test/fixtures/syncfalse.js +6 -0
  131. package/test/fixtures/syntax-error-esm.mjs +2 -0
  132. package/test/fixtures/to-file-transport-with-transform.js +20 -0
  133. package/test/fixtures/to-file-transport.js +13 -0
  134. package/test/fixtures/to-file-transport.mjs +8 -0
  135. package/test/fixtures/transport/index.js +12 -0
  136. package/test/fixtures/transport/package.json +5 -0
  137. package/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  138. package/test/fixtures/transport-exit-immediately.js +11 -0
  139. package/test/fixtures/transport-exit-on-ready.js +12 -0
  140. package/test/fixtures/transport-main.js +9 -0
  141. package/test/fixtures/transport-many-lines.js +29 -0
  142. package/test/fixtures/transport-string-stdout.js +9 -0
  143. package/test/fixtures/transport-transform.js +21 -0
  144. package/test/fixtures/transport-uses-pino-config.js +33 -0
  145. package/test/fixtures/transport-with-on-exit.js +12 -0
  146. package/test/fixtures/transport-worker-data.js +19 -0
  147. package/test/fixtures/transport-worker.js +15 -0
  148. package/test/fixtures/transport-wrong-export-type.js +3 -0
  149. package/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  150. package/test/fixtures/ts/to-file-transport.ts +11 -0
  151. package/test/fixtures/ts/transpile.cjs +36 -0
  152. package/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  153. package/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  154. package/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  155. package/test/fixtures/ts/transport-main.ts +8 -0
  156. package/test/fixtures/ts/transport-string-stdout.ts +8 -0
  157. package/test/fixtures/ts/transport-worker.ts +14 -0
  158. package/test/formatters.test.js +355 -0
  159. package/test/helper.d.ts +4 -0
  160. package/test/helper.js +128 -0
  161. package/test/hooks.test.js +118 -0
  162. package/test/http.test.js +242 -0
  163. package/test/internals/version.test.js +15 -0
  164. package/test/is-level-enabled.test.js +185 -0
  165. package/test/jest/basic.spec.js +10 -0
  166. package/test/levels.test.js +772 -0
  167. package/test/metadata.test.js +106 -0
  168. package/test/mixin-merge-strategy.test.js +55 -0
  169. package/test/mixin.test.js +218 -0
  170. package/test/multistream.test.js +673 -0
  171. package/test/pkg/index.js +46 -0
  172. package/test/pkg/pkg.config.json +17 -0
  173. package/test/pkg/pkg.test.js +56 -0
  174. package/test/redact.test.js +847 -0
  175. package/test/serializers.test.js +253 -0
  176. package/test/stdout-protection.test.js +39 -0
  177. package/test/syncfalse.test.js +188 -0
  178. package/test/timestamp.test.js +121 -0
  179. package/test/transport/big.test.js +43 -0
  180. package/test/transport/bundlers-support.test.js +97 -0
  181. package/test/transport/caller.test.js +23 -0
  182. package/test/transport/core.test.js +644 -0
  183. package/test/transport/core.test.ts +236 -0
  184. package/test/transport/core.transpiled.test.ts +112 -0
  185. package/test/transport/module-link.test.js +239 -0
  186. package/test/transport/pipeline.test.js +135 -0
  187. package/test/transport/repl.test.js +14 -0
  188. package/test/transport/syncTrue.test.js +55 -0
  189. package/test/transport/syncfalse.test.js +68 -0
  190. package/test/transport/targets.test.js +44 -0
  191. package/test/transport/uses-pino-config.test.js +167 -0
  192. package/test/transport-stream.test.js +26 -0
  193. package/test/types/pino-import.test-d.ts +29 -0
  194. package/test/types/pino-multistream.test-d.ts +28 -0
  195. package/test/types/pino-top-export.test-d.ts +35 -0
  196. package/test/types/pino-transport.test-d.ts +145 -0
  197. package/test/types/pino-type-only.test-d.ts +64 -0
  198. package/test/types/pino.test-d.ts +468 -0
  199. package/test/types/pino.ts +78 -0
  200. package/tsconfig.json +14 -0
@@ -0,0 +1,772 @@
1
+ 'use strict'
2
+
3
+ const { test } = require('tap')
4
+ const { sink, once, check } = require('./helper')
5
+ const pino = require('../')
6
+
7
+ const levelsLib = require('../lib/levels')
8
+
9
+ // Silence all warnings for this test
10
+ process.removeAllListeners('warning')
11
+ process.on('warning', () => {})
12
+
13
+ test('set the level by string', async ({ equal }) => {
14
+ const expected = [{
15
+ level: 50,
16
+ msg: 'this is an error'
17
+ }, {
18
+ level: 60,
19
+ msg: 'this is fatal'
20
+ }]
21
+ const stream = sink()
22
+ const instance = pino(stream)
23
+ instance.level = 'error'
24
+ instance.info('hello world')
25
+ instance.error('this is an error')
26
+ instance.fatal('this is fatal')
27
+ const result = await once(stream, 'data')
28
+ const current = expected.shift()
29
+ check(equal, result, current.level, current.msg)
30
+ })
31
+
32
+ test('the wrong level throws', async ({ throws }) => {
33
+ const instance = pino()
34
+ throws(() => {
35
+ instance.level = 'kaboom'
36
+ })
37
+ })
38
+
39
+ test('set the level by number', async ({ equal }) => {
40
+ const expected = [{
41
+ level: 50,
42
+ msg: 'this is an error'
43
+ }, {
44
+ level: 60,
45
+ msg: 'this is fatal'
46
+ }]
47
+ const stream = sink()
48
+ const instance = pino(stream)
49
+
50
+ instance.level = 50
51
+ instance.info('hello world')
52
+ instance.error('this is an error')
53
+ instance.fatal('this is fatal')
54
+ const result = await once(stream, 'data')
55
+ const current = expected.shift()
56
+ check(equal, result, current.level, current.msg)
57
+ })
58
+
59
+ test('exposes level string mappings', async ({ equal }) => {
60
+ equal(pino.levels.values.error, 50)
61
+ })
62
+
63
+ test('exposes level number mappings', async ({ equal }) => {
64
+ equal(pino.levels.labels[50], 'error')
65
+ })
66
+
67
+ test('returns level integer', async ({ equal }) => {
68
+ const instance = pino({ level: 'error' })
69
+ equal(instance.levelVal, 50)
70
+ })
71
+
72
+ test('child returns level integer', async ({ equal }) => {
73
+ const parent = pino({ level: 'error' })
74
+ const child = parent.child({ foo: 'bar' })
75
+ equal(child.levelVal, 50)
76
+ })
77
+
78
+ test('set the level via exported pino function', async ({ equal }) => {
79
+ const expected = [{
80
+ level: 50,
81
+ msg: 'this is an error'
82
+ }, {
83
+ level: 60,
84
+ msg: 'this is fatal'
85
+ }]
86
+ const stream = sink()
87
+ const instance = pino({ level: 'error' }, stream)
88
+
89
+ instance.info('hello world')
90
+ instance.error('this is an error')
91
+ instance.fatal('this is fatal')
92
+ const result = await once(stream, 'data')
93
+ const current = expected.shift()
94
+ check(equal, result, current.level, current.msg)
95
+ })
96
+
97
+ test('level-change event', async ({ equal }) => {
98
+ const instance = pino()
99
+ function handle (lvl, val, prevLvl, prevVal, logger) {
100
+ equal(lvl, 'trace')
101
+ equal(val, 10)
102
+ equal(prevLvl, 'info')
103
+ equal(prevVal, 30)
104
+ equal(logger, instance)
105
+ }
106
+ instance.on('level-change', handle)
107
+ instance.level = 'trace'
108
+ instance.removeListener('level-change', handle)
109
+ instance.level = 'info'
110
+
111
+ let count = 0
112
+
113
+ const l1 = () => count++
114
+ const l2 = () => count++
115
+ const l3 = () => count++
116
+ instance.on('level-change', l1)
117
+ instance.on('level-change', l2)
118
+ instance.on('level-change', l3)
119
+
120
+ instance.level = 'trace'
121
+ instance.removeListener('level-change', l3)
122
+ instance.level = 'fatal'
123
+ instance.removeListener('level-change', l1)
124
+ instance.level = 'debug'
125
+ instance.removeListener('level-change', l2)
126
+ instance.level = 'info'
127
+
128
+ equal(count, 6)
129
+
130
+ instance.once('level-change', (lvl, val, prevLvl, prevVal, logger) => equal(logger, instance))
131
+ instance.level = 'info'
132
+ const child = instance.child({})
133
+ instance.once('level-change', (lvl, val, prevLvl, prevVal, logger) => equal(logger, child))
134
+ child.level = 'trace'
135
+ })
136
+
137
+ test('enable', async ({ fail }) => {
138
+ const instance = pino({
139
+ level: 'trace',
140
+ enabled: false
141
+ }, sink((result, enc) => {
142
+ fail('no data should be logged')
143
+ }))
144
+
145
+ Object.keys(pino.levels.values).forEach((level) => {
146
+ instance[level]('hello world')
147
+ })
148
+ })
149
+
150
+ test('silent level', async ({ fail }) => {
151
+ const instance = pino({
152
+ level: 'silent'
153
+ }, sink((result, enc) => {
154
+ fail('no data should be logged')
155
+ }))
156
+
157
+ Object.keys(pino.levels.values).forEach((level) => {
158
+ instance[level]('hello world')
159
+ })
160
+ })
161
+
162
+ test('set silent via Infinity', async ({ fail }) => {
163
+ const instance = pino({
164
+ level: Infinity
165
+ }, sink((result, enc) => {
166
+ fail('no data should be logged')
167
+ }))
168
+
169
+ Object.keys(pino.levels.values).forEach((level) => {
170
+ instance[level]('hello world')
171
+ })
172
+ })
173
+
174
+ test('exposed levels', async ({ same }) => {
175
+ same(Object.keys(pino.levels.values), [
176
+ 'trace',
177
+ 'debug',
178
+ 'info',
179
+ 'warn',
180
+ 'error',
181
+ 'fatal'
182
+ ])
183
+ })
184
+
185
+ test('exposed labels', async ({ same }) => {
186
+ same(Object.keys(pino.levels.labels), [
187
+ '10',
188
+ '20',
189
+ '30',
190
+ '40',
191
+ '50',
192
+ '60'
193
+ ])
194
+ })
195
+
196
+ test('setting level in child', async ({ equal }) => {
197
+ const expected = [{
198
+ level: 50,
199
+ msg: 'this is an error'
200
+ }, {
201
+ level: 60,
202
+ msg: 'this is fatal'
203
+ }]
204
+ const instance = pino(sink((result, enc, cb) => {
205
+ const current = expected.shift()
206
+ check(equal, result, current.level, current.msg)
207
+ cb()
208
+ })).child({ level: 30 })
209
+
210
+ instance.level = 'error'
211
+ instance.info('hello world')
212
+ instance.error('this is an error')
213
+ instance.fatal('this is fatal')
214
+ })
215
+
216
+ test('setting level by assigning a number to level', async ({ equal }) => {
217
+ const instance = pino()
218
+ equal(instance.levelVal, 30)
219
+ equal(instance.level, 'info')
220
+ instance.level = 50
221
+ equal(instance.levelVal, 50)
222
+ equal(instance.level, 'error')
223
+ })
224
+
225
+ test('setting level by number to unknown value results in a throw', async ({ throws }) => {
226
+ const instance = pino()
227
+ throws(() => { instance.level = 973 })
228
+ })
229
+
230
+ test('setting level by assigning a known label to level', async ({ equal }) => {
231
+ const instance = pino()
232
+ equal(instance.levelVal, 30)
233
+ equal(instance.level, 'info')
234
+ instance.level = 'error'
235
+ equal(instance.levelVal, 50)
236
+ equal(instance.level, 'error')
237
+ })
238
+
239
+ test('levelVal is read only', async ({ throws }) => {
240
+ const instance = pino()
241
+ throws(() => { instance.levelVal = 20 })
242
+ })
243
+
244
+ test('produces labels when told to', async ({ equal }) => {
245
+ const expected = [{
246
+ level: 'info',
247
+ msg: 'hello world'
248
+ }]
249
+ const instance = pino({
250
+ formatters: {
251
+ level (label, number) {
252
+ return { level: label }
253
+ }
254
+ }
255
+ }, sink((result, enc, cb) => {
256
+ const current = expected.shift()
257
+ check(equal, result, current.level, current.msg)
258
+ cb()
259
+ }))
260
+
261
+ instance.info('hello world')
262
+ })
263
+
264
+ test('resets levels from labels to numbers', async ({ equal }) => {
265
+ const expected = [{
266
+ level: 30,
267
+ msg: 'hello world'
268
+ }]
269
+ pino({ useLevelLabels: true })
270
+ const instance = pino({ useLevelLabels: false }, sink((result, enc, cb) => {
271
+ const current = expected.shift()
272
+ check(equal, result, current.level, current.msg)
273
+ cb()
274
+ }))
275
+
276
+ instance.info('hello world')
277
+ })
278
+
279
+ test('changes label naming when told to', async ({ equal }) => {
280
+ const expected = [{
281
+ priority: 30,
282
+ msg: 'hello world'
283
+ }]
284
+ const instance = pino({
285
+ formatters: {
286
+ level (label, number) {
287
+ return { priority: number }
288
+ }
289
+ }
290
+ }, sink((result, enc, cb) => {
291
+ const current = expected.shift()
292
+ equal(result.priority, current.priority)
293
+ equal(result.msg, current.msg)
294
+ cb()
295
+ }))
296
+
297
+ instance.info('hello world')
298
+ })
299
+
300
+ test('children produce labels when told to', async ({ equal }) => {
301
+ const expected = [
302
+ {
303
+ level: 'info',
304
+ msg: 'child 1'
305
+ },
306
+ {
307
+ level: 'info',
308
+ msg: 'child 2'
309
+ }
310
+ ]
311
+ const instance = pino({
312
+ formatters: {
313
+ level (label, number) {
314
+ return { level: label }
315
+ }
316
+ }
317
+ }, sink((result, enc, cb) => {
318
+ const current = expected.shift()
319
+ check(equal, result, current.level, current.msg)
320
+ cb()
321
+ }))
322
+
323
+ const child1 = instance.child({ name: 'child1' })
324
+ const child2 = child1.child({ name: 'child2' })
325
+
326
+ child1.info('child 1')
327
+ child2.info('child 2')
328
+ })
329
+
330
+ test('produces labels for custom levels', async ({ equal }) => {
331
+ const expected = [
332
+ {
333
+ level: 'info',
334
+ msg: 'hello world'
335
+ },
336
+ {
337
+ level: 'foo',
338
+ msg: 'foobar'
339
+ }
340
+ ]
341
+ const opts = {
342
+ formatters: {
343
+ level (label, number) {
344
+ return { level: label }
345
+ }
346
+ },
347
+ customLevels: {
348
+ foo: 35
349
+ }
350
+ }
351
+ const instance = pino(opts, sink((result, enc, cb) => {
352
+ const current = expected.shift()
353
+ check(equal, result, current.level, current.msg)
354
+ cb()
355
+ }))
356
+
357
+ instance.info('hello world')
358
+ instance.foo('foobar')
359
+ })
360
+
361
+ test('setting levelKey does not affect labels when told to', async ({ equal }) => {
362
+ const instance = pino(
363
+ {
364
+ formatters: {
365
+ level (label, number) {
366
+ return { priority: label }
367
+ }
368
+ }
369
+ },
370
+ sink((result, enc, cb) => {
371
+ equal(result.priority, 'info')
372
+ cb()
373
+ })
374
+ )
375
+
376
+ instance.info('hello world')
377
+ })
378
+
379
+ test('throws when creating a default label that does not exist in logger levels', async ({ throws }) => {
380
+ const defaultLevel = 'foo'
381
+ throws(() => {
382
+ pino({
383
+ customLevels: {
384
+ bar: 5
385
+ },
386
+ level: defaultLevel
387
+ })
388
+ }, `default level:${defaultLevel} must be included in custom levels`)
389
+ })
390
+
391
+ test('throws when creating a default value that does not exist in logger levels', async ({ throws }) => {
392
+ const defaultLevel = 15
393
+ throws(() => {
394
+ pino({
395
+ customLevels: {
396
+ bar: 5
397
+ },
398
+ level: defaultLevel
399
+ })
400
+ }, `default level:${defaultLevel} must be included in custom levels`)
401
+ })
402
+
403
+ test('throws when creating a default value that does not exist in logger levels', async ({ equal, throws }) => {
404
+ throws(() => {
405
+ pino({
406
+ customLevels: {
407
+ foo: 5
408
+ },
409
+ useOnlyCustomLevels: true
410
+ })
411
+ }, 'default level:info must be included in custom levels')
412
+ })
413
+
414
+ test('passes when creating a default value that exists in logger levels', async ({ equal, throws }) => {
415
+ pino({
416
+ level: 30
417
+ })
418
+ })
419
+
420
+ test('log null value when message is null', async ({ equal }) => {
421
+ const expected = {
422
+ msg: null,
423
+ level: 30
424
+ }
425
+
426
+ const stream = sink()
427
+ const instance = pino(stream)
428
+ instance.level = 'info'
429
+ instance.info(null)
430
+
431
+ const result = await once(stream, 'data')
432
+ check(equal, result, expected.level, expected.msg)
433
+ })
434
+
435
+ test('formats when base param is null', async ({ equal }) => {
436
+ const expected = {
437
+ msg: 'a string',
438
+ level: 30
439
+ }
440
+
441
+ const stream = sink()
442
+ const instance = pino(stream)
443
+ instance.level = 'info'
444
+ instance.info(null, 'a %s', 'string')
445
+
446
+ const result = await once(stream, 'data')
447
+ check(equal, result, expected.level, expected.msg)
448
+ })
449
+
450
+ test('fatal method sync-flushes the destination if sync flushing is available', async ({ pass, doesNotThrow, plan }) => {
451
+ plan(2)
452
+ const stream = sink()
453
+ stream.flushSync = () => {
454
+ pass('destination flushed')
455
+ }
456
+ const instance = pino(stream)
457
+ instance.fatal('this is fatal')
458
+ await once(stream, 'data')
459
+ doesNotThrow(() => {
460
+ stream.flushSync = undefined
461
+ instance.fatal('this is fatal')
462
+ })
463
+ })
464
+
465
+ test('fatal method should call async when sync-flushing fails', ({ equal, fail, doesNotThrow, plan }) => {
466
+ plan(2)
467
+ const messages = [
468
+ 'this is fatal 1'
469
+ ]
470
+ const stream = sink((result) => equal(result.msg, messages.shift()))
471
+ stream.flushSync = () => { throw new Error('Error') }
472
+ stream.flush = () => fail('flush should be called')
473
+
474
+ const instance = pino(stream)
475
+ doesNotThrow(() => instance.fatal(messages[0]))
476
+ })
477
+
478
+ test('calling silent method on logger instance', async ({ fail }) => {
479
+ const instance = pino({ level: 'silent' }, sink((result, enc) => {
480
+ fail('no data should be logged')
481
+ }))
482
+ instance.silent('hello world')
483
+ })
484
+
485
+ test('calling silent method on child logger', async ({ fail }) => {
486
+ const child = pino({ level: 'silent' }, sink((result, enc) => {
487
+ fail('no data should be logged')
488
+ })).child({})
489
+ child.silent('hello world')
490
+ })
491
+
492
+ test('changing level from info to silent and back to info', async ({ equal }) => {
493
+ const expected = {
494
+ level: 30,
495
+ msg: 'hello world'
496
+ }
497
+ const stream = sink()
498
+ const instance = pino({ level: 'info' }, stream)
499
+
500
+ instance.level = 'silent'
501
+ instance.info('hello world')
502
+ let result = stream.read()
503
+ equal(result, null)
504
+
505
+ instance.level = 'info'
506
+ instance.info('hello world')
507
+ result = await once(stream, 'data')
508
+ check(equal, result, expected.level, expected.msg)
509
+ })
510
+
511
+ test('changing level from info to silent and back to info in child logger', async ({ equal }) => {
512
+ const expected = {
513
+ level: 30,
514
+ msg: 'hello world'
515
+ }
516
+ const stream = sink()
517
+ const child = pino({ level: 'info' }, stream).child({})
518
+
519
+ child.level = 'silent'
520
+ child.info('hello world')
521
+ let result = stream.read()
522
+ equal(result, null)
523
+
524
+ child.level = 'info'
525
+ child.info('hello world')
526
+ result = await once(stream, 'data')
527
+ check(equal, result, expected.level, expected.msg)
528
+ })
529
+
530
+ test('changing level respects level comparison set to', async ({ test, end }) => {
531
+ const ascLevels = {
532
+ debug: 1,
533
+ info: 2,
534
+ warn: 3
535
+ }
536
+
537
+ const descLevels = {
538
+ debug: 3,
539
+ info: 2,
540
+ warn: 1
541
+ }
542
+
543
+ const expected = {
544
+ level: 2,
545
+ msg: 'hello world'
546
+ }
547
+
548
+ test('ASC in parent logger', async ({ equal }) => {
549
+ const customLevels = ascLevels
550
+ const levelComparison = 'ASC'
551
+
552
+ const stream = sink()
553
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream)
554
+
555
+ logger.level = 'warn'
556
+ logger.info('hello world')
557
+ let result = stream.read()
558
+ equal(result, null)
559
+
560
+ logger.level = 'debug'
561
+ logger.info('hello world')
562
+ result = await once(stream, 'data')
563
+ check(equal, result, expected.level, expected.msg)
564
+ })
565
+
566
+ test('DESC in parent logger', async ({ equal }) => {
567
+ const customLevels = descLevels
568
+ const levelComparison = 'DESC'
569
+
570
+ const stream = sink()
571
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream)
572
+
573
+ logger.level = 'warn'
574
+ logger.info('hello world')
575
+ let result = stream.read()
576
+ equal(result, null)
577
+
578
+ logger.level = 'debug'
579
+ logger.info('hello world')
580
+ result = await once(stream, 'data')
581
+ check(equal, result, expected.level, expected.msg)
582
+ })
583
+
584
+ test('custom function in parent logger', async ({ equal }) => {
585
+ const customLevels = {
586
+ info: 2,
587
+ debug: 345,
588
+ warn: 789
589
+ }
590
+ const levelComparison = (current, expected) => {
591
+ if (expected === customLevels.warn) return false
592
+ return true
593
+ }
594
+
595
+ const stream = sink()
596
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream)
597
+
598
+ logger.level = 'warn'
599
+ logger.info('hello world')
600
+ let result = stream.read()
601
+ equal(result, null)
602
+
603
+ logger.level = 'debug'
604
+ logger.info('hello world')
605
+ result = await once(stream, 'data')
606
+ check(equal, result, expected.level, expected.msg)
607
+ })
608
+
609
+ test('ASC in child logger', async ({ equal }) => {
610
+ const customLevels = ascLevels
611
+ const levelComparison = 'ASC'
612
+
613
+ const stream = sink()
614
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream).child({ })
615
+
616
+ logger.level = 'warn'
617
+ logger.info('hello world')
618
+ let result = stream.read()
619
+ equal(result, null)
620
+
621
+ logger.level = 'debug'
622
+ logger.info('hello world')
623
+ result = await once(stream, 'data')
624
+ check(equal, result, expected.level, expected.msg)
625
+ })
626
+
627
+ test('DESC in parent logger', async ({ equal }) => {
628
+ const customLevels = descLevels
629
+ const levelComparison = 'DESC'
630
+
631
+ const stream = sink()
632
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream).child({ })
633
+
634
+ logger.level = 'warn'
635
+ logger.info('hello world')
636
+ let result = stream.read()
637
+ equal(result, null)
638
+
639
+ logger.level = 'debug'
640
+ logger.info('hello world')
641
+ result = await once(stream, 'data')
642
+ check(equal, result, expected.level, expected.msg)
643
+ })
644
+
645
+ test('custom function in child logger', async ({ equal }) => {
646
+ const customLevels = {
647
+ info: 2,
648
+ debug: 345,
649
+ warn: 789
650
+ }
651
+ const levelComparison = (current, expected) => {
652
+ if (expected === customLevels.warn) return false
653
+ return true
654
+ }
655
+
656
+ const stream = sink()
657
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream).child({ })
658
+
659
+ logger.level = 'warn'
660
+ logger.info('hello world')
661
+ let result = stream.read()
662
+ equal(result, null)
663
+
664
+ logger.level = 'debug'
665
+ logger.info('hello world')
666
+ result = await once(stream, 'data')
667
+ check(equal, result, expected.level, expected.msg)
668
+ })
669
+
670
+ end()
671
+ })
672
+
673
+ test('changing level respects level comparison DESC', async ({ equal }) => {
674
+ const customLevels = {
675
+ warn: 1,
676
+ info: 2,
677
+ debug: 3
678
+ }
679
+
680
+ const levelComparison = 'DESC'
681
+
682
+ const expected = {
683
+ level: 2,
684
+ msg: 'hello world'
685
+ }
686
+
687
+ const stream = sink()
688
+ const logger = pino({ levelComparison, customLevels, useOnlyCustomLevels: true, level: 'info' }, stream)
689
+
690
+ logger.level = 'warn'
691
+ logger.info('hello world')
692
+ let result = stream.read()
693
+ equal(result, null)
694
+
695
+ logger.level = 'debug'
696
+ logger.info('hello world')
697
+ result = await once(stream, 'data')
698
+ check(equal, result, expected.level, expected.msg)
699
+ })
700
+
701
+ // testing for potential loss of Pino constructor scope from serializers - an edge case with circular refs see: https://github.com/pinojs/pino/issues/833
702
+ test('trying to get levels when `this` is no longer a Pino instance returns an empty string', async ({ equal }) => {
703
+ const notPinoInstance = { some: 'object', getLevel: levelsLib.getLevel }
704
+ const blankedLevelValue = notPinoInstance.getLevel()
705
+ equal(blankedLevelValue, '')
706
+ })
707
+
708
+ test('accepts capital letter for INFO level', async ({ equal }) => {
709
+ const stream = sink()
710
+ const logger = pino({
711
+ level: 'INFO'
712
+ }, stream)
713
+
714
+ logger.info('test')
715
+ const { level } = await once(stream, 'data')
716
+ equal(level, 30)
717
+ })
718
+
719
+ test('accepts capital letter for FATAL level', async ({ equal }) => {
720
+ const stream = sink()
721
+ const logger = pino({
722
+ level: 'FATAL'
723
+ }, stream)
724
+
725
+ logger.fatal('test')
726
+ const { level } = await once(stream, 'data')
727
+ equal(level, 60)
728
+ })
729
+
730
+ test('accepts capital letter for ERROR level', async ({ equal }) => {
731
+ const stream = sink()
732
+ const logger = pino({
733
+ level: 'ERROR'
734
+ }, stream)
735
+
736
+ logger.error('test')
737
+ const { level } = await once(stream, 'data')
738
+ equal(level, 50)
739
+ })
740
+
741
+ test('accepts capital letter for WARN level', async ({ equal }) => {
742
+ const stream = sink()
743
+ const logger = pino({
744
+ level: 'WARN'
745
+ }, stream)
746
+
747
+ logger.warn('test')
748
+ const { level } = await once(stream, 'data')
749
+ equal(level, 40)
750
+ })
751
+
752
+ test('accepts capital letter for DEBUG level', async ({ equal }) => {
753
+ const stream = sink()
754
+ const logger = pino({
755
+ level: 'DEBUG'
756
+ }, stream)
757
+
758
+ logger.debug('test')
759
+ const { level } = await once(stream, 'data')
760
+ equal(level, 20)
761
+ })
762
+
763
+ test('accepts capital letter for TRACE level', async ({ equal }) => {
764
+ const stream = sink()
765
+ const logger = pino({
766
+ level: 'TRACE'
767
+ }, stream)
768
+
769
+ logger.trace('test')
770
+ const { level } = await once(stream, 'data')
771
+ equal(level, 10)
772
+ })