Skip to content

Commit 88d9d2d

Browse files
committed
Add prettier, refactor message
1 parent e825d5d commit 88d9d2d

File tree

7 files changed

+72
-45
lines changed

7 files changed

+72
-45
lines changed

.prettierrc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
arrowParens: avoid
2+
bracketSpacing: true
3+
jsxBracketSameLine: true
4+
printWidth: 120
5+
semi: true
6+
singleQuote: true
7+
tabWidth: 4
8+
trailingComma: es5
9+
useTabs: false

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# eslint-plugin-react-redux
2+
> Find issues with react-redux code usages
23
3-
Find issues with react-redux code usages
4+
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
45

56
## Installation
67

lib/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
* @fileoverview Find issues with react-redux code usages
33
* @author Gilad Peleg
44
*/
5-
"use strict";
5+
'use strict';
66

77
//------------------------------------------------------------------------------
88
// Requirements
99
//------------------------------------------------------------------------------
1010

11-
var requireIndex = require("requireindex");
11+
var requireIndex = require('requireindex');
1212

1313
//------------------------------------------------------------------------------
1414
// Plugin Definition
1515
//------------------------------------------------------------------------------
1616

1717
// import all rules in lib/rules
18-
module.exports.rules = requireIndex(__dirname + "/rules");
18+
module.exports.rules = requireIndex(__dirname + '/rules');

lib/rules/use-selectors-on-state.js

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,65 @@
22
* @fileoverview Enforce usage of selector functions on state in mapStateToProps
33
* @author Gilad Peleg
44
*/
5-
"use strict";
5+
'use strict';
66

