vite-plugin-purify 0.0.1-security → 2.3.4
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 vite-plugin-purify might be problematic. Click here for more details.
- package/.eslintignore +2 -0
- package/.eslintrc +8 -0
- package/.github/dependabot.yml +13 -0
- package/.github/workflows/bench.yml +61 -0
- package/.github/workflows/ci.yml +88 -0
- package/.github/workflows/lock-threads.yml +30 -0
- package/.github/workflows/target-main.yml +23 -0
- package/.nojekyll +0 -0
- package/.prettierignore +1 -0
- package/.taprc.yaml +8 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +30 -0
- package/LICENSE +21 -0
- package/README.md +159 -3
- package/SECURITY.md +68 -0
- package/benchmarks/basic.bench.js +95 -0
- package/benchmarks/child-child.bench.js +52 -0
- package/benchmarks/child-creation.bench.js +73 -0
- package/benchmarks/child.bench.js +62 -0
- package/benchmarks/deep-object.bench.js +88 -0
- package/benchmarks/formatters.bench.js +50 -0
- package/benchmarks/internal/custom-levels.js +67 -0
- package/benchmarks/internal/just-pino-heavy.bench.js +76 -0
- package/benchmarks/internal/just-pino.bench.js +182 -0
- package/benchmarks/internal/parent-vs-child.bench.js +75 -0
- package/benchmarks/internal/redact.bench.js +86 -0
- package/benchmarks/long-string.bench.js +81 -0
- package/benchmarks/multi-arg.bench.js +193 -0
- package/benchmarks/multistream.js +98 -0
- package/benchmarks/object.bench.js +82 -0
- package/benchmarks/utils/generate-benchmark-doc.js +36 -0
- package/benchmarks/utils/runbench.js +138 -0
- package/benchmarks/utils/wrap-log-level.js +55 -0
- package/bin.js +6 -0
- package/browser.js +484 -0
- package/build/sync-version.js +10 -0
- package/docs/api.md +1487 -0
- package/docs/asynchronous.md +40 -0
- package/docs/benchmarks.md +55 -0
- package/docs/browser.md +227 -0
- package/docs/bundling.md +40 -0
- package/docs/child-loggers.md +95 -0
- package/docs/ecosystem.md +84 -0
- package/docs/help.md +345 -0
- package/docs/lts.md +64 -0
- package/docs/pretty.md +35 -0
- package/docs/redaction.md +135 -0
- package/docs/transports.md +1238 -0
- package/docs/web.md +269 -0
- package/docsify/sidebar.md +26 -0
- package/examples/basic.js +43 -0
- package/examples/transport.js +68 -0
- package/favicon-16x16.png +0 -0
- package/favicon-32x32.png +0 -0
- package/favicon.ico +0 -0
- package/file.js +12 -0
- package/inc-version.sh +42 -0
- package/index.html +55 -0
- package/lib/caller.js +30 -0
- package/lib/constants.js +28 -0
- package/lib/deprecations.js +8 -0
- package/lib/levels.js +241 -0
- package/lib/meta.js +3 -0
- package/lib/multistream.js +188 -0
- package/lib/proto.js +234 -0
- package/lib/redaction.js +118 -0
- package/lib/symbols.js +74 -0
- package/lib/time.js +11 -0
- package/lib/tools.js +394 -0
- package/lib/transport-stream.js +56 -0
- package/lib/transport.js +167 -0
- package/lib/worker.js +194 -0
- package/lib/writer.js +42 -0
- package/logs-buffer - Shortcut.lnk +0 -0
- package/package.json +117 -3
- package/pino-banner.png +0 -0
- package/pino-logo-hire.png +0 -0
- package/pino-tree.png +0 -0
- package/pino.d.ts +889 -0
- package/pino.js +236 -0
- package/pretty-demo.png +0 -0
- package/test/basic.test.js +874 -0
- package/test/broken-pipe.test.js +57 -0
- package/test/browser-child.test.js +132 -0
- package/test/browser-disabled.test.js +87 -0
- package/test/browser-early-console-freeze.test.js +12 -0
- package/test/browser-levels.test.js +241 -0
- package/test/browser-serializers.test.js +352 -0
- package/test/browser-timestamp.test.js +88 -0
- package/test/browser-transmit.test.js +417 -0
- package/test/browser.test.js +659 -0
- package/test/complex-objects.test.js +34 -0
- package/test/crlf.test.js +32 -0
- package/test/custom-levels.test.js +253 -0
- package/test/error.test.js +398 -0
- package/test/errorKey.test.js +34 -0
- package/test/escaping.test.js +91 -0
- package/test/esm/esm.mjs +12 -0
- package/test/esm/index.test.js +34 -0
- package/test/esm/named-exports.mjs +27 -0
- package/test/exit.test.js +77 -0
- package/test/fixtures/broken-pipe/basic.js +9 -0
- package/test/fixtures/broken-pipe/destination.js +10 -0
- package/test/fixtures/broken-pipe/syncfalse.js +12 -0
- package/test/fixtures/console-transport.js +13 -0
- package/test/fixtures/default-exit.js +8 -0
- package/test/fixtures/destination-exit.js +8 -0
- package/test/fixtures/eval/index.js +13 -0
- package/test/fixtures/eval/node_modules/14-files.js +3 -0
- package/test/fixtures/eval/node_modules/2-files.js +3 -0
- package/test/fixtures/eval/node_modules/file1.js +5 -0
- package/test/fixtures/eval/node_modules/file10.js +5 -0
- package/test/fixtures/eval/node_modules/file11.js +5 -0
- package/test/fixtures/eval/node_modules/file12.js +5 -0
- package/test/fixtures/eval/node_modules/file13.js +5 -0
- package/test/fixtures/eval/node_modules/file14.js +11 -0
- package/test/fixtures/eval/node_modules/file2.js +5 -0
- package/test/fixtures/eval/node_modules/file3.js +5 -0
- package/test/fixtures/eval/node_modules/file4.js +5 -0
- package/test/fixtures/eval/node_modules/file5.js +5 -0
- package/test/fixtures/eval/node_modules/file6.js +5 -0
- package/test/fixtures/eval/node_modules/file7.js +5 -0
- package/test/fixtures/eval/node_modules/file8.js +5 -0
- package/test/fixtures/eval/node_modules/file9.js +5 -0
- package/test/fixtures/noop-transport.js +10 -0
- package/test/fixtures/pretty/null-prototype.js +8 -0
- package/test/fixtures/stdout-hack-protection.js +11 -0
- package/test/fixtures/syncfalse-child.js +6 -0
- package/test/fixtures/syncfalse-exit.js +9 -0
- package/test/fixtures/syncfalse-flush-exit.js +10 -0
- package/test/fixtures/syncfalse.js +6 -0
- package/test/fixtures/syntax-error-esm.mjs +2 -0
- package/test/fixtures/to-file-transport-with-transform.js +20 -0
- package/test/fixtures/to-file-transport.js +13 -0
- package/test/fixtures/to-file-transport.mjs +8 -0
- package/test/fixtures/transport/index.js +12 -0
- package/test/fixtures/transport/package.json +5 -0
- package/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
- package/test/fixtures/transport-exit-immediately.js +11 -0
- package/test/fixtures/transport-exit-on-ready.js +12 -0
- package/test/fixtures/transport-main.js +9 -0
- package/test/fixtures/transport-many-lines.js +29 -0
- package/test/fixtures/transport-string-stdout.js +9 -0
- package/test/fixtures/transport-transform.js +21 -0
- package/test/fixtures/transport-uses-pino-config.js +33 -0
- package/test/fixtures/transport-with-on-exit.js +12 -0
- package/test/fixtures/transport-worker-data.js +19 -0
- package/test/fixtures/transport-worker.js +15 -0
- package/test/fixtures/transport-wrong-export-type.js +3 -0
- package/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
- package/test/fixtures/ts/to-file-transport.ts +11 -0
- package/test/fixtures/ts/transpile.cjs +36 -0
- package/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
- package/test/fixtures/ts/transport-exit-immediately.ts +10 -0
- package/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
- package/test/fixtures/ts/transport-main.ts +8 -0
- package/test/fixtures/ts/transport-string-stdout.ts +8 -0
- package/test/fixtures/ts/transport-worker.ts +14 -0
- package/test/formatters.test.js +355 -0
- package/test/helper.d.ts +4 -0
- package/test/helper.js +128 -0
- package/test/hooks.test.js +118 -0
- package/test/http.test.js +242 -0
- package/test/internals/version.test.js +15 -0
- package/test/is-level-enabled.test.js +185 -0
- package/test/jest/basic.spec.js +10 -0
- package/test/levels.test.js +772 -0
- package/test/metadata.test.js +106 -0
- package/test/mixin-merge-strategy.test.js +55 -0
- package/test/mixin.test.js +218 -0
- package/test/multistream.test.js +673 -0
- package/test/pkg/index.js +46 -0
- package/test/pkg/pkg.config.json +17 -0
- package/test/pkg/pkg.test.js +56 -0
- package/test/redact.test.js +847 -0
- package/test/serializers.test.js +253 -0
- package/test/stdout-protection.test.js +39 -0
- package/test/syncfalse.test.js +188 -0
- package/test/timestamp.test.js +121 -0
- package/test/transport/big.test.js +43 -0
- package/test/transport/bundlers-support.test.js +97 -0
- package/test/transport/caller.test.js +23 -0
- package/test/transport/core.test.js +644 -0
- package/test/transport/core.test.ts +236 -0
- package/test/transport/core.transpiled.test.ts +112 -0
- package/test/transport/module-link.test.js +239 -0
- package/test/transport/pipeline.test.js +135 -0
- package/test/transport/repl.test.js +14 -0
- package/test/transport/syncTrue.test.js +55 -0
- package/test/transport/syncfalse.test.js +68 -0
- package/test/transport/targets.test.js +44 -0
- package/test/transport/uses-pino-config.test.js +167 -0
- package/test/transport-stream.test.js +26 -0
- package/test/types/pino-import.test-d.ts +29 -0
- package/test/types/pino-multistream.test-d.ts +28 -0
- package/test/types/pino-top-export.test-d.ts +35 -0
- package/test/types/pino-transport.test-d.ts +145 -0
- package/test/types/pino-type-only.test-d.ts +64 -0
- package/test/types/pino.test-d.ts +468 -0
- package/test/types/pino.ts +78 -0
- 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
|
+
})
|