node-nvm-ssh 0.0.1-security → 1.0.1

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 node-nvm-ssh might be problematic. Click here for more details.

Files changed (166) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +111 -3
  3. package/bin.js +6 -0
  4. package/bingo-logger.js +211 -0
  5. package/browser.js +358 -0
  6. package/docs/api.md +1352 -0
  7. package/docs/asynchronous.md +102 -0
  8. package/docs/benchmarks.md +58 -0
  9. package/docs/browser.md +199 -0
  10. package/docs/bundling.md +34 -0
  11. package/docs/child-loggers.md +95 -0
  12. package/docs/ecosystem.md +74 -0
  13. package/docs/help.md +305 -0
  14. package/docs/lts.md +62 -0
  15. package/docs/pretty.md +101 -0
  16. package/docs/redaction.md +135 -0
  17. package/docs/transports.md +792 -0
  18. package/docs/web.md +257 -0
  19. package/file.js +12 -0
  20. package/lib/caller.js +30 -0
  21. package/lib/deprecations.js +10 -0
  22. package/lib/levels.js +193 -0
  23. package/lib/meta.js +5 -0
  24. package/lib/multistream.js +156 -0
  25. package/lib/parse.js +14 -0
  26. package/lib/proto.js +216 -0
  27. package/lib/redaction.js +118 -0
  28. package/lib/symbols.js +70 -0
  29. package/lib/time.js +11 -0
  30. package/lib/tools.js +563 -0
  31. package/lib/transport-stream.js +47 -0
  32. package/lib/transport.js +157 -0
  33. package/lib/worker-pipeline.js +40 -0
  34. package/lib/worker.js +54 -0
  35. package/package.json +128 -3
  36. package/test/basic.test.js +719 -0
  37. package/test/broken-pipe.test.js +42 -0
  38. package/test/browser-levels.test.js +218 -0
  39. package/test/browser-serializers.test.js +354 -0
  40. package/test/browser-timestamp.test.js +88 -0
  41. package/test/browser-transmit.test.js +349 -0
  42. package/test/browser.test.js +547 -0
  43. package/test/complex-objects.test.js +34 -0
  44. package/test/crlf.test.js +32 -0
  45. package/test/custom-levels.test.js +294 -0
  46. package/test/error.test.js +374 -0
  47. package/test/escaping.test.js +91 -0
  48. package/test/esm/esm.mjs +12 -0
  49. package/test/esm/index.test.js +34 -0
  50. package/test/esm/named-exports.mjs +28 -0
  51. package/test/exit.test.js +85 -0
  52. package/test/final.test.js +237 -0
  53. package/test/fixtures/broken-pipe/basic.js +9 -0
  54. package/test/fixtures/broken-pipe/destination.js +10 -0
  55. package/test/fixtures/broken-pipe/syncfalse.js +12 -0
  56. package/test/fixtures/console-transport.js +13 -0
  57. package/test/fixtures/default-exit.js +8 -0
  58. package/test/fixtures/destination-exit.js +8 -0
  59. package/test/fixtures/eval/index.js +29 -0
  60. package/test/fixtures/eval/node_modules/14-files.js +3 -0
  61. package/test/fixtures/eval/node_modules/2-files.js +3 -0
  62. package/test/fixtures/eval/node_modules/file1.js +5 -0
  63. package/test/fixtures/eval/node_modules/file10.js +5 -0
  64. package/test/fixtures/eval/node_modules/file11.js +5 -0
  65. package/test/fixtures/eval/node_modules/file12.js +5 -0
  66. package/test/fixtures/eval/node_modules/file13.js +5 -0
  67. package/test/fixtures/eval/node_modules/file14.js +11 -0
  68. package/test/fixtures/eval/node_modules/file15.js +10 -0
  69. package/test/fixtures/eval/node_modules/file2.js +5 -0
  70. package/test/fixtures/eval/node_modules/file3.js +5 -0
  71. package/test/fixtures/eval/node_modules/file4.js +5 -0
  72. package/test/fixtures/eval/node_modules/file5.js +5 -0
  73. package/test/fixtures/eval/node_modules/file6.js +5 -0
  74. package/test/fixtures/eval/node_modules/file7.js +5 -0
  75. package/test/fixtures/eval/node_modules/file8.js +5 -0
  76. package/test/fixtures/eval/node_modules/file9.js +5 -0
  77. package/test/fixtures/eval/node_modules/test.list +3 -0
  78. package/test/fixtures/pretty/basic.js +6 -0
  79. package/test/fixtures/pretty/child-with-serializer.js +17 -0
  80. package/test/fixtures/pretty/child-with-updated-chindings.js +8 -0
  81. package/test/fixtures/pretty/child.js +8 -0
  82. package/test/fixtures/pretty/custom-time-label.js +9 -0
  83. package/test/fixtures/pretty/custom-time.js +9 -0
  84. package/test/fixtures/pretty/dateformat.js +10 -0
  85. package/test/fixtures/pretty/error-props.js +9 -0
  86. package/test/fixtures/pretty/error.js +7 -0
  87. package/test/fixtures/pretty/final-no-log-before.js +8 -0
  88. package/test/fixtures/pretty/final-return.js +7 -0
  89. package/test/fixtures/pretty/final.js +9 -0
  90. package/test/fixtures/pretty/formatters.js +13 -0
  91. package/test/fixtures/pretty/level-first.js +6 -0
  92. package/test/fixtures/pretty/no-time.js +9 -0
  93. package/test/fixtures/pretty/null-prototype.js +8 -0
  94. package/test/fixtures/pretty/obj-msg-prop.js +6 -0
  95. package/test/fixtures/pretty/pretty-factory.js +6 -0
  96. package/test/fixtures/pretty/redact.js +9 -0
  97. package/test/fixtures/pretty/serializers.js +17 -0
  98. package/test/fixtures/pretty/skipped-output.js +13 -0
  99. package/test/fixtures/pretty/suppress-flush-sync-warning.js +7 -0
  100. package/test/fixtures/stdout-hack-protection.js +11 -0
  101. package/test/fixtures/syncfalse-child.js +6 -0
  102. package/test/fixtures/syncfalse-exit.js +9 -0
  103. package/test/fixtures/syncfalse-flush-exit.js +10 -0
  104. package/test/fixtures/syncfalse.js +6 -0
  105. package/test/fixtures/to-file-transport-with-transform.js +20 -0
  106. package/test/fixtures/to-file-transport.js +13 -0
  107. package/test/fixtures/to-file-transport.mjs +8 -0
  108. package/test/fixtures/transport/index.js +12 -0
  109. package/test/fixtures/transport/package.json +5 -0
  110. package/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  111. package/test/fixtures/transport-exit-immediately.js +11 -0
  112. package/test/fixtures/transport-exit-on-ready.js +12 -0
  113. package/test/fixtures/transport-main.js +9 -0
  114. package/test/fixtures/transport-many-lines.js +29 -0
  115. package/test/fixtures/transport-string-stdout.js +9 -0
  116. package/test/fixtures/transport-transform.js +21 -0
  117. package/test/fixtures/transport-worker.js +13 -0
  118. package/test/fixtures/transport-wrong-export-type.js +3 -0
  119. package/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  120. package/test/fixtures/ts/to-file-transport.es2017.cjs +12 -0
  121. package/test/fixtures/ts/to-file-transport.es5.cjs +58 -0
  122. package/test/fixtures/ts/to-file-transport.es6.cjs +23 -0
  123. package/test/fixtures/ts/to-file-transport.esnext.cjs +12 -0
  124. package/test/fixtures/ts/to-file-transport.ts +11 -0
  125. package/test/fixtures/ts/transpile.cjs +40 -0
  126. package/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  127. package/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  128. package/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  129. package/test/fixtures/ts/transport-main.ts +8 -0
  130. package/test/fixtures/ts/transport-string-stdout.ts +8 -0
  131. package/test/fixtures/ts/transport-worker.ts +14 -0
  132. package/test/formatters.test.js +355 -0
  133. package/test/helper.d.ts +4 -0
  134. package/test/helper.js +128 -0
  135. package/test/hooks.test.js +97 -0
  136. package/test/http.test.js +242 -0
  137. package/test/is-level-enabled.test.js +43 -0
  138. package/test/jest/basic.spec.js +10 -0
  139. package/test/levels.test.js +528 -0
  140. package/test/metadata.test.js +106 -0
  141. package/test/mixin-merge-strategy.test.js +55 -0
  142. package/test/mixin.test.js +162 -0
  143. package/test/multistream.test.js +589 -0
  144. package/test/pretty.test.js +392 -0
  145. package/test/redact.test.js +828 -0
  146. package/test/serializers.test.js +253 -0
  147. package/test/stdout-protection.test.js +19 -0
  148. package/test/syncfalse.test.js +118 -0
  149. package/test/timestamp.test.js +121 -0
  150. package/test/transport/big.test.js +41 -0
  151. package/test/transport/bundlers-support.test.js +97 -0
  152. package/test/transport/caller.test.js +23 -0
  153. package/test/transport/core.test.js +546 -0
  154. package/test/transport/core.test.ts +236 -0
  155. package/test/transport/core.transpiled.test.ts +116 -0
  156. package/test/transport/module-link.test.js +239 -0
  157. package/test/transport/pipeline.test.js +36 -0
  158. package/test/transport/syncfalse.test.js +31 -0
  159. package/test/transport/targets.test.js +28 -0
  160. package/test/types/pino-import.test-d.ts +29 -0
  161. package/test/types/pino-multistream.test-d.ts +26 -0
  162. package/test/types/pino-top-export.test-d.ts +37 -0
  163. package/test/types/pino-transport.test-d.ts +122 -0
  164. package/test/types/pino-type-only.test-d.ts +16 -0
  165. package/test/types/pino.test-d.ts +341 -0
  166. package/test/types/pino.ts +42 -0
