You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							668 lines
						
					
					
						
							17 KiB
						
					
					
				
			
		
		
	
	
							668 lines
						
					
					
						
							17 KiB
						
					
					
				| 'use strict'
 | |
| const os = require('os')
 | |
| const { join } = require('path')
 | |
| const { readFileSync } = require('fs')
 | |
| const { test } = require('tap')
 | |
| const { sink, check, once, watchFileCreated } = require('./helper')
 | |
| const pino = require('../')
 | |
| const { version } = require('../package.json')
 | |
| const { pid } = process
 | |
| const hostname = os.hostname()
 | |
| 
 | |
| test('pino version is exposed on export', async ({ equal }) => {
 | |
|   equal(pino.version, version)
 | |
| })
 | |
| 
 | |
| test('pino version is exposed on instance', async ({ equal }) => {
 | |
|   const instance = pino()
 | |
|   equal(instance.version, version)
 | |
| })
 | |
| 
 | |
| test('child instance exposes pino version', async ({ equal }) => {
 | |
|   const child = pino().child({ foo: 'bar' })
 | |
|   equal(child.version, version)
 | |
| })
 | |
| 
 | |
| test('bindings are exposed on every instance', async ({ same }) => {
 | |
|   const instance = pino()
 | |
|   same(instance.bindings(), {})
 | |
| })
 | |
| 
 | |
| test('bindings contain the name and the child bindings', async ({ same }) => {
 | |
|   const instance = pino({ name: 'basicTest', level: 'info' }).child({ foo: 'bar' }).child({ a: 2 })
 | |
|   same(instance.bindings(), { name: 'basicTest', foo: 'bar', a: 2 })
 | |
| })
 | |
| 
 | |
| test('set bindings on instance', async ({ same }) => {
 | |
|   const instance = pino({ name: 'basicTest', level: 'info' })
 | |
|   instance.setBindings({ foo: 'bar' })
 | |
|   same(instance.bindings(), { name: 'basicTest', foo: 'bar' })
 | |
| })
 | |
| 
 | |
| test('newly set bindings overwrite old bindings', async ({ same }) => {
 | |
|   const instance = pino({ name: 'basicTest', level: 'info', base: { foo: 'bar' } })
 | |
|   instance.setBindings({ foo: 'baz' })
 | |
|   same(instance.bindings(), { name: 'basicTest', foo: 'baz' })
 | |
| })
 | |
| 
 | |
| test('set bindings on child instance', async ({ same }) => {
 | |
|   const child = pino({ name: 'basicTest', level: 'info' }).child({})
 | |
|   child.setBindings({ foo: 'bar' })
 | |
|   same(child.bindings(), { name: 'basicTest', foo: 'bar' })
 | |
| })
 | |
| 
 | |
| test('child should have bindings set by parent', async ({ same }) => {
 | |
|   const instance = pino({ name: 'basicTest', level: 'info' })
 | |
|   instance.setBindings({ foo: 'bar' })
 | |
|   const child = instance.child({})
 | |
|   same(child.bindings(), { name: 'basicTest', foo: 'bar' })
 | |
| })
 | |
| 
 | |
| test('child should not share bindings of parent set after child creation', async ({ same }) => {
 | |
|   const instance = pino({ name: 'basicTest', level: 'info' })
 | |
|   const child = instance.child({})
 | |
|   instance.setBindings({ foo: 'bar' })
 | |
|   same(instance.bindings(), { name: 'basicTest', foo: 'bar' })
 | |
|   same(child.bindings(), { name: 'basicTest' })
 | |
| })
 | |
| 
 | |
