Skip to content

Commit 7f94490

Browse files
author
Eugene Rodionov
committed
Merge pull request #130 from mathieudutour/master
feat: fine grained level (fix #94, #54)
2 parents 1098263 + 893c375 commit 7f94490

File tree

3 files changed

+59
-10
lines changed

3 files changed

+59
-10
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,21 @@ createLogger(options?: Object) => LoggerMiddleware
5050

5151
### Options
5252

53-
#### __level (String)__
53+
#### __level (String | Function | Object)__
5454
Level of `console`. `warn`, `error`, `info` or [else](https://developer.mozilla.org/en/docs/Web/API/console).
5555

56+
It can be a function `(action: Object) => level: String`.
57+
58+
It can be an object with level string for: `prevState`, `action`, `nextState`, `error`
59+
60+
It can be an object with getter functions: `prevState`, `action`, `nextState`, `error`. Useful if you want to print
61+
message based on specific state or action. Set any of them to `false` if you want to hide it.
62+
63+
* `prevState(prevState: Object) => level: String`
64+
* `action(action: Object) => level: String`
65+
* `nextState(nextState: Object) => level: String`
66+
* `error(error: Any, prevState: Object) => level: String`
67+
5668
*Default: `log`*
5769

5870
#### __duration (Boolean)__

example/src/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ import { AUTH_REMOVE_TOKEN, AUTH_SET_INFO } from 'constants/auth';
1414

1515
const logger = createLogger({
1616
predicate: (getState, action) => action.type !== AUTH_REMOVE_TOKEN, // log all actions except AUTH_REMOVE_TOKEN
17-
level: `info`,
17+
level: {
18+
prevState: () => `info`,
19+
action: ({ type }) => type === AUTH_SET_INFO ? `error` : `log`,
20+
error: () => `error`,
21+
nextState: () => `info`,
22+
},
1823
duration: true,
1924
actionTransformer: (action) => ({
2025
...action,

src/index.js

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,33 @@ const formatTime = (time) => `@ ${pad(time.getHours(), 2)}:${pad(time.getMinutes
55
// Use the new performance api to get better precision if available
66
const timer = typeof performance !== `undefined` && typeof performance.now === `function` ? performance : Date;
77

8+
9+
/**
10+
* parse the level option of createLogger
11+
*
12+
* @property {string | function | object} level - console[level]
13+
* @property {object} action
14+
* @property {array} payload
15+
* @property {string} type
16+
*/
17+
18+
function getLogLevel(level, action, payload, type) {
19+
switch (typeof level) {
20+
case `object`:
21+
return typeof level[type] === `function` ? level[type](...payload) : level[type];
22+
case `function`:
23+
return level(action);
24+
default:
25+
return level;
26+
}
27+
}
28+
829
/**
930
* Creates logger with followed options
1031
*
1132
* @namespace
1233
* @property {object} options - options for logger
13-
* @property {string} options.level - console[level]
34+
* @property {string | function | object} options.level - console[level]
1435
* @property {boolean} options.duration - print duration of each action?
1536
* @property {boolean} options.timestamp - print timestamp with each action?
1637
* @property {object} options.colors - custom colors
@@ -85,19 +106,30 @@ function createLogger(options = {}) {
85106
logger.log(title);
86107
}
87108

88-
if (colors.prevState) logger[level](`%c prev state`, `color: ${colors.prevState(prevState)}; font-weight: bold`, prevState);
89-
else logger[level](`prev state`, prevState);
109+
const prevStateLevel = getLogLevel(level, formattedAction, [prevState], `prevState`);
110+
const actionLevel = getLogLevel(level, formattedAction, [formattedAction], `action`);
111+
const errorLevel = getLogLevel(level, formattedAction, [error, prevState], `error`);
112+
const nextStateLevel = getLogLevel(level, formattedAction, [nextState], `nextState`);
113+
114+
if (prevStateLevel) {
115+
if (colors.prevState) logger[level](`%c prev state`, `color: ${colors.prevState(prevState)}; font-weight: bold`, prevState);
116+
else logger[level](`prev state`, prevState);
117+
}
90118

91-
if (colors.action) logger[level](`%c action`, `color: ${colors.action(formattedAction)}; font-weight: bold`, formattedAction);
92-
else logger[level](`action`, formattedAction);
119+
if (actionLevel) {
120+
if (colors.action) logger[level](`%c action`, `color: ${colors.action(formattedAction)}; font-weight: bold`, formattedAction);
121+
else logger[level](`action`, formattedAction);
122+
}
93123

94-
if (error) {
124+
if (error && errorLevel) {
95125
if (colors.error) logger[level](`%c error`, `color: ${colors.error(error, prevState)}; font-weight: bold`, error);
96126
else logger[level](`error`, error);
97127
}
98128

99-
if (colors.nextState) logger[level](`%c next state`, `color: ${colors.nextState(nextState)}; font-weight: bold`, nextState);
100-
else logger[level](`next state`, nextState);
129+
if (nextStateLevel) {
130+
if (colors.nextState) logger[level](`%c next state`, `color: ${colors.nextState(nextState)}; font-weight: bold`, nextState);
131+
else logger[level](`next state`, nextState);
132+
}
101133

102134
try {
103135
logger.groupEnd();

0 commit comments

Comments
 (0)