Skip to content

Commit 92c2f83

Browse files
author
Eugene Rodionov
committed
feat: colors! (#91, #92, #94); chore: clean up everything; feat: new example!
1 parent 4253d61 commit 92c2f83

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+547
-721
lines changed

.babelrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"stage": 0
2+
"presets": ["es2015", "react", "stage-0"]
33
}

.eslintignore

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
webpack.*
21
dist
32
lib
4-
example/webpack.*
5-
example/dist
3+
example/build

.eslintrc

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,3 @@
11
{
2-
"extends": "airbnb/base",
3-
"env": {
4-
"browser": true,
5-
"mocha": true,
6-
"node": true
7-
},
8-
"rules": {
9-
"id-length": [2, { "exceptions": ["e"] }],
10-
"valid-jsdoc": 2,
11-
"no-else-return": 0,
12-
"no-extend-native": 0,
13-
"no-console": 0,
14-
"quotes": [2, "backtick"],
15-
"jsx-quotes": 2,
16-
"new-cap": 0,
17-
}
2+
"extends": "@dtrussia/eslint-config-dtrussia/react"
183
}

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
.DS_Store
22
node_modules
33
npm-debug.log
4-
examples/*/dist/*
4+
example/build
5+
dist
6+
lib

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
language: node_js
22
node_js:
3-
- "4.1.1"
3+
- "5.1.0"
44
script: npm run test

README.md

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Logger for redux
22
[![Build Status](https://travis-ci.org/fcomb/redux-logger.svg?branch=master)](https://travis-ci.org/fcomb/redux-logger)
33

4-
![logger](http://i.imgur.com/qhcz1OD.png)
4+
![redux-logger](http://i.imgur.com/LDgv4tp.png)
55

66
## Install
77
`npm i --save redux-logger`
@@ -32,49 +32,54 @@ Level of `console`. `warn`, `error`, `info` or [else](https://developer.mozilla.
3232

3333
*Default: `log`*
3434

35+
#### __duration (Boolean)__
36+
Print duration of each action?
37+
38+
*Default: `false`*
39+
40+
#### __timestamp (Boolean)__
41+
Print timestamp with each action?
42+
43+
*Default: `true`*
44+
45+
#### __colors (Object)__
46+
Object with 3 functions: `prevState`, `action`, `nextState`. Useful if you want paint message based on specific state or action. It also can be `false` if you want show plain message without colors.
47+
48+
* `prevState(prevState: Object) => color: String`
49+
* `action(action: Object) => color: String`
50+
* `nextState(nextState: Object) => color: String`
51+
3552
#### __logger (Object)__
3653
Implementation of the `console` API. Useful if you are using a custom, wrapped version of `console`.
3754

3855
*Default: `window.console`*
3956

40-
#### __collapsed (getState: Function, action: Object): boolean__
57+
#### __collapsed = (getState: Function, action: Object) => Boolean__
4158
Takes a boolean or optionally a function that receives `getState` function for accessing current store state and `action` object as parameters. Returns `true` if the log group should be collapsed, `false` otherwise.
4259

4360
*Default: `false`*
4461

45-
#### __predicate (getState: Function, action: Object): boolean__
62+
#### __predicate = (getState: Function, action: Object) => Boolean__
4663
If specified this function will be called before each action is processed with this middleware.
4764
Receives `getState` function for accessing current store state and `action` object as parameters. Returns `true` if action should be logged, `false` otherwise.
4865

4966
*Default: `null` (always log)*
5067

51-
#### __duration (Boolean)__
52-
Print duration of each action?
53-
54-
*Default: `false`*
55-
56-
#### __timestamp (Boolean)__
57-
Print timestamp with each action?
58-
59-
*Default: `true`*
60-
61-
#### __transformer (Function)__
68+
#### __stateTransformer = (state: Object) => state__
6269
Transform state before print. Eg. convert Immutable object to plain JSON.
6370

6471
*Default: identity function*
6572

66-
#### __actionTransformer (Function)__
73+
#### __actionTransformer = (action: Function) => action__
6774
Transform action before print. Eg. convert Immutable object to plain JSON.
6875

6976
*Default: identity function*
7077

7178
### Examples:
7279
#### log only in dev mode
7380
```javascript
74-
const __DEV__ = true;
75-
7681
createLogger({
77-
predicate: (getState, action) => __DEV__
82+
predicate: (getState, action) => process.env.NODE_ENV === `development`
7883
});
7984
```
8085

@@ -102,15 +107,17 @@ createLogger({
102107
#### transform Immutable objects into JSON
103108
```javascript
104109
createLogger({
105-
transformer: (state) => {
106-
var newState = {};
110+
stateTransformer: (state) => {
111+
let newState = {};
112+
107113
for (var i of Object.keys(state)) {
108114
if (Immutable.Iterable.isIterable(state[i])) {
109115
newState[i] = state[i].toJS();
110116
} else {
111117
newState[i] = state[i];
112118
}
113119
};
120+
114121
return newState;
115122
}
116123
});

dist/index.js

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ return /******/ (function(modules) { // webpackBootstrap
7373
var pad = function pad(num, maxLength) {
7474
return repeat("0", maxLength - num.toString().length) + num;
7575
};
76+
var formatTime = function formatTime(time) {
77+
return " @ " + pad(time.getHours(), 2) + ":" + pad(time.getMinutes(), 2) + ":" + pad(time.getSeconds(), 2) + "." + pad(time.getMilliseconds(), 3);
78+
};
7679

7780
// Use the new performance api to get better precision if available
7881
var timer = typeof performance !== "undefined" && typeof performance.now === "function" ? performance : Date;
@@ -83,12 +86,13 @@ return /******/ (function(modules) { // webpackBootstrap
8386
* @namespace
8487
* @property {object} options - options for logger
8588
* @property {string} options.level - console[level]
86-
* @property {object} options.logger - implementation of the `console` API.
87-
* @property {boolean} options.collapsed - is group collapsed?
88-
* @property {boolean} options.predicate - condition which resolves logger behavior
8989
* @property {bool} options.duration - print duration of each action?
9090
* @property {bool} options.timestamp - print timestamp with each action?
91-
* @property {function} options.transformer - transform state before print
91+
* @property {object} options.colors - custom colors
92+
* @property {object} options.logger - implementation of the `console` API
93+
* @property {boolean} options.collapsed - is group collapsed?
94+
* @property {boolean} options.predicate - condition which resolves logger behavior
95+
* @property {function} options.stateTransformer - transform state before print
9296
* @property {function} options.actionTransformer - transform action before print
9397
*/
9498

@@ -99,27 +103,42 @@ return /******/ (function(modules) { // webpackBootstrap
99103
var getState = _ref.getState;
100104
return function (next) {
101105
return function (action) {
102-
var level = options.level;
103-
var logger = options.logger;
106+
var _options$level = options.level;
107+
var level = _options$level === undefined ? "log" : _options$level;
108+
var _options$logger = options.logger;
109+
var logger = _options$logger === undefined ? window.console : _options$logger;
104110
var collapsed = options.collapsed;
105111
var predicate = options.predicate;
106112
var _options$duration = options.duration;
107113
var duration = _options$duration === undefined ? false : _options$duration;
108114
var _options$timestamp = options.timestamp;
109115
var timestamp = _options$timestamp === undefined ? true : _options$timestamp;
110-
var _options$transformer = options.transformer;
111-
var transformer = _options$transformer === undefined ? function (state) {
116+
var transformer = options.transformer;
117+
var _options$stateTransfo = options.stateTransformer;
118+
var // deprecated
119+
stateTransformer = _options$stateTransfo === undefined ? function (state) {
112120
return state;
113-
} : _options$transformer;
114-
var _options$actionTransformer = options.actionTransformer;
115-
var actionTransformer = _options$actionTransformer === undefined ? function (actn) {
121+
} : _options$stateTransfo;
122+
var _options$actionTransf = options.actionTransformer;
123+
var actionTransformer = _options$actionTransf === undefined ? function (actn) {
116124
return actn;
117-
} : _options$actionTransformer;
118-
119-
var console = logger || window.console;
125+
} : _options$actionTransf;
126+
var _options$colors = options.colors;
127+
var colors = _options$colors === undefined ? {
128+
prevState: function prevState() {
129+
return "#9E9E9E";
130+
},
131+
action: function action() {
132+
return "#03A9F4";
133+
},
134+
nextState: function nextState() {
135+
return "#4CAF50";
136+
}
137+
} : _options$colors;
120138

121139
// exit if console undefined
122-
if (typeof console === "undefined") {
140+
141+
if (typeof logger === "undefined") {
123142
return next(action);
124143
}
125144

@@ -128,55 +147,59 @@ return /******/ (function(modules) { // webpackBootstrap
128147
return next(action);
129148
}
130149

150+
if (transformer) {
151+
console.error("Option 'transformer' is deprecated, use stateTransformer instead");
152+
}
153+
131154
var started = timer.now();
132-
var prevState = transformer(getState());
155+
var prevState = stateTransformer(getState());
133156

134-
var returnValue = next(action);
135-
var took = timer.now() - started;
157+
var formattedAction = actionTransformer(action);
136158

137-
var nextState = transformer(getState());
159+
var took = timer.now() - started;
160+
var nextState = stateTransformer(getState());
138161

139-
// formatters
162+
// message
140163
var time = new Date();
141164
var isCollapsed = typeof collapsed === "function" ? collapsed(getState, action) : collapsed;
142165

143-
var formattedTime = timestamp ? " @ " + pad(time.getHours(), 2) + ":" + pad(time.getMinutes(), 2) + ":" + pad(time.getSeconds(), 2) + "." + pad(time.getMilliseconds(), 3) : "";
144-
var formattedDuration = duration ? " in " + took.toFixed(2) + " ms" : "";
145-
var formattedAction = actionTransformer(action);
146-
var message = "action " + formattedAction.type + formattedTime + formattedDuration;
147-
var startMessage = isCollapsed ? console.groupCollapsed : console.group;
166+
var formattedTime = formatTime(time);
167+
var title = "action " + formattedAction.type + (timestamp && formattedTime) + (duration && " in " + took.toFixed(2) + " ms");
148168

149169
// render
150170
try {
151-
startMessage.call(console, message);
171+
if (isCollapsed) {
172+
logger.groupCollapsed(title);
173+
} else {
174+
logger.group(title);
175+
}
152176
} catch (e) {
153-
console.log(message);
177+
logger.log(title);
154178
}
155179

156-
if (level) {
157-
console[level]("%c prev state", "color: #9E9E9E; font-weight: bold", prevState);
158-
console[level]("%c action", "color: #03A9F4; font-weight: bold", formattedAction);
159-
console[level]("%c next state", "color: #4CAF50; font-weight: bold", nextState);
180+
if (colors) {
181+
logger[level]("%c prev state", "color: " + colors.prevState(prevState) + "; font-weight: bold", prevState);
182+
logger[level]("%c action", "color: " + colors.action(formattedAction) + "; font-weight: bold", formattedAction);
183+
logger[level]("%c next state", "color: " + colors.nextState(nextState) + "; font-weight: bold", nextState);
160184
} else {
161-
console.log("%c prev state", "color: #9E9E9E; font-weight: bold", prevState);
162-
console.log("%c action", "color: #03A9F4; font-weight: bold", formattedAction);
163-
console.log("%c next state", "color: #4CAF50; font-weight: bold", nextState);
185+
logger[level]("prev state", prevState);
186+
logger[level]("action", formattedAction);
187+
logger[level]("next state", nextState);
164188
}
165189

166190
try {
167-
console.groupEnd();
191+
logger.groupEnd();
168192
} catch (e) {
169-
console.log("—— log end ——");
193+
logger.log("—— log end ——");
170194
}
171195

172-
return returnValue;
196+
return next(action);
173197
};
174198
};
175199
};
176200
}
177201

178-
exports["default"] = createLogger;
179-
module.exports = exports["default"];
202+
exports.default = createLogger;
180203

181204
/***/ }
182205
/******/ ])

dist/index.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/package.json

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"name": "redux-logger-example-basic",
3+
"version": "1.0.0",
4+
"description": "Basic example of redux-logger",
5+
"main": "src/index.js",
6+
"author": "",
7+
"license": "MIT",
8+
"scripts": {
9+
"start": "NODE_ENV=development $(npm bin)/babel-node webpack.server.dev.js",
10+
"build": "NODE_ENV=production $(npm bin)/webpack -p --config webpack.build.prod.js",
11+
"publish": "gh-pages -d examples/dist",
12+
"deploy": "npm run build && npm run publish"
13+
},
14+
"devDependencies": {
15+
"@dtrussia/eslint-config-dtrussia": "1.0.3",
16+
"babel-cli": "6.3.13",
17+
"babel-core": "6.3.13",
18+
"babel-loader": "6.2.0",
19+
"babel-preset-es2015": "6.3.13",
20+
"babel-preset-react": "6.3.13",
21+
"babel-preset-stage-0": "6.3.13",
22+
"css-loader": "0.23.0",
23+
"express": "4.13.3",
24+
"extract-text-webpack-plugin": "0.9.1",
25+
"html-webpack-plugin": "1.7.0",
26+
"postcss-loader": "0.8.0",
27+
"style-loader": "0.13.0",
28+
"webpack": "1.12.9",
29+
"webpack-dev-middleware": "1.4.0",
30+
"webpack-hot-middleware": "2.6.0"
31+
},
32+
"dependencies": {
33+
"@react-ui/core": "0.0.25",
34+
"@react-ui/theme-default": "0.0.17",
35+
"normalize.css": "3.0.3",
36+
"react": "0.14.3",
37+
"react-dom": "0.14.3",
38+
"react-redux": "4.0.0",
39+
"redux": "3.0.4",
40+
"redux-actions": "0.8.0",
41+
"uuid": "2.0.1"
42+
}
43+
}
File renamed without changes.

0 commit comments

Comments
 (0)