From c107636702e042ff57d43852b374e7a3eb5f0546 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Sat, 26 Nov 2016 01:28:49 +1100 Subject: [PATCH 1/2] Add unit tests --- tests/lib/rules/prop-types.js | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tests/lib/rules/prop-types.js b/tests/lib/rules/prop-types.js index 04cbc97ee6..37147085a4 100644 --- a/tests/lib/rules/prop-types.js +++ b/tests/lib/rules/prop-types.js @@ -1385,6 +1385,19 @@ ruleTester.run('prop-types', rule, { '}' ].join('\n'), parser: 'babel-eslint' + }, { + // Flow annotations with variance + code: [ + 'type Props = {', + ' +firstname: string;', + ' -lastname: string;', + '};', + 'function Hello(props: Props): React.Element {', + ' const {firstname, lastname} = props;', + ' return
Hello {firstname} {lastname}
', + '}' + ].join('\n'), + parser: 'babel-eslint' } ], @@ -2471,6 +2484,52 @@ ruleTester.run('prop-types', rule, { line: 3, column: 29 }] + }, { + code: [ + 'type MyComponentProps = {', + ' +a: number,', + '};', + 'function MyComponent({ a, b }: MyComponentProps) {', + ' return
;', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [{ + message: '\'b\' is missing in props validation', + line: 4, + column: 27, + type: 'Property' + }] + }, { + code: [ + 'type MyComponentProps = {', + ' -a: number,', + '};', + 'function MyComponent({ a, b }: MyComponentProps) {', + ' return
;', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [{ + message: '\'b\' is missing in props validation', + line: 4, + column: 27, + type: 'Property' + }] + }, { + code: [ + 'type Props = {+name: Object;};', + 'class Hello extends React.Component {', + ' props: Props;', + ' render () {', + ' return
Hello {this.props.firstname}
;', + ' }', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [ + {message: '\'firstname\' is missing in props validation'} + ] } ] }); From 754022c6db339d636c792ae7082c54f912d9ed89 Mon Sep 17 00:00:00 2001 From: Andrew Hyndman Date: Sat, 26 Nov 2016 13:54:43 +1100 Subject: [PATCH 2/2] getKeyValue should account for variance syntax --- lib/rules/prop-types.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/rules/prop-types.js b/lib/rules/prop-types.js index cf486483b9..e64aaef39a 100644 --- a/lib/rules/prop-types.js +++ b/lib/rules/prop-types.js @@ -271,8 +271,11 @@ module.exports = { */ function getKeyValue(node) { if (node.type === 'ObjectTypeProperty') { - var tokens = context.getFirstTokens(node, 1); - return tokens[0].value; + var tokens = context.getFirstTokens(node, 2); + return (tokens[0].value === '+' || tokens[0].value === '-' + ? tokens[1].value + : tokens[0].value + ); } var key = node.key || node.argument; return key.type === 'Identifier' ? key.name : key.value;