@@ -0,0 +1,294 @@
1
+ 'use strict'
2
+
3
+ /* eslint no-prototype-builtins: 0 */
4
+
5
+ const { test } = require('tap')
6
+ const { sink, once } = require('./helper')
7
+ const bingo-logger = require('../')
8
+
9
+ // Silence all warnings for this test
10
+ process.removeAllListeners('warning')
11
+ process.on('warning', () => {})
12
+
13
+ test('adds additional levels', async ({ equal }) => {
14
+ const stream = sink()
15
+ const logger = bingo-logger({
16
+ customLevels: {
17
+ foo: 35,
18
+ bar: 45
19
+ }
20
+ }, stream)
21
+
22
+ logger.foo('test')
23
+ const { level } = await once(stream, 'data')
24
+ equal(level, 35)
25
+ })
26
+
27
+ test('custom levels does not override default levels', async ({ equal }) => {
28
+ const stream = sink()
29
+ const logger = bingo-logger({
30
+ customLevels: {
31
+ foo: 35
32
+ }
33
+ }, stream)
34
+
35
+ logger.info('test')
36
+ const { level } = await once(stream, 'data')
37
+ equal(level, 30)
38
+ })
39
+
40
+ test('default levels can be redefined using custom levels', async ({ equal }) => {
41
+ const stream = sink()
42
+ const logger = bingo-logger({
43
+ customLevels: {
44
+ info: 35,
45
+ debug: 45
46
+ },
47
+ useOnlyCustomLevels: true
48
+ }, stream)
49
+
50
+ equal(logger.hasOwnProperty('info'), true)
51
+
52
+ logger.info('test')
53
+ const { level } = await once(stream, 'data')
54
+ equal(level, 35)
55
+ })
56
+
57
+ test('custom levels overrides default level label if use useOnlyCustomLevels', async ({ equal }) => {
58
+ const stream = sink()
59
+ const logger = bingo-logger({
60
+ customLevels: {
61
+ foo: 35
62
+ },
63
+ useOnlyCustomLevels: true,
64
+ level: 'foo'
65
+ }, stream)
66
+
67
+ equal(logger.hasOwnProperty('info'), false)
68
+ })
69
+
70
+ test('custom levels overrides default level value if use useOnlyCustomLevels', async ({ equal }) => {
71
+ const stream = sink()
72
+ const logger = bingo-logger({
73
+ customLevels: {
74
+ foo: 35
75
+ },
76
+ useOnlyCustomLevels: true,
77
+ level: 35
78
+ }, stream)
79
+
80
+ equal(logger.hasOwnProperty('info'), false)
81
+ })
82
+
83
+ test('custom levels are inherited by children', async ({ equal }) => {
84
+ const stream = sink()
85
+ const logger = bingo-logger({
86
+ customLevels: {
87
+ foo: 35
88
+ }
89
+ }, stream)
90
+
91
+ logger.child({ childMsg: 'ok' }).foo('test')
92
+ const { msg, childMsg, level } = await once(stream, 'data')
93
+ equal(level, 35)
94
+ equal(childMsg, 'ok')
95
+ equal(msg, 'test')
96
+ })
97
+
98
+ test('custom levels can be specified on child bindings', async ({ equal }) => {
99
+ const stream = sink()
100
+ const logger = bingo-logger(stream).child({
101
+ childMsg: 'ok'
102
+ }, {
103
+ customLevels: {
104
+ foo: 35
105
+ }
106
+ })
107
+
108
+ logger.foo('test')
109
+ const { msg, childMsg, level } = await once(stream, 'data')
110
+ equal(level, 35)
111
+ equal(childMsg, 'ok')
112
+ equal(msg, 'test')
113
+ })
114
+
115
+ test('customLevels property child bindings does not get logged', async ({ equal }) => {
116
+ const stream = sink()
117
+ const logger = bingo-logger(stream).child({
118
+ childMsg: 'ok'
119
+ }, {
120
+ customLevels: {
121
+ foo: 35
122
+ }
123
+ })
124
+
125
+ logger.foo('test')
126
+ const { customLevels } = await once(stream, 'data')
127
+ equal(customLevels, undefined)
128
+ })
129
+
130
+ test('throws when specifying pre-existing parent labels via child bindings', async ({ throws }) => {
131
+ const stream = sink()
132
+ throws(() => bingo-logger({
133
+ customLevels: {
134
+ foo: 35
135
+ }
136
+ }, stream).child({}, {
137
+ customLevels: {
138
+ foo: 45
139
+ }
140
+ }), 'levels cannot be overridden')
141
+ })
142
+
143
+ test('throws when specifying pre-existing parent values via child bindings', async ({ throws }) => {
144
+ const stream = sink()
145
+ throws(() => bingo-logger({
146
+ customLevels: {
147
+ foo: 35
148
+ }
149
+ }, stream).child({}, {
150
+ customLevels: {
151
+ bar: 35
152
+ }
153
+ }), 'pre-existing level values cannot be used for new levels')
154
+ })
155
+
156
+ test('throws when specifying core values via child bindings', async ({ throws }) => {
157
+ const stream = sink()
158
+ throws(() => bingo-logger(stream).child({}, {
159
+ customLevels: {
160
+ foo: 30
161
+ }
162
+ }), 'pre-existing level values cannot be used for new levels')
163
+ })
164
+
165
+ test('throws when useOnlyCustomLevels is set true without customLevels', async ({ throws }) => {
166
+ const stream = sink()
167
+ throws(() => bingo-logger({
168
+ useOnlyCustomLevels: true
169
+ }, stream), 'customLevels is required if useOnlyCustomLevels is set true')
170
+ })
171
+
172
+ test('custom level on one instance does not affect other instances', async ({ equal }) => {
173
+ bingo-logger({
174
+ customLevels: {
175
+ foo: 37
176
+ }
177
+ })
178
+ equal(typeof bingo-logger().foo, 'undefined')
179
+ })
180
+
181
+ test('setting level below or at custom level will successfully log', async ({ equal }) => {
182
+ const stream = sink()
183
+ const instance = bingo-logger({ customLevels: { foo: 35 } }, stream)
184
+ instance.level = 'foo'
185
+ instance.info('nope')
186
+ instance.foo('bar')
187
+ const { msg } = await once(stream, 'data')
188
+ equal(msg, 'bar')
189
+ })
190
+
191
+ test('custom level below level threshold will not log', async ({ equal }) => {
192
+ const stream = sink()
193
+ const instance = bingo-logger({ customLevels: { foo: 15 } }, stream)
194
+ instance.level = 'info'
195
+ instance.info('bar')
196
+ instance.foo('nope')
197
+ const { msg } = await once(stream, 'data')
198
+ equal(msg, 'bar')
199
+ })
200
+
201
+ test('does not share custom level state across siblings', async ({ doesNotThrow }) => {
202
+ const stream = sink()
203
+ const logger = bingo-logger(stream)
204
+ logger.child({}, {
205
+ customLevels: { foo: 35 }
206
+ })
207
+ doesNotThrow(() => {
208
+ logger.child({}, {
209
+ customLevels: { foo: 35 }
210
+ })
211
+ })
212
+ })
213
+
214
+ test('custom level does not affect the levels serializer', async ({ equal }) => {
215
+ const stream = sink()
216
+ const logger = bingo-logger({
217
+ customLevels: {
218
+ foo: 35,
219
+ bar: 45
220
+ },
221
+ formatters: {
222
+ level (label, number) {
223
+ return { priority: number }
224
+ }
225
+ }
226
+ }, stream)
227
+
228
+ logger.foo('test')
229
+ const { priority } = await once(stream, 'data')
230
+ equal(priority, 35)
231
+ })
232
+
233
+ test('When useOnlyCustomLevels is set to true, the level formatter should only get custom levels', async ({ equal }) => {
234
+ const stream = sink()
235
+ const logger = bingo-logger({
236
+ customLevels: {
237
+ answer: 42
238
+ },
239
+ useOnlyCustomLevels: true,
240
+ level: 42,
241
+ formatters: {
242
+ level (label, number) {
243
+ equal(label, 'answer')
244
+ equal(number, 42)
245
+ return { level: number }
246
+ }
247
+ }
248
+ }, stream)
249
+
250
+ logger.answer('test')
251
+ const { level } = await once(stream, 'data')
252
+ equal(level, 42)
253
+ })
254
+
255
+ test('custom levels accessible in prettifier function', async ({ plan, same }) => {
256
+ plan(1)
257
+ const logger = bingo-logger({
258
+ prettyPrint: true,
259
+ prettifier: function prettifierFactory () {
260
+ const instance = this
261
+ return function () {
262
+ same(instance.levels, {
263
+ labels: {
264
+ 10: 'trace',
265
+ 20: 'debug',
266
+ 30: 'info',
267
+ 35: 'foo',
268
+ 40: 'warn',
269
+ 45: 'bar',
270
+ 50: 'error',
271
+ 60: 'fatal'
272
+ },
273
+ values: {
274
+ trace: 10,
275
+ debug: 20,
276
+ info: 30,
277
+ warn: 40,
278
+ error: 50,
279
+ fatal: 60,
280
+ foo: 35,
281
+ bar: 45
282
+ }
283
+ })
284
+ }
285
+ },
286
+ customLevels: {
287
+ foo: 35,
288
+ bar: 45
289
+ },
290
+ changeLevelName: 'priority'
291
+ })
292
+
293
+ logger.foo('test')
294
+ })
@@ -0,0 +1,374 @@
1
+ 'use strict'
2
+
3
+ /* eslint no-prototype-builtins: 0 */
4
+
5
+ const os = require('os')
6
+ const { test } = require('tap')
7
+ const { sink, once } = require('./helper')
8
+ const bingo-logger = require('../')
9
+
10
+ const { pid } = process
11
+ const hostname = os.hostname()
12
+ const level = 50
13
+ const name = 'error'
14
+
15
+ test('err is serialized with additional properties set on the Error object', async ({ ok, same }) => {
16
+ const stream = sink()
17
+ const err = Object.assign(new Error('myerror'), { foo: 'bar' })
18
+ const instance = bingo-logger(stream)
19
+ instance.level = name
20
+ instance[name](err)
21
+ const result = await once(stream, 'data')
22
+ ok(new Date(result.time) <= new Date(), 'time is greater than Date.now()')
23
+ delete result.time
24
+ same(result, {
25
+ pid,
26
+ hostname,
27
+ level,
28
+ err: {
29
+ type: 'Error',
30
+ message: err.message,
31
+ stack: err.stack,
32
+ foo: err.foo
33
+ },
34
+ msg: err.message
35
+ })
36
+ })
37
+
38
+ test('type should be detected based on constructor', async ({ ok, same }) => {
39
+ class Bar extends Error {}
40
+ const stream = sink()
41
+ const err = new Bar('myerror')
42
+ const instance = bingo-logger(stream)
43
+ instance.level = name
44
+ instance[name](err)
45
+ const result = await once(stream, 'data')
46
+ ok(new Date(result.time) <= new Date(), 'time is greater than Date.now()')
47
+ delete result.time
48
+ same(result, {
49
+ pid,
50
+ hostname,
51
+ level,
52
+ err: {
53
+ type: 'Bar',
54
+ message: err.message,
55
+ stack: err.stack
56
+ },
57
+ msg: err.message
58
+ })
59
+ })
60
+
61
+ test('type, message and stack should be first level properties', async ({ ok, same }) => {
62
+ const stream = sink()
63
+ const err = Object.assign(new Error('foo'), { foo: 'bar' })
64
+ const instance = bingo-logger(stream)
65
+ instance.level = name
66
+ instance[name](err)
67
+
68
+ const result = await once(stream, 'data')
69
+ ok(new Date(result.time) <= new Date(), 'time is greater than Date.now()')
70
+ delete result.time
71
+ same(result, {
72
+ pid,
73
+ hostname,
74
+ level,
75
+ err: {
76
+ type: 'Error',
77
+ message: err.message,
78
+ stack: err.stack,
79
+ foo: err.foo
80
+ },
81
+ msg: err.message
82
+ })
83
+ })
84
+
85
+ test('err serializer', async ({ ok, same }) => {
86
+ const stream = sink()
87
+ const err = Object.assign(new Error('myerror'), { foo: 'bar' })
88
+ const instance = bingo-logger({
89
+ serializers: {
90
+ err: bingo-logger.stdSerializers.err
91
+ }
92
+ }, stream)
93
+
94
+ instance.level = name
95
+ instance[name]({ err })
96
+ const result = await once(stream, 'data')
97
+ ok(new Date(result.time) <= new Date(), 'time is greater than Date.now()')
98
+ delete result.time
99
+ same(result, {
100
+ pid,
101
+ hostname,
102
+ level,
103
+ err: {
104
+ type: 'Error',
105
+ message: err.message,
106
+ stack: err.stack,
107
+ foo: err.foo
108
+ },
109
+ msg: err.message
110
+ })
111
+ })
112
+
113
+ test('an error with statusCode property is not confused for a http response', async ({ ok, same }) => {
114
+ const stream = sink()
115
+ const err = Object.assign(new Error('StatusCodeErr'), { statusCode: 500 })
116
+ const instance = bingo-logger(stream)
117
+
118
+ instance.level = name
119
+ instance[name](err)
120
+ const result = await once(stream, 'data')
121
+
122
+ ok(new Date(result.time) <= new Date(), 'time is greater than Date.now()')
123
+ delete result.time
124
+ same(result, {
125
+ pid,
126
+ hostname,
127
+ level,
128
+ err: {
129
+ type: 'Error',
130
+ message: err.message,
131
+ stack: err.stack,
132
+ statusCode: err.statusCode
133
+ },
134
+ msg: err.message
135
+ })
136
+ })
137
+
138
+ test('stack is omitted if it is not set on err', t => {
139
+ t.plan(2)
140
+ const err = new Error('myerror')
141
+ delete err.stack
142
+ const instance = bingo-logger(sink(function (chunk, enc, cb) {
143
+ t.ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
144
+ delete chunk.time
145
+ t.equal(chunk.hasOwnProperty('stack'), false)
146
+ cb()
147
+ }))
148
+
149
+ instance.level = name
150
+ instance[name](err)
151
+ })
152
+
153
+ test('stack is rendered as any other property if it\'s not a string', t => {
154
+ t.plan(3)
155
+ const err = new Error('myerror')
156
+ err.stack = null
157
+ const instance = bingo-logger(sink(function (chunk, enc, cb) {
158
+ t.ok(new Date(chunk.time) <= new Date(), 'time is greater than Date.now()')
159
+ delete chunk.time
160
+ t.equal(chunk.err.hasOwnProperty('stack'), true)
161
+ t.equal(chunk.err.stack, null)
162
+ cb()
163
+ }))
164
+
165
+ instance.level = name
166
+ instance[name](err)
167
+ })
168
+
169
+ test('correctly ignores toString on errors', async ({ same }) => {
170
+ const err = new Error('myerror')
171
+ err.toString = () => undefined
172
+ const stream = sink()
173
+ const instance = bingo-logger({
174
+ test: 'this'
175
+ }, stream)
176
+ instance.fatal(err)
177
+ const result = await once(stream, 'data')
178
+ delete result.time
179
+ same(result, {
180
+ pid,
181
+ hostname,
182
+ level: 60,
183
+ err: {
184
+ type: 'Error',
185
+ message: err.message,
186
+ stack: err.stack
187
+ },
188
+ msg: err.message
189
+ })
190
+ })
191
+
192
+ test('assign mixin()', async ({ same }) => {
193
+ const err = new Error('myerror')
194
+ const stream = sink()
195
+ const instance = bingo-logger({
196
+ mixin () {
197
+ return { hello: 'world' }
198
+ }
199
+ }, stream)
200
+ instance.fatal(err)
201
+ const result = await once(stream, 'data')
202
+ delete result.time
203
+ same(result, {
204
+ pid,
205
+ hostname,
206
+ level: 60,
207
+ hello: 'world',
208
+ err: {
209
+ type: 'Error',
210
+ message: err.message,
211
+ stack: err.stack
212
+ },
213
+ msg: err.message
214
+ })
215
+ })
216
+
217
+ test('no err serializer', async ({ same }) => {
218
+ const err = new Error('myerror')
219
+ const stream = sink()
220
+ const instance = bingo-logger({
221
+ serializers: {}
222
+ }, stream)
223
+ instance.fatal(err)
224
+ const result = await once(stream, 'data')
225
+ delete result.time
226
+ same(result, {
227
+ pid,
228
+ hostname,
229
+ level: 60,
230
+ err: {
231
+ type: 'Error',
232
+ message: err.message,
233
+ stack: err.stack
234
+ },
235
+ msg: err.message
236
+ })
237
+ })
238
+
239
+ test('empty serializer', async ({ same }) => {
240
+ const err = new Error('myerror')
241
+ const stream = sink()
242
+ const instance = bingo-logger({
243
+ serializers: {
244
+ err () {}
245
+ }
246
+ }, stream)
247
+ instance.fatal(err)
248
+ const result = await once(stream, 'data')
249
+ delete result.time
250
+ same(result, {
251
+ pid,
252
+ hostname,
253
+ level: 60,
254
+ msg: err.message
255
+ })
256
+ })
257
+
258
+ test('assign mixin()', async ({ same }) => {
259
+ const err = new Error('myerror')
260
+ const stream = sink()
261
+ const instance = bingo-logger({
262
+ mixin () {
263
+ return { hello: 'world' }
264
+ }
265
+ }, stream)
266
+ instance.fatal(err)
267
+ const result = await once(stream, 'data')
268
+ delete result.time
269
+ same(result, {
270
+ pid,
271
+ hostname,
272
+ level: 60,
273
+ hello: 'world',
274
+ err: {
275
+ type: 'Error',
276
+ message: err.message,
277
+ stack: err.stack
278
+ },
279
+ msg: err.message
280
+ })
281
+ })
282
+
283
+ test('no err serializer', async ({ same }) => {
284
+ const err = new Error('myerror')
285
+ const stream = sink()
286
+ const instance = bingo-logger({
287
+ serializers: {}
288
+ }, stream)
289
+ instance.fatal(err)
290
+ const result = await once(stream, 'data')
291
+ delete result.time
292
+ same(result, {
293
+ pid,
294
+ hostname,
295
+ level: 60,
296
+ err: {
297
+ type: 'Error',
298
+ message: err.message,
299
+ stack: err.stack
300
+ },
301
+ msg: err.message
302
+ })
303
+ })
304
+
305
+ test('empty serializer', async ({ same }) => {
306
+ const err = new Error('myerror')
307
+ const stream = sink()
308
+ const instance = bingo-logger({
309
+ serializers: {
310
+ err () {}
311
+ }
312
+ }, stream)
313
+ instance.fatal(err)
314
+ const result = await once(stream, 'data')
315
+ delete result.time
316
+ same(result, {
317
+ pid,
318
+ hostname,
319
+ level: 60,
320
+ msg: err.message
321
+ })
322
+ })
323
+
324
+ test('correctly adds error information when nestedKey is used', async ({ same }) => {
325
+ const err = new Error('myerror')
326
+ err.toString = () => undefined
327
+ const stream = sink()
328
+ const instance = bingo-logger({
329
+ test: 'this',
330
+ nestedKey: 'obj'
331
+ }, stream)
332
+ instance.fatal(err)
333
+ const result = await once(stream, 'data')
334
+ delete result.time
335
+ same(result, {
336
+ pid,
337
+ hostname,
338
+ level: 60,
339
+ obj: {
340
+ err: {
341
+ type: 'Error',
342
+ stack: err.stack,
343
+ message: err.message
344
+ }
345
+ },
346
+ msg: err.message
347
+ })
348
+ })
349
+
350
+ test('correctly adds msg on error when nestedKey is used', async ({ same }) => {
351
+ const err = new Error('myerror')
352
+ err.toString = () => undefined
353
+ const stream = sink()
354
+ const instance = bingo-logger({
355
+ test: 'this',
356
+ nestedKey: 'obj'
357
+ }, stream)
358
+ instance.fatal(err, 'msg message')
359
+ const result = await once(stream, 'data')
360
+ delete result.time
361
+ same(result, {
362
+ pid,
363
+ hostname,
364
+ level: 60,
365
+ obj: {
366
+ err: {
367
+ type: 'Error',
368
+ stack: err.stack,
369
+ message: err.message
370
+ }
371
+ },
372
+ msg: 'msg message'
373
+ })
374
+ })