diff --git a/lib/rules/boolean-prop-naming.js b/lib/rules/boolean-prop-naming.js index 6a2b828599..b34da42652 100644 --- a/lib/rules/boolean-prop-naming.js +++ b/lib/rules/boolean-prop-naming.js @@ -256,6 +256,18 @@ module.exports = { } } + function findTypeAnnotations(identifier, node) { + if (node.type === 'TSTypeLiteral') { + const currentNode = objectTypeAnnotations.get(identifier.name) || []; + currentNode.push(node); + objectTypeAnnotations.set(identifier.name, currentNode); + } else if (node.type === 'TSIntersectionType' || node.type === 'TSUnionType') { + node.types.forEach((type) => { + findTypeAnnotations(identifier, type); + }); + } + } + // -------------------------------------------------------------------------- // Public // -------------------------------------------------------------------------- @@ -327,17 +339,7 @@ module.exports = { }, TSTypeAliasDeclaration(node) { - if (node.typeAnnotation.type === 'TSTypeLiteral') { - objectTypeAnnotations.set(node.id.name, node.typeAnnotation); - } else if (node.typeAnnotation.type === 'TSIntersectionType') { - node.typeAnnotation.types.forEach((type) => { - if (type.type === 'TSTypeLiteral') { - const currentNode = objectTypeAnnotations.get(node.id.name) || []; - currentNode.push(type); - objectTypeAnnotations.set(node.id.name, currentNode); - } - }); - } + findTypeAnnotations(node.id, node.typeAnnotation); }, // eslint-disable-next-line object-shorthand diff --git a/tests/lib/rules/boolean-prop-naming.js b/tests/lib/rules/boolean-prop-naming.js index 5d46a63f2c..2e2be01e5d 100644 --- a/tests/lib/rules/boolean-prop-naming.js +++ b/tests/lib/rules/boolean-prop-naming.js @@ -467,6 +467,36 @@ ruleTester.run('boolean-prop-naming', rule, { features: ['types'], errors: [], }, + { + code: ` + type Props = { + isEnabled: boolean + } | { + hasLOL: boolean + } + + const HelloNew = (props: Props) => { return
}; + `, + options: [{ rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+' }], + features: ['types'], + errors: [], + }, + { + code: ` + type Props = { + isEnabled: boolean + } & ({ + hasLOL: boolean + } | { + isLOL: boolean + }) + + const HelloNew = (props: Props) => { return
}; + `, + options: [{ rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+' }], + features: ['types'], + errors: [], + }, ]), invalid: parsers.all([ @@ -1168,5 +1198,46 @@ ruleTester.run('boolean-prop-naming', rule, { }, ], }, + { + code: ` + type Props = { + enabled: boolean + } | { + hasLOL: boolean + } + + const HelloNew = (props: Props) => { return
}; + `, + options: [{ rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+' }], + features: ['types', 'no-ts-old'], + errors: [ + { + message: 'Prop name (enabled) doesn\'t match rule (^(is|has)[A-Z]([A-Za-z0-9]?)+)', + }, + ], + }, + { + code: ` + type Props = { + enabled: boolean + } & ({ + hasLOL: boolean + } | { + lol: boolean + }) + + const HelloNew = (props: Props) => { return
}; + `, + options: [{ rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+' }], + features: ['types', 'no-ts-old'], + errors: [ + { + message: 'Prop name (enabled) doesn\'t match rule (^(is|has)[A-Z]([A-Za-z0-9]?)+)', + }, + { + message: 'Prop name (lol) doesn\'t match rule (^(is|has)[A-Z]([A-Za-z0-9]?)+)', + }, + ], + }, ]), });