;',
errors: [{ messageId: 'inlineElement' }],
@@ -101,5 +102,5 @@ ruleTester.run('no-adjacent-inline-elements', rule, {
errors: [{ messageId: 'inlineElement' }],
parserOptions,
},
- ],
+ ]),
});
diff --git a/tests/lib/rules/no-array-index-key.js b/tests/lib/rules/no-array-index-key.js
index b1e85fa15d..c6317a1ff4 100644
--- a/tests/lib/rules/no-array-index-key.js
+++ b/tests/lib/rules/no-array-index-key.js
@@ -27,7 +27,7 @@ const parserOptions = {
const ruleTester = new RuleTester({ parserOptions });
ruleTester.run('no-array-index-key', rule, {
- valid: [].concat(
+ valid: parsers.all(
{ code: ';' },
{ code: ';' },
{ code: ';' },
@@ -92,29 +92,16 @@ ruleTester.run('no-array-index-key', rule, {
})
`,
},
- parsers.ES2020(
- {
- code: 'foo?.map(child => )',
- parserOptions: {
- ecmaVersion: 2020,
- },
- },
- {
- code: 'foo?.map(child => )',
- parser: parsers.BABEL_ESLINT,
- },
- {
- code: 'foo?.map(child => )',
- parser: parsers.TYPESCRIPT_ESLINT,
+ {
+ code: 'foo?.map(child => )',
+ features: ['optional chaining'],
+ parserOptions: {
+ ecmaVersion: 2020,
},
- {
- code: 'foo?.map(child => )',
- parser: parsers['@TYPESCRIPT_ESLINT'],
- }
- )
+ }
),
- invalid: [].concat(
+ invalid: parsers.all([].concat(
{
code: 'foo.map((bar, i) => )',
errors: [{ messageId: 'noArrayIndex' }],
@@ -257,29 +244,13 @@ ruleTester.run('no-array-index-key', rule, {
`,
errors: [{ messageId: 'noArrayIndex' }],
},
- parsers.ES2020(
- {
- code: 'foo?.map((child, i) => )',
- errors: [{ messageId: 'noArrayIndex' }],
- parserOptions: {
- ecmaVersion: 2020,
- },
- },
- {
- code: 'foo?.map((child, i) => )',
- errors: [{ messageId: 'noArrayIndex' }],
- parser: parsers.BABEL_ESLINT,
- },
- {
- code: 'foo?.map((child, i) => )',
- errors: [{ messageId: 'noArrayIndex' }],
- parser: parsers.TYPESCRIPT_ESLINT,
+ {
+ code: 'foo?.map((child, i) => )',
+ errors: [{ messageId: 'noArrayIndex' }],
+ features: ['optional chaining'],
+ parserOptions: {
+ ecmaVersion: 2020,
},
- {
- code: 'foo?.map((child, i) => )',
- errors: [{ messageId: 'noArrayIndex' }],
- parser: parsers['@TYPESCRIPT_ESLINT'],
- }
- )
- ),
+ }
+ )),
});
diff --git a/tests/lib/rules/no-arrow-function-lifecycle.js b/tests/lib/rules/no-arrow-function-lifecycle.js
index 283e54b5d5..850d59d4ab 100644
--- a/tests/lib/rules/no-arrow-function-lifecycle.js
+++ b/tests/lib/rules/no-arrow-function-lifecycle.js
@@ -24,7 +24,7 @@ const parserOptions = {
const ruleTester = new RuleTester({ parserOptions });
ruleTester.run('no-arrow-function-lifecycle', rule, {
- valid: [
+ valid: parsers.all([
{
code: `
var Hello = createReactClass({
@@ -167,7 +167,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -177,7 +177,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -187,7 +187,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -197,7 +197,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -207,7 +207,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -217,7 +217,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -227,7 +227,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -237,7 +237,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -247,7 +247,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -257,7 +257,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -267,7 +267,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -277,7 +277,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -287,7 +287,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -297,7 +297,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -307,7 +307,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -317,7 +317,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -327,7 +327,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -338,7 +338,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render() { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
},
{
code: `
@@ -348,20 +348,17 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
});
`,
},
- ].concat(
- parsers.TS([
- {
- code: `
- class MyComponent extends React.Component {
- onChange: () => void;
- }
- `,
- parser: parsers['@TYPESCRIPT_ESLINT'],
- },
- ])
- ),
+ {
+ code: `
+ class MyComponent extends React.Component {
+ onChange: () => void;
+ }
+ `,
+ features: ['types'],
+ },
+ ]),
- invalid: [
+ invalid: parsers.all([
{
code: `
var Hello = createReactClass({
@@ -607,7 +604,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' }],
output: `
class Hello extends React.Component {
@@ -624,7 +621,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'getDefaultProps is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -645,7 +642,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'getInitialState is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -666,7 +663,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'getChildContext is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -687,7 +684,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'getDerivedStateFromProps is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -708,7 +705,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentWillMount is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -729,7 +726,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'UNSAFE_componentWillMount is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -750,7 +747,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentDidMount is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -771,7 +768,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentWillReceiveProps is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -792,7 +789,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'UNSAFE_componentWillReceiveProps is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -813,7 +810,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'shouldComponentUpdate is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -834,7 +831,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentWillUpdate is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -855,7 +852,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'UNSAFE_componentWillUpdate is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -876,7 +873,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'getSnapshotBeforeUpdate is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -897,7 +894,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentDidUpdate is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -918,7 +915,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentDidCatch is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -939,7 +936,7 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
render = () => { return ; }
}
`,
- parser: parsers.BABEL_ESLINT,
+ features: ['class fields'],
errors: [
{ message: 'componentWillUnmount is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
{ message: 'render is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.' },
@@ -952,5 +949,5 @@ ruleTester.run('no-arrow-function-lifecycle', rule, {
}
`,
},
- ],
+ ]),
});
diff --git a/tests/lib/rules/no-children-prop.js b/tests/lib/rules/no-children-prop.js
index 4e80807417..93f0f4cf42 100644
--- a/tests/lib/rules/no-children-prop.js
+++ b/tests/lib/rules/no-children-prop.js
@@ -12,6 +12,8 @@
const RuleTester = require('eslint').RuleTester;
const rule = require('../../../lib/rules/no-children-prop');
+const parsers = require('../../helpers/parsers');
+
const parserOptions = {
ecmaVersion: 2018,
sourceType: 'module',
@@ -26,7 +28,7 @@ const parserOptions = {
const ruleTester = new RuleTester({ parserOptions });
ruleTester.run('no-children-prop', rule, {
- valid: [
+ valid: parsers.all([
{
code: ';',
},
@@ -170,8 +172,8 @@ ruleTester.run('no-children-prop', rule, {
code: 'React.createElement(MyComponent, {children: function* () {}});',
options: [{ allowFunctions: true }],
},
- ],
- invalid: [
+ ]),
+ invalid: parsers.all([
{
code: ';', // not a valid use case but make sure we don't crash
errors: [{ messageId: 'nestChildren' }],
@@ -272,5 +274,5 @@ ruleTester.run('no-children-prop', rule, {
options: [{ allowFunctions: true }],
errors: [{ messageId: 'passFunctionAsArgs' }],
},
- ],
+ ]),
});
diff --git a/tests/lib/rules/no-danger-with-children.js b/tests/lib/rules/no-danger-with-children.js
index 37a0a5ed31..b25397e0c6 100644
--- a/tests/lib/rules/no-danger-with-children.js
+++ b/tests/lib/rules/no-danger-with-children.js
@@ -12,6 +12,8 @@
const RuleTester = require('eslint').RuleTester;
const rule = require('../../../lib/rules/no-danger-with-children');
+const parsers = require('../../helpers/parsers');
+
const parserOptions = {
ecmaVersion: 2018,
sourceType: 'module',
@@ -26,7 +28,7 @@ const parserOptions = {
const ruleTester = new RuleTester({ parserOptions });
ruleTester.run('no-danger-with-children', rule, {
- valid: [
+ valid: parsers.all([
{
code: '
;
- }
- }
- `,
- parser: parsers.BABEL_ESLINT,
- errors: [
- { message: '\'unused\' PropType is defined but prop is never used' },
- ],
- },
- {
- code: `
- import PropTypes from 'prop-types';
- import React from 'react';
-
- const MyComponent= (props) => {
- switch (props.usedProp) {
- case 1:
- return ();
- default:
- return ;
- }
- };
-
- MyComponent.propTypes = {
- usedProp: PropTypes.string,
- unUsedProp: PropTypes.string,
- };
-
- export default MyComponent;
- `,
- errors: [{ message: '\'unUsedProp\' PropType is defined but prop is never used' }],
- },
- parsers.TS([
- {
- code: `
- const Foo = (props) => {
- const { foo } = props as unknown;
- (props as unknown).bar as unknown;
-
- return <>>;
- };
-
- Foo.propTypes = {
- fooUnused,
- barUnused,
- };
- `,
- parser: parsers.TYPESCRIPT_ESLINT,
- errors: [
- { message: '\'fooUnused\' PropType is defined but prop is never used' },
- { message: '\'barUnused\' PropType is defined but prop is never used' },
- ],
- },
- {
- code: `
- const Foo = (props) => {
- const { foo } = props as unknown;
- (props as unknown).bar as unknown;
-
- return <>>;
- };
-
- Foo.propTypes = {
- fooUnused,
- barUnused,
- };
- `,
- parser: parsers['@TYPESCRIPT_ESLINT'],
- errors: [
- { message: '\'fooUnused\' PropType is defined but prop is never used' },
- { message: '\'barUnused\' PropType is defined but prop is never used' },
- ],
- },
- {
- code: `
- class Foo extends React.Component {
- static propTypes = {
- prevPropUnused,
- nextPropUnused,
- setStatePropUnused,
- thisPropsAliasDestructPropUnused,
- thisPropsAliasPropUnused,
- thisDestructPropsAliasDestructPropUnused,
- thisDestructPropsAliasPropUnused,
- thisDestructPropsDestructPropUnused,
- thisPropsDestructPropUnused,
- thisPropsPropUnused,
- };
-
- componentDidUpdate(prevProps) {
- (prevProps as unknown).prevProp as unknown;
- }
-
- shouldComponentUpdate(nextProps) {
- (nextProps as unknown).nextProp as unknown;
- }
-
- stateProps() {
- ((this as unknown).setState as unknown)((_, props) => (props as unknown).setStateProp as unknown);
- }
-
- thisPropsAlias() {
- const props = (this as unknown).props as unknown;
-
- const { thisPropsAliasDestructProp } = props as unknown;
- (props as unknown).thisPropsAliasProp as unknown;
- }
-
- thisDestructPropsAlias() {
- const { props } = this as unknown;
-
- const { thisDestructPropsAliasDestructProp } = props as unknown;
- (props as unknown).thisDestructPropsAliasProp as unknown;
- }
-
- render() {
- const { props: { thisDestructPropsDestructProp } } = this as unknown;
- const { thisPropsDestructProp } = (this as unknown).props as unknown;
- ((this as unknown).props as unknown).thisPropsProp as unknown;
-
- return null;
- }
- }
- `,
- parser: parsers.TYPESCRIPT_ESLINT,
- errors: [
- { message: '\'prevPropUnused\' PropType is defined but prop is never used' },
- { message: '\'nextPropUnused\' PropType is defined but prop is never used' },
- { message: '\'setStatePropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsAliasDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsAliasPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisDestructPropsAliasDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisDestructPropsAliasPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisDestructPropsDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsPropUnused\' PropType is defined but prop is never used' },
- ],
- },
- {
- code: `
- class Foo extends React.Component {
- static propTypes = {
- prevPropUnused,
- nextPropUnused,
- setStatePropUnused,
- thisPropsAliasDestructPropUnused,
- thisPropsAliasPropUnused,
- thisDestructPropsAliasDestructPropUnused,
- thisDestructPropsAliasPropUnused,
- thisDestructPropsDestructPropUnused,
- thisPropsDestructPropUnused,
- thisPropsPropUnused,
- };
-
- componentDidUpdate(prevProps) {
- (prevProps as unknown).prevProp as unknown;
- }
-
- shouldComponentUpdate(nextProps) {
- (nextProps as unknown).nextProp as unknown;
- }
-
- stateProps() {
- ((this as unknown).setState as unknown)((_, props) => (props as unknown).setStateProp as unknown);
- }
-
- thisPropsAlias() {
- const props = (this as unknown).props as unknown;
-
- const { thisPropsAliasDestructProp } = props as unknown;
- (props as unknown).thisPropsAliasProp as unknown;
- }
-
- thisDestructPropsAlias() {
- const { props } = this as unknown;
-
- const { thisDestructPropsAliasDestructProp } = props as unknown;
- (props as unknown).thisDestructPropsAliasProp as unknown;
- }
-
- render() {
- const { props: { thisDestructPropsDestructProp } } = this as unknown;
- const { thisPropsDestructProp } = (this as unknown).props as unknown;
- ((this as unknown).props as unknown).thisPropsProp as unknown;
-
- return null;
- }
- }
- `,
- parser: parsers['@TYPESCRIPT_ESLINT'],
- errors: [
- { message: '\'prevPropUnused\' PropType is defined but prop is never used' },
- { message: '\'nextPropUnused\' PropType is defined but prop is never used' },
- { message: '\'setStatePropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsAliasDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsAliasPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisDestructPropsAliasDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisDestructPropsAliasPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisDestructPropsDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsDestructPropUnused\' PropType is defined but prop is never used' },
- { message: '\'thisPropsPropUnused\' PropType is defined but prop is never used' },
- ],
- },
- ]),
+ }
+ `,
+ features: ['flow'],
+ errors: [{ message: '\'lastname\' PropType is defined but prop is never used' }],
+ },
{
code: `
type Person = {
+ ...$Exact,
lastname: string
};
- const Hello = (props: Person) => {
- return