pino-sdk 9.7.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 pino-sdk might be problematic. Click here for more details.

Files changed (202) 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 +161 -0
  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 +505 -0
  36. package/build/sync-version.js +10 -0
  37. package/docs/api.md +1490 -0
  38. package/docs/asynchronous.md +40 -0
  39. package/docs/benchmarks.md +55 -0
  40. package/docs/browser.md +242 -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 +1263 -0
  49. package/docs/web.md +309 -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 +390 -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/package.json +119 -0
  74. package/pino-banner.png +0 -0
  75. package/pino-logo-hire.png +0 -0
  76. package/pino-tree.png +0 -0
  77. package/pino2.d.ts +913 -0
  78. package/pino2.js +234 -0
  79. package/pretty-demo.png +0 -0
  80. package/test/basic.test.js +874 -0
  81. package/test/broken-pipe.test.js +57 -0
  82. package/test/browser-child.test.js +132 -0
  83. package/test/browser-disabled.test.js +87 -0
  84. package/test/browser-early-console-freeze.test.js +12 -0
  85. package/test/browser-is-level-enabled.test.js +104 -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 +679 -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/crashing-transport.js +13 -0
  106. package/test/fixtures/default-exit.js +8 -0
  107. package/test/fixtures/destination-exit.js +8 -0
  108. package/test/fixtures/eval/index.js +13 -0
  109. package/test/fixtures/eval/node_modules/14-files.js +3 -0
  110. package/test/fixtures/eval/node_modules/2-files.js +3 -0
  111. package/test/fixtures/eval/node_modules/file1.js +5 -0
  112. package/test/fixtures/eval/node_modules/file10.js +5 -0
  113. package/test/fixtures/eval/node_modules/file11.js +5 -0
  114. package/test/fixtures/eval/node_modules/file12.js +5 -0
  115. package/test/fixtures/eval/node_modules/file13.js +5 -0
  116. package/test/fixtures/eval/node_modules/file14.js +11 -0
  117. package/test/fixtures/eval/node_modules/file2.js +5 -0
  118. package/test/fixtures/eval/node_modules/file3.js +5 -0
  119. package/test/fixtures/eval/node_modules/file4.js +5 -0
  120. package/test/fixtures/eval/node_modules/file5.js +5 -0
  121. package/test/fixtures/eval/node_modules/file6.js +5 -0
  122. package/test/fixtures/eval/node_modules/file7.js +5 -0
  123. package/test/fixtures/eval/node_modules/file8.js +5 -0
  124. package/test/fixtures/eval/node_modules/file9.js +5 -0
  125. package/test/fixtures/noop-transport.js +10 -0
  126. package/test/fixtures/pretty/null-prototype.js +8 -0
  127. package/test/fixtures/stdout-hack-protection.js +11 -0
  128. package/test/fixtures/syncfalse-child.js +6 -0
  129. package/test/fixtures/syncfalse-exit.js +9 -0
  130. package/test/fixtures/syncfalse-flush-exit.js +10 -0
  131. package/test/fixtures/syncfalse.js +6 -0
  132. package/test/fixtures/syntax-error-esm.mjs +2 -0
  133. package/test/fixtures/to-file-transport-with-transform.js +20 -0
  134. package/test/fixtures/to-file-transport.js +13 -0
  135. package/test/fixtures/to-file-transport.mjs +8 -0
  136. package/test/fixtures/transport/index.js +12 -0
  137. package/test/fixtures/transport/package.json +5 -0
  138. package/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  139. package/test/fixtures/transport-exit-immediately.js +11 -0
  140. package/test/fixtures/transport-exit-on-ready.js +12 -0
  141. package/test/fixtures/transport-main.js +9 -0
  142. package/test/fixtures/transport-many-lines.js +29 -0
  143. package/test/fixtures/transport-string-stdout.js +9 -0
  144. package/test/fixtures/transport-transform.js +21 -0
  145. package/test/fixtures/transport-uses-pino-config.js +33 -0
  146. package/test/fixtures/transport-with-on-exit.js +12 -0
  147. package/test/fixtures/transport-worker-data.js +19 -0
  148. package/test/fixtures/transport-worker.js +15 -0
  149. package/test/fixtures/transport-wrong-export-type.js +3 -0
  150. package/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  151. package/test/fixtures/ts/to-file-transport.ts +11 -0
  152. package/test/fixtures/ts/transpile.cjs +36 -0
  153. package/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  154. package/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  155. package/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  156. package/test/fixtures/ts/transport-main.ts +8 -0
  157. package/test/fixtures/ts/transport-string-stdout.ts +8 -0
  158. package/test/fixtures/ts/transport-worker.ts +14 -0
  159. package/test/formatters.test.js +355 -0
  160. package/test/helper.d.ts +4 -0
  161. package/test/helper.js +128 -0
  162. package/test/hooks.test.js +118 -0
  163. package/test/http.test.js +242 -0
  164. package/test/internals/version.test.js +15 -0
  165. package/test/is-level-enabled.test.js +185 -0
  166. package/test/jest/basic.spec.js +10 -0
  167. package/test/levels.test.js +772 -0
  168. package/test/metadata.test.js +106 -0
  169. package/test/mixin-merge-strategy.test.js +55 -0
  170. package/test/mixin.test.js +218 -0
  171. package/test/multistream.test.js +673 -0
  172. package/test/pkg/index.js +46 -0
  173. package/test/pkg/pkg.config.json +17 -0
  174. package/test/pkg/pkg.test.js +58 -0
  175. package/test/redact.test.js +847 -0
  176. package/test/serializers.test.js +253 -0
  177. package/test/stdout-protection.test.js +39 -0
  178. package/test/syncfalse.test.js +188 -0
  179. package/test/timestamp.test.js +121 -0
  180. package/test/transport/big.test.js +43 -0
  181. package/test/transport/bundlers-support.test.js +97 -0
  182. package/test/transport/caller.test.js +23 -0
  183. package/test/transport/core.test.js +643 -0
  184. package/test/transport/core.test.ts +236 -0
  185. package/test/transport/core.transpiled.test.ts +112 -0
  186. package/test/transport/crash.test.js +34 -0
  187. package/test/transport/module-link.test.js +239 -0
  188. package/test/transport/pipeline.test.js +135 -0
  189. package/test/transport/repl.test.js +14 -0
  190. package/test/transport/syncTrue.test.js +55 -0
  191. package/test/transport/syncfalse.test.js +68 -0
  192. package/test/transport/targets.test.js +44 -0
  193. package/test/transport/uses-pino-config.test.js +167 -0
  194. package/test/transport-stream.test.js +26 -0
  195. package/test/types/pino-import.test-d.ts +29 -0
  196. package/test/types/pino-multistream.test-d.ts +28 -0
  197. package/test/types/pino-top-export.test-d.ts +35 -0
  198. package/test/types/pino-transport.test-d.ts +145 -0
  199. package/test/types/pino-type-only.test-d.ts +64 -0
  200. package/test/types/pino.test-d.ts +527 -0
  201. package/test/types/pino.ts +78 -0
  202. package/tsconfig.json +14 -0
