diff --git a/.eslintrc b/.eslintrc
index a221189379..4d2d2a26fb 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,6 +1,7 @@
{
"root": true,
- "extends": "airbnb-base",
+ "extends": ["airbnb-base", "plugin:eslint-plugin/recommended"],
+ "plugins": ["eslint-plugin"],
"env": {
"es6": true,
"node": true
diff --git a/lib/rules/jsx-child-element-spacing.js b/lib/rules/jsx-child-element-spacing.js
index 0d0756fef0..6c78257626 100644
--- a/lib/rules/jsx-child-element-spacing.js
+++ b/lib/rules/jsx-child-element-spacing.js
@@ -45,7 +45,7 @@ module.exports = {
recommended: false,
url: docsUrl('jsx-child-element-spacing')
},
- fixable: false,
+ fixable: null,
schema: [
{
type: 'object',
diff --git a/package.json b/package.json
index 64c0ffd72d..e88979f187 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,7 @@
"dependencies": {
"array-includes": "^3.0.3",
"doctrine": "^2.1.0",
+ "eslint-plugin-eslint-plugin": "^2.1.0",
"has": "^1.0.3",
"jsx-ast-utils": "^2.2.1",
"object.entries": "^1.1.0",
diff --git a/tests/lib/rules/default-props-match-prop-types.js b/tests/lib/rules/default-props-match-prop-types.js
index 5e244cbec7..ecd5ec24b8 100644
--- a/tests/lib/rules/default-props-match-prop-types.js
+++ b/tests/lib/rules/default-props-match-prop-types.js
@@ -252,24 +252,6 @@ ruleTester.run('default-props-match-prop-types', rule, {
'};'
].join('\n')
},
- {
- code: [
- 'class Greeting extends React.Component {',
- ' render() {',
- ' return (',
- '
Hello, {this.props.foo} {this.props.bar}
',
- ' );',
- ' }',
- '}',
- 'Greeting.propTypes = {',
- ' foo: React.PropTypes.string,',
- ' bar: React.PropTypes.string.isRequired',
- '};',
- 'Greeting.defaultProps = {',
- ' foo: "foo"',
- '};'
- ].join('\n')
- },
{
code: [
'class Greeting extends React.Component {',
@@ -513,25 +495,6 @@ ruleTester.run('default-props-match-prop-types', rule, {
'};'
].join('\n')
},
- {
- code: [
- 'class Greeting extends React.Component {',
- ' render() {',
- ' return (',
- ' Hello, {this.props.foo} {this.props.bar}
',
- ' );',
- ' }',
- '}',
- 'Greeting.propTypes = {',
- ' foo: React.PropTypes.string,',
- ' bar: React.PropTypes.string.isRequired',
- '};',
- 'Greeting.defaultProps = {',
- ' ...defaults,',
- ' bar: "bar"',
- '};'
- ].join('\n')
- },
//
// with Flow annotations
@@ -1348,25 +1311,6 @@ ruleTester.run('default-props-match-prop-types', rule, {
column: 5
}]
},
- {
- code: [
- 'function MyStatelessComponent({ foo, bar }) {',
- ' return {foo}{bar}
;',
- '}',
- 'MyStatelessComponent.propTypes = {',
- ' foo: React.PropTypes.string,',
- ' bar: React.PropTypes.string.isRequired',
- '};',
- 'MyStatelessComponent.defaultProps = {',
- ' baz: "baz"',
- '};'
- ].join('\n'),
- errors: [{
- message: 'defaultProp "baz" has no corresponding propTypes declaration.',
- line: 9,
- column: 3
- }]
- },
{
code: [
'class Greeting extends React.Component {',
diff --git a/tests/lib/rules/destructuring-assignment.js b/tests/lib/rules/destructuring-assignment.js
index 5aa5d2873b..4d44203549 100644
--- a/tests/lib/rules/destructuring-assignment.js
+++ b/tests/lib/rules/destructuring-assignment.js
@@ -95,31 +95,6 @@ ruleTester.run('destructuring-assignment', rule, {
return {foo}
;
}
};`
- }, {
- code: `const Foo = class extends React.PureComponent {
- render() {
- const { foo } = this.props;
- return {foo}
;
- }
- };`,
- options: ['always'],
- parser: parsers.BABEL_ESLINT
- }, {
- code: `const Foo = class extends React.PureComponent {
- render() {
- const { foo } = this.props;
- return {foo}
;
- }
- };`
- }, {
- code: `const Foo = class extends React.PureComponent {
- render() {
- const { foo } = this.props;
- return {foo}
;
- }
- };`,
- options: ['always'],
- parser: parsers.BABEL_ESLINT
}, {
code: `const MyComponent = (props) => {
const { h, i } = hi;
diff --git a/tests/lib/rules/jsx-curly-brace-presence.js b/tests/lib/rules/jsx-curly-brace-presence.js
index c6dce207d0..9ef668dda8 100755
--- a/tests/lib/rules/jsx-curly-brace-presence.js
+++ b/tests/lib/rules/jsx-curly-brace-presence.js
@@ -504,12 +504,6 @@ ruleTester.run('jsx-curly-brace-presence', rule, {
options: [{props: 'always'}],
errors: [{message: missingCurlyMessage}]
},
- {
- code: `foo`,
- output: `foo`,
- options: [{props: 'always'}],
- errors: [{message: missingCurlyMessage}]
- },
{
code: 'foo bar ',
output: `{"foo bar "}`,
diff --git a/tests/lib/rules/jsx-curly-spacing.js b/tests/lib/rules/jsx-curly-spacing.js
index 859ac71365..8c05314929 100644
--- a/tests/lib/rules/jsx-curly-spacing.js
+++ b/tests/lib/rules/jsx-curly-spacing.js
@@ -486,9 +486,6 @@ ruleTester.run('jsx-curly-spacing', rule, {
}, {
code: '{bar}',
options: [{attributes: {when: 'always'}}]
- }, {
- code: '{bar}',
- options: [{attributes: {when: 'always'}}]
}, {
code: [
'',
@@ -624,13 +621,6 @@ ruleTester.run('jsx-curly-spacing', rule, {
'} />;'
].join('\n'),
options: ['always']
- }, {
- code: [
- ';'
- ].join('\n'),
- options: ['always']
}, {
code: [
');'
- }, {
- code: '/*eslint no-undef:1*/ var React, App; React.render();'
}, {
code: '/*eslint no-undef:1*/ var React; React.render();'
}, {
diff --git a/tests/lib/rules/jsx-one-expression-per-line.js b/tests/lib/rules/jsx-one-expression-per-line.js
index 2778d16e42..d2a6d14ad3 100644
--- a/tests/lib/rules/jsx-one-expression-per-line.js
+++ b/tests/lib/rules/jsx-one-expression-per-line.js
@@ -522,23 +522,6 @@ ruleTester.run('jsx-one-expression-per-line', rule, {
].join('\n'),
errors: [{message: '` bar` must be placed on a new line'}],
parserOptions
- }, {
- code: [
- '',
- ' foo {"bar"}',
- '
'
- ].join('\n'),
- output: [
- '',
- ' foo ',
- '{\' \'}',
- '{"bar"}',
- '
'
- ].join('\n'),
- errors: [
- {message: '`{"bar"}` must be placed on a new line'}
- ],
- parserOptions
}, {
code: [
'',
@@ -692,20 +675,6 @@ ruleTester.run('jsx-one-expression-per-line', rule, {
].join('\n'),
errors: [{message: '`Foo` must be placed on a new line'}],
parserOptions
- }, {
- code: [
- '
',
- ' ',
- 'Foo>'
- ].join('\n'),
- output: [
- '
',
- ' ',
- 'Foo>',
- ''
- ].join('\n'),
- errors: [{message: '`Foo` must be placed on a new line'}],
- parserOptions
}, {
code: [
'
',
diff --git a/tests/lib/rules/jsx-pascal-case.js b/tests/lib/rules/jsx-pascal-case.js
index f0965730f2..a26b2361d6 100644
--- a/tests/lib/rules/jsx-pascal-case.js
+++ b/tests/lib/rules/jsx-pascal-case.js
@@ -59,8 +59,6 @@ ruleTester.run('jsx-pascal-case', rule, {
}, {
code: '',
options: [{ignore: ['IGNORED']}]
- }, {
- code: ''
}, {
code: '<$ />'
}, {
diff --git a/tests/lib/rules/jsx-wrap-multilines.js b/tests/lib/rules/jsx-wrap-multilines.js
index cdf0718689..4555388b27 100644
--- a/tests/lib/rules/jsx-wrap-multilines.js
+++ b/tests/lib/rules/jsx-wrap-multilines.js
@@ -1081,15 +1081,6 @@ ruleTester.run('jsx-wrap-multilines', rule, {
{message: PARENS_NEW_LINES},
{message: PARENS_NEW_LINES}
]
- }, {
- code: DECLARATION_TERNARY_PAREN_FRAGMENT,
- parser: parsers.BABEL_ESLINT,
- output: addNewLineSymbols(DECLARATION_TERNARY_PAREN_FRAGMENT),
- options: [{declaration: 'parens-new-line'}],
- errors: [
- {message: PARENS_NEW_LINES},
- {message: PARENS_NEW_LINES}
- ]
}, {
code: ASSIGNMENT_TERNARY_NO_PAREN,
output: addNewLineSymbols(ASSIGNMENT_TERNARY_PAREN),
diff --git a/tests/lib/rules/no-redundant-should-component-update.js b/tests/lib/rules/no-redundant-should-component-update.js
index 34c9724413..11edc2528e 100644
--- a/tests/lib/rules/no-redundant-should-component-update.js
+++ b/tests/lib/rules/no-redundant-should-component-update.js
@@ -52,16 +52,6 @@ ruleTester.run('no-redundant-should-component-update', rule, {
parser: parsers.BABEL_ESLINT,
parserOptions
},
- {
- code: `
- class Foo extends React.Component {
- shouldComponentUpdate() {
- return true;
- }
- }
- `,
- parserOptions
- },
{
code: `
function Foo() {
diff --git a/tests/lib/rules/no-typos.js b/tests/lib/rules/no-typos.js
index 0a001e304e..59a92183e3 100644
--- a/tests/lib/rules/no-typos.js
+++ b/tests/lib/rules/no-typos.js
@@ -333,19 +333,6 @@ ruleTester.run('no-typos', rule, {
`,
parser: parsers.BABEL_ESLINT,
parserOptions
- }, {
- code: `
- import PropTypes from "prop-types";
- class Component extends React.Component {};
- Component.propTypes = {
- a: PropTypes.oneOf([
- 'hello',
- 'hi'
- ])
- }
- `,
- parser: parsers.BABEL_ESLINT,
- parserOptions
}, {
code: `
import PropTypes from "prop-types";
@@ -406,21 +393,6 @@ ruleTester.run('no-typos', rule, {
}
`,
parserOptions
- }, {
- code: `
- import PropTypes from "prop-types";
- class Component extends React.Component {};
- Component.childContextTypes = {
- a: PropTypes.string,
- b: PropTypes.string.isRequired,
- c: PropTypes.shape({
- d: PropTypes.string,
- e: PropTypes.number.isRequired,
- }).isRequired
- }
- `,
- parser: parsers.BABEL_ESLINT,
- parserOptions
}, {
code: `
import PropTypes from "prop-types";
@@ -1355,23 +1327,6 @@ ruleTester.run('no-typos', rule, {
}, {
message: 'Typo in declared prop type: objectof'
}]
- }, {
- code: `
- import PropTypes from 'prop-types';
- class Component extends React.Component {};
- Component.propTypes = {
- a: PropTypes.string.isrequired,
- b: PropTypes.shape({
- c: PropTypes.number
- }).isrequired
- }
- `,
- parserOptions,
- errors: [{
- message: 'Typo in prop type chain qualifier: isrequired'
- }, {
- message: 'Typo in prop type chain qualifier: isrequired'
- }]
}, {
code: `
import PropTypes from 'prop-types';
diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js
index df76b3117e..0b32121c48 100644
--- a/tests/lib/rules/no-unused-prop-types.js
+++ b/tests/lib/rules/no-unused-prop-types.js
@@ -5025,40 +5025,6 @@ ruleTester.run('no-unused-prop-types', rule, {
errors: [{
message: '\'lastname\' PropType is defined but prop is never used'
}]
- }, {
- code: [
- 'type Person = {',
- ' ...data,',
- ' lastname: string',
- '};',
- 'class Hello extends React.Component {',
- ' props: Person;',
- ' render () {',
- ' return Hello {this.props.firstname}
;',
- ' }',
- '}'
- ].join('\n'),
- parser: parsers.BABEL_ESLINT,
- errors: [{
- message: '\'lastname\' PropType is defined but prop is never used'
- }]
- }, {
- code: [
- 'type Person = {|',
- ' ...data,',
- ' lastname: string',
- '|};',
- 'class Hello extends React.Component {',
- ' props: Person;',
- ' render () {',
- ' return Hello {this.props.firstname}
;',
- ' }',
- '}'
- ].join('\n'),
- parser: parsers.BABEL_ESLINT,
- errors: [{
- message: '\'lastname\' PropType is defined but prop is never used'
- }]
}, {
code: [
'class Hello extends React.Component {',
diff --git a/tests/lib/rules/prop-types.js b/tests/lib/rules/prop-types.js
index 7f533b4d26..b0890d8dac 100755
--- a/tests/lib/rules/prop-types.js
+++ b/tests/lib/rules/prop-types.js
@@ -1440,15 +1440,6 @@ ruleTester.run('prop-types', rule, {
'});'
].join('\n'),
options: [{skipUndeclared: true}]
- }, {
- code: [
- 'var Hello = createReactClass({',
- ' render: function() {',
- ' return {this.props.name}
;',
- ' }',
- '});'
- ].join('\n'),
- options: [{skipUndeclared: true}]
}, {
code: [
'class Hello extends React.Component {',
diff --git a/tests/lib/rules/react-in-jsx-scope.js b/tests/lib/rules/react-in-jsx-scope.js
index 4371074d48..ee94a15b5c 100644
--- a/tests/lib/rules/react-in-jsx-scope.js
+++ b/tests/lib/rules/react-in-jsx-scope.js
@@ -41,7 +41,6 @@ ruleTester.run('react-in-jsx-scope', rule, {
{code: 'var React; ;'},
{code: 'var React, App, a=1; ;'},
{code: 'var React, App, a=1; function elem() { return ; }'},
- {code: 'var React, App; ;'},
{code: '/** @jsx Foo */ var Foo, App; ;'},
{code: '/** @jsx Foo.Bar */ var Foo, App; ;'},
{
diff --git a/tests/lib/rules/require-default-props.js b/tests/lib/rules/require-default-props.js
index e537414f2c..ae1bfa2851 100644
--- a/tests/lib/rules/require-default-props.js
+++ b/tests/lib/rules/require-default-props.js
@@ -497,25 +497,6 @@ ruleTester.run('require-default-props', rule, {
'};'
].join('\n')
},
- {
- code: [
- 'class Greeting extends React.Component {',
- ' render() {',
- ' return (',
- ' Hello, {this.props.foo} {this.props.bar}
',
- ' );',
- ' }',
- '}',
- 'Greeting.propTypes = {',
- ' foo: PropTypes.string,',
- ' bar: PropTypes.string.isRequired',
- '};',
- 'Greeting.defaultProps = {',
- ' ...defaults,',
- ' bar: "bar"',
- '};'
- ].join('\n')
- },
//
// with Flow annotations
@@ -1789,23 +1770,6 @@ ruleTester.run('require-default-props', rule, {
column: 47
}]
},
- {
- code: [
- 'type Props = {',
- ' foo?: string',
- '};',
-
- 'function Hello(props: Props) {',
- ' return Hello {props.foo}
;',
- '}'
- ].join('\n'),
- parser: parsers.BABEL_ESLINT,
- errors: [{
- message: 'propType "foo" is not required, but has no corresponding defaultProps declaration.',
- line: 2,
- column: 3
- }]
- },
{
code: [
'type Props = {',