77
const checkNode = (node, context) => {
88
const parents = context.getAncestors(node);
99
const isInsideMapStateToProps = parents.some(parent => {
10-
if (parent.type !== "VariableDeclarator") {
10+
if (parent.type !== 'VariableDeclarator') {
1111
return false;
1212
}
13-
if (parent.id.type !== "Identifier") {
13+
if (parent.id.type !== 'Identifier') {
1414
return false;
1515
}
16-
return parent.id.name === "mapStateToProps";
16+
return parent.id.name === 'mapStateToProps';
1717
});
1818
if (!isInsideMapStateToProps) {
19-
return;
19+
return false;
2020
}
2121

2222
context.report({
23-
message: "You should not access state directly in `mapStateToProps`. Use a selector function instead.",
24-
node: node
23+
node: node,
24+
messageId: 'nonSelector',
25+
data: {
26+
usage: context.getSourceCode().getText(node),
27+
},
2528
});
29+
30+
return true;
2631
};
2732

2833
module.exports = {
2934
meta: {
3035
docs: {
31-
description: "Enforce usage of selector functions on state in mapStateToProps",
32-
category: "Possible Errors",
33-
recommended: false
36+
description: 'Enforce usage of selector functions on state in mapStateToProps',
37+
category: 'Possible Errors',
38+
recommended: false,
39+
url: 'https://github.com/pgilad/eslint-plugin-react-redux/docs/rules/use-selectors-on-state.md',
3440
},
3541
fixable: null,
36-
schema: [
37-
// fill in your schema
38-
]
42+
schema: [],
43+
messages: {
44+
nonSelector:
45+
'You are directly accessing state by {{ usage }} in mapStateToProps. Use a selector function instead.',
46+
},
3947
},
4048
create: function(context) {
4149
return {
4250
VariableDeclarator(node) {
43-
if (node.id.type === "ObjectPattern") {
44-
if (node.init.type === "Identifier" && node.init.name === "state") {
51+
if (node.id.type === 'ObjectPattern') {
52+
if (node.init.type === 'Identifier' && node.init.name === 'state') {
4553
checkNode(node, context);
4654
}
4755
}
4856
},
4957
MemberExpression(node) {
50-
if (node.object.type === "Identifier" && node.object.name === "state") {
51-
if (node.property.type === "Identifier" || node.property.type === "Literal") {
58+
if (node.object.type === 'Identifier' && node.object.name === 'state') {
59+
if (node.property.type === 'Identifier' || node.property.type === 'Literal') {
5260
checkNode(node, context);
53-
return;
5461
}
5562
}
56-
}
63+
},
5764
};
58-
}
65+
},
5966
};

package-lock.json

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

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@
1414
"main": "lib/index.js",
1515
"repository": "pgilad/eslint-plugin-react-redux",
1616
"scripts": {
17-
"test": "mocha tests --recursive"
17+
"test": "mocha tests --recursive",
18+
"prettier": "prettier --write '**/*.js'"
1819
},
1920
"dependencies": {
2021
"requireindex": "^1.2.0"
2122
},
2223
"devDependencies": {
2324
"eslint": "^4.19.1",
24-
"mocha": "^5.0.5"
25+
"mocha": "^5.0.5",
26+
"prettier": "^1.11.1"
2527
},
2628
"engines": {
2729
"node": ">=6.0.0"

tests/lib/rules/use-selectors-on-state.js

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,34 @@
22
* @fileoverview Enforce usage of selector functions on state in mapStateToProps
33
* @author Gilad Peleg
44
*/
5-
"use strict";
5+
'use strict';
66

7-
var rule = require("../../../lib/rules/use-selectors-on-state");
8-
var RuleTester = require("eslint").RuleTester;
7+
var rule = require('../../../lib/rules/use-selectors-on-state');
8+
var RuleTester = require('eslint').RuleTester;
99

1010
const parserOptions = {
1111
ecmaVersion: 6,
1212
sourceType: 'module',
1313
ecmaFeatures: {
1414
experimentalObjectRestSpread: true,
15-
jsx: true
16-
}
15+
jsx: true,
16+
},
1717
};
1818

19-
const ruleMessage = 'You should not access state directly in `mapStateToProps`. Use a selector function instead.'
20-
2119
var ruleTester = new RuleTester({ parserOptions });
22-
ruleTester.run("use-selectors-on-state", rule, {
23-
valid: [{
24-
code: `
20+
ruleTester.run('use-selectors-on-state', rule, {
21+
valid: [
22+
{
23+
code: `
2524
const mapStateToProps = state => {
2625
const account = getAccountsEntity(state);
2726
2827
return {
2928
account,
3029
};
3130
};
32-
`
33-
},
31+
`,
32+
},
3433
{
3534
code: `
3635
const mapStateToProps = state => {
@@ -54,7 +53,7 @@ ruleTester.run("use-selectors-on-state", rule, {
5453
};
5554
};
5655
`,
57-
errors: [ { message: ruleMessage, }]
56+
errors: [{ messageId: 'nonSelector', data: { usage: 'state.appState' } }],
5857
},
5958
{
6059
code: `
@@ -66,7 +65,7 @@ ruleTester.run("use-selectors-on-state", rule, {
6665
};
6766
};
6867
`,
69-
errors: [ { message: ruleMessage, }]
68+
errors: [{ messageId: 'nonSelector', data: { usage: '{ w, s } = state' } }],
7069
},
7170
{
7271
code: `
@@ -78,7 +77,7 @@ ruleTester.run("use-selectors-on-state", rule, {
7877
};
7978
};
8079
`,
81-
errors: [ { message: ruleMessage, }]
80+
errors: [{ messageId: 'nonSelector', data: { usage: 'state.outer' } }],
8281
},
8382
{
8483
code: `
@@ -91,7 +90,10 @@ ruleTester.run("use-selectors-on-state", rule, {
9190
};
9291
};
9392
`,
94-
errors: [ { message: ruleMessage, }, { message: ruleMessage, }]
93+
errors: [
94+
{ messageId: 'nonSelector', data: { usage: "state['a']" } },
95+
{ messageId: 'nonSelector', data: { usage: 'state[d]' } },
96+
],
9597
},
9698
{
9799
code: `
@@ -103,7 +105,7 @@ ruleTester.run("use-selectors-on-state", rule, {
103105
};
104106
};
105107
`,
106-
errors: [ { message: ruleMessage, }]
108+
errors: [{ messageId: 'nonSelector', data: { usage: 'state.inner' } }],
107109
},
108-
]
110+
],
109111
});

0 commit comments

Comments
 (0)