1 | import { printBuffer } from './core';
|
2 | import { timer } from './helpers';
|
3 | import defaults from './defaults';
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | function createLogger(options = {}) {
|
25 | const loggerOptions = {
|
26 | ...defaults,
|
27 | ...options,
|
28 | };
|
29 |
|
30 | const {
|
31 | logger,
|
32 | transformer,
|
33 | stateTransformer,
|
34 | errorTransformer,
|
35 | predicate,
|
36 | logErrors,
|
37 | diffPredicate,
|
38 | } = loggerOptions;
|
39 |
|
40 |
|
41 | if (typeof logger === `undefined`) {
|
42 | return () => next => action => next(action);
|
43 | }
|
44 |
|
45 | if (transformer) {
|
46 | console.error(`Option 'transformer' is deprecated, use 'stateTransformer' instead!`);
|
47 | }
|
48 |
|
49 |
|
50 | if (options.getState && options.dispatch) {
|
51 |
|
52 | console.error(`redux-logger not installed. Make sure to pass logger instance as middleware:
|
53 |
|
54 | import createLogger from 'redux-logger';
|
55 |
|
56 | const logger = createLogger();
|
57 | const store = createStore(
|
58 | reducer,
|
59 | applyMiddleware(logger)
|
60 | );`);
|
61 |
|
62 | return () => next => action => next(action);
|
63 | }
|
64 |
|
65 | const logBuffer = [];
|
66 |
|
67 | return ({ getState }) => (next) => (action) => {
|
68 |
|
69 | if (typeof predicate === `function` && !predicate(getState, action)) {
|
70 | return next(action);
|
71 | }
|
72 |
|
73 | const logEntry = {};
|
74 | logBuffer.push(logEntry);
|
75 |
|
76 | logEntry.started = timer.now();
|
77 | logEntry.startedTime = new Date();
|
78 | logEntry.prevState = stateTransformer(getState());
|
79 | logEntry.action = action;
|
80 |
|
81 | let returnedValue;
|
82 | if (logErrors) {
|
83 | try {
|
84 | returnedValue = next(action);
|
85 | } catch (e) {
|
86 | logEntry.error = errorTransformer(e);
|
87 | }
|
88 | } else {
|
89 | returnedValue = next(action);
|
90 | }
|
91 |
|
92 | logEntry.took = timer.now() - logEntry.started;
|
93 | logEntry.nextState = stateTransformer(getState());
|
94 |
|
95 | const diff = loggerOptions.diff && typeof diffPredicate === `function` ? diffPredicate(getState, action) : loggerOptions.diff;
|
96 |
|
97 | printBuffer(logBuffer, { ...loggerOptions, diff });
|
98 | logBuffer.length = 0;
|
99 |
|
100 | if (logEntry.error) throw logEntry.error;
|
101 | return returnedValue;
|
102 | };
|
103 | }
|
104 |
|
105 | export default createLogger;
|