Skip to content
This repository has been archived by the owner on Aug 18, 2020. It is now read-only.

Commit

Permalink
adds `react-no-render-methods’ rule
Browse files Browse the repository at this point in the history
  • Loading branch information
cartogram committed Aug 3, 2018
1 parent c4e2c1d commit 673bfa2
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
46 changes: 46 additions & 0 deletions lib/rules/react-no-render-methods.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
const Components = require('eslint-plugin-react/lib/util/Components');

module.exports = {
meta: {
docs: {
description: 'Disallow public members within React component classes',
category: 'Best Practices',
recommended: true,
uri:
'https://github.com/Shopify/eslint-plugin-shopify/blob/master/docs/rules/react-prefer-private-members.md',
},
},

create: Components.detect((context, components, utils) => {
let isES6Component = false;

function report(node) {
const {
key: {name},
} = node;

context.report({
node,
message: `No renderX methods. '{{name}}' should be a seperate component.`,
data: {name},
});
}

return {
ClassDeclaration(node) {
isES6Component = utils.isES6Component(node);
},
MethodDefinition(node) {
if (!isES6Component || isRenderMethod(node)) {
return;
}

report(node);
},
};
}),
};

function isRenderMethod({key: {name}}) {
return !name.match(/^render[a-zA-Z0-9]+/i);
}
35 changes: 35 additions & 0 deletions tests/lib/rules/react-no-render-methods.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const {RuleTester} = require('eslint');
const rule = require('../../../lib/rules/react-no-render-methods');

const ruleTester = new RuleTester();

require('babel-eslint');

const babelParser = 'babel-eslint';

function error(memberName) {
return {
type: 'MethodDefinition',
message: `No renderX methods. '${memberName}' should be a seperate component.`,
};
}

ruleTester.run('react-no-render-methods', rule, {
valid: [
{
code: `class Button extends React.Component {
render() {}
}`,
parser: babelParser,
},
],
invalid: [
{
code: `class Button extends React.Component {
renderFoo() {}
}`,
parser: babelParser,
errors: [error('renderFoo')],
},
],
});

0 comments on commit 673bfa2

Please sign in to comment.