Skip to content

Commit 06f15ed

Browse files
iamdustanyannickcr
authored andcommitted
Add no-render-return-value rule (fixes jsx-eslint#531)
1 parent fd35cbf commit 06f15ed

File tree

3 files changed

+198
-0
lines changed

3 files changed

+198
-0
lines changed

index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module.exports = {
1414
'no-deprecated': require('./lib/rules/no-deprecated'),
1515
'no-did-mount-set-state': require('./lib/rules/no-did-mount-set-state'),
1616
'no-did-update-set-state': require('./lib/rules/no-did-update-set-state'),
17+
'no-render-return-value': require('./lib/rules/no-render-return-value'),
1718
'react-in-jsx-scope': require('./lib/rules/react-in-jsx-scope'),
1819
'jsx-uses-vars': require('./lib/rules/jsx-uses-vars'),
1920
'jsx-handler-names': require('./lib/rules/jsx-handler-names'),
@@ -67,6 +68,7 @@ module.exports = {
6768
'react/no-direct-mutation-state': 2,
6869
'react/no-is-mounted': 2,
6970
'react/no-unknown-property': 2,
71+
'react/no-render-return-value': 2,
7072
'react/prop-types': 2,
7173
'react/react-in-jsx-scope': 2
7274
}

lib/rules/no-render-return-value.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* @fileoverview Prevent usage of the return value of React.render
3+
* @author Dustan Kasten
4+
*/
5+
'use strict';
6+
7+
var versionUtil = require('../util/version');
8+
9+
// ------------------------------------------------------------------------------
10+
// Rule Definition
11+
// ------------------------------------------------------------------------------
12+
13+
module.exports = function(context) {
14+
15+
// --------------------------------------------------------------------------
16+
// Public
17+
// --------------------------------------------------------------------------
18+
19+
return {
20+
21+
CallExpression: function(node) {
22+
var callee = node.callee;
23+
var parent = node.parent;
24+
if (callee.type !== 'MemberExpression') {
25+
return;
26+
}
27+
28+
var calleeObjectName = /^ReactDOM$/;
29+
if (versionUtil.test(context, '15.0.0')) {
30+
calleeObjectName = /^ReactDOM$/;
31+
} else if (versionUtil.test(context, '0.14.0')) {
32+
calleeObjectName = /^React(DOM)?$/;
33+
} else if (versionUtil.test(context, '0.13.0')) {
34+
calleeObjectName = /^React$/;
35+
}
36+
37+
if (
38+
callee.object.type !== 'Identifier' ||
39+
!calleeObjectName.test(callee.object.name) ||
40+
callee.property.name !== 'render'
41+
) {
42+
return;
43+
}
44+
45+
if (
46+
parent.type === 'VariableDeclarator' ||
47+
parent.type === 'Property' ||
48+
parent.type === 'ReturnStatement' ||
49+
parent.type === 'ArrowFunctionExpression'
50+
) {
51+
context.report({
52+
node: callee,
53+
message: 'Do not depend on the return value from ' + callee.object.name + '.render'
54+
});
55+
}
56+
}
57+
};
58+
59+
};
60+
61+
module.exports.schema = [];
62+
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/**
2+
* @fileoverview Prevent usage of setState
3+
* @author Mark Dalgleish
4+
*/
5+
'use strict';
6+
7+
// ------------------------------------------------------------------------------
8+
// Requirements
9+
// ------------------------------------------------------------------------------
10+
11+
var rule = require('../../../lib/rules/no-render-return-value');
12+
var RuleTester = require('eslint').RuleTester;
13+
14+
var parserOptions = {
15+
ecmaVersion: 6,
16+
ecmaFeatures: {
17+
jsx: true
18+
}
19+
};
20+
21+
// ------------------------------------------------------------------------------
22+
// Tests
23+
// ------------------------------------------------------------------------------
24+
25+
var ruleTester = new RuleTester();
26+
ruleTester.run('no-render-return-value', rule, {
27+
28+
valid: [{
29+
code: [
30+
'ReactDOM.render(<div />, document.body);'
31+
].join('\n'),
32+
parserOptions: parserOptions
33+
}, {
34+
code: [
35+
'let node;',
36+
'ReactDOM.render(<div ref={ref => node = ref}/>, document.body);'
37+
].join('\n'),
38+
parserOptions: parserOptions
39+
}, {
40+
code: 'ReactDOM.render(<div ref={ref => this.node = ref}/>, document.body);',
41+
parserOptions: parserOptions,
42+
settings: {
43+
react: {
44+
version: '0.14.0'
45+
}
46+
}
47+
}, {
48+
code: 'React.render(<div ref={ref => this.node = ref}/>, document.body);',
49+
parserOptions: parserOptions,
50+
settings: {
51+
react: {
52+
version: '0.14.0'
53+
}
54+
}
55+
}, {
56+
code: 'React.render(<div ref={ref => this.node = ref}/>, document.body);',
57+
parserOptions: parserOptions,
58+
settings: {
59+
react: {
60+
version: '0.13.0'
61+
}
62+
}
63+
}
64+
],
65+
66+
invalid: [{
67+
code: [
68+
'var Hello = ReactDOM.render(<div />, document.body);'
69+
].join('\n'),
70+
parserOptions: parserOptions,
71+
errors: [{
72+
message: 'Do not depend on the return value from ReactDOM.render'
73+
}]
74+
}, {
75+
code: [
76+
'var o = {',
77+
' inst: ReactDOM.render(<div />, document.body)',
78+
'};'
79+
].join('\n'),
80+
parserOptions: parserOptions,
81+
errors: [{
82+
message: 'Do not depend on the return value from ReactDOM.render'
83+
}]
84+
}, {
85+
code: [
86+
'function render () {',
87+
' return ReactDOM.render(<div />, document.body)',
88+
'}'
89+
].join('\n'),
90+
parserOptions: parserOptions,
91+
errors: [{
92+
message: 'Do not depend on the return value from ReactDOM.render'
93+
}]
94+
}, {
95+
code: 'var render = (a, b) => ReactDOM.render(a, b)',
96+
parserOptions: parserOptions,
97+
errors: [{
98+
message: 'Do not depend on the return value from ReactDOM.render'
99+
}]
100+
}, {
101+
code: 'var inst = React.render(<div />, document.body);',
102+
parserOptions: parserOptions,
103+
settings: {
104+
react: {
105+
version: '0.14.0'
106+
}
107+
},
108+
errors: [{
109+
message: 'Do not depend on the return value from React.render'
110+
}]
111+
}, {
112+
code: 'var inst = ReactDOM.render(<div />, document.body);',
113+
parserOptions: parserOptions,
114+
settings: {
115+
react: {
116+
version: '0.14.0'
117+
}
118+
},
119+
errors: [{
120+
message: 'Do not depend on the return value from ReactDOM.render'
121+
}]
122+
}, {
123+
code: 'var inst = React.render(<div />, document.body);',
124+
parserOptions: parserOptions,
125+
settings: {
126+
react: {
127+
version: '0.13.0'
128+
}
129+
},
130+
errors: [{
131+
message: 'Do not depend on the return value from React.render'
132+
}]
133+
}]
134+
});

0 commit comments

Comments
 (0)