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: [ - '', - ' ' - ].join('\n'), - output: [ - '', - ' ', - '' - ].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 = {',