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,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
+ '`pino` 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,484 @@
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
+ formatters: opts.browser.formatters,
113
+ levels,
114
+ timestamp: getTimeFunction(opts),
115
+ messageKey: opts.messageKey || 'msg',
116
+ onChild: opts.onChild || noop
117
+ }
118
+ logger.levels = getLevels(opts)
119
+ logger.level = level
120
+
121
+ logger.setMaxListeners = logger.getMaxListeners =
122
+ logger.emit = logger.addListener = logger.on =
123
+ logger.prependListener = logger.once =
124
+ logger.prependOnceListener = logger.removeListener =
125
+ logger.removeAllListeners = logger.listeners =
126
+ logger.listenerCount = logger.eventNames =
127
+ logger.write = logger.flush = noop
128
+ logger.serializers = serializers
129
+ logger._serialize = serialize
130
+ logger._stdErrSerialize = stdErrSerialize
131
+ logger.child = function (...args) { return child.call(this, setOpts, ...args) }
132
+
133
+ if (transmit) logger._logEvent = createLogEventShape()
134
+
135
+ function getLevelVal () {
136
+ return levelToValue(this.level, this)
137
+ }
138
+
139
+ function getLevel () {
140
+ return this._level
141
+ }
142
+ function setLevel (level) {
143
+ if (level !== 'silent' && !this.levels.values[level]) {
144
+ throw Error('unknown level ' + level)
145
+ }
146
+ this._level = level
147
+
148
+ set(this, setOpts, logger, 'error') // <-- must stay first
149
+ set(this, setOpts, logger, 'fatal')
150
+ set(this, setOpts, logger, 'warn')
151
+ set(this, setOpts, logger, 'info')
152
+ set(this, setOpts, logger, 'debug')
153
+ set(this, setOpts, logger, 'trace')
154
+
155
+ customLevels.forEach((level) => {
156
+ set(this, setOpts, logger, level)
157
+ })
158
+ }
159
+
160
+ function child (setOpts, bindings, childOptions) {
161
+ if (!bindings) {
162
+ throw new Error('missing bindings for child Pino')
163
+ }
164
+ childOptions = childOptions || {}
165
+ if (serialize && bindings.serializers) {
166
+ childOptions.serializers = bindings.serializers
167
+ }
168
+ const childOptionsSerializers = childOptions.serializers
169
+ if (serialize && childOptionsSerializers) {
170
+ var childSerializers = Object.assign({}, serializers, childOptionsSerializers)
171
+ var childSerialize = opts.browser.serialize === true
172
+ ? Object.keys(childSerializers)
173
+ : serialize
174
+ delete bindings.serializers
175
+ applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)
176
+ }
177
+ function Child (parent) {
178
+ this._childLevel = (parent._childLevel | 0) + 1
179
+
180
+ // make sure bindings are available in the `set` function
181
+ this.bindings = bindings
182
+
183
+ if (childSerializers) {
184
+ this.serializers = childSerializers
185
+ this._serialize = childSerialize
186
+ }
187
+ if (transmit) {
188
+ this._logEvent = createLogEventShape(
189
+ [].concat(parent._logEvent.bindings, bindings)
190
+ )
191
+ }
192
+ }
193
+ Child.prototype = this
194
+ const newLogger = new Child(this)
195
+
196
+ // must happen before the level is assigned
197
+ appendChildLogger(this, newLogger)
198
+ newLogger.child = function (...args) { return child.call(this, setOpts, ...args) }
199
+ // required to actually initialize the logger functions for any given child
200
+ newLogger.level = childOptions.level || this.level // allow level to be set by childOptions
201
+ setOpts.onChild(newLogger)
202
+
203
+ return newLogger
204
+ }
205
+ return logger
206
+ }
207
+
208
+ function getLevels (opts) {
209
+ const customLevels = opts.customLevels || {}
210
+
211
+ const values = Object.assign({}, pino.levels.values, customLevels)
212
+ const labels = Object.assign({}, pino.levels.labels, invertObject(customLevels))
213
+
214
+ return {
215
+ values,
216
+ labels
217
+ }
218
+ }
219
+
220
+ function invertObject (obj) {
221
+ const inverted = {}
222
+ Object.keys(obj).forEach(function (key) {
223
+ inverted[obj[key]] = key
224
+ })
225
+ return inverted
226
+ }
227
+
228
+ pino.levels = {
229
+ values: {
230
+ fatal: 60,
231
+ error: 50,
232
+ warn: 40,
233
+ info: 30,
234
+ debug: 20,
235
+ trace: 10
236
+ },
237
+ labels: {
238
+ 10: 'trace',
239
+ 20: 'debug',
240
+ 30: 'info',
241
+ 40: 'warn',
242
+ 50: 'error',
243
+ 60: 'fatal'
244
+ }
245
+ }
246
+
247
+ pino.stdSerializers = stdSerializers
248
+ pino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })
249
+
250
+ function getBindingChain (logger) {
251
+ const bindings = []
252
+ if (logger.bindings) {
253
+ bindings.push(logger.bindings)
254
+ }
255
+
256
+ // traverse up the tree to get all bindings
257
+ let hierarchy = logger[hierarchySymbol]
258
+ while (hierarchy.parent) {
259
+ hierarchy = hierarchy.parent
260
+ if (hierarchy.logger.bindings) {
261
+ bindings.push(hierarchy.logger.bindings)
262
+ }
263
+ }
264
+
265
+ return bindings.reverse()
266
+ }
267
+
268
+ function set (self, opts, rootLogger, level) {
269
+ // override the current log functions with either `noop` or the base log function
270
+ Object.defineProperty(self, level, {
271
+ value: (levelToValue(self.level, rootLogger) > levelToValue(level, rootLogger)
272
+ ? noop
273
+ : rootLogger[baseLogFunctionSymbol][level]),
274
+ writable: true,
275
+ enumerable: true,
276
+ configurable: true
277
+ })
278
+
279
+ if (self[level] === noop) {
280
+ if (!opts.transmit) return
281
+
282
+ const transmitLevel = opts.transmit.level || self.level
283
+ const transmitValue = levelToValue(transmitLevel, rootLogger)
284
+ const methodValue = levelToValue(level, rootLogger)
285
+ if (methodValue < transmitValue) return
286
+ }
287
+
288
+ // make sure the log format is correct
289
+ self[level] = createWrap(self, opts, rootLogger, level)
290
+
291
+ // prepend bindings if it is not the root logger
292
+ const bindings = getBindingChain(self)
293
+ if (bindings.length === 0) {
294
+ // early exit in case for rootLogger
295
+ return
296
+ }
297
+ self[level] = prependBindingsInArguments(bindings, self[level])
298
+ }
299
+
300
+ function prependBindingsInArguments (bindings, logFunc) {
301
+ return function () {
302
+ return logFunc.apply(this, [...bindings, ...arguments])
303
+ }
304
+ }
305
+
306
+ function createWrap (self, opts, rootLogger, level) {
307
+ return (function (write) {
308
+ return function LOG () {
309
+ const ts = opts.timestamp()
310
+ const args = new Array(arguments.length)
311
+ const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this
312
+ for (var i = 0; i < args.length; i++) args[i] = arguments[i]
313
+
314
+ var argsIsSerialized = false
315
+ if (opts.serialize) {
316
+ applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)
317
+ argsIsSerialized = true
318
+ }
319
+ if (opts.asObject || opts.formatters) {
320
+ write.call(proto, asObject(this, level, args, ts, opts))
321
+ } else write.apply(proto, args)
322
+
323
+ if (opts.transmit) {
324
+ const transmitLevel = opts.transmit.level || self._level
325
+ const transmitValue = levelToValue(transmitLevel, rootLogger)
326
+ const methodValue = levelToValue(level, rootLogger)
327
+ if (methodValue < transmitValue) return
328
+ transmit(this, {
329
+ ts,
330
+ methodLevel: level,
331
+ methodValue,
332
+ transmitLevel,
333
+ transmitValue: rootLogger.levels.values[opts.transmit.level || self._level],
334
+ send: opts.transmit.send,
335
+ val: levelToValue(self._level, rootLogger)
336
+ }, args, argsIsSerialized)
337
+ }
338
+ }
339
+ })(self[baseLogFunctionSymbol][level])
340
+ }
341
+
342
+ function asObject (logger, level, args, ts, opts) {
343
+ const {
344
+ level: levelFormatter,
345
+ log: logObjectFormatter = (obj) => obj
346
+ } = opts.formatters || {}
347
+ const argsCloned = args.slice()
348
+ let msg = argsCloned[0]
349
+ const logObject = {}
350
+ if (ts) {
351
+ logObject.time = ts
352
+ }
353
+
354
+ if (levelFormatter) {
355
+ const formattedLevel = levelFormatter(level, logger.levels.values[level])
356
+ Object.assign(logObject, formattedLevel)
357
+ } else {
358
+ logObject.level = logger.levels.values[level]
359
+ }
360
+
361
+ let lvl = (logger._childLevel | 0) + 1
362
+ if (lvl < 1) lvl = 1
363
+ // deliberate, catching objects, arrays
364
+ if (msg !== null && typeof msg === 'object') {
365
+ while (lvl-- && typeof argsCloned[0] === 'object') {
366
+ Object.assign(logObject, argsCloned.shift())
367
+ }
368
+ msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined
369
+ } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)
370
+ if (msg !== undefined) logObject[opts.messageKey] = msg
371
+
372
+ const formattedLogObject = logObjectFormatter(logObject)
373
+ return formattedLogObject
374
+ }
375
+
376
+ function applySerializers (args, serialize, serializers, stdErrSerialize) {
377
+ for (const i in args) {
378
+ if (stdErrSerialize && args[i] instanceof Error) {
379
+ args[i] = pino.stdSerializers.err(args[i])
380
+ } else if (typeof args[i] === 'object' && !Array.isArray(args[i]) && serialize) {
381
+ for (const k in args[i]) {
382
+ if (serialize.indexOf(k) > -1 && k in serializers) {
383
+ args[i][k] = serializers[k](args[i][k])
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+
390
+ function transmit (logger, opts, args, argsIsSerialized = false) {
391
+ const send = opts.send
392
+ const ts = opts.ts
393
+ const methodLevel = opts.methodLevel
394
+ const methodValue = opts.methodValue
395
+ const val = opts.val
396
+ const bindings = logger._logEvent.bindings
397
+
398
+ if (!argsIsSerialized) {
399
+ applySerializers(
400
+ args,
401
+ logger._serialize || Object.keys(logger.serializers),
402
+ logger.serializers,
403
+ logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize
404
+ )
405
+ }
406
+
407
+ logger._logEvent.ts = ts
408
+ logger._logEvent.messages = args.filter(function (arg) {
409
+ // bindings can only be objects, so reference equality check via indexOf is fine
410
+ return bindings.indexOf(arg) === -1
411
+ })
412
+
413
+ logger._logEvent.level.label = methodLevel
414
+ logger._logEvent.level.value = methodValue
415
+
416
+ send(methodLevel, logger._logEvent, val)
417
+
418
+ logger._logEvent = createLogEventShape(bindings)
419
+ }
420
+
421
+ function createLogEventShape (bindings) {
422
+ return {
423
+ ts: 0,
424
+ messages: [],
425
+ bindings: bindings || [],
426
+ level: { label: '', value: 0 }
427
+ }
428
+ }
429
+
430
+ function asErrValue (err) {
431
+ const obj = {
432
+ type: err.constructor.name,
433
+ msg: err.message,
434
+ stack: err.stack
435
+ }
436
+ for (const key in err) {
437
+ if (obj[key] === undefined) {
438
+ obj[key] = err[key]
439
+ }
440
+ }
441
+ return obj
442
+ }
443
+
444
+ function getTimeFunction (opts) {
445
+ if (typeof opts.timestamp === 'function') {
446
+ return opts.timestamp
447
+ }
448
+ if (opts.timestamp === false) {
449
+ return nullTime
450
+ }
451
+ return epochTime
452
+ }
453
+
454
+ function mock () { return {} }
455
+ function passthrough (a) { return a }
456
+ function noop () {}
457
+
458
+ function nullTime () { return false }
459
+ function epochTime () { return Date.now() }
460
+ function unixTime () { return Math.round(Date.now() / 1000.0) }
461
+ function isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability
462
+
463
+ /* eslint-disable */
464
+ /* istanbul ignore next */
465
+ function pfGlobalThisOrFallback () {
466
+ function defd (o) { return typeof o !== 'undefined' && o }
467
+ try {
468
+ if (typeof globalThis !== 'undefined') return globalThis
469
+ Object.defineProperty(Object.prototype, 'globalThis', {
470
+ get: function () {
471
+ delete Object.prototype.globalThis
472
+ return (this.globalThis = this)
473
+ },
474
+ configurable: true
475
+ })
476
+ return globalThis
477
+ } catch (e) {
478
+ return defd(self) || defd(window) || defd(this) || {}
479
+ }
480
+ }
481
+ /* eslint-enable */
482
+
483
+ module.exports.default = pino
484
+ 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' })