Skip to content

Commit

Permalink
Also handle cases where we declare propTypes outside of the class
Browse files Browse the repository at this point in the history
  • Loading branch information
Joachim Seminck committed Jun 28, 2017
1 parent 01d4338 commit 394b4d5
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 12 deletions.
28 changes: 17 additions & 11 deletions lib/rules/no-static-typos.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@ module.exports = {

create: Components.detect(function(context, components, utils) {

function reportError(node) {
context.report({
node: node,
message: 'Typo in static class property declaration'
function reportErrorIfCasingTypo(node, propertyName) {
STATIC_CLASS_PROPERTIES.forEach(function(CLASS_PROP) {
if (CLASS_PROP.toLowerCase() === propertyName.toLowerCase() && CLASS_PROP !== propertyName) {
context.report({
node: node,
message: 'Typo in static class property declaration'
});
}
});
}

Expand All @@ -37,15 +41,17 @@ module.exports = {
}

var tokens = context.getFirstTokens(node, 2);

var propertyName = tokens[1].value;
var propertyNameLowerCase = propertyName.toLowerCase();
reportErrorIfCasingTypo(node, propertyName);
},

STATIC_CLASS_PROPERTIES.forEach(function(CLASS_PROP) {
if (CLASS_PROP.toLowerCase() === propertyNameLowerCase && CLASS_PROP !== propertyName) {
reportError(node);
}
});
MemberExpression: function(node) {
const relatedComponent = utils.getRelatedComponent(node);

if (relatedComponent && utils.isES6Component(relatedComponent.node)) {
var propertyName = node.property.name;
reportErrorIfCasingTypo(node, propertyName);
}
}
};
})
Expand Down
98 changes: 97 additions & 1 deletion tests/lib/rules/no-static-typos.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ var rule = require('../../../lib/rules/no-static-typos');
var RuleTester = require('eslint').RuleTester;

var parserOptions = {
ecmaVersion: 6
ecmaVersion: 6,
ecmaFeatures: {
jsx: true
}
};

// -----------------------------------------------------------------------------
Expand All @@ -34,6 +37,16 @@ ruleTester.run('no-static-typos', rule, {
].join('\n'),
parser: 'babel-eslint',
parserOptions: parserOptions
},
{
code: [
'class First {}',
'First.PropTypes = {key: "myValue"};',
'First.ContextTypes = {key: "myValue"};',
'First.ChildContextTypes = {key: "myValue"};',
'First.DefaultProps = {key: "myValue"};'
].join('\n'),
parserOptions: parserOptions
}, {
code: [
'class First extends React.Component {',
Expand All @@ -45,6 +58,15 @@ ruleTester.run('no-static-typos', rule, {
].join('\n'),
parser: 'babel-eslint',
parserOptions: parserOptions
}, {
code: [
'class First extends React.Component {}',
'First.propTypes = {key: "myValue"};',
'First.contextTypes = {key: "myValue"};',
'First.childContextTypes = {key: "myValue"};',
'First.defaultProps = {key: "myValue"};'
].join('\n'),
parserOptions: parserOptions
}, {
code: [
'class MyClass {',
Expand Down Expand Up @@ -100,6 +122,24 @@ ruleTester.run('no-static-typos', rule, {
].join('\n'),
parser: 'babel-eslint',
parserOptions: parserOptions
}, {
code: [
'class MyClass {}',
'MyClass.prototype.PropTypes = function() {};',
'MyClass.prototype.ContextTypes = function() {};',
'MyClass.prototype.ChildContextTypes = function() {};',
'MyClass.prototype.DefaultProps = function() {};'
].join('\n'),
parserOptions: parserOptions
}, {
code: [
'class MyClass {}',
'MyClass.PropTypes = function() {};',
'MyClass.ContextTypes = function() {};',
'MyClass.ChildContextTypes = function() {};',
'MyClass.DefaultProps = function() {};'
].join('\n'),
parserOptions: parserOptions
}],

invalid: [{
Expand All @@ -111,6 +151,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.PropTypes = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -120,6 +167,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.proptypes = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -129,6 +183,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.ContextTypes = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -138,6 +199,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.contexttypes = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -147,6 +215,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.ChildContextTypes = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -156,6 +231,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.childcontexttypes = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -165,6 +247,13 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.DefaultProps = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {',
Expand All @@ -174,5 +263,12 @@ ruleTester.run('no-static-typos', rule, {
parser: 'babel-eslint',
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}, {
code: [
'class Component extends React.Component {}',
'Component.defaultprops = {}'
].join('\n'),
parserOptions: parserOptions,
errors: [{message: ERROR_MESSAGE}]
}]
});

0 comments on commit 394b4d5

Please sign in to comment.