lucide-node 0.0.1-security → 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.

Potentially problematic release.


This version of lucide-node 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 +117 -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
package/test/helper.js ADDED
@@ -0,0 +1,128 @@
1
+ 'use strict'
2
+
3
+ const crypto = require('crypto')
4
+ const os = require('node:os')
5
+ const writer = require('flush-write-stream')
6
+ const split = require('split2')
7
+ const { existsSync, readFileSync, statSync, unlinkSync } = require('node:fs')
8
+ const pid = process.pid
9
+ const hostname = os.hostname()
10
+ const t = require('tap')
11
+ const { join } = require('node:path')
12
+ const { tmpdir } = os
13
+
14
+ const isWin = process.platform === 'win32'
15
+ const isYarnPnp = process.versions.pnp !== undefined
16
+
17
+ function getPathToNull () {
18
+ return isWin ? '\\\\.\\NUL' : '/dev/null'
19
+ }
20
+
21
+ function once (emitter, name) {
22
+ return new Promise((resolve, reject) => {
23
+ if (name !== 'error') emitter.once('error', reject)
24
+ emitter.once(name, (...args) => {
25
+ emitter.removeListener('error', reject)
26
+ resolve(...args)
27
+ })
28
+ })
29
+ }
30
+
31
+ function sink (func) {
32
+ const result = split((data) => {
33
+ try {
34
+ return JSON.parse(data)
35
+ } catch (err) {
36
+ console.log(err)
37
+ console.log(data)
38
+ }
39
+ })
40
+ if (func) result.pipe(writer.obj(func))
41
+ return result
42
+ }
43
+
44
+ function check (is, chunk, level, msg) {
45
+ is(new Date(chunk.time) <= new Date(), true, 'time is greater than Date.now()')
46
+ delete chunk.time
47
+ is(chunk.pid, pid)
48
+ is(chunk.hostname, hostname)
49
+ is(chunk.level, level)
50
+ is(chunk.msg, msg)
51
+ }
52
+
53
+ function sleep (ms) {
54
+ return new Promise((resolve) => {
55
+ setTimeout(resolve, ms)
56
+ })
57
+ }
58
+
59
+ function watchFileCreated (filename) {
60
+ return new Promise((resolve, reject) => {
61
+ const TIMEOUT = process.env.PINO_TEST_WAIT_WATCHFILE_TIMEOUT || 10000
62
+ const INTERVAL = 100
63
+ const threshold = TIMEOUT / INTERVAL
64
+ let counter = 0
65
+ const interval = setInterval(() => {
66
+ const exists = existsSync(filename)
67
+ // On some CI runs file is created but not filled
68
+ if (exists && statSync(filename).size !== 0) {
69
+ clearInterval(interval)
70
+ resolve()
71
+ } else if (counter <= threshold) {
72
+ counter++
73
+ } else {
74
+ clearInterval(interval)
75
+ reject(new Error(
76
+ `${filename} hasn't been created within ${TIMEOUT} ms. ` +
77
+ (exists ? 'File exist, but still empty.' : 'File not yet created.')
78
+ ))
79
+ }
80
+ }, INTERVAL)
81
+ })
82
+ }
83
+
84
+ function watchForWrite (filename, testString) {
85
+ return new Promise((resolve, reject) => {
86
+ const TIMEOUT = process.env.PINO_TEST_WAIT_WRITE_TIMEOUT || 10000
87
+ const INTERVAL = 100
88
+ const threshold = TIMEOUT / INTERVAL
89
+ let counter = 0
90
+ const interval = setInterval(() => {
91
+ if (readFileSync(filename).includes(testString)) {
92
+ clearInterval(interval)
93
+ resolve()
94
+ } else if (counter <= threshold) {
95
+ counter++
96
+ } else {
97
+ clearInterval(interval)
98
+ reject(new Error(`'${testString}' hasn't been written to ${filename} within ${TIMEOUT} ms.`))
99
+ }
100
+ }, INTERVAL)
101
+ })
102
+ }
103
+
104
+ let files = []
105
+
106
+ function file () {
107
+ const hash = crypto.randomBytes(12).toString('hex')
108
+ const file = join(tmpdir(), `pino-${pid}-${hash}`)
109
+ files.push(file)
110
+ return file
111
+ }
112
+
113
+ process.on('beforeExit', () => {
114
+ if (files.length === 0) return
115
+ t.comment('unlink files')
116
+ for (const file of files) {
117
+ try {
118
+ t.comment(`unliking ${file}`)
119
+ unlinkSync(file)
120
+ } catch (e) {
121
+ console.log(e)
122
+ }
123
+ }
124
+ files = []
125
+ t.comment('unlink completed')
126
+ })
127
+
128
+ module.exports = { getPathToNull, sink, check, once, sleep, watchFileCreated, watchForWrite, isWin, isYarnPnp, file }
@@ -0,0 +1,118 @@
1
+ 'use strict'
2
+
3
+ const tap = require('tap')
4
+ const { sink, once } = require('./helper')
5
+ const pino = require('../')
6
+
7
+ tap.test('log method hook', t => {
8
+ t.test('gets invoked', async t => {
9
+ t.plan(8)
10
+
11
+ const stream = sink()
12
+ const logger = pino({
13
+ hooks: {
14
+ logMethod (args, method, level) {
15
+ t.type(args, Array)
16
+ t.type(level, 'number')
17
+ t.equal(args.length, 3)
18
+ t.equal(level, this.levels.values.info)
19
+ t.same(args, ['a', 'b', 'c'])
20
+
21
+ t.type(method, Function)
22
+ t.equal(method.name, 'LOG')
23
+
24
+ method.apply(this, [args.join('-')])
25
+ }
26
+ }
27
+ }, stream)
28
+
29
+ const o = once(stream, 'data')
30
+ logger.info('a', 'b', 'c')
31
+ t.match(await o, { msg: 'a-b-c' })
32
+ })
33
+
34
+ t.test('fatal method invokes hook', async t => {
35
+ t.plan(2)
36
+
37
+ const stream = sink()
38
+ const logger = pino({
39
+ hooks: {
40
+ logMethod (args, method) {
41
+ t.pass()
42
+ method.apply(this, [args.join('-')])
43
+ }
44
+ }
45
+ }, stream)
46
+
47
+ const o = once(stream, 'data')
48
+ logger.fatal('a')
49
+ t.match(await o, { msg: 'a' })
50
+ })
51
+
52
+ t.test('children get the hook', async t => {
53
+ t.plan(4)
54
+
55
+ const stream = sink()
56
+ const root = pino({
57
+ hooks: {
58
+ logMethod (args, method) {
59
+ t.pass()
60
+ method.apply(this, [args.join('-')])
61
+ }
62
+ }
63
+ }, stream)
64
+ const child = root.child({ child: 'one' })
65
+ const grandchild = child.child({ child: 'two' })
66
+
67
+ let o = once(stream, 'data')
68
+ child.info('a', 'b')
69
+ t.match(await o, { msg: 'a-b' })
70
+
71
+ o = once(stream, 'data')
72
+ grandchild.info('c', 'd')
73
+ t.match(await o, { msg: 'c-d' })
74
+ })
75
+
76
+ t.test('get log level', async t => {
77
+ t.plan(3)
78
+
79
+ const stream = sink()
80
+ const logger = pino({
81
+ hooks: {
82
+ logMethod (args, method, level) {
83
+ t.type(level, 'number')
84
+ t.equal(level, this.levels.values.error)
85
+
86
+ method.apply(this, [args.join('-')])
87
+ }
88
+ }
89
+ }, stream)
90
+
91
+ const o = once(stream, 'data')
92
+ logger.error('a')
93
+ t.match(await o, { msg: 'a' })
94
+ })
95
+
96
+ t.end()
97
+ })
98
+
99
+ tap.test('streamWrite hook', t => {
100
+ t.test('gets invoked', async t => {
101
+ t.plan(1)
102
+
103
+ const stream = sink()
104
+ const logger = pino({
105
+ hooks: {
106
+ streamWrite (s) {
107
+ return s.replaceAll('redact-me', 'XXX')
108
+ }
109
+ }
110
+ }, stream)
111
+
112
+ const o = once(stream, 'data')
113
+ logger.info('hide redact-me in this string')
114
+ t.match(await o, { msg: 'hide XXX in this string' })
115
+ })
116
+
117
+ t.end()
118
+ })
@@ -0,0 +1,242 @@
1
+ 'use strict'
2
+
3
+ const http = require('http')
4
+ const os = require('node:os')
5
+ const semver = require('semver')
6
+ const { test, skip } = require('tap')
7
+ const { sink, once } = require('./helper')
8
+ const pino = require('../')
9
+
10
+ const { pid } = process
11
+ const hostname = os.hostname()
12
+
13
+ test('http request support', async ({ ok, same, error, teardown }) => {
14
+ let originalReq
15
+ const instance = pino(sink((chunk, enc) => {
16
+ ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
17
+ delete chunk.time
18
+ same(chunk, {
19
+ pid,
20
+ hostname,
21
+ level: 30,
22
+ msg: 'my request',
23
+ req: {
24
+ method: originalReq.method,
25
+ url: originalReq.url,
26
+ headers: originalReq.headers,
27
+ remoteAddress: originalReq.socket.remoteAddress,
28
+ remotePort: originalReq.socket.remotePort
29
+ }
30
+ })
31
+ }))
32
+
33
+ const server = http.createServer((req, res) => {
34
+ originalReq = req
35
+ instance.info(req, 'my request')
36
+ res.end('hello')
37
+ })
38
+ server.unref()
39
+ server.listen()
40
+ const err = await once(server, 'listening')
41
+ error(err)
42
+ const res = await once(http.get('http://localhost:' + server.address().port), 'response')
43
+ res.resume()
44
+ server.close()
45
+ })
46
+
47
+ test('http request support via serializer', async ({ ok, same, error, teardown }) => {
48
+ let originalReq
49
+ const instance = pino({
50
+ serializers: {
51
+ req: pino.stdSerializers.req
52
+ }
53
+ }, sink((chunk, enc) => {
54
+ ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
55
+ delete chunk.time
56
+ same(chunk, {
57
+ pid,
58
+ hostname,
59
+ level: 30,
60
+ msg: 'my request',
61
+ req: {
62
+ method: originalReq.method,
63
+ url: originalReq.url,
64
+ headers: originalReq.headers,
65
+ remoteAddress: originalReq.socket.remoteAddress,
66
+ remotePort: originalReq.socket.remotePort
67
+ }
68
+ })
69
+ }))
70
+
71
+ const server = http.createServer(function (req, res) {
72
+ originalReq = req
73
+ instance.info({ req }, 'my request')
74
+ res.end('hello')
75
+ })
76
+ server.unref()
77
+ server.listen()
78
+ const err = await once(server, 'listening')
79
+ error(err)
80
+
81
+ const res = await once(http.get('http://localhost:' + server.address().port), 'response')
82
+ res.resume()
83
+ server.close()
84
+ })
85
+
86
+ // skipped because request connection is deprecated since v13, and request socket is always available
87
+ skip('http request support via serializer without request connection', async ({ ok, same, error, teardown }) => {
88
+ let originalReq
89
+ const instance = pino({
90
+ serializers: {
91
+ req: pino.stdSerializers.req
92
+ }
93
+ }, sink((chunk, enc) => {
94
+ ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
95
+ delete chunk.time
96
+ const expected = {
97
+ pid,
98
+ hostname,
99
+ level: 30,
100
+ msg: 'my request',
101
+ req: {
102
+ method: originalReq.method,
103
+ url: originalReq.url,
104
+ headers: originalReq.headers
105
+ }
106
+ }
107
+ if (semver.gte(process.version, '13.0.0')) {
108
+ expected.req.remoteAddress = originalReq.socket.remoteAddress
109
+ expected.req.remotePort = originalReq.socket.remotePort
110
+ }
111
+ same(chunk, expected)
112
+ }))
113
+
114
+ const server = http.createServer(function (req, res) {
115
+ originalReq = req
116
+ delete req.connection
117
+ instance.info({ req }, 'my request')
118
+ res.end('hello')
119
+ })
120
+ server.unref()
121
+ server.listen()
122
+ const err = await once(server, 'listening')
123
+ error(err)
124
+
125
+ const res = await once(http.get('http://localhost:' + server.address().port), 'response')
126
+ res.resume()
127
+ server.close()
128
+ })
129
+
130
+ test('http response support', async ({ ok, same, error, teardown }) => {
131
+ let originalRes
132
+ const instance = pino(sink((chunk, enc) => {
133
+ ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
134
+ delete chunk.time
135
+ same(chunk, {
136
+ pid,
137
+ hostname,
138
+ level: 30,
139
+ msg: 'my response',
140
+ res: {
141
+ statusCode: originalRes.statusCode,
142
+ headers: originalRes.getHeaders()
143
+ }
144
+ })
145
+ }))
146
+
147
+ const server = http.createServer(function (req, res) {
148
+ originalRes = res
149
+ res.end('hello')
150
+ instance.info(res, 'my response')
151
+ })
152
+ server.unref()
153
+ server.listen()
154
+ const err = await once(server, 'listening')
155
+
156
+ error(err)
157
+
158
+ const res = await once(http.get('http://localhost:' + server.address().port), 'response')
159
+ res.resume()
160
+ server.close()
161
+ })
162
+
163
+ test('http response support via a serializer', async ({ ok, same, error, teardown }) => {
164
+ const instance = pino({
165
+ serializers: {
166
+ res: pino.stdSerializers.res
167
+ }
168
+ }, sink((chunk, enc) => {
169
+ ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
170
+ delete chunk.time
171
+ same(chunk, {
172
+ pid,
173
+ hostname,
174
+ level: 30,
175
+ msg: 'my response',
176
+ res: {
177
+ statusCode: 200,
178
+ headers: {
179
+ 'x-single': 'y',
180
+ 'x-multi': [1, 2]
181
+ }
182
+ }
183
+ })
184
+ }))
185
+
186
+ const server = http.createServer(function (req, res) {
187
+ res.setHeader('x-single', 'y')
188
+ res.setHeader('x-multi', [1, 2])
189
+ res.end('hello')
190
+ instance.info({ res }, 'my response')
191
+ })
192
+
193
+ server.unref()
194
+ server.listen()
195
+ const err = await once(server, 'listening')
196
+ error(err)
197
+
198
+ const res = await once(http.get('http://localhost:' + server.address().port), 'response')
199
+ res.resume()
200
+ server.close()
201
+ })
202
+
203
+ test('http request support via serializer in a child', async ({ ok, same, error, teardown }) => {
204
+ let originalReq
205
+ const instance = pino({
206
+ serializers: {
207
+ req: pino.stdSerializers.req
208
+ }
209
+ }, sink((chunk, enc) => {
210
+ ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
211
+ delete chunk.time
212
+ same(chunk, {
213
+ pid,
214
+ hostname,
215
+ level: 30,
216
+ msg: 'my request',
217
+ req: {
218
+ method: originalReq.method,
219
+ url: originalReq.url,
220
+ headers: originalReq.headers,
221
+ remoteAddress: originalReq.socket.remoteAddress,
222
+ remotePort: originalReq.socket.remotePort
223
+ }
224
+ })
225
+ }))
226
+
227
+ const server = http.createServer(function (req, res) {
228
+ originalReq = req
229
+ const child = instance.child({ req })
230
+ child.info('my request')
231
+ res.end('hello')
232
+ })
233
+
234
+ server.unref()
235
+ server.listen()
236
+ const err = await once(server, 'listening')
237
+ error(err)
238
+
239
+ const res = await once(http.get('http://localhost:' + server.address().port), 'response')
240
+ res.resume()
241
+ server.close()
242
+ })
@@ -0,0 +1,15 @@
1
+ 'use strict'
2
+
3
+ const fs = require('node:fs')
4
+ const path = require('node:path')
5
+ const t = require('tap')
6
+ const test = t.test
7
+ const pino = require('../..')()
8
+
9
+ test('should be the same as package.json', t => {
10
+ t.plan(1)
11
+
12
+ const json = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json')).toString('utf8'))
13
+
14
+ t.equal(pino.version, json.version)
15
+ })
@@ -0,0 +1,185 @@
1
+ 'use strict'
2
+
3
+ const { test } = require('tap')
4
+ const pino = require('../')
5
+
6
+ const descLevels = {
7
+ trace: 60,
8
+ debug: 50,
9
+ info: 40,
10
+ warn: 30,
11
+ error: 20,
12
+ fatal: 10
13
+ }
14
+
15
+ const ascLevels = {
16
+ trace: 10,
17
+ debug: 20,
18
+ info: 30,
19
+ warn: 40,
20
+ error: 50,
21
+ fatal: 60
22
+ }
23
+
24
+ test('Default levels suite', ({ test, end }) => {
25
+ test('can check if current level enabled', async ({ equal }) => {
26
+ const log = pino({ level: 'debug' })
27
+ equal(true, log.isLevelEnabled('debug'))
28
+ })
29
+
30
+ test('can check if level enabled after level set', async ({ equal }) => {
31
+ const log = pino()
32
+ equal(false, log.isLevelEnabled('debug'))
33
+ log.level = 'debug'
34
+ equal(true, log.isLevelEnabled('debug'))
35
+ })
36
+
37
+ test('can check if higher level enabled', async ({ equal }) => {
38
+ const log = pino({ level: 'debug' })
39
+ equal(true, log.isLevelEnabled('error'))
40
+ })
41
+
42
+ test('can check if lower level is disabled', async ({ equal }) => {
43
+ const log = pino({ level: 'error' })
44
+ equal(false, log.isLevelEnabled('trace'))
45
+ })
46
+
47
+ test('ASC: can check if child has current level enabled', async ({ equal }) => {
48
+ const log = pino().child({}, { level: 'debug' })
49
+ equal(true, log.isLevelEnabled('debug'))
50
+ equal(true, log.isLevelEnabled('error'))
51
+ equal(false, log.isLevelEnabled('trace'))
52
+ })
53
+
54
+ test('can check if custom level is enabled', async ({ equal }) => {
55
+ const log = pino({
56
+ customLevels: { foo: 35 },
57
+ level: 'debug'
58
+ })
59
+ equal(true, log.isLevelEnabled('foo'))
60
+ equal(true, log.isLevelEnabled('error'))
61
+ equal(false, log.isLevelEnabled('trace'))
62
+ })
63
+
64
+ end()
65
+ })
66
+
67
+ test('Ascending levels suite', ({ test, end }) => {
68
+ const customLevels = ascLevels
69
+ const levelComparison = 'ASC'
70
+
71
+ test('can check if current level enabled', async ({ equal }) => {
72
+ const log = pino({ level: 'debug', levelComparison, customLevels, useOnlyCustomLevels: true })
73
+ equal(true, log.isLevelEnabled('debug'))
74
+ })
75
+
76
+ test('can check if level enabled after level set', async ({ equal }) => {
77
+ const log = pino({ levelComparison, customLevels, useOnlyCustomLevels: true })
78
+ equal(false, log.isLevelEnabled('debug'))
79
+ log.level = 'debug'
80
+ equal(true, log.isLevelEnabled('debug'))
81
+ })
82
+
83
+ test('can check if higher level enabled', async ({ equal }) => {
84
+ const log = pino({ level: 'debug', levelComparison, customLevels, useOnlyCustomLevels: true })
85
+ equal(true, log.isLevelEnabled('error'))
86
+ })
87
+
88
+ test('can check if lower level is disabled', async ({ equal }) => {
89
+ const log = pino({ level: 'error', customLevels, useOnlyCustomLevels: true })
90
+ equal(false, log.isLevelEnabled('trace'))
91
+ })
92
+
93
+ test('can check if child has current level enabled', async ({ equal }) => {
94
+ const log = pino().child({ levelComparison, customLevels, useOnlyCustomLevels: true }, { level: 'debug' })
95
+ equal(true, log.isLevelEnabled('debug'))
96
+ equal(true, log.isLevelEnabled('error'))
97
+ equal(false, log.isLevelEnabled('trace'))
98
+ })
99
+
100
+ test('can check if custom level is enabled', async ({ equal }) => {
101
+ const log = pino({
102
+ levelComparison,
103
+ useOnlyCustomLevels: true,
104
+ customLevels: { foo: 35, ...customLevels },
105
+ level: 'debug'
106
+ })
107
+ equal(true, log.isLevelEnabled('foo'))
108
+ equal(true, log.isLevelEnabled('error'))
109
+ equal(false, log.isLevelEnabled('trace'))
110
+ })
111
+
112
+ end()
113
+ })
114
+
115
+ test('Descending levels suite', ({ test, end }) => {
116
+ const customLevels = descLevels
117
+ const levelComparison = 'DESC'
118
+
119
+ test('can check if current level enabled', async ({ equal }) => {
120
+ const log = pino({ level: 'debug', levelComparison, customLevels, useOnlyCustomLevels: true })
121
+ equal(true, log.isLevelEnabled('debug'))
122
+ })
123
+
124
+ test('can check if level enabled after level set', async ({ equal }) => {
125
+ const log = pino({ levelComparison, customLevels, useOnlyCustomLevels: true })
126
+ equal(false, log.isLevelEnabled('debug'))
127
+ log.level = 'debug'
128
+ equal(true, log.isLevelEnabled('debug'))
129
+ })
130
+
131
+ test('can check if higher level enabled', async ({ equal }) => {
132
+ const log = pino({ level: 'debug', levelComparison, customLevels, useOnlyCustomLevels: true })
133
+ equal(true, log.isLevelEnabled('error'))
134
+ })
135
+
136
+ test('can check if lower level is disabled', async ({ equal }) => {
137
+ const log = pino({ level: 'error', levelComparison, customLevels, useOnlyCustomLevels: true })
138
+ equal(false, log.isLevelEnabled('trace'))
139
+ })
140
+
141
+ test('can check if child has current level enabled', async ({ equal }) => {
142
+ const log = pino({ levelComparison, customLevels, useOnlyCustomLevels: true }).child({}, { level: 'debug' })
143
+ equal(true, log.isLevelEnabled('debug'))
144
+ equal(true, log.isLevelEnabled('error'))
145
+ equal(false, log.isLevelEnabled('trace'))
146
+ })
147
+
148
+ test('can check if custom level is enabled', async ({ equal }) => {
149
+ const log = pino({
150
+ levelComparison,
151
+ customLevels: { foo: 35, ...customLevels },
152
+ useOnlyCustomLevels: true,
153
+ level: 'debug'
154
+ })
155
+ equal(true, log.isLevelEnabled('foo'))
156
+ equal(true, log.isLevelEnabled('error'))
157
+ equal(false, log.isLevelEnabled('trace'))
158
+ })
159
+
160
+ end()
161
+ })
162
+
163
+ test('Custom levels comparison', async ({ test, end }) => {
164
+ test('Custom comparison returns true cause level is enabled', async ({ equal }) => {
165
+ const log = pino({ level: 'error', levelComparison: () => true })
166
+ equal(true, log.isLevelEnabled('debug'))
167
+ })
168
+
169
+ test('Custom comparison returns false cause level is disabled', async ({ equal }) => {
170
+ const log = pino({ level: 'error', levelComparison: () => false })
171
+ equal(false, log.isLevelEnabled('debug'))
172
+ })
173
+
174
+ test('Custom comparison returns true cause child level is enabled', async ({ equal }) => {
175
+ const log = pino({ levelComparison: () => true }).child({ level: 'error' })
176
+ equal(true, log.isLevelEnabled('debug'))
177
+ })
178
+
179
+ test('Custom comparison returns false cause child level is disabled', async ({ equal }) => {
180
+ const log = pino({ levelComparison: () => false }).child({ level: 'error' })
181
+ equal(false, log.isLevelEnabled('debug'))
182
+ })
183
+
184
+ end()
185
+ })
@@ -0,0 +1,10 @@
1
+ /* global test */
2
+ const pino = require('../../pino')
3
+
4
+ test('transport should work in jest', function () {
5
+ pino({
6
+ transport: {
7
+ target: 'pino-pretty'
8
+ }
9
+ })
10
+ })