| function levelTest (name, level) {
 | |
|   test(`${name} logs as ${level}`, async ({ equal }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
|     instance[name]('hello world')
 | |
|     check(equal, await once(stream, 'data'), level, 'hello world')
 | |
|   })
 | |
| 
 | |
|   test(`passing objects at level ${name}`, async ({ equal, same }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
|     const obj = { hello: 'world' }
 | |
|     instance[name](obj)
 | |
| 
 | |
|     const result = await once(stream, 'data')
 | |
|     equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|     equal(result.pid, pid)
 | |
|     equal(result.hostname, hostname)
 | |
|     equal(result.level, level)
 | |
|     equal(result.hello, 'world')
 | |
|     same(Object.keys(obj), ['hello'])
 | |
|   })
 | |
| 
 | |
|   test(`passing an object and a string at level ${name}`, async ({ equal, same }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
|     const obj = { hello: 'world' }
 | |
|     instance[name](obj, 'a string')
 | |
|     const result = await once(stream, 'data')
 | |
|     equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|     delete result.time
 | |
|     same(result, {
 | |
|       pid,
 | |
|       hostname,
 | |
|       level,
 | |
|       msg: 'a string',
 | |
|       hello: 'world'
 | |
|     })
 | |
|     same(Object.keys(obj), ['hello'])
 | |
|   })
 | |
| 
 | |
|   test(`overriding object key by string at level ${name}`, async ({ equal, same }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
|     instance[name]({ hello: 'world', msg: 'object' }, 'string')
 | |
|     const result = await once(stream, 'data')
 | |
|     equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|     delete result.time
 | |
|     same(result, {
 | |
|       pid,
 | |
|       hostname,
 | |
|       level,
 | |
|       msg: 'string',
 | |
|       hello: 'world'
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   test(`formatting logs as ${name}`, async ({ equal }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
|     instance[name]('hello %d', 42)
 | |
|     const result = await once(stream, 'data')
 | |
|     check(equal, result, level, 'hello 42')
 | |
|   })
 | |
| 
 | |
|   test(`formatting a symbol at level ${name}`, async ({ equal }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
| 
 | |
|     const sym = Symbol('foo')
 | |
|     instance[name]('hello %s', sym)
 | |
| 
 | |
|     const result = await once(stream, 'data')
 | |
| 
 | |
|     check(equal, result, level, 'hello Symbol(foo)')
 | |
|   })
 | |
| 
 | |
|   test(`passing error with a serializer at level ${name}`, async ({ equal, same }) => {
 | |
|     const stream = sink()
 | |
|     const err = new Error('myerror')
 | |
|     const instance = pino({
 | |
|       serializers: {
 | |
|         err: pino.stdSerializers.err
 | |
|       }
 | |
|     }, stream)
 | |
|     instance.level = name
 | |
|     instance[name]({ err })
 | |
|     const result = await once(stream, 'data')
 | |
|     equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|     delete result.time
 | |
|     same(result, {
 | |
|       pid,
 | |
|       hostname,
 | |
|       level,
 | |
|       err: {
 | |
|         type: 'Error',
 | |
|         message: err.message,
 | |
|         stack: err.stack
 | |
|       }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   test(`child logger for level ${name}`, async ({ equal, same }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino(stream)
 | |
|     instance.level = name
 | |
|     const child = instance.child({ hello: 'world' })
 | |
|     child[name]('hello world')
 | |
|     const result = await once(stream, 'data')
 | |
|     equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|     delete result.time
 | |
|     same(result, {
 | |
|       pid,
 | |
|       hostname,
 | |
|       level,
 | |
|       msg: 'hello world',
 | |
|       hello: 'world'
 | |
|     })
 | |
|   })
 | |
| }
 | |
| 
 | |
| levelTest('fatal', 60)
 | |
| levelTest('error', 50)
 | |
| levelTest('warn', 40)
 | |
| levelTest('info', 30)
 | |
| levelTest('debug', 20)
 | |
| levelTest('trace', 10)
 | |
| 
 | |
| test('serializers can return undefined to strip field', async ({ equal }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     serializers: {
 | |
|       test () { return undefined }
 | |
|     }
 | |
|   }, stream)
 | |
| 
 | |
|   instance.info({ test: 'sensitive info' })
 | |
|   const result = await once(stream, 'data')
 | |
|   equal('test' in result, false)
 | |
| })
 | |
| 
 | |
| test('does not explode with a circular ref', async ({ doesNotThrow }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   const b = {}
 | |
|   const a = {
 | |
|     hello: b
 | |
|   }
 | |
|   b.a = a // circular ref
 | |
|   doesNotThrow(() => instance.info(a))
 | |
| })
 | |
| 
 | |
| test('set the name', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     name: 'hello'
 | |
|   }, stream)
 | |
|   instance.fatal('this is fatal')
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 60,
 | |
|     name: 'hello',
 | |
|     msg: 'this is fatal'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('set the messageKey', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const message = 'hello world'
 | |
|   const messageKey = 'fooMessage'
 | |
|   const instance = pino({
 | |
|     messageKey
 | |
|   }, stream)
 | |
|   instance.info(message)
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     fooMessage: message
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('set the nestedKey', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const object = { hello: 'world' }
 | |
|   const nestedKey = 'stuff'
 | |
|   const instance = pino({
 | |
|     nestedKey
 | |
|   }, stream)
 | |
|   instance.info(object)
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     stuff: object
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('set undefined properties', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   instance.info({ hello: 'world', property: undefined })
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     hello: 'world'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('prototype properties are not logged', async ({ equal }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   instance.info(Object.create({ hello: 'world' }))
 | |
|   const { hello } = await once(stream, 'data')
 | |
|   equal(hello, undefined)
 | |
| })
 | |
| 
 | |
| test('set the base', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     base: {
 | |
|       a: 'b'
 | |
|     }
 | |
|   }, stream)
 | |
| 
 | |
|   instance.fatal('this is fatal')
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     a: 'b',
 | |
|     level: 60,
 | |
|     msg: 'this is fatal'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('set the base to null', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     base: null
 | |
|   }, stream)
 | |
|   instance.fatal('this is fatal')
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     level: 60,
 | |
|     msg: 'this is fatal'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('set the base to null and use a formatter', async ({ equal, same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     base: null,
 | |
|     formatters: {
 | |
|       log (input) {
 | |
|         return Object.assign({}, input, { additionalMessage: 'using pino' })
 | |
|       }
 | |
|     }
 | |
|   }, stream)
 | |
|   instance.fatal('this is fatal too')
 | |
|   const result = await once(stream, 'data')
 | |
|   equal(new Date(result.time) <= new Date(), true, 'time is greater than Date.now()')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     level: 60,
 | |
|     msg: 'this is fatal too',
 | |
|     additionalMessage: 'using pino'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('throw if creating child without bindings', async ({ equal, fail }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   try {
 | |
|     instance.child()
 | |
|     fail('it should throw')
 | |
|   } catch (err) {
 | |
|     equal(err.message, 'missing bindings for child Pino')
 | |
|   }
 | |
| })
 | |
| 
 | |
| test('correctly escapes msg strings with stray double quote at end', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     name: 'hello'
 | |
|   }, stream)
 | |
| 
 | |
|   instance.fatal('this contains "')
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 60,
 | |
|     name: 'hello',
 | |
|     msg: 'this contains "'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('correctly escape msg strings with unclosed double quote', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     name: 'hello'
 | |
|   }, stream)
 | |
|   instance.fatal('" this contains')
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 60,
 | |
|     name: 'hello',
 | |
|     msg: '" this contains'
 | |
|   })
 | |
| })
 | |
| 
 | |
| // https://github.com/pinojs/pino/issues/139
 | |
| test('object and format string', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   instance.info({}, 'foo %s', 'bar')
 | |
| 
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: 'foo bar'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('object and format string property', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   instance.info({ answer: 42 }, 'foo %s', 'bar')
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: 'foo bar',
 | |
|     answer: 42
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('correctly strip undefined when returned from toJSON', async ({ equal }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     test: 'this'
 | |
|   }, stream)
 | |
|   instance.fatal({ test: { toJSON () { return undefined } } })
 | |
|   const result = await once(stream, 'data')
 | |
|   equal('test' in result, false)
 | |
| })
 | |
| 
 | |
| test('correctly supports stderr', async ({ same }) => {
 | |
|   // stderr inherits from Stream, rather than Writable
 | |
|   const dest = {
 | |
|     writable: true,
 | |
|     write (result) {
 | |
|       result = JSON.parse(result)
 | |
|       delete result.time
 | |
|       same(result, {
 | |
|         pid,
 | |
|         hostname,
 | |
|         level: 60,
 | |
|         msg: 'a message'
 | |
|       })
 | |
|     }
 | |
|   }
 | |
|   const instance = pino(dest)
 | |
|   instance.fatal('a message')
 | |
| })
 | |
| 
 | |
| test('normalize number to string', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   instance.info(1)
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: '1'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('normalize number to string with an object', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   instance.info({ answer: 42 }, 1)
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: '1',
 | |
|     answer: 42
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('handles objects with null prototype', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
|   const o = Object.create(null)
 | |
|   o.test = 'test'
 | |
|   instance.info(o)
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     test: 'test'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('pino.destination', async ({ same }) => {
 | |
|   const tmp = join(
 | |
|     os.tmpdir(),
 | |
|     '_' + Math.random().toString(36).substr(2, 9)
 | |
|   )
 | |
|   const instance = pino(pino.destination(tmp))
 | |
|   instance.info('hello')
 | |
|   await watchFileCreated(tmp)
 | |
|   const result = JSON.parse(readFileSync(tmp).toString())
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: 'hello'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('auto pino.destination with a string', async ({ same }) => {
 | |
|   const tmp = join(
 | |
|     os.tmpdir(),
 | |
|     '_' + Math.random().toString(36).substr(2, 9)
 | |
|   )
 | |
|   const instance = pino(tmp)
 | |
|   instance.info('hello')
 | |
|   await watchFileCreated(tmp)
 | |
|   const result = JSON.parse(readFileSync(tmp).toString())
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: 'hello'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('auto pino.destination with a string as second argument', async ({ same }) => {
 | |
|   const tmp = join(
 | |
|     os.tmpdir(),
 | |
|     '_' + Math.random().toString(36).substr(2, 9)
 | |
|   )
 | |
|   const instance = pino(null, tmp)
 | |
|   instance.info('hello')
 | |
|   await watchFileCreated(tmp)
 | |
|   const result = JSON.parse(readFileSync(tmp).toString())
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     msg: 'hello'
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('does not override opts with a string as second argument', async ({ same }) => {
 | |
|   const tmp = join(
 | |
|     os.tmpdir(),
 | |
|     '_' + Math.random().toString(36).substr(2, 9)
 | |
|   )
 | |
|   const instance = pino({
 | |
|     timestamp: () => ',"time":"none"'
 | |
|   }, tmp)
 | |
|   instance.info('hello')
 | |
|   await watchFileCreated(tmp)
 | |
|   const result = JSON.parse(readFileSync(tmp).toString())
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 30,
 | |
|     time: 'none',
 | |
|     msg: 'hello'
 | |
|   })
 | |
| })
 | |
| 
 | |
| // https://github.com/pinojs/pino/issues/222
 | |
| test('children with same names render in correct order', async ({ equal }) => {
 | |
|   const stream = sink()
 | |
|   const root = pino(stream)
 | |
|   root.child({ a: 1 }).child({ a: 2 }).info({ a: 3 })
 | |
|   const { a } = await once(stream, 'data')
 | |
|   equal(a, 3, 'last logged object takes precedence')
 | |
| })
 | |
| 
 | |
| // https://github.com/pinojs/pino/pull/251 - use this.stringify
 | |
| test('use `fast-safe-stringify` to avoid circular dependencies', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const root = pino(stream)
 | |
|   // circular depth
 | |
|   const obj = {}
 | |
|   obj.a = obj
 | |
|   root.info(obj)
 | |
|   const { a } = await once(stream, 'data')
 | |
|   same(a, { a: '[Circular]' })
 | |
| })
 | |
| 
 | |
| test('fast-safe-stringify must be used when interpolating', async (t) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
| 
 | |
|   const o = { a: { b: {} } }
 | |
|   o.a.b.c = o.a.b
 | |
|   instance.info('test %j', o)
 | |
| 
 | |
|   const { msg } = await once(stream, 'data')
 | |
|   t.equal(msg, 'test {"a":{"b":{"c":"[Circular]"}}}')
 | |
| })
 | |
| 
 | |
| test('throws when setting useOnlyCustomLevels without customLevels', async ({ throws }) => {
 | |
|   throws(() => {
 | |
|     pino({
 | |
|       useOnlyCustomLevels: true
 | |
|     })
 | |
|   }, 'customLevels is required if useOnlyCustomLevels is set true')
 | |
| })
 | |
| 
 | |
| test('correctly log Infinity', async (t) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
| 
 | |
|   const o = { num: Infinity }
 | |
|   instance.info(o)
 | |
| 
 | |
|   const { num } = await once(stream, 'data')
 | |
|   t.equal(num, null)
 | |
| })
 | |
| 
 | |
| test('correctly log -Infinity', async (t) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
| 
 | |
|   const o = { num: -Infinity }
 | |
|   instance.info(o)
 | |
| 
 | |
|   const { num } = await once(stream, 'data')
 | |
|   t.equal(num, null)
 | |
| })
 | |
| 
 | |
| test('correctly log NaN', async (t) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino(stream)
 | |
| 
 | |
|   const o = { num: NaN }
 | |
|   instance.info(o)
 | |
| 
 | |
|   const { num } = await once(stream, 'data')
 | |
|   t.equal(num, null)
 | |
| })
 | |
| 
 | |
| test('offers a .default() method to please typescript', async ({ equal }) => {
 | |
|   equal(pino.default, pino)
 | |
| 
 | |
|   const stream = sink()
 | |
|   const instance = pino.default(stream)
 | |
|   instance.info('hello world')
 | |
|   check(equal, await once(stream, 'data'), 30, 'hello world')
 | |
| })
 |