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
@@ -0,0 +1,29 @@
1
+ 'use strict'
2
+
3
+ const pino = require('../..')
4
+ const transport = pino.transport({
5
+ targets: [{
6
+ level: 'info',
7
+ target: 'pino/file',
8
+ options: {
9
+ destination: process.argv[2]
10
+ }
11
+ }]
12
+ })
13
+ const logger = pino(transport)
14
+
15
+ const toWrite = 1000000
16
+ transport.on('ready', run)
17
+
18
+ let total = 0
19
+
20
+ function run () {
21
+ if (total++ === 8) {
22
+ return
23
+ }
24
+
25
+ for (let i = 0; i < toWrite; i++) {
26
+ logger.info(`hello ${i}`)
27
+ }
28
+ transport.once('drain', run)
29
+ }
@@ -0,0 +1,9 @@
1
+ 'use strict'
2
+
3
+ const pino = require('../..')
4
+ const transport = pino.transport({
5
+ target: 'pino/file',
6
+ options: { destination: '1' }
7
+ })
8
+ const logger = pino(transport)
9
+ logger.info('Hello')
@@ -0,0 +1,21 @@
1
+ 'use strict'
2
+
3
+ const build = require('pino-abstract-transport')
4
+ const { pipeline, Transform } = require('node:stream')
5
+ module.exports = (options) => {
6
+ return build(function (source) {
7
+ const myTransportStream = new Transform({
8
+ autoDestroy: true,
9
+ objectMode: true,
10
+ transform (chunk, enc, cb) {
11
+ chunk.service = 'pino'
12
+ this.push(JSON.stringify(chunk))
13
+ cb()
14
+ }
15
+ })
16
+ pipeline(source, myTransportStream, () => {})
17
+ return myTransportStream
18
+ }, {
19
+ enablePipelining: true
20
+ })
21
+ }
@@ -0,0 +1,33 @@
1
+ 'use strict'
2
+
3
+ const build = require('pino-abstract-transport')
4
+ const { pipeline, Transform } = require('node:stream')
5
+ module.exports = () => {
6
+ return build(function (source) {
7
+ const myTransportStream = new Transform({
8
+ autoDestroy: true,
9
+ objectMode: true,
10
+ transform (chunk, enc, cb) {
11
+ const {
12
+ time,
13
+ level,
14
+ [source.messageKey]: body,
15
+ [source.errorKey]: error,
16
+ ...attributes
17
+ } = chunk
18
+ this.push(JSON.stringify({
19
+ severityText: source.levels.labels[level],
20
+ body,
21
+ attributes,
22
+ ...(error && { error })
23
+ }))
24
+ cb()
25
+ }
26
+ })
27
+ pipeline(source, myTransportStream, () => {})
28
+ return myTransportStream
29
+ }, {
30
+ enablePipelining: true,
31
+ expectPinoConfig: true
32
+ })
33
+ }
@@ -0,0 +1,12 @@
1
+ 'use strict'
2
+ const pino = require('../..')
3
+ const log = pino({
4
+ transport: {
5
+ target: 'pino/file',
6
+ options: { destination: 1 }
7
+ }
8
+ })
9
+ log.info('hello world!')
10
+ process.on('exit', (code) => {
11
+ log.info('Exiting peacefully')
12
+ })
@@ -0,0 +1,19 @@
1
+ 'use strict'
2
+
3
+ const { parentPort, workerData } = require('worker_threads')
4
+ const { Writable } = require('node:stream')
5
+
6
+ module.exports = (options) => {
7
+ const myTransportStream = new Writable({
8
+ autoDestroy: true,
9
+ write (chunk, enc, cb) {
10
+ parentPort.postMessage({
11
+ code: 'EVENT',
12
+ name: 'workerData',
13
+ args: [workerData]
14
+ })
15
+ cb()
16
+ }
17
+ })
18
+ return myTransportStream
19
+ }
@@ -0,0 +1,15 @@
1
+ 'use strict'
2
+
3
+ const { Writable } = require('node:stream')
4
+ const fs = require('node:fs')
5
+ module.exports = (options) => {
6
+ const myTransportStream = new Writable({
7
+ autoDestroy: true,
8
+ write (chunk, enc, cb) {
9
+ // Bypass console.log() to avoid flakiness
10
+ fs.writeSync(1, chunk.toString())
11
+ cb()
12
+ }
13
+ })
14
+ return myTransportStream
15
+ }
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ completelyUnrelatedProperty: 'Just a very incorrect transport worker implementation'
3
+ }
@@ -0,0 +1,18 @@
1
+ import * as fs from 'node:fs'
2
+ import { once } from 'node:events'
3
+ import { Transform } from 'node:stream'
4
+
5
+ async function run (opts: { destination?: fs.PathLike }): Promise<Transform> {
6
+ if (!opts.destination) throw new Error('kaboom')
7
+ const stream = fs.createWriteStream(opts.destination)
8
+ await once(stream, 'open')
9
+ const t = new Transform({
10
+ transform (chunk, enc, cb) {
11
+ setImmediate(cb, null, chunk.toString().toUpperCase())
12
+ }
13
+ })
14
+ t.pipe(stream)
15
+ return t
16
+ }
17
+
18
+ export default run
@@ -0,0 +1,11 @@
1
+ import * as fs from 'node:fs'
2
+ import { once } from 'node:events'
3
+
4
+ async function run (opts: { destination?: fs.PathLike }): Promise<fs.WriteStream> {
5
+ if (!opts.destination) throw new Error('kaboom')
6
+ const stream = fs.createWriteStream(opts.destination, { encoding: 'utf8' })
7
+ await once(stream, 'open')
8
+ return stream
9
+ }
10
+
11
+ export default run
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ const execa = require('execa')
4
+ const fs = require('node:fs')
5
+
6
+ const existsSync = fs.existsSync
7
+ const stat = fs.promises.stat
8
+
9
+ // Hardcoded parameters
10
+ const esVersions = ['es5', 'es6', 'es2017', 'esnext']
11
+ const filesToTranspile = ['to-file-transport.ts']
12
+
13
+ async function transpile () {
14
+ process.chdir(__dirname)
15
+
16
+ for (const sourceFileName of filesToTranspile) {
17
+ const sourceStat = await stat(sourceFileName)
18
+
19
+ for (const esVersion of esVersions) {
20
+ const intermediateFileName = sourceFileName.replace(/\.ts$/, '.js')
21
+ const targetFileName = sourceFileName.replace(/\.ts$/, `.${esVersion}.cjs`)
22
+
23
+ const shouldTranspile = !existsSync(targetFileName) || (await stat(targetFileName)).mtimeMs < sourceStat.mtimeMs
24
+
25
+ if (shouldTranspile) {
26
+ await execa('tsc', ['--target', esVersion, '--module', 'commonjs', sourceFileName])
27
+ await execa('mv', [intermediateFileName, targetFileName])
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+ transpile().catch(err => {
34
+ process.exitCode = 1
35
+ throw err
36
+ })
@@ -0,0 +1,15 @@
1
+ import pino from '../../..'
2
+ import { join } from 'node:path'
3
+
4
+ const transport = pino.transport({
5
+ target: join(__dirname, 'to-file-transport-with-transform.ts'),
6
+ options: {
7
+ destination: process.argv[2]
8
+ }
9
+ })
10
+ const logger = pino(transport)
11
+
12
+ logger.info('Hello')
13
+ logger.info('World')
14
+
15
+ process.exit(0)
@@ -0,0 +1,10 @@
1
+ import pino from '../../..'
2
+
3
+ const transport = pino.transport({
4
+ target: 'pino/file'
5
+ })
6
+ const logger = pino(transport)
7
+
8
+ logger.info('Hello')
9
+
10
+ process.exit(0)
@@ -0,0 +1,11 @@
1
+ import pino from '../../..'
2
+
3
+ const transport = pino.transport({
4
+ target: 'pino/file'
5
+ })
6
+ const logger = pino(transport)
7
+
8
+ transport.on('ready', function () {
9
+ logger.info('Hello')
10
+ process.exit(0)
11
+ })
@@ -0,0 +1,8 @@
1
+ import { join } from 'node:path'
2
+ import pino from '../../..'
3
+
4
+ const transport = pino.transport({
5
+ target: join(__dirname, 'transport-worker.ts')
6
+ })
7
+ const logger = pino(transport)
8
+ logger.info('Hello')
@@ -0,0 +1,8 @@
1
+ import pino from '../../..'
2
+
3
+ const transport = pino.transport({
4
+ target: 'pino/file',
5
+ options: { destination: '1' }
6
+ })
7
+ const logger = pino(transport)
8
+ logger.info('Hello')
@@ -0,0 +1,14 @@
1
+ import { Writable } from 'node:stream'
2
+
3
+ export default (): Writable => {
4
+ const myTransportStream = new Writable({
5
+ autoDestroy: true,
6
+ write (chunk, _enc, cb) {
7
+ console.log(chunk.toString())
8
+ cb()
9
+ },
10
+ defaultEncoding: 'utf8'
11
+ })
12
+
13
+ return myTransportStream
14
+ }
@@ -0,0 +1,355 @@
1
+ 'use strict'
2
+ /* eslint no-prototype-builtins: 0 */
3
+
4
+ const { hostname } = require('node:os')
5
+ const { join } = require('node:path')
6
+ const { readFile } = require('node:fs').promises
7
+ const { test } = require('tap')
8
+ const { sink, once, watchFileCreated, file } = require('./helper')
9
+ const pino = require('../')
10
+
11
+ test('level formatter', async ({ match }) => {
12
+ const stream = sink()
13
+ const logger = pino({
14
+ formatters: {
15
+ level (label, number) {
16
+ return {
17
+ log: {
18
+ level: label
19
+ }
20
+ }
21
+ }
22
+ }
23
+ }, stream)
24
+
25
+ const o = once(stream, 'data')
26
+ logger.info('hello world')
27
+ match(await o, {
28
+ log: {
29
+ level: 'info'
30
+ }
31
+ })
32
+ })
33
+
34
+ test('bindings formatter', async ({ match }) => {
35
+ const stream = sink()
36
+ const logger = pino({
37
+ formatters: {
38
+ bindings (bindings) {
39
+ return {
40
+ process: {
41
+ pid: bindings.pid
42
+ },
43
+ host: {
44
+ name: bindings.hostname
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }, stream)
50
+
51
+ const o = once(stream, 'data')
52
+ logger.info('hello world')
53
+ match(await o, {
54
+ process: {
55
+ pid: process.pid
56
+ },
57
+ host: {
58
+ name: hostname()
59
+ }
60
+ })
61
+ })
62
+
63
+ test('no bindings formatter', async ({ match, notOk }) => {
64
+ const stream = sink()
65
+ const logger = pino({
66
+ formatters: {
67
+ bindings (bindings) {
68
+ return null
69
+ }
70
+ }
71
+ }, stream)
72
+
73
+ const o = once(stream, 'data')
74
+ logger.info('hello world')
75
+ const log = await o
76
+ notOk(log.hasOwnProperty('pid'))
77
+ notOk(log.hasOwnProperty('hostname'))
78
+ match(log, { msg: 'hello world' })
79
+ })
80
+
81
+ test('log formatter', async ({ match, equal }) => {
82
+ const stream = sink()
83
+ const logger = pino({
84
+ formatters: {
85
+ log (obj) {
86
+ equal(obj.hasOwnProperty('msg'), false)
87
+ return { hello: 'world', ...obj }
88
+ }
89
+ }
90
+ }, stream)
91
+
92
+ const o = once(stream, 'data')
93
+ logger.info({ foo: 'bar', nested: { object: true } }, 'hello world')
94
+ match(await o, {
95
+ hello: 'world',
96
+ foo: 'bar',
97
+ nested: { object: true }
98
+ })
99
+ })
100
+
101
+ test('Formatters combined', async ({ match }) => {
102
+ const stream = sink()
103
+ const logger = pino({
104
+ formatters: {
105
+ level (label, number) {
106
+ return {
107
+ log: {
108
+ level: label
109
+ }
110
+ }
111
+ },
112
+ bindings (bindings) {
113
+ return {
114
+ process: {
115
+ pid: bindings.pid
116
+ },
117
+ host: {
118
+ name: bindings.hostname
119
+ }
120
+ }
121
+ },
122
+ log (obj) {
123
+ return { hello: 'world', ...obj }
124
+ }
125
+ }
126
+ }, stream)
127
+
128
+ const o = once(stream, 'data')
129
+ logger.info({ foo: 'bar', nested: { object: true } }, 'hello world')
130
+ match(await o, {
131
+ log: {
132
+ level: 'info'
133
+ },
134
+ process: {
135
+ pid: process.pid
136
+ },
137
+ host: {
138
+ name: hostname()
139
+ },
140
+ hello: 'world',
141
+ foo: 'bar',
142
+ nested: { object: true }
143
+ })
144
+ })
145
+
146
+ test('Formatters in child logger', async ({ match }) => {
147
+ const stream = sink()
148
+ const logger = pino({
149
+ formatters: {
150
+ level (label, number) {
151
+ return {
152
+ log: {
153
+ level: label
154
+ }
155
+ }
156
+ },
157
+ bindings (bindings) {
158
+ return {
159
+ process: {
160
+ pid: bindings.pid
161
+ },
162
+ host: {
163
+ name: bindings.hostname
164
+ }
165
+ }
166
+ },
167
+ log (obj) {
168
+ return { hello: 'world', ...obj }
169
+ }
170
+ }
171
+ }, stream)
172
+
173
+ const child = logger.child({
174
+ foo: 'bar',
175
+ nested: { object: true }
176
+ }, {
177
+ formatters: {
178
+ bindings (bindings) {
179
+ return { ...bindings, faz: 'baz' }
180
+ }
181
+ }
182
+ })
183
+
184
+ const o = once(stream, 'data')
185
+ child.info('hello world')
186
+ match(await o, {
187
+ log: {
188
+ level: 'info'
189
+ },
190
+ process: {
191
+ pid: process.pid
192
+ },
193
+ host: {
194
+ name: hostname()
195
+ },
196
+ hello: 'world',
197
+ foo: 'bar',
198
+ nested: { object: true },
199
+ faz: 'baz'
200
+ })
201
+ })
202
+
203
+ test('Formatters without bindings in child logger', async ({ match }) => {
204
+ const stream = sink()
205
+ const logger = pino({
206
+ formatters: {
207
+ level (label, number) {
208
+ return {
209
+ log: {
210
+ level: label
211
+ }
212
+ }
213
+ },
214
+ bindings (bindings) {
215
+ return {
216
+ process: {
217
+ pid: bindings.pid
218
+ },
219
+ host: {
220
+ name: bindings.hostname
221
+ }
222
+ }
223
+ },
224
+ log (obj) {
225
+ return { hello: 'world', ...obj }
226
+ }
227
+ }
228
+ }, stream)
229
+
230
+ const child = logger.child({
231
+ foo: 'bar',
232
+ nested: { object: true }
233
+ }, {
234
+ formatters: {
235
+ log (obj) {
236
+ return { other: 'stuff', ...obj }
237
+ }
238
+ }
239
+ })
240
+
241
+ const o = once(stream, 'data')
242
+ child.info('hello world')
243
+ match(await o, {
244
+ log: {
245
+ level: 'info'
246
+ },
247
+ process: {
248
+ pid: process.pid
249
+ },
250
+ host: {
251
+ name: hostname()
252
+ },
253
+ foo: 'bar',
254
+ other: 'stuff',
255
+ nested: { object: true }
256
+ })
257
+ })
258
+
259
+ test('elastic common schema format', async ({ match, type }) => {
260
+ const stream = sink()
261
+ const ecs = {
262
+ formatters: {
263
+ level (label, number) {
264
+ return {
265
+ log: {
266
+ level: label,
267
+ logger: 'pino'
268
+ }
269
+ }
270
+ },
271
+ bindings (bindings) {
272
+ return {
273
+ process: {
274
+ pid: bindings.pid
275
+ },
276
+ host: {
277
+ name: bindings.hostname
278
+ }
279
+ }
280
+ },
281
+ log (obj) {
282
+ return { ecs: { version: '1.4.0' }, ...obj }
283
+ }
284
+ },
285
+ messageKey: 'message',
286
+ timestamp: () => `,"@timestamp":"${new Date(Date.now()).toISOString()}"`
287
+ }
288
+
289
+ const logger = pino({ ...ecs }, stream)
290
+
291
+ const o = once(stream, 'data')
292
+ logger.info({ foo: 'bar' }, 'hello world')
293
+ const log = await o
294
+ type(log['@timestamp'], 'string')
295
+ match(log, {
296
+ log: { level: 'info', logger: 'pino' },
297
+ process: { pid: process.pid },
298
+ host: { name: hostname() },
299
+ ecs: { version: '1.4.0' },
300
+ foo: 'bar',
301
+ message: 'hello world'
302
+ })
303
+ })
304
+
305
+ test('formatter with transport', async ({ match, equal }) => {
306
+ const destination = file()
307
+ const logger = pino({
308
+ formatters: {
309
+ log (obj) {
310
+ equal(obj.hasOwnProperty('msg'), false)
311
+ return { hello: 'world', ...obj }
312
+ }
313
+ },
314
+ transport: {
315
+ targets: [
316
+ {
317
+ target: join(__dirname, 'fixtures', 'to-file-transport.js'),
318
+ options: { destination }
319
+ }
320
+ ]
321
+ }
322
+ })
323
+
324
+ logger.info({ foo: 'bar', nested: { object: true } }, 'hello world')
325
+ await watchFileCreated(destination)
326
+ const result = JSON.parse(await readFile(destination))
327
+ delete result.time
328
+ match(result, {
329
+ hello: 'world',
330
+ foo: 'bar',
331
+ nested: { object: true }
332
+ })
333
+ })
334
+
335
+ test('throws when custom level formatter is used with transport.targets', async ({ throws }) => {
336
+ throws(() => {
337
+ pino({
338
+ formatters: {
339
+ level (label) {
340
+ return label
341
+ }
342
+ },
343
+ transport: {
344
+ targets: [
345
+ {
346
+ target: 'pino/file',
347
+ options: { destination: 'foo.log' }
348
+ }
349
+ ]
350
+ }
351
+ }
352
+ )
353
+ },
354
+ Error('option.transport.targets do not allow custom level formatters'))
355
+ })
@@ -0,0 +1,4 @@
1
+ import { PathLike } from 'node:fs'
2
+
3
+ export declare function watchFileCreated(filename: PathLike): Promise<void>
4
+ export declare function watchForWrite(filename: PathLike, testString: string): Promise<void>