diff --git a/lib/rules/no-typos.js b/lib/rules/no-typos.js index 29c38b633c..8d1e8845fc 100644 --- a/lib/rules/no-typos.js +++ b/lib/rules/no-typos.js @@ -59,9 +59,15 @@ module.exports = { if (node && node.type === 'MemberExpression' && node.object.type === 'MemberExpression') { checkValidPropType(node.object.property); checkValidPropTypeQualfier(node.property); - } else if (node && node.type === 'MemberExpression' && node.object.type === 'Identifier') { + } else if (node && node.type === 'MemberExpression' && node.object.type === 'Identifier' && node.property.name !== 'isRequired') { checkValidPropType(node.property); - } else if (node && node.type === 'CallExpression') { + } else if (node && ( + node.type === 'MemberExpression' && node.object.type === 'CallExpression' || node.type === 'CallExpression' + )) { + if (node.type === 'MemberExpression') { + checkValidPropTypeQualfier(node.property); + node = node.object; + } const callee = node.callee; if (callee.type === 'MemberExpression' && callee.property.name === 'shape') { checkValidPropObject(node.arguments[0]); diff --git a/tests/lib/rules/no-typos.js b/tests/lib/rules/no-typos.js index 3a4ab31c1f..7fe2eb79ff 100644 --- a/tests/lib/rules/no-typos.js +++ b/tests/lib/rules/no-typos.js @@ -369,6 +369,17 @@ ruleTester.run('no-typos', rule, { }; `, parser: 'babel-eslint' + }, { + code: `class Component extends React.Component {}; + Component.propTypes = { + b: string.isRequired, + c: PropTypes.shape({ + d: number.isRequired, + }).isRequired + } + `, + parser: 'babel-eslint', + parserOptions: parserOptions }], invalid: [{ @@ -795,5 +806,29 @@ ruleTester.run('no-typos', rule, { }, { message: 'Typo in declared prop type: objectof' }] + }, { + code: `class Component extends React.Component {}; + Component.propTypes = { + b: string.isrequired + } + `, + parser: 'babel-eslint', + parserOptions: parserOptions, + errors: [{ + message: 'Typo in declared prop type: isrequired' + }] + }, { + code: `class Component extends React.Component {}; + Component.propTypes = { + c: shape({ + d: number, + }).isrequired + } + `, + parser: 'babel-eslint', + parserOptions: parserOptions, + errors: [{ + message: 'Typo in prop type chain qualifier: isrequired' + }] }] });