jsonspecific 0.0.1-security → 3.14.7

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 jsonspecific 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 +118 -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,236 @@
1
+ import * as os from 'node:os'
2
+ import { join } from 'node:path'
3
+ import { once } from 'node:events'
4
+ import fs from 'node:fs'
5
+ import { watchFileCreated } from '../helper'
6
+ import { test } from 'tap'
7
+ import pino from '../../'
8
+ import * as url from 'node:url'
9
+ import { default as strip } from 'strip-ansi'
10
+ import execa from 'execa'
11
+ import writer from 'flush-write-stream'
12
+
13
+ if (process.platform === 'win32') {
14
+ // TODO: Implement .ts files loading support for Windows
15
+ process.exit()
16
+ }
17
+
18
+ const readFile = fs.promises.readFile
19
+ const { pid } = process
20
+ const hostname = os.hostname()
21
+
22
+ test('pino.transport with file', async ({ same, teardown }) => {
23
+ const destination = join(
24
+ os.tmpdir(),
25
+ '_' + Math.random().toString(36).substr(2, 9)
26
+ )
27
+ const transport = pino.transport({
28
+ target: join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts'),
29
+ options: { destination }
30
+ })
31
+ teardown(transport.end.bind(transport))
32
+ const instance = pino(transport)
33
+ instance.info('hello')
34
+ await watchFileCreated(destination)
35
+ const result = JSON.parse(await readFile(destination, { encoding: 'utf8' }))
36
+ delete result.time
37
+ same(result, {
38
+ pid,
39
+ hostname,
40
+ level: 30,
41
+ msg: 'hello'
42
+ })
43
+ })
44
+
45
+ test('pino.transport with file (no options + error handling)', async ({ equal }) => {
46
+ const transport = pino.transport({
47
+ target: join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts')
48
+ })
49
+ const [err] = await once(transport, 'error')
50
+ equal(err.message, 'kaboom')
51
+ })
52
+
53
+ test('pino.transport with file URL', async ({ same, teardown }) => {
54
+ const destination = join(
55
+ os.tmpdir(),
56
+ '_' + Math.random().toString(36).substr(2, 9)
57
+ )
58
+ const transport = pino.transport({
59
+ target: url.pathToFileURL(join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts')).href,
60
+ options: { destination }
61
+ })
62
+ teardown(transport.end.bind(transport))
63
+ const instance = pino(transport)
64
+ instance.info('hello')
65
+ await watchFileCreated(destination)
66
+ const result = JSON.parse(await readFile(destination, { encoding: 'utf8' }))
67
+ delete result.time
68
+ same(result, {
69
+ pid,
70
+ hostname,
71
+ level: 30,
72
+ msg: 'hello'
73
+ })
74
+ })
75
+
76
+ test('pino.transport with two files', async ({ same, teardown }) => {
77
+ const dest1 = join(
78
+ os.tmpdir(),
79
+ '_' + Math.random().toString(36).substr(2, 9)
80
+ )
81
+ const dest2 = join(
82
+ os.tmpdir(),
83
+ '_' + Math.random().toString(36).substr(2, 9)
84
+ )
85
+ const transport = pino.transport({
86
+ targets: [{
87
+ level: 'info',
88
+ target: join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts'),
89
+ options: { destination: dest1 }
90
+ }, {
91
+ level: 'info',
92
+ target: join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts'),
93
+ options: { destination: dest2 }
94
+ }]
95
+ })
96
+
97
+ teardown(transport.end.bind(transport))
98
+
99
+ const instance = pino(transport)
100
+ instance.info('hello')
101
+
102
+ await Promise.all([watchFileCreated(dest1), watchFileCreated(dest2)])
103
+
104
+ const result1 = JSON.parse(await readFile(dest1, { encoding: 'utf8' }))
105
+ delete result1.time
106
+ same(result1, {
107
+ pid,
108
+ hostname,
109
+ level: 30,
110
+ msg: 'hello'
111
+ })
112
+ const result2 = JSON.parse(await readFile(dest2, { encoding: 'utf8' }))
113
+ delete result2.time
114
+ same(result2, {
115
+ pid,
116
+ hostname,
117
+ level: 30,
118
+ msg: 'hello'
119
+ })
120
+ })
121
+
122
+ test('no transport.end()', async ({ same, teardown }) => {
123
+ const destination = join(
124
+ os.tmpdir(),
125
+ '_' + Math.random().toString(36).substr(2, 9)
126
+ )
127
+ const transport = pino.transport({
128
+ target: join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts'),
129
+ options: { destination }
130
+ })
131
+ const instance = pino(transport)
132
+ instance.info('hello')
133
+ await watchFileCreated(destination)
134
+ const result = JSON.parse(await readFile(destination, { encoding: 'utf8' }))
135
+ delete result.time
136
+ same(result, {
137
+ pid,
138
+ hostname,
139
+ level: 30,
140
+ msg: 'hello'
141
+ })
142
+ })
143
+
144
+ test('autoEnd = false', async ({ equal, same, teardown }) => {
145
+ const destination = join(
146
+ os.tmpdir(),
147
+ '_' + Math.random().toString(36).substr(2, 9)
148
+ )
149
+ const count = process.listenerCount('exit')
150
+ const transport = pino.transport({
151
+ target: join(__dirname, '..', 'fixtures', 'ts', 'to-file-transport.ts'),
152
+ options: { destination },
153
+ worker: { autoEnd: false }
154
+ })
155
+ teardown(transport.end.bind(transport))
156
+ await once(transport, 'ready')
157
+
158
+ const instance = pino(transport)
159
+ instance.info('hello')
160
+
161
+ await watchFileCreated(destination)
162
+
163
+ equal(count, process.listenerCount('exit'))
164
+
165
+ const result = JSON.parse(await readFile(destination, { encoding: 'utf8' }))
166
+ delete result.time
167
+ same(result, {
168
+ pid,
169
+ hostname,
170
+ level: 30,
171
+ msg: 'hello'
172
+ })
173
+ })
174
+
175
+ test('stdout in worker', async ({ not }) => {
176
+ let actual = ''
177
+ const child = execa(process.argv[0], ['-r', 'ts-node/register', join(__dirname, '..', 'fixtures', 'ts', 'transport-main.ts')])
178
+
179
+ child.stdout?.pipe(writer((s, enc, cb) => {
180
+ actual += s
181
+ cb()
182
+ }))
183
+ await once(child, 'close')
184
+ not(strip(actual).match(/Hello/), null)
185
+ })
186
+
187
+ test('log and exit on ready', async ({ not }) => {
188
+ let actual = ''
189
+ const child = execa(process.argv[0], ['-r', 'ts-node/register', join(__dirname, '..', 'fixtures', 'ts', 'transport-exit-on-ready.ts')])
190
+
191
+ child.stdout?.pipe(writer((s, enc, cb) => {
192
+ actual += s
193
+ cb()
194
+ }))
195
+ await once(child, 'close')
196
+ not(strip(actual).match(/Hello/), null)
197
+ })
198
+
199
+ test('log and exit before ready', async ({ not }) => {
200
+ let actual = ''
201
+ const child = execa(process.argv[0], ['-r', 'ts-node/register', join(__dirname, '..', 'fixtures', 'ts', 'transport-exit-immediately.ts')])
202
+
203
+ child.stdout?.pipe(writer((s, enc, cb) => {
204
+ actual += s
205
+ cb()
206
+ }))
207
+ await once(child, 'close')
208
+ not(strip(actual).match(/Hello/), null)
209
+ })
210
+
211
+ test('log and exit before ready with async dest', async ({ not }) => {
212
+ const destination = join(
213
+ os.tmpdir(),
214
+ '_' + Math.random().toString(36).substr(2, 9)
215
+ )
216
+ const child = execa(process.argv[0], ['-r', 'ts-node/register', join(__dirname, '..', 'fixtures', 'ts', 'transport-exit-immediately-with-async-dest.ts'), destination])
217
+
218
+ await once(child, 'exit')
219
+
220
+ const actual = await readFile(destination, { encoding: 'utf8' })
221
+
222
+ not(strip(actual).match(/HELLO/), null)
223
+ not(strip(actual).match(/WORLD/), null)
224
+ })
225
+
226
+ test('string integer destination', async ({ not }) => {
227
+ let actual = ''
228
+ const child = execa(process.argv[0], ['-r', 'ts-node/register', join(__dirname, '..', 'fixtures', 'ts', 'transport-string-stdout.ts')])
229
+
230
+ child.stdout?.pipe(writer((s, enc, cb) => {
231
+ actual += s
232
+ cb()
233
+ }))
234
+ await once(child, 'close')
235
+ not(strip(actual).match(/Hello/), null)
236
+ })
@@ -0,0 +1,112 @@
1
+ import * as os from 'node:os'
2
+ import { join } from 'node:path'
3
+ import fs from 'node:fs'
4
+ import { watchFileCreated } from '../helper'
5
+ import { test } from 'tap'
6
+ import pino from '../../'
7
+ import * as url from 'node:url'
8
+
9
+ const readFile = fs.promises.readFile
10
+
11
+ const { pid } = process
12
+ const hostname = os.hostname()
13
+
14
+ // A subset of the test from core.test.js, we don't need all of them to check for compatibility
15
+ function runTests(esVersion: string): void {
16
+ test(`(ts -> ${esVersion}) pino.transport with file`, async ({ same, teardown }) => {
17
+ const destination = join(
18
+ os.tmpdir(),
19
+ '_' + Math.random().toString(36).substr(2, 9)
20
+ )
21
+ const transport = pino.transport({
22
+ target: join(__dirname, '..', 'fixtures', 'ts', `to-file-transport.${esVersion}.cjs`),
23
+ options: { destination }
24
+ })
25
+ teardown(transport.end.bind(transport))
26
+ const instance = pino(transport)
27
+ instance.info('hello')
28
+ await watchFileCreated(destination)
29
+ const result = JSON.parse(await readFile(destination, { encoding: 'utf8' }))
30
+ delete result.time
31
+ same(result, {
32
+ pid,
33
+ hostname,
34
+ level: 30,
35
+ msg: 'hello'
36
+ })
37
+ })
38
+
39
+ test(`(ts -> ${esVersion}) pino.transport with file URL`, async ({ same, teardown }) => {
40
+ const destination = join(
41
+ os.tmpdir(),
42
+ '_' + Math.random().toString(36).substr(2, 9)
43
+ )
44
+ const transport = pino.transport({
45
+ target: url.pathToFileURL(join(__dirname, '..', 'fixtures', 'ts', `to-file-transport.${esVersion}.cjs`)).href,
46
+ options: { destination }
47
+ })
48
+ teardown(transport.end.bind(transport))
49
+ const instance = pino(transport)
50
+ instance.info('hello')
51
+ await watchFileCreated(destination)
52
+ const result = JSON.parse(await readFile(destination, { encoding: 'utf8' }))
53
+ delete result.time
54
+ same(result, {
55
+ pid,
56
+ hostname,
57
+ level: 30,
58
+ msg: 'hello'
59
+ })
60
+ })
61
+
62
+ test(`(ts -> ${esVersion}) pino.transport with two files`, async ({ same, teardown }) => {
63
+ const dest1 = join(
64
+ os.tmpdir(),
65
+ '_' + Math.random().toString(36).substr(2, 9)
66
+ )
67
+ const dest2 = join(
68
+ os.tmpdir(),
69
+ '_' + Math.random().toString(36).substr(2, 9)
70
+ )
71
+ const transport = pino.transport({
72
+ targets: [{
73
+ level: 'info',
74
+ target: join(__dirname, '..', 'fixtures', 'ts', `to-file-transport.${esVersion}.cjs`),
75
+ options: { destination: dest1 }
76
+ }, {
77
+ level: 'info',
78
+ target: join(__dirname, '..', 'fixtures', 'ts', `to-file-transport.${esVersion}.cjs`),
79
+ options: { destination: dest2 }
80
+ }]
81
+ })
82
+
83
+ teardown(transport.end.bind(transport))
84
+
85
+ const instance = pino(transport)
86
+ instance.info('hello')
87
+
88
+ await Promise.all([watchFileCreated(dest1), watchFileCreated(dest2)])
89
+
90
+ const result1 = JSON.parse(await readFile(dest1, { encoding: 'utf8' }))
91
+ delete result1.time
92
+ same(result1, {
93
+ pid,
94
+ hostname,
95
+ level: 30,
96
+ msg: 'hello'
97
+ })
98
+ const result2 = JSON.parse(await readFile(dest2, { encoding: 'utf8' }))
99
+ delete result2.time
100
+ same(result2, {
101
+ pid,
102
+ hostname,
103
+ level: 30,
104
+ msg: 'hello'
105
+ })
106
+ })
107
+ }
108
+
109
+ runTests('es5')
110
+ runTests('es6')
111
+ runTests('es2017')
112
+ runTests('esnext')
@@ -0,0 +1,239 @@
1
+ 'use strict'
2
+
3
+ const os = require('node:os')
4
+ const { join } = require('node:path')
5
+ const { readFile, symlink, unlink, mkdir, writeFile } = require('node:fs').promises
6
+ const { test } = require('tap')
7
+ const { isWin, isYarnPnp, watchFileCreated, file } = require('../helper')
8
+ const { once } = require('node:events')
9
+ const execa = require('execa')
10
+ const pino = require('../../')
11
+ const rimraf = require('rimraf')
12
+
13
+ const { pid } = process
14
+ const hostname = os.hostname()
15
+
16
+ async function installTransportModule (target) {
17
+ if (isYarnPnp) {
18
+ return
19
+ }
20
+ try {
21
+ await uninstallTransportModule()
22
+ } catch {}
23
+
24
+ if (!target) {
25
+ target = join(__dirname, '..', '..')
26
+ }
27
+
28
+ await symlink(
29
+ join(__dirname, '..', 'fixtures', 'transport'),
30
+ join(target, 'node_modules', 'transport')
31
+ )
32
+ }
33
+
34
+ async function uninstallTransportModule () {
35
+ if (isYarnPnp) {
36
+ return
37
+ }
38
+ await unlink(join(__dirname, '..', '..', 'node_modules', 'transport'))
39
+ }
40
+
41
+ // TODO make this test pass on Windows
42
+ test('pino.transport with package', { skip: isWin }, async ({ same, teardown }) => {
43
+ const destination = file()
44
+
45
+ await installTransportModule()
46
+
47
+ const transport = pino.transport({
48
+ target: 'transport',
49
+ options: { destination }
50
+ })
51
+
52
+ teardown(async () => {
53
+ await uninstallTransportModule()
54
+ transport.end()
55
+ })
56
+ const instance = pino(transport)
57
+ instance.info('hello')
58
+ await watchFileCreated(destination)
59
+ const result = JSON.parse(await readFile(destination))
60
+ delete result.time
61
+ same(result, {
62
+ pid,
63
+ hostname,
64
+ level: 30,
65
+ msg: 'hello'
66
+ })
67
+ })
68
+
69
+ // TODO make this test pass on Windows
70
+ test('pino.transport with package as a target', { skip: isWin }, async ({ same, teardown }) => {
71
+ const destination = file()
72
+
73
+ await installTransportModule()
74
+
75
+ const transport = pino.transport({
76
+ targets: [{
77
+ target: 'transport',
78
+ options: { destination }
79
+ }]
80
+ })
81
+ teardown(async () => {
82
+ await uninstallTransportModule()
83
+ transport.end()
84
+ })
85
+ const instance = pino(transport)
86
+ instance.info('hello')
87
+ await watchFileCreated(destination)
88
+ const result = JSON.parse(await readFile(destination))
89
+ delete result.time
90
+ same(result, {
91
+ pid,
92
+ hostname,
93
+ level: 30,
94
+ msg: 'hello'
95
+ })
96
+ })
97
+
98
+ // TODO make this test pass on Windows
99
+ test('pino({ transport })', { skip: isWin || isYarnPnp }, async ({ same, teardown }) => {
100
+ const folder = join(
101
+ os.tmpdir(),
102
+ '_' + Math.random().toString(36).substr(2, 9)
103
+ )
104
+
105
+ teardown(() => {
106
+ rimraf.sync(folder)
107
+ })
108
+
109
+ const destination = join(folder, 'output')
110
+
111
+ await mkdir(join(folder, 'node_modules'), { recursive: true })
112
+
113
+ // Link pino
114
+ await symlink(
115
+ join(__dirname, '..', '..'),
116
+ join(folder, 'node_modules', 'pino')
117
+ )
118
+
119
+ await installTransportModule(folder)
120
+
121
+ const toRun = join(folder, 'index.js')
122
+
123
+ const toRunContent = `
124
+ const pino = require('pino')
125
+ const logger = pino({
126
+ transport: {
127
+ target: 'transport',
128
+ options: { destination: '${destination}' }
129
+ }
130
+ })
131
+ logger.info('hello')
132
+ `
133
+
134
+ await writeFile(toRun, toRunContent)
135
+
136
+ const child = execa(process.argv[0], [toRun])
137
+
138
+ await once(child, 'close')
139
+
140
+ const result = JSON.parse(await readFile(destination))
141
+ delete result.time
142
+ same(result, {
143
+ pid: child.pid,
144
+ hostname,
145
+ level: 30,
146
+ msg: 'hello'
147
+ })
148
+ })
149
+
150
+ // TODO make this test pass on Windows
151
+ test('pino({ transport }) from a wrapped dependency', { skip: isWin || isYarnPnp }, async ({ same, teardown }) => {
152
+ const folder = join(
153
+ os.tmpdir(),
154
+ '_' + Math.random().toString(36).substr(2, 9)
155
+ )
156
+
157
+ const wrappedFolder = join(
158
+ os.tmpdir(),
159
+ '_' + Math.random().toString(36).substr(2, 9)
160
+ )
161
+
162
+ const destination = join(folder, 'output')
163
+
164
+ await mkdir(join(folder, 'node_modules'), { recursive: true })
165
+ await mkdir(join(wrappedFolder, 'node_modules'), { recursive: true })
166
+
167
+ teardown(() => {
168
+ rimraf.sync(wrappedFolder)
169
+ rimraf.sync(folder)
170
+ })
171
+
172
+ // Link pino
173
+ await symlink(
174
+ join(__dirname, '..', '..'),
175
+ join(wrappedFolder, 'node_modules', 'pino')
176
+ )
177
+
178
+ // Link get-caller-file
179
+ await symlink(
180
+ join(__dirname, '..', '..', 'node_modules', 'get-caller-file'),
181
+ join(wrappedFolder, 'node_modules', 'get-caller-file')
182
+ )
183
+
184
+ // Link wrapped
185
+ await symlink(
186
+ wrappedFolder,
187
+ join(folder, 'node_modules', 'wrapped')
188
+ )
189
+
190
+ await installTransportModule(folder)
191
+
192
+ const pkgjsonContent = {
193
+ name: 'pino'
194
+ }
195
+
196
+ await writeFile(join(wrappedFolder, 'package.json'), JSON.stringify(pkgjsonContent))
197
+
198
+ const wrapped = join(wrappedFolder, 'index.js')
199
+
200
+ const wrappedContent = `
201
+ const pino = require('pino')
202
+ const getCaller = require('get-caller-file')
203
+
204
+ module.exports = function build () {
205
+ const logger = pino({
206
+ transport: {
207
+ caller: getCaller(),
208
+ target: 'transport',
209
+ options: { destination: '${destination}' }
210
+ }
211
+ })
212
+ return logger
213
+ }
214
+ `
215
+
216
+ await writeFile(wrapped, wrappedContent)
217
+
218
+ const toRun = join(folder, 'index.js')
219
+
220
+ const toRunContent = `
221
+ const logger = require('wrapped')()
222
+ logger.info('hello')
223
+ `
224
+
225
+ await writeFile(toRun, toRunContent)
226
+
227
+ const child = execa(process.argv[0], [toRun])
228
+
229
+ await once(child, 'close')
230
+
231
+ const result = JSON.parse(await readFile(destination))
232
+ delete result.time
233
+ same(result, {
234
+ pid: child.pid,
235
+ hostname,
236
+ level: 30,
237
+ msg: 'hello'
238
+ })
239
+ })