@@ -0,0 +1,138 @@
1
+ 'use strict'
2
+
3
+ const { type, platform, arch, release, cpus } = require('node:os')
4
+ const { resolve, join } = require('node:path')
5
+ const spawn = require('node:child_process').spawn
6
+ const pump = require('pump')
7
+ const split = require('split2')
8
+ const through = require('through2')
9
+ const steed = require('steed')
10
+
11
+ function usage () {
12
+ console.log(`
13
+ Pino Benchmarks
14
+
15
+ To run a benchmark, specify which to run:
16
+
17
+ ・all ⁃ run all benchmarks (takes a while)
18
+ ・basic ⁃ log a simple string
19
+ ・object ⁃ logging a basic object
20
+ ・deep-object ⁃ logging a large object
21
+ ・multi-arg ⁃ multiple log method arguments
22
+ ・child ⁃ child from a parent
23
+ ・child-child ⁃ child from a child
24
+ ・child-creation ⁃ child constructor
25
+ ・formatters ⁃ difference between with or without formatters
26
+
27
+ Example:
28
+
29
+ node runbench basic
30
+ `)
31
+ }
32
+
33
+ if (!process.argv[2]) {
34
+ usage()
35
+ process.exit()
36
+ }
37
+
38
+ const quiet = process.argv[3] === '-q'
39
+
40
+ const selectedBenchmark = process.argv[2].toLowerCase()
41
+ const benchmarkDir = resolve(__dirname, '..')
42
+ const benchmarks = {
43
+ basic: 'basic.bench.js',
44
+ object: 'object.bench.js',
45
+ 'deep-object': 'deep-object.bench.js',
46
+ 'multi-arg': 'multi-arg.bench.js',
47
+ 'long-string': 'long-string.bench.js',
48
+ child: 'child.bench.js',
49
+ 'child-child': 'child-child.bench.js',
50
+ 'child-creation': 'child-creation.bench.js',
51
+ formatters: 'formatters.bench.js'
52
+ }
53
+
54
+ function runBenchmark (name, done) {
55
+ const benchmarkResults = {}
56
+ benchmarkResults[name] = {}
57
+
58
+ const processor = through(function (line, enc, cb) {
59
+ const [label, time] = ('' + line).split(': ')
60
+ const [target, iterations] = label.split('*')
61
+ const logger = target.replace('bench', '')
62
+
63
+ if (!benchmarkResults[name][logger]) benchmarkResults[name][logger] = []
64
+
65
+ benchmarkResults[name][logger].push({
66
+ time: time.replace('ms', ''),
67
+ iterations: iterations.replace(':', '')
68
+ })
69
+
70
+ cb()
71
+ })
72
+
73
+ if (quiet === false) console.log(`Running ${name.toUpperCase()} benchmark\n`)
74
+
75
+ const benchmark = spawn(
76
+ process.argv[0],
77
+ [join(benchmarkDir, benchmarks[name])]
78
+ )
79
+
80
+ if (quiet === false) {
81
+ benchmark.stdout.pipe(process.stdout)
82
+ }
83
+
84
+ pump(benchmark.stdout, split(), processor)
85
+
86
+ benchmark.on('exit', () => {
87
+ console.log()
88
+ if (done && typeof done === 'function') done(null, benchmarkResults)
89
+ })
90
+ }
91
+
92
+ function sum (arr) {
93
+ let result = 0
94
+ for (var i = 0; i < arr.length; i += 1) {
95
+ result += Number.parseFloat(arr[i].time)
96
+ }
97
+ return result
98
+ }
99
+
100
+ function displayResults (results) {
101
+ if (quiet === false) console.log('==========')
102
+ const benchNames = Object.keys(results)
103
+ for (var i = 0; i < benchNames.length; i += 1) {
104
+ console.log(`${benchNames[i].toUpperCase()} benchmark averages`)
105
+ const benchmark = results[benchNames[i]]
106
+ const loggers = Object.keys(benchmark)
107
+ for (var j = 0; j < loggers.length; j += 1) {
108
+ const logger = benchmark[loggers[j]]
109
+ const average = sum(logger) / logger.length
110
+ console.log(`${loggers[j]} average: ${average.toFixed(3)}ms`)
111
+ }
112
+ }
113
+ if (quiet === false) {
114
+ console.log('==========')
115
+ console.log(
116
+ `System: ${type()}/${platform()} ${arch()} ${release()}`,
117
+ `~ ${cpus()[0].model} (cores/threads: ${cpus().length})`
118
+ )
119
+ }
120
+ }
121
+
122
+ function toBench (done) {
123
+ runBenchmark(this.name, done)
124
+ }
125
+
126
+ const benchQueue = []
127
+ if (selectedBenchmark !== 'all') {
128
+ benchQueue.push(toBench.bind({ name: selectedBenchmark }))
129
+ } else {
130
+ const keys = Object.keys(benchmarks)
131
+ for (var i = 0; i < keys.length; i += 1) {
132
+ benchQueue.push(toBench.bind({ name: keys[i] }))
133
+ }
134
+ }
135
+ steed.series(benchQueue, function (err, results) {
136
+ if (err) return console.error(err.message)
137
+ results.forEach(displayResults)
138
+ })
@@ -0,0 +1,55 @@
1
+ 'use strict'
2
+
3
+ const { readFileSync } = require('node:fs')
4
+ const vm = require('vm')
5
+ const { join } = require('node:path')
6
+ const code = readFileSync(
7
+ join(__dirname, '..', '..', 'node_modules', 'loglevel', 'lib', 'loglevel.js')
8
+ )
9
+ const { Console } = require('console')
10
+
11
+ function build (dest) {
12
+ const sandbox = {
13
+ module: {},
14
+ console: new Console(dest, dest)
15
+ }
16
+ const context = vm.createContext(sandbox)
17
+
18
+ const script = new vm.Script(code)
19
+ script.runInContext(context)
20
+
21
+ const loglevel = sandbox.log
22
+
23
+ const originalFactory = loglevel.methodFactory
24
+ loglevel.methodFactory = function (methodName, logLevel, loggerName) {
25
+ const rawMethod = originalFactory(methodName, logLevel, loggerName)
26
+
27
+ return function () {
28
+ const time = new Date()
29
+ let array
30
+ if (typeof arguments[0] === 'string') {
31
+ arguments[0] = '[' + time.toISOString() + '] ' + arguments[0]
32
+ rawMethod.apply(null, arguments)
33
+ } else {
34
+ array = new Array(arguments.length + 1)
35
+ array[0] = '[' + time.toISOString() + ']'
36
+ for (var i = 0; i < arguments.length; i++) {
37
+ array[i + 1] = arguments[i]
38
+ }
39
+ rawMethod.apply(null, array)
40
+ }
41
+ }
42
+ }
43
+
44
+ loglevel.setLevel(loglevel.levels.INFO)
45
+ return loglevel
46
+ }
47
+
48
+ module.exports = build
49
+
50
+ if (require.main === module) {
51
+ const loglevel = build(process.stdout)
52
+ loglevel.info('hello')
53
+ loglevel.info({ hello: 'world' })
54
+ loglevel.info('hello %j', { hello: 'world' })
55
+ }
package/bin.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ console.error(
3
+ '`pino2` cli has been removed. Use `pino-pretty` cli instead.\n' +
4
+ '\nSee: https://github.com/pinojs/pino-pretty'
5
+ )
6
+ process.exit(1)
package/browser.js ADDED
@@ -0,0 +1,505 @@
1
+ 'use strict'
2
+
3
+ const format = require('quick-format-unescaped')
4
+
5
+ module.exports = pino
6
+
7
+ const _console = pfGlobalThisOrFallback().console || {}
8
+ const stdSerializers = {
9
+ mapHttpRequest: mock,
10
+ mapHttpResponse: mock,
11
+ wrapRequestSerializer: passthrough,
12
+ wrapResponseSerializer: passthrough,
13
+ wrapErrorSerializer: passthrough,
14
+ req: mock,
15
+ res: mock,
16
+ err: asErrValue,
17
+ errWithCause: asErrValue
18
+ }
19
+ function levelToValue (level, logger) {
20
+ return level === 'silent'
21
+ ? Infinity
22
+ : logger.levels.values[level]
23
+ }
24
+ const baseLogFunctionSymbol = Symbol('pino.logFuncs')
25
+ const hierarchySymbol = Symbol('pino.hierarchy')
26
+
27
+ const logFallbackMap = {
28
+ error: 'log',
29
+ fatal: 'error',
30
+ warn: 'error',
31
+ info: 'log',
32
+ debug: 'log',
33
+ trace: 'log'
34
+ }
35
+
36
+ function appendChildLogger (parentLogger, childLogger) {
37
+ const newEntry = {
38
+ logger: childLogger,
39
+ parent: parentLogger[hierarchySymbol]
40
+ }
41
+ childLogger[hierarchySymbol] = newEntry
42
+ }
43
+
44
+ function setupBaseLogFunctions (logger, levels, proto) {
45
+ const logFunctions = {}
46
+ levels.forEach(level => {
47
+ logFunctions[level] = proto[level] ? proto[level] : (_console[level] || _console[logFallbackMap[level] || 'log'] || noop)
48
+ })
49
+ logger[baseLogFunctionSymbol] = logFunctions
50
+ }
51
+
52
+ function shouldSerialize (serialize, serializers) {
53
+ if (Array.isArray(serialize)) {
54
+ const hasToFilter = serialize.filter(function (k) {
55
+ return k !== '!stdSerializers.err'
56
+ })
57
+ return hasToFilter
58
+ } else if (serialize === true) {
59
+ return Object.keys(serializers)
60
+ }
61
+
62
+ return false
63
+ }
64
+
65
+ function pino (opts) {
66
+ opts = opts || {}
67
+ opts.browser = opts.browser || {}
68
+
69
+ const transmit = opts.browser.transmit
70
+ if (transmit && typeof transmit.send !== 'function') { throw Error('pino: transmit option must have a send function') }
71
+
72
+ const proto = opts.browser.write || _console
73
+ if (opts.browser.write) opts.browser.asObject = true
74
+ const serializers = opts.serializers || {}
75
+ const serialize = shouldSerialize(opts.browser.serialize, serializers)
76
+ let stdErrSerialize = opts.browser.serialize
77
+
78
+ if (
79
+ Array.isArray(opts.browser.serialize) &&
80
+ opts.browser.serialize.indexOf('!stdSerializers.err') > -1
81
+ ) stdErrSerialize = false
82
+
83
+ const customLevels = Object.keys(opts.customLevels || {})
84
+ const levels = ['error', 'fatal', 'warn', 'info', 'debug', 'trace'].concat(customLevels)
85
+
86
+ if (typeof proto === 'function') {
87
+ levels.forEach(function (level) {
88
+ proto[level] = proto
89
+ })
90
+ }
91
+ if (opts.enabled === false || opts.browser.disabled) opts.level = 'silent'
92
+ const level = opts.level || 'info'
93
+ const logger = Object.create(proto)
94
+ if (!logger.log) logger.log = noop
95
+
96
+ setupBaseLogFunctions(logger, levels, proto)
97
+ // setup root hierarchy entry
98
+ appendChildLogger({}, logger)
99
+
100
+ Object.defineProperty(logger, 'levelVal', {
101
+ get: getLevelVal
102
+ })
103
+ Object.defineProperty(logger, 'level', {
104
+ get: getLevel,
105
+ set: setLevel
106
+ })
107
+
108
+ const setOpts = {
109
+ transmit,
110
+ serialize,
111
+ asObject: opts.browser.asObject,
112
+ asObjectBindingsOnly: opts.browser.asObjectBindingsOnly,
113
+ formatters: opts.browser.formatters,
114
+ levels,
115
+ timestamp: getTimeFunction(opts),
116
+ messageKey: opts.messageKey || 'msg',
117
+ onChild: opts.onChild || noop
118
+ }
119
+ logger.levels = getLevels(opts)
120
+ logger.level = level
121
+
122
+ logger.isLevelEnabled = function (level) {
123
+ if (!this.levels.values[level]) {
124
+ return false
125
+ }
126
+
127
+ return this.levels.values[level] >= this.levels.values[this.level]
128
+ }
129
+ logger.setMaxListeners = logger.getMaxListeners =
130
+ logger.emit = logger.addListener = logger.on =
131
+ logger.prependListener = logger.once =
132
+ logger.prependOnceListener = logger.removeListener =
133
+ logger.removeAllListeners = logger.listeners =
134
+ logger.listenerCount = logger.eventNames =
135
+ logger.write = logger.flush = noop
136
+ logger.serializers = serializers
137
+ logger._serialize = serialize
138
+ logger._stdErrSerialize = stdErrSerialize
139
+ logger.child = function (...args) { return child.call(this, setOpts, ...args) }
140
+
141
+ if (transmit) logger._logEvent = createLogEventShape()
142
+
143
+ function getLevelVal () {
144
+ return levelToValue(this.level, this)
145
+ }
146
+
147
+ function getLevel () {
148
+ return this._level
149
+ }
150
+ function setLevel (level) {
151
+ if (level !== 'silent' && !this.levels.values[level]) {
152
+ throw Error('unknown level ' + level)
153
+ }
154
+ this._level = level
155
+
156
+ set(this, setOpts, logger, 'error') // <-- must stay first
157
+ set(this, setOpts, logger, 'fatal')
158
+ set(this, setOpts, logger, 'warn')
159
+ set(this, setOpts, logger, 'info')
160
+ set(this, setOpts, logger, 'debug')
161
+ set(this, setOpts, logger, 'trace')
162
+
163
+ customLevels.forEach((level) => {
164
+ set(this, setOpts, logger, level)
165
+ })
166
+ }
167
+
168
+ function child (setOpts, bindings, childOptions) {
169
+ if (!bindings) {
170
+ throw new Error('missing bindings for child Pino')
171
+ }
172
+ childOptions = childOptions || {}
173
+ if (serialize && bindings.serializers) {
174
+ childOptions.serializers = bindings.serializers
175
+ }
176
+ const childOptionsSerializers = childOptions.serializers
177
+ if (serialize && childOptionsSerializers) {
178
+ var childSerializers = Object.assign({}, serializers, childOptionsSerializers)
179
+ var childSerialize = opts.browser.serialize === true
180
+ ? Object.keys(childSerializers)
181
+ : serialize
182
+ delete bindings.serializers
183
+ applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)
184
+ }
185
+ function Child (parent) {
186
+ this._childLevel = (parent._childLevel | 0) + 1
187
+
188
+ // make sure bindings are available in the `set` function
189
+ this.bindings = bindings
190
+
191
+ if (childSerializers) {
192
+ this.serializers = childSerializers
193
+ this._serialize = childSerialize
194
+ }
195
+ if (transmit) {
196
+ this._logEvent = createLogEventShape(
197
+ [].concat(parent._logEvent.bindings, bindings)
198
+ )
199
+ }
200
+ }
201
+ Child.prototype = this
202
+ const newLogger = new Child(this)
203
+
204
+ // must happen before the level is assigned
205
+ appendChildLogger(this, newLogger)
206
+ newLogger.child = function (...args) { return child.call(this, setOpts, ...args) }
207
+ // required to actually initialize the logger functions for any given child
208
+ newLogger.level = childOptions.level || this.level // allow level to be set by childOptions
209
+ setOpts.onChild(newLogger)
210
+
211
+ return newLogger
212
+ }
213
+ return logger
214
+ }
215
+
216
+ function getLevels (opts) {
217
+ const customLevels = opts.customLevels || {}
218
+
219
+ const values = Object.assign({}, pino.levels.values, customLevels)
220
+ const labels = Object.assign({}, pino.levels.labels, invertObject(customLevels))
221
+
222
+ return {
223
+ values,
224
+ labels
225
+ }
226
+ }
227
+
228
+ function invertObject (obj) {
229
+ const inverted = {}
230
+ Object.keys(obj).forEach(function (key) {
231
+ inverted[obj[key]] = key
232
+ })
233
+ return inverted
234
+ }
235
+
236
+ pino.levels = {
237
+ values: {
238
+ fatal: 60,
239
+ error: 50,
240
+ warn: 40,
241
+ info: 30,
242
+ debug: 20,
243
+ trace: 10
244
+ },
245
+ labels: {
246
+ 10: 'trace',
247
+ 20: 'debug',
248
+ 30: 'info',
249
+ 40: 'warn',
250
+ 50: 'error',
251
+ 60: 'fatal'
252
+ }
253
+ }
254
+
255
+ pino.stdSerializers = stdSerializers
256
+ pino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })
257
+
258
+ function getBindingChain (logger) {
259
+ const bindings = []
260
+ if (logger.bindings) {
261
+ bindings.push(logger.bindings)
262
+ }
263
+
264
+ // traverse up the tree to get all bindings
265
+ let hierarchy = logger[hierarchySymbol]
266
+ while (hierarchy.parent) {
267
+ hierarchy = hierarchy.parent
268
+ if (hierarchy.logger.bindings) {
269
+ bindings.push(hierarchy.logger.bindings)
270
+ }
271
+ }
272
+
273
+ return bindings.reverse()
274
+ }
275
+
276
+ function set (self, opts, rootLogger, level) {
277
+ // override the current log functions with either `noop` or the base log function
278
+ Object.defineProperty(self, level, {
279
+ value: (levelToValue(self.level, rootLogger) > levelToValue(level, rootLogger)
280
+ ? noop
281
+ : rootLogger[baseLogFunctionSymbol][level]),
282
+ writable: true,
283
+ enumerable: true,
284
+ configurable: true
285
+ })
286
+
287
+ if (self[level] === noop) {
288
+ if (!opts.transmit) return
289
+
290
+ const transmitLevel = opts.transmit.level || self.level
291
+ const transmitValue = levelToValue(transmitLevel, rootLogger)
292
+ const methodValue = levelToValue(level, rootLogger)
293
+ if (methodValue < transmitValue) return
294
+ }
295
+
296
+ // make sure the log format is correct
297
+ self[level] = createWrap(self, opts, rootLogger, level)
298
+
299
+ // prepend bindings if it is not the root logger
300
+ const bindings = getBindingChain(self)
301
+ if (bindings.length === 0) {
302
+ // early exit in case for rootLogger
303
+ return
304
+ }
305
+ self[level] = prependBindingsInArguments(bindings, self[level])
306
+ }
307
+
308
+ function prependBindingsInArguments (bindings, logFunc) {
309
+ return function () {
310
+ return logFunc.apply(this, [...bindings, ...arguments])
311
+ }
312
+ }
313
+
314
+ function createWrap (self, opts, rootLogger, level) {
315
+ return (function (write) {
316
+ return function LOG () {
317
+ const ts = opts.timestamp()
318
+ const args = new Array(arguments.length)
319
+ const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this
320
+ for (var i = 0; i < args.length; i++) args[i] = arguments[i]
321
+
322
+ var argsIsSerialized = false
323
+ if (opts.serialize) {
324
+ applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)
325
+ argsIsSerialized = true
326
+ }
327
+ if (opts.asObject || opts.formatters) {
328
+ write.call(proto, ...asObject(this, level, args, ts, opts))
329
+ } else write.apply(proto, args)
330
+
331
+ if (opts.transmit) {
332
+ const transmitLevel = opts.transmit.level || self._level
333
+ const transmitValue = levelToValue(transmitLevel, rootLogger)
334
+ const methodValue = levelToValue(level, rootLogger)
335
+ if (methodValue < transmitValue) return
336
+ transmit(this, {
337
+ ts,
338
+ methodLevel: level,
339
+ methodValue,
340
+ transmitLevel,
341
+ transmitValue: rootLogger.levels.values[opts.transmit.level || self._level],
342
+ send: opts.transmit.send,
343
+ val: levelToValue(self._level, rootLogger)
344
+ }, args, argsIsSerialized)
345
+ }
346
+ }
347
+ })(self[baseLogFunctionSymbol][level])
348
+ }
349
+
350
+ function asObject (logger, level, args, ts, opts) {
351
+ const {
352
+ level: levelFormatter,
353
+ log: logObjectFormatter = (obj) => obj
354
+ } = opts.formatters || {}
355
+ const argsCloned = args.slice()
356
+ let msg = argsCloned[0]
357
+ const logObject = {}
358
+
359
+ let lvl = (logger._childLevel | 0) + 1
360
+ if (lvl < 1) lvl = 1
361
+
362
+ if (ts) {
363
+ logObject.time = ts
364
+ }
365
+
366
+ if (levelFormatter) {
367
+ const formattedLevel = levelFormatter(level, logger.levels.values[level])
368
+ Object.assign(logObject, formattedLevel)
369
+ } else {
370
+ logObject.level = logger.levels.values[level]
371
+ }
372
+
373
+ if (opts.asObjectBindingsOnly) {
374
+ if (msg !== null && typeof msg === 'object') {
375
+ while (lvl-- && typeof argsCloned[0] === 'object') {
376
+ Object.assign(logObject, argsCloned.shift())
377
+ }
378
+ }
379
+
380
+ const formattedLogObject = logObjectFormatter(logObject)
381
+ return [formattedLogObject, ...argsCloned]
382
+ } else {
383
+ // deliberate, catching objects, arrays
384
+ if (msg !== null && typeof msg === 'object') {
385
+ while (lvl-- && typeof argsCloned[0] === 'object') {
386
+ Object.assign(logObject, argsCloned.shift())
387
+ }
388
+ msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined
389
+ } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)
390
+ if (msg !== undefined) logObject[opts.messageKey] = msg
391
+
392
+ const formattedLogObject = logObjectFormatter(logObject)
393
+ return [formattedLogObject]
394
+ }
395
+ }
396
+
397
+ function applySerializers (args, serialize, serializers, stdErrSerialize) {
398
+ for (const i in args) {
399
+ if (stdErrSerialize && args[i] instanceof Error) {
400
+ args[i] = pino.stdSerializers.err(args[i])
401
+ } else if (typeof args[i] === 'object' && !Array.isArray(args[i]) && serialize) {
402
+ for (const k in args[i]) {
403
+ if (serialize.indexOf(k) > -1 && k in serializers) {
404
+ args[i][k] = serializers[k](args[i][k])
405
+ }
406
+ }
407
+ }
408
+ }
409
+ }
410
+
411
+ function transmit (logger, opts, args, argsIsSerialized = false) {
412
+ const send = opts.send
413
+ const ts = opts.ts
414
+ const methodLevel = opts.methodLevel
415
+ const methodValue = opts.methodValue
416
+ const val = opts.val
417
+ const bindings = logger._logEvent.bindings
418
+
419
+ if (!argsIsSerialized) {
420
+ applySerializers(
421
+ args,
422
+ logger._serialize || Object.keys(logger.serializers),
423
+ logger.serializers,
424
+ logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize
425
+ )
426
+ }
427
+
428
+ logger._logEvent.ts = ts
429
+ logger._logEvent.messages = args.filter(function (arg) {
430
+ // bindings can only be objects, so reference equality check via indexOf is fine
431
+ return bindings.indexOf(arg) === -1
432
+ })
433
+
434
+ logger._logEvent.level.label = methodLevel
435
+ logger._logEvent.level.value = methodValue
436
+
437
+ send(methodLevel, logger._logEvent, val)
438
+
439
+ logger._logEvent = createLogEventShape(bindings)
440
+ }
441
+
442
+ function createLogEventShape (bindings) {
443
+ return {
444
+ ts: 0,
445
+ messages: [],
446
+ bindings: bindings || [],
447
+ level: { label: '', value: 0 }
448
+ }
449
+ }
450
+
451
+ function asErrValue (err) {
452
+ const obj = {
453
+ type: err.constructor.name,
454
+ msg: err.message,
455
+ stack: err.stack
456
+ }
457
+ for (const key in err) {
458
+ if (obj[key] === undefined) {
459
+ obj[key] = err[key]
460
+ }
461
+ }
462
+ return obj
463
+ }
464
+
465
+ function getTimeFunction (opts) {
466
+ if (typeof opts.timestamp === 'function') {
467
+ return opts.timestamp
468
+ }
469
+ if (opts.timestamp === false) {
470
+ return nullTime
471
+ }
472
+ return epochTime
473
+ }
474
+
475
+ function mock () { return {} }
476
+ function passthrough (a) { return a }
477
+ function noop () {}
478
+
479
+ function nullTime () { return false }
480
+ function epochTime () { return Date.now() }
481
+ function unixTime () { return Math.round(Date.now() / 1000.0) }
482
+ function isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability
483
+
484
+ /* eslint-disable */
485
+ /* istanbul ignore next */
486
+ function pfGlobalThisOrFallback () {
487
+ function defd (o) { return typeof o !== 'undefined' && o }
488
+ try {
489
+ if (typeof globalThis !== 'undefined') return globalThis
490
+ Object.defineProperty(Object.prototype, 'globalThis', {
491
+ get: function () {
492
+ delete Object.prototype.globalThis
493
+ return (this.globalThis = this)
494
+ },
495
+ configurable: true
496
+ })
497
+ return globalThis
498
+ } catch (e) {
499
+ return defd(self) || defd(window) || defd(this) || {}
500
+ }
501
+ }
502
+ /* eslint-enable */
503
+
504
+ module.exports.default = pino
505
+ module.exports.pino = pino
@@ -0,0 +1,10 @@
1
+ const fs = require('node:fs')
2
+ const path = require('node:path')
3
+ const { version } = require('../package.json')
4
+
5
+ const metaContent = `'use strict'
6
+
7
+ module.exports = { version: '${version}' }
8
+ `
9
+
10
+ fs.writeFileSync(path.resolve('./lib/meta.js'), metaContent, { encoding: 'utf-8' })