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..9b449f0ae3 100644
--- a/tests/lib/rules/default-props-match-prop-types.js
+++ b/tests/lib/rules/default-props-match-prop-types.js
@@ -268,7 +268,8 @@ ruleTester.run('default-props-match-prop-types', rule, {
'Greeting.defaultProps = {',
' foo: "foo"',
'};'
- ].join('\n')
+ ].join('\n'),
+ parser: parsers.BABEL_ESLINT
},
{
code: [
@@ -530,7 +531,8 @@ ruleTester.run('default-props-match-prop-types', rule, {
' ...defaults,',
' bar: "bar"',
'};'
- ].join('\n')
+ ].join('\n'),
+ parser: parsers.BABEL_ESLINT
},
//
@@ -845,6 +847,26 @@ ruleTester.run('default-props-match-prop-types', rule, {
column: 3
}]
},
+ {
+ 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
+ }],
+ parser: parsers.BABEL_ESLINT
+ },
{
code: [
'function MyStatelessComponent({ foo, bar }) {',
@@ -1348,25 +1370,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..b8eaefe620 100644
--- a/tests/lib/rules/destructuring-assignment.js
+++ b/tests/lib/rules/destructuring-assignment.js
@@ -21,15 +21,6 @@ const parserOptions = {
const ruleTester = new RuleTester({parserOptions});
ruleTester.run('destructuring-assignment', rule, {
valid: [{
- code: `const Foo = class extends React.PureComponent {
- render() {
- const { foo } = this.props;
- return {foo}
;
- }
- };`,
- options: ['always'],
- parser: parsers.BABEL_ESLINT
- }, {
code: `const MyComponent = ({ id, className }) => (
);`
@@ -102,15 +93,16 @@ ruleTester.run('destructuring-assignment', rule, {
return {foo}
;
}
};`,
- options: ['always'],
- parser: parsers.BABEL_ESLINT
+ options: ['always']
}, {
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() {
@@ -119,7 +111,7 @@ ruleTester.run('destructuring-assignment', rule, {
}
};`,
options: ['always'],
- parser: parsers.BABEL_ESLINT
+ parser: parsers.TYPESCRIPT_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..1e137a6c8e 100755
--- a/tests/lib/rules/jsx-curly-brace-presence.js
+++ b/tests/lib/rules/jsx-curly-brace-presence.js
@@ -508,7 +508,8 @@ ruleTester.run('jsx-curly-brace-presence', rule, {
code: `foo`,
output: `foo`,
options: [{props: 'always'}],
- errors: [{message: missingCurlyMessage}]
+ errors: [{message: missingCurlyMessage}],
+ parser: parsers.BABEL_ESLINT
},
{
code: 'foo bar ',
diff --git a/tests/lib/rules/jsx-curly-spacing.js b/tests/lib/rules/jsx-curly-spacing.js
index 859ac71365..4a38804354 100644
--- a/tests/lib/rules/jsx-curly-spacing.js
+++ b/tests/lib/rules/jsx-curly-spacing.js
@@ -405,7 +405,8 @@ ruleTester.run('jsx-curly-spacing', rule, {
'...bar',
'} />;'
].join('\n'),
- options: [{attributes: {when: 'never'}}]
+ options: [{attributes: {when: 'never'}}],
+ parser: parsers.BABEL_ESLINT
}, {
code: [
'{bar}',
options: [{attributes: {when: 'always'}}]
- }, {
- code: '{bar}',
- options: [{attributes: {when: 'always'}}]
}, {
code: [
'',
@@ -630,7 +628,8 @@ ruleTester.run('jsx-curly-spacing', rule, {
'...bar',
'} />;'
].join('\n'),
- options: ['always']
+ options: ['always'],
+ parser: parsers.BABEL_ESLINT
}, {
code: [
');'
}, {
- code: '/*eslint no-undef:1*/ var React, App; React.render();'
+ code: '/*eslint no-undef:1*/ var React, App; React.render();',
+ parser: parsers.BABEL_ESLINT
}, {
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..92c3e93898 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: [
'',
@@ -705,7 +688,8 @@ ruleTester.run('jsx-one-expression-per-line', rule, {
''
].join('\n'),
errors: [{message: '`Foo` must be placed on a new line'}],
- parserOptions
+ parserOptions,
+ parser: parsers.BABEL_ESLINT
}, {
code: [
'
',
diff --git a/tests/lib/rules/jsx-pascal-case.js b/tests/lib/rules/jsx-pascal-case.js
index f0965730f2..f15c9b633d 100644
--- a/tests/lib/rules/jsx-pascal-case.js
+++ b/tests/lib/rules/jsx-pascal-case.js
@@ -12,6 +12,8 @@
const RuleTester = require('eslint').RuleTester;
const rule = require('../../../lib/rules/jsx-pascal-case');
+const parsers = require('../../helpers/parsers');
+
const parserOptions = {
ecmaVersion: 2018,
sourceType: 'module',
@@ -46,6 +48,9 @@ ruleTester.run('jsx-pascal-case', rule, {
code: ''
}, {
code: ''
+ }, {
+ code: '',
+ parser: parsers.BABEL_ESLINT
}, {
code: '',
options: [{allowAllCaps: true}]
@@ -59,8 +64,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..ff43136f2b 100644
--- a/tests/lib/rules/jsx-wrap-multilines.js
+++ b/tests/lib/rules/jsx-wrap-multilines.js
@@ -1083,7 +1083,7 @@ ruleTester.run('jsx-wrap-multilines', rule, {
]
}, {
code: DECLARATION_TERNARY_PAREN_FRAGMENT,
- parser: parsers.BABEL_ESLINT,
+ parser: parsers.TYPESCRIPT_ESLINT,
output: addNewLineSymbols(DECLARATION_TERNARY_PAREN_FRAGMENT),
options: [{declaration: 'parens-new-line'}],
errors: [
diff --git a/tests/lib/rules/no-redundant-should-component-update.js b/tests/lib/rules/no-redundant-should-component-update.js
index 34c9724413..de3a37518b 100644
--- a/tests/lib/rules/no-redundant-should-component-update.js
+++ b/tests/lib/rules/no-redundant-should-component-update.js
@@ -44,22 +44,23 @@ ruleTester.run('no-redundant-should-component-update', rule, {
{
code: `
class Foo extends React.Component {
- shouldComponentUpdate = () => {
+ shouldComponentUpdate() {
return true;
}
}
`,
- parser: parsers.BABEL_ESLINT,
- parserOptions
+ parserOptions,
+ parser: parsers.BABEL_ESLINT
},
{
code: `
class Foo extends React.Component {
- shouldComponentUpdate() {
+ shouldComponentUpdate = () => {
return true;
}
}
`,
+ parser: parsers.BABEL_ESLINT,
parserOptions
},
{
diff --git a/tests/lib/rules/no-typos.js b/tests/lib/rules/no-typos.js
index 0a001e304e..24e982fd08 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";
@@ -1366,6 +1338,7 @@ ruleTester.run('no-typos', rule, {
}).isrequired
}
`,
+ parser: parsers.BABEL_ESLINT,
parserOptions,
errors: [{
message: 'Typo in prop type chain qualifier: isrequired'
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..b55fd6e0db 100755
--- a/tests/lib/rules/prop-types.js
+++ b/tests/lib/rules/prop-types.js
@@ -1448,7 +1448,8 @@ ruleTester.run('prop-types', rule, {
' }',
'});'
].join('\n'),
- options: [{skipUndeclared: true}]
+ options: [{skipUndeclared: true}],
+ parser: parsers.BABEL_ESLINT
}, {
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..47f206ddf3 100644
--- a/tests/lib/rules/react-in-jsx-scope.js
+++ b/tests/lib/rules/react-in-jsx-scope.js
@@ -41,7 +41,10 @@ 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: 'var React, App; ;',
+ parser: parsers.BABEL_ESLINT
+ },
{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..c691961ed7 100644
--- a/tests/lib/rules/require-default-props.js
+++ b/tests/lib/rules/require-default-props.js
@@ -514,7 +514,8 @@ ruleTester.run('require-default-props', rule, {
' ...defaults,',
' bar: "bar"',
'};'
- ].join('\n')
+ ].join('\n'),
+ parser: parsers.BABEL_ESLINT
},
//
@@ -1789,23 +1790,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 = {',