@@ -21,27 +21,29 @@ import defaults from './defaults';
21
21
*
22
22
* @returns {function } logger middleware
23
23
*/
24
- function createLogger ( options = { } ) {
25
- const loggerOptions = Object . assign ( { } , defaults , options ) ;
24
+ function directlyApplied ( options ) {
25
+ return options . getState && options . dispatch ;
26
+ }
26
27
27
- const {
28
- logger,
29
- stateTransformer,
30
- errorTransformer,
31
- predicate,
32
- logErrors,
33
- diffPredicate,
34
- } = loggerOptions ;
28
+ function noLogger ( options ) {
29
+ return typeof options . logger === 'undefined' ;
30
+ }
35
31
36
- // Return if 'console' object is not defined
37
- if ( typeof logger === 'undefined' ) {
38
- return ( ) => next => action => next ( action ) ;
39
- }
32
+ function shouldNotLog ( { predicate } , getState , action ) {
33
+ return typeof predicate === 'function' && ! predicate ( getState , action ) ;
34
+ }
40
35
41
- // Detect if 'createLogger' was passed directly to 'applyMiddleware'.
42
- if ( options . getState && options . dispatch ) {
43
- // eslint-disable-next-line no-console
44
- console . error ( `[redux-logger] redux-logger not installed. Make sure to pass logger instance as middleware:
36
+ function shouldDiff ( { diff, diffPredicate } , getState , action ) {
37
+ return diff && typeof diffPredicate === 'function' && diffPredicate ( getState , action ) ;
38
+ }
39
+
40
+ function emptyLogger ( ) {
41
+ return ( ) => next => action => next ( action ) ;
42
+ }
43
+
44
+ function emptyLoggerWarning ( ) {
45
+ // eslint-disable-next-line no-console
46
+ console . error ( `[redux-logger] redux-logger not installed. Make sure to pass logger instance as middleware:
45
47
// Logger with default options
46
48
import { logger } from 'redux-logger'
47
49
const store = createStore(
@@ -58,49 +60,58 @@ const store = createStore(
58
60
applyMiddleware(logger)
59
61
)
60
62
` ) ;
63
+ }
61
64
62
- return ( ) => next => action => next ( action ) ;
65
+ function createLogger ( options = { } ) {
66
+ // Detect if 'createLogger' was passed directly to 'applyMiddleware'.
67
+ if ( directlyApplied ( options ) ) {
68
+ emptyLoggerWarning ( ) ;
69
+ return emptyLogger ( ) ;
63
70
}
64
71
65
- const logBuffer = [ ] ;
72
+ // Return if 'console' object is not defined
73
+ if ( noLogger ( options ) ) return emptyLogger ( ) ;
74
+
75
+ const loggerOptions = Object . assign ( { } , defaults , options ) :
66
76
67
77
return ( { getState } ) => next => ( action ) => {
68
78
// Exit early if predicate function returns 'false'
69
- if ( typeof predicate === 'function' && ! predicate ( getState , action ) ) {
70
- return next ( action ) ;
71
- }
72
-
73
- const logEntry = { } ;
74
-
75
- logBuffer . push ( logEntry ) ;
76
-
77
- logEntry . started = timer . now ( ) ;
78
- logEntry . startedTime = new Date ( ) ;
79
- logEntry . prevState = stateTransformer ( getState ( ) ) ;
80
- logEntry . action = action ;
79
+ if ( shouldNotLog ( getState , action ) ) return next ( action ) ;
81
80
81
+ const started = timer . now ( ) ;
82
+ const startedTime = new Date ( ) ;
83
+ const prevState = loggerOptions . stateTransformer ( getState ( ) ) ;
82
84
let returnedValue ;
83
- if ( logErrors ) {
84
- try {
85
- returnedValue = next ( action ) ;
86
- } catch ( e ) {
87
- logEntry . error = errorTransformer ( e ) ;
88
- }
89
- } else {
85
+ let error ;
86
+
87
+ try {
90
88
returnedValue = next ( action ) ;
89
+ } catch ( e ) {
90
+ if ( loggerOptions . logErrors ) {
91
+ error = loggerOptions . errorTransformer ( e ) ;
92
+ } else {
93
+ throw e ;
94
+ }
91
95
}
92
96
93
- logEntry . took = timer . now ( ) - logEntry . started ;
94
- logEntry . nextState = stateTransformer ( getState ( ) ) ;
97
+ const took = timer . now ( ) - started ;
98
+ const nextState = loggerOptions . stateTransformer ( getState ( ) ) ;
95
99
96
- const diff = loggerOptions . diff && typeof diffPredicate === 'function'
97
- ? diffPredicate ( getState , action )
98
- : loggerOptions . diff ;
100
+ loggerOptions . diff = shouldDiff ( loggerOptions , getState , action ) ;
99
101
100
- printBuffer ( logBuffer , Object . assign ( { } , loggerOptions , { diff } ) ) ;
101
- logBuffer . length = 0 ;
102
+ printBuffer (
103
+ [ {
104
+ started,
105
+ startedTime,
106
+ prevState,
107
+ action,
108
+ error,
109
+ took,
110
+ nextState,
111
+ } ] ,
112
+ loggerOptions ) ;
102
113
103
- if ( logEntry . error ) throw logEntry . error ;
114
+ if ( error ) throw error ;
104
115
return returnedValue ;
105
116
} ;
106
117
}
0 commit comments