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 | stateTransformer,
|
33 | errorTransformer,
|
34 | predicate,
|
35 | logErrors,
|
36 | diffPredicate,
|
37 | } = loggerOptions;
|
38 |
|
39 |
|
40 | if (typeof logger === `undefined`) {
|
41 | return () => next => action => next(action);
|
42 | }
|
43 |
|
44 |
|
45 | if (options.getState && options.dispatch) {
|
46 |
|
47 | console.error(`[redux-logger] redux-logger not installed. Make sure to pass logger instance as middleware:
|
48 | // Logger with default options
|
49 | import { logger } from 'redux-logger'
|
50 | const store = createStore(
|
51 | reducer,
|
52 | applyMiddleware(logger)
|
53 | )
|
54 | // Or you can create your own logger with custom options http://bit.ly/redux-logger-options
|
55 | import createLogger from 'redux-logger'
|
56 | const logger = createLogger({
|
57 | // ...options
|
58 | });
|
59 | const store = createStore(
|
60 | reducer,
|
61 | applyMiddleware(logger)
|
62 | )
|
63 | `);
|
64 |
|
65 | return () => next => action => next(action);
|
66 | }
|
67 |
|
68 | const logBuffer = [];
|
69 |
|
70 | return ({ getState }) => (next) => (action) => {
|
71 |
|
72 | if (typeof predicate === `function` && !predicate(getState, action)) {
|
73 | return next(action);
|
74 | }
|
75 |
|
76 | const logEntry = {};
|
77 |
|
78 | logBuffer.push(logEntry);
|
79 |
|
80 | logEntry.started = timer.now();
|
81 | logEntry.startedTime = new Date();
|
82 | logEntry.prevState = stateTransformer(getState());
|
83 | logEntry.action = action;
|
84 |
|
85 | let returnedValue;
|
86 | if (logErrors) {
|
87 | try {
|
88 | returnedValue = next(action);
|
89 | } catch (e) {
|
90 | logEntry.error = errorTransformer(e);
|
91 | }
|
92 | } else {
|
93 | returnedValue = next(action);
|
94 | }
|
95 |
|
96 | logEntry.took = timer.now() - logEntry.started;
|
97 | logEntry.nextState = stateTransformer(getState());
|
98 |
|
99 | const diff = loggerOptions.diff && typeof diffPredicate === `function` ? diffPredicate(getState, action) : loggerOptions.diff;
|
100 |
|
101 | printBuffer(logBuffer, { ...loggerOptions, diff });
|
102 | logBuffer.length = 0;
|
103 |
|
104 | if (logEntry.error) throw logEntry.error;
|
105 | return returnedValue;
|
106 | };
|
107 | }
|
108 |
|
109 | const defaultLogger = ({ dispatch, getState } = {}) => {
|
110 | if (typeof dispatch === `function` || typeof getState === `function`) {
|
111 | return createLogger()({ dispatch, getState });
|
112 | } else {
|
113 |
|
114 | console.error(`
|
115 | [redux-logger v3] BREAKING CHANGE
|
116 | [redux-logger v3] Since 3.0.0 redux-logger exports by default logger with default settings.
|
117 | [redux-logger v3] Change
|
118 | [redux-logger v3] import createLogger from 'redux-logger'
|
119 | [redux-logger v3] to
|
120 | [redux-logger v3] import { createLogger } from 'redux-logger'
|
121 | `);
|
122 | }
|
123 | };
|
124 |
|
125 | export {
|
126 | defaults,
|
127 | createLogger,
|
128 | defaultLogger as logger,
|
129 | };
|
130 |
|
131 | export default defaultLogger;
|