@@ -812,6 +812,23 @@ ruleTester.run('no-unused-prop-types', rule, {
812812 '}'
813813 ] . join ( '\n' ) ,
814814 parser : 'babel-eslint'
815+ } , {
816+ code : [
817+ 'import type {BasePerson} from \'./types\'' ,
818+ 'type Props = {' ,
819+ ' person: {' ,
820+ ' ...$Exact<BasePerson>,' ,
821+ ' lastname: string' ,
822+ ' }' ,
823+ '};' ,
824+ 'class Hello extends React.Component {' ,
825+ ' props: Props;' ,
826+ ' render () {' ,
827+ ' return <div>Hello {this.props.person.firstname}</div>;' ,
828+ ' }' ,
829+ '}'
830+ ] . join ( '\n' ) ,
831+ parser : 'babel-eslint'
815832 } , {
816833 code : [
817834 'type Props = {name: Object;};' ,
@@ -1801,34 +1818,6 @@ ruleTester.run('no-unused-prop-types', rule, {
18011818 ' bar: PropTypes.bool' ,
18021819 '};'
18031820 ] . join ( '\n' )
1804- } , {
1805- code : [
1806- 'type Person = {' ,
1807- ' ...data,' ,
1808- ' lastname: string' ,
1809- '};' ,
1810- 'class Hello extends React.Component {' ,
1811- ' props: Person;' ,
1812- ' render () {' ,
1813- ' return <div>Hello {this.props.firstname}</div>;' ,
1814- ' }' ,
1815- '}'
1816- ] . join ( '\n' ) ,
1817- parser : 'babel-eslint'
1818- } , {
1819- code : [
1820- 'type Person = {|' ,
1821- ' ...data,' ,
1822- ' lastname: string' ,
1823- '|};' ,
1824- 'class Hello extends React.Component {' ,
1825- ' props: Person;' ,
1826- ' render () {' ,
1827- ' return <div>Hello {this.props.firstname}</div>;' ,
1828- ' }' ,
1829- '}'
1830- ] . join ( '\n' ) ,
1831- parser : 'babel-eslint'
18321821 } , {
18331822 // The next two test cases are related to: https://github.com/yannickcr/eslint-plugin-react/issues/1183
18341823 code : [
@@ -2470,6 +2459,20 @@ ruleTester.run('no-unused-prop-types', rule, {
24702459 '}'
24712460 ] . join ( '\n' ) ,
24722461 parser : 'babel-eslint'
2462+ } , {
2463+ code : [
2464+ 'const foo = {};' ,
2465+ 'class Hello extends React.Component {' ,
2466+ ' render() {' ,
2467+ ' const {firstname, lastname} = this.props.name;' ,
2468+ ' return <div>{firstname} {lastname}</div>;' ,
2469+ ' }' ,
2470+ '}' ,
2471+ 'Hello.propTypes = {' ,
2472+ ' name: PropTypes.shape(foo)' ,
2473+ '};'
2474+ ] . join ( '\n' ) ,
2475+ parser : 'babel-eslint'
24732476 } , {
24742477 // issue #933
24752478 code : [
@@ -4475,6 +4478,48 @@ ruleTester.run('no-unused-prop-types', rule, {
44754478 errors : [ {
44764479 message : '\'lastname\' PropType is defined but prop is never used'
44774480 } ]
4481+ } , {
4482+ code : `
4483+ type Person = string;
4484+ class Hello extends React.Component<{ person: Person }> {
4485+ render () {
4486+ return <div />;
4487+ }
4488+ }
4489+ ` ,
4490+ settings : { react : { flowVersion : '0.53' } } ,
4491+ errors : [ {
4492+ message : '\'person\' PropType is defined but prop is never used'
4493+ } ] ,
4494+ parser : 'babel-eslint'
4495+ } , {
4496+ code : `
4497+ type Person = string;
4498+ class Hello extends React.Component<void, { person: Person }, void> {
4499+ render () {
4500+ return <div />;
4501+ }
4502+ }
4503+ ` ,
4504+ settings : { react : { flowVersion : '0.52' } } ,
4505+ errors : [ {
4506+ message : '\'person\' PropType is defined but prop is never used'
4507+ } ] ,
4508+ parser : 'babel-eslint'
4509+ } , {
4510+ code : `
4511+ function higherOrderComponent<P: { foo: string }>() {
4512+ return class extends React.Component<P> {
4513+ render() {
4514+ return <div />;
4515+ }
4516+ }
4517+ }
4518+ ` ,
4519+ errors : [ {
4520+ message : '\'foo\' PropType is defined but prop is never used'
4521+ } ] ,
4522+ parser : 'babel-eslint'
44784523 } , {
44794524 // issue #1506
44804525 code : [
@@ -4665,6 +4710,142 @@ ruleTester.run('no-unused-prop-types', rule, {
46654710 } , {
46664711 message : '\'a.b.c\' PropType is defined but prop is never used'
46674712 } ]
4713+ } , {
4714+ code : `
4715+ type Props = { foo: string }
4716+ function higherOrderComponent<Props>() {
4717+ return class extends React.Component<Props> {
4718+ render() {
4719+ return <div />;
4720+ }
4721+ }
4722+ }
4723+ ` ,
4724+ parser : 'babel-eslint' ,
4725+ errors : [ {
4726+ message : '\'foo\' PropType is defined but prop is never used'
4727+ } ]
4728+ } , {
4729+ code : [
4730+ 'type Person = {' ,
4731+ ' ...data,' ,
4732+ ' lastname: string' ,
4733+ '};' ,
4734+ 'class Hello extends React.Component {' ,
4735+ ' props: Person;' ,
4736+ ' render () {' ,
4737+ ' return <div>Hello {this.props.firstname}</div>;' ,
4738+ ' }' ,
4739+ '}'
4740+ ] . join ( '\n' ) ,
4741+ parser : 'babel-eslint' ,
4742+ errors : [ {
4743+ message : '\'lastname\' PropType is defined but prop is never used'
4744+ } ]
4745+ } , {
4746+ code : [
4747+ 'type Person = {|' ,
4748+ ' ...data,' ,
4749+ ' lastname: string' ,
4750+ '|};' ,
4751+ 'class Hello extends React.Component {' ,
4752+ ' props: Person;' ,
4753+ ' render () {' ,
4754+ ' return <div>Hello {this.props.firstname}</div>;' ,
4755+ ' }' ,
4756+ '}'
4757+ ] . join ( '\n' ) ,
4758+ parser : 'babel-eslint' ,
4759+ errors : [ {
4760+ message : '\'lastname\' PropType is defined but prop is never used'
4761+ } ]
4762+ } , {
4763+ code : [
4764+ 'type Person = {' ,
4765+ ' ...$Exact<data>,' ,
4766+ ' lastname: string' ,
4767+ '};' ,
4768+ 'class Hello extends React.Component {' ,
4769+ ' props: Person;' ,
4770+ ' render () {' ,
4771+ ' return <div>Hello {this.props.firstname}</div>;' ,
4772+ ' }' ,
4773+ '}'
4774+ ] . join ( '\n' ) ,
4775+ parser : 'babel-eslint' ,
4776+ errors : [ {
4777+ message : '\'lastname\' PropType is defined but prop is never used'
4778+ } ]
4779+ } , {
4780+ code : [
4781+ 'import type {Data} from \'./Data\'' ,
4782+ 'type Person = {' ,
4783+ ' ...Data,' ,
4784+ ' lastname: string' ,
4785+ '};' ,
4786+ 'class Hello extends React.Component {' ,
4787+ ' props: Person;' ,
4788+ ' render () {' ,
4789+ ' return <div>Hello {this.props.bar}</div>;' ,
4790+ ' }' ,
4791+ '}'
4792+ ] . join ( '\n' ) ,
4793+ parser : 'babel-eslint' ,
4794+ errors : [ {
4795+ message : '\'lastname\' PropType is defined but prop is never used'
4796+ } ]
4797+ } , {
4798+ code : [
4799+ 'import type {Data} from \'some-libdef-like-flow-typed-provides\'' ,
4800+ 'type Person = {' ,
4801+ ' ...Data,' ,
4802+ ' lastname: string' ,
4803+ '};' ,
4804+ 'class Hello extends React.Component {' ,
4805+ ' props: Person;' ,
4806+ ' render () {' ,
4807+ ' return <div>Hello {this.props.bar}</div>;' ,
4808+ ' }' ,
4809+ '}'
4810+ ] . join ( '\n' ) ,
4811+ parser : 'babel-eslint' ,
4812+ errors : [ {
4813+ message : '\'lastname\' PropType is defined but prop is never used'
4814+ } ]
4815+ } , {
4816+ code : [
4817+ 'type Person = {' ,
4818+ ' ...data,' ,
4819+ ' lastname: string' ,
4820+ '};' ,
4821+ 'class Hello extends React.Component {' ,
4822+ ' props: Person;' ,
4823+ ' render () {' ,
4824+ ' return <div>Hello {this.props.firstname}</div>;' ,
4825+ ' }' ,
4826+ '}'
4827+ ] . join ( '\n' ) ,
4828+ parser : 'babel-eslint' ,
4829+ errors : [ {
4830+ message : '\'lastname\' PropType is defined but prop is never used'
4831+ } ]
4832+ } , {
4833+ code : [
4834+ 'type Person = {|' ,
4835+ ' ...data,' ,
4836+ ' lastname: string' ,
4837+ '|};' ,
4838+ 'class Hello extends React.Component {' ,
4839+ ' props: Person;' ,
4840+ ' render () {' ,
4841+ ' return <div>Hello {this.props.firstname}</div>;' ,
4842+ ' }' ,
4843+ '}'
4844+ ] . join ( '\n' ) ,
4845+ parser : 'babel-eslint' ,
4846+ errors : [ {
4847+ message : '\'lastname\' PropType is defined but prop is never used'
4848+ } ]
46684849 }
46694850
46704851 /* , {
0 commit comments