standard-log 6.3.1 → 7.0.2

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.
@@ -1,88 +1,99 @@
1
- import a from 'assertron';
2
- import { addLogReporter, clearLogReporters, config, createMemoryLogReporter, getLogReporter, ProhibitedDuringProduction } from '.';
3
- import { store } from './store';
4
- import { createConsoleLogReporter } from './console';
5
- import { LogFilter } from './types';
6
- import { logLevels } from './logLevel';
7
- import { getConsoleReporter, hasConsoleReporter } from './logReporter';
1
+ import a from 'assertron'
2
+ import {
3
+ addLogReporter, clearLogReporters, config,
4
+ createConsoleLogReporter, createMemoryLogReporter,
5
+ getConsoleReporter, getLogReporter, hasConsoleReporter,
6
+ LogFilter, logLevels, ProhibitedDuringProduction
7
+ } from '.'
8
+ import { store } from './store'
8
9
 
9
- beforeEach(() => {
10
- store.reset()
11
- config({ mode: 'test' })
12
- })
10
+ describe('production checks', () => {
11
+ beforeEach(() => store.reset())
13
12
 
14
- describe('addLogReporter()', () => {
15
- test('throws in production mode', () => {
16
- config({ mode: 'production' })
17
- const reporter = createMemoryLogReporter()
18
- a.throws(() => addLogReporter(reporter), ProhibitedDuringProduction)
13
+ describe('addLogReporter()', () => {
14
+ test('throws in production mode', () => {
15
+ config({ mode: 'production' })
16
+ const reporter = createMemoryLogReporter()
17
+ a.throws(() => addLogReporter(reporter), ProhibitedDuringProduction)
18
+ })
19
19
  })
20
20
 
21
- test('adds log reporter', () => {
22
- const count = store.value.reporters.length
23
- const reporter = createMemoryLogReporter()
24
- addLogReporter(reporter)
21
+ describe('clearLogReporters()', () => {
22
+ test('throws in production mode', () => {
23
+ config({ mode: 'production' })
24
+ a.throws(() => clearLogReporters(), ProhibitedDuringProduction)
25
+ })
26
+ })
27
+ })
25
28
 
26
- expect(store.value.reporters.length).toBe(count + 1)
29
+ describe('unit tests', () => {
30
+ beforeEach(() => {
31
+ store.reset()
32
+ config({ mode: 'test' })
27
33
  })
28
34
 
29
- describe('add another console reporter', () => {
30
- test('will not replace existing one', () => {
31
- expect(getLogReporter('console')).toBeDefined()
32
- addLogReporter(createConsoleLogReporter({ id: 'c2' }))
33
- expect(getLogReporter('c2')).toBeUndefined()
34
- expect(getLogReporter('console')).toBeDefined()
35
- })
35
+ describe('addLogReporter()', () => {
36
+ test('adds log reporter', () => {
37
+ const count = store.value.reporters.length
38
+ const reporter = createMemoryLogReporter()
39
+ addLogReporter(reporter)
36
40
 
37
- test('will carry over existing filter', () => {
38
- const filter: LogFilter = entry => entry.level < logLevels.alert
39
- addLogReporter(createConsoleLogReporter({ id: 'c2', filter }))
40
- addLogReporter(createConsoleLogReporter({ id: 'c3' }))
41
- const c3 = getConsoleReporter()!
42
- expect(c3.filter).toBe(filter)
41
+ expect(store.value.reporters.length).toBe(count + 1)
43
42
  })
44
43
 
45
- test('will combine existing filter and new filter', () => {
46
- addLogReporter(createConsoleLogReporter({ id: 'c2', filter: entry => entry.level > logLevels.critical }))
47
- addLogReporter(createConsoleLogReporter({ id: 'c3', filter: entry => entry.level < logLevels.error }))
48
- const c2 = getConsoleReporter()!
49
- expect(c2.filter!({ level: logLevels.info } as any)).toBe(false)
50
- expect(c2.filter!({ level: logLevels.alert } as any)).toBe(false)
51
- })
52
- })
53
- })
44
+ describe('add another console reporter', () => {
45
+ test('will not replace existing one', () => {
46
+ expect(getLogReporter('console')).toBeDefined()
47
+ addLogReporter(createConsoleLogReporter({ id: 'c2' }))
48
+ expect(getLogReporter('c2')).toBeUndefined()
49
+ expect(getLogReporter('console')).toBeDefined()
50
+ })
54
51
 
55
- describe('getLogReporter()', () => {
56
- test('get log reporter by id', () => {
57
- expect(getLogReporter('console')).toBeDefined()
58
- })
52
+ test('will carry over existing filter', () => {
53
+ const filter: LogFilter = entry => entry.level < logLevels.alert
54
+ addLogReporter(createConsoleLogReporter({ id: 'c2', filter }))
55
+ addLogReporter(createConsoleLogReporter({ id: 'c3' }))
56
+ const c3 = getConsoleReporter()!
57
+ expect(c3.filter).toBe(filter)
58
+ })
59
59
 
60
- test('get log reporter with unknown id gets undefined', () => {
61
- expect(getLogReporter('blah')).toBeUndefined()
60
+ test('will combine existing filter and new filter', () => {
61
+ addLogReporter(createConsoleLogReporter({ id: 'c2', filter: entry => entry.level > logLevels.critical }))
62
+ addLogReporter(createConsoleLogReporter({ id: 'c3', filter: entry => entry.level < logLevels.error }))
63
+ const c2 = getConsoleReporter()!
64
+ expect(c2.filter!({ level: logLevels.info } as any)).toBe(false)
65
+ expect(c2.filter!({ level: logLevels.alert } as any)).toBe(false)
66
+ })
67
+ })
62
68
  })
63
- })
64
69
 
65
- describe('clearLogReporters()', () => {
66
- test('throws in production mode', () => {
67
- config({ mode: 'production' })
68
- a.throws(() => clearLogReporters(), ProhibitedDuringProduction)
70
+ describe('getLogReporter()', () => {
71
+ test('get log reporter by id', () => {
72
+ expect(getLogReporter('console')).toBeDefined()
73
+ })
74
+
75
+ test('get log reporter with unknown id gets undefined', () => {
76
+ expect(getLogReporter('blah')).toBeUndefined()
77
+ })
69
78
  })
70
79
 
71
- test('removes all reporters', () => {
72
- clearLogReporters()
80
+ describe('clearLogReporters()', () => {
81
+ test('removes all reporters', () => {
82
+ clearLogReporters()
73
83
 
74
- expect(store.value.reporters.length).toBe(0)
84
+ expect(store.value.reporters.length).toBe(0)
85
+ })
75
86
  })
76
- })
77
87
 
78
- describe('hasConsoleReporter()', () => {
79
- test('returns true if there is a console reporter', () => {
80
- expect(hasConsoleReporter()).toBeTruthy()
81
- })
82
- test('returns false if there is no console reporter', () => {
83
- clearLogReporters()
84
- expect(hasConsoleReporter()).toBeFalsy()
85
- addLogReporter(createMemoryLogReporter())
86
- expect(hasConsoleReporter()).toBeFalsy()
88
+ describe('hasConsoleReporter()', () => {
89
+ test('returns true if there is a console reporter', () => {
90
+ expect(hasConsoleReporter()).toBeTruthy()
91
+ })
92
+ test('returns false if there is no console reporter', () => {
93
+ clearLogReporters()
94
+ expect(hasConsoleReporter()).toBeFalsy()
95
+ addLogReporter(createMemoryLogReporter())
96
+ expect(hasConsoleReporter()).toBeFalsy()
97
+ })
87
98
  })
88
99
  })
@@ -1,98 +1,114 @@
1
1
  import a from 'assertron'
2
2
  import { config, createMemoryLogReporter, logLevels, ProhibitedDuringProduction } from '..'
3
+ import { configForTest } from '../configForTest'
4
+ import { getLogger } from '../getLogger'
3
5
  import { store } from '../store'
4
6
 
5
- beforeEach(() => {
6
- store.reset()
7
- config({ mode: 'test' })
8
- })
9
- test('log entries are saved in the `logs` property', () => {
10
- const reporter = createMemoryLogReporter()
11
- const entry = { id: 'log', level: 1, args: ['some messages'], timestamp: new Date() }
12
- reporter.write(entry)
13
- expect(reporter.logs).toEqual([entry])
14
- })
15
-
16
- test('can override id', () => {
17
- const reporter = createMemoryLogReporter({ id: 'custom-id-mem' })
18
- expect(reporter.id).toBe('custom-id-mem')
19
- })
20
-
21
- test('can filter', () => {
22
- const reporter = createMemoryLogReporter({ filter(entry) { return entry.id !== 'secret' } })
23
- reporter.write({ id: 'ok', level: 1, args: ['some messages'], timestamp: new Date() })
24
- reporter.write({ id: 'secret', level: 1, args: ['some messages'], timestamp: new Date() })
25
- expect(reporter.logs.length).toBe(1)
26
- })
7
+ describe('production checks', () => {
8
+ beforeEach(() => store.reset())
9
+ test('set formatter in production mode throws', () => {
10
+ config({ mode: 'production' })
11
+ const reporter = createMemoryLogReporter()
27
12
 
28
- test('can change filter', () => {
29
- const reporter = createMemoryLogReporter()
30
- const filter = reporter.filter
31
- reporter.filter = entry => entry.id !== 'secret'
32
- expect(reporter.filter).not.toEqual(filter)
33
- })
13
+ a.throws(() => { reporter.formatter = e => e }, ProhibitedDuringProduction)
14
+ })
34
15
 
35
- test('set filter in production mode throws', () => {
36
- config({ mode: 'production' })
37
- const reporter = createMemoryLogReporter()
38
- a.throws(() => { reporter.filter = () => true }, ProhibitedDuringProduction)
39
- })
16
+ test('set filter in production mode throws', () => {
17
+ config({ mode: 'production' })
18
+ const reporter = createMemoryLogReporter()
19
+ a.throws(() => { reporter.filter = () => true }, ProhibitedDuringProduction)
20
+ })
40
21
 
41
- test('formatter can be used to pre-process the log', () => {
42
- const reporter = createMemoryLogReporter({
43
- formatter: (entry) => ({
44
- ...entry,
45
- args: entry.args.map(arg => arg === 'secret' ? '<censored>' : arg)
22
+ describe('getLogMessageWithLevel()', () => {
23
+ test('the production log is omitted', () => {
24
+ const { reporter } = configForTest()
25
+ config({ mode: 'production' })
26
+ getLogger('test').warn('some test warnings')
27
+ expect(reporter.getLogMessageWithLevel()).toEqual(`(WARN) some test warnings`)
46
28
  })
47
29
  })
48
-
49
- const entry = { id: 'log', level: 1, args: ['a', 'secret', 'b'], timestamp: new Date() }
50
- reporter.write(entry)
51
-
52
- expect(reporter.logs[0].args[1]).toBe('<censored>')
53
30
  })
54
31
 
55
- test('can change formatter', () => {
56
- const reporter = createMemoryLogReporter()
57
- const formatter = reporter.formatter
58
- reporter.formatter = e => ({ ...e, args: e.args.reverse() })
59
- expect(reporter.formatter).not.toEqual(formatter)
60
- })
32
+ describe('unit tests', () => {
33
+ beforeEach(() => {
34
+ store.reset()
35
+ config({ mode: 'test' })
36
+ })
37
+ test('log entries are saved in the `logs` property', () => {
38
+ const reporter = createMemoryLogReporter()
39
+ const entry = { id: 'log', level: 1, args: ['some messages'], timestamp: new Date() }
40
+ reporter.write(entry)
41
+ expect(reporter.logs).toEqual([entry])
42
+ })
61
43
 
62
- test('set formatter in production mode throws', () => {
63
- config({ mode: 'production' })
64
- const reporter = createMemoryLogReporter()
44
+ test('can override id', () => {
45
+ const reporter = createMemoryLogReporter({ id: 'custom-id-mem' })
46
+ expect(reporter.id).toBe('custom-id-mem')
47
+ })
65
48
 
66
- a.throws(() => { reporter.formatter = e => e }, ProhibitedDuringProduction)
67
- })
49
+ test('can filter', () => {
50
+ const reporter = createMemoryLogReporter({ filter(entry) { return entry.id !== 'secret' } })
51
+ reporter.write({ id: 'ok', level: 1, args: ['some messages'], timestamp: new Date() })
52
+ reporter.write({ id: 'secret', level: 1, args: ['some messages'], timestamp: new Date() })
53
+ expect(reporter.logs.length).toBe(1)
54
+ })
68
55
 
69
- describe('getLogMessages()', () => {
70
- test('empty logs returns empty string', () => {
56
+ test('can change filter', () => {
71
57
  const reporter = createMemoryLogReporter()
72
-
73
- expect(reporter.getLogMessage()).toEqual('')
58
+ const filter = reporter.filter
59
+ reporter.filter = entry => entry.id !== 'secret'
60
+ expect(reporter.filter).not.toEqual(filter)
74
61
  })
75
62
 
76
- test('print args', () => {
77
- const reporter = createMemoryLogReporter()
78
- const entry = { id: 'log', level: 1, args: ['miku', 'is', 'singing'], timestamp: new Date() }
63
+ test('formatter can be used to pre-process the log', () => {
64
+ const reporter = createMemoryLogReporter({
65
+ formatter: (entry) => ({
66
+ ...entry,
67
+ args: entry.args.map(arg => arg === 'secret' ? '<censored>' : arg)
68
+ })
69
+ })
70
+
71
+ const entry = { id: 'log', level: 1, args: ['a', 'secret', 'b'], timestamp: new Date() }
79
72
  reporter.write(entry)
80
- expect(reporter.getLogMessage()).toEqual('miku is singing')
73
+
74
+ expect(reporter.logs[0].args[1]).toBe('<censored>')
81
75
  })
82
76
 
83
- test('print object arg', () => {
77
+ test('can change formatter', () => {
84
78
  const reporter = createMemoryLogReporter()
85
- const entry = { id: 'log', level: 1, args: [{ 'miku': 'sing' }], timestamp: new Date() }
86
- reporter.write(entry)
87
- expect(reporter.getLogMessage()).toEqual("{ miku: 'sing' }")
79
+ const formatter = reporter.formatter
80
+ reporter.formatter = e => ({ ...e, args: e.args.reverse() })
81
+ expect(reporter.formatter).not.toEqual(formatter)
88
82
  })
89
- })
90
83
 
91
- describe('getLogMessageWithLevel', () => {
92
- test('print with level', () => {
93
- const reporter = createMemoryLogReporter()
94
- reporter.write({ id: 'log', level: logLevels.info, args: ['msg 1'], timestamp: new Date() })
95
- reporter.write({ id: 'log', level: logLevels.warn, args: ['msg 2'], timestamp: new Date() })
96
- expect(reporter.getLogMessageWithLevel()).toEqual(`(INFO) msg 1\n(WARN) msg 2`)
84
+ describe('getLogMessages()', () => {
85
+ test('empty logs returns empty string', () => {
86
+ const reporter = createMemoryLogReporter()
87
+
88
+ expect(reporter.getLogMessage()).toEqual('')
89
+ })
90
+
91
+ test('print args', () => {
92
+ const reporter = createMemoryLogReporter()
93
+ const entry = { id: 'log', level: 1, args: ['miku', 'is', 'singing'], timestamp: new Date() }
94
+ reporter.write(entry)
95
+ expect(reporter.getLogMessage()).toEqual('miku is singing')
96
+ })
97
+
98
+ test('print object arg', () => {
99
+ const reporter = createMemoryLogReporter()
100
+ const entry = { id: 'log', level: 1, args: [{ 'miku': 'sing' }], timestamp: new Date() }
101
+ reporter.write(entry)
102
+ expect(reporter.getLogMessage()).toEqual("{ miku: 'sing' }")
103
+ })
104
+ })
105
+
106
+ describe('getLogMessageWithLevel', () => {
107
+ test('print with level', () => {
108
+ const reporter = createMemoryLogReporter()
109
+ reporter.write({ id: 'log', level: logLevels.info, args: ['msg 1'], timestamp: new Date() })
110
+ reporter.write({ id: 'log', level: logLevels.warn, args: ['msg 2'], timestamp: new Date() })
111
+ expect(reporter.getLogMessageWithLevel()).toEqual(`(INFO) msg 1\n(WARN) msg 2`)
112
+ })
97
113
  })
98
114
  })
@@ -28,6 +28,10 @@ export function toMessageWithLevel(logs: LogEntry[]) {
28
28
  return logs.map(toInspectLogEntry)
29
29
  .map(log => `${formatLogLevel(log.level)} ${log.args.join(' ')}`)
30
30
  .join('\n')
31
+ // if it has more than this log,
32
+ // we assume it is running under tests,
33
+ // and remove this log to simplify testing.
34
+ .replace(/^\(WARN\) already configured for test, ignoring config\(\) call\n/, '')
31
35
  }
32
36
 
33
37