@blumintinc/eslint-plugin-blumint 1.5.3 → 1.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +1 -1
- package/lib/rules/enforce-verb-noun-naming.js +62 -14
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -4581,29 +4581,77 @@ exports.enforceVerbNounNaming = (0, createRule_1.createRule)({
|
|
|
4581
4581
|
}
|
|
4582
4582
|
return isVerb;
|
|
4583
4583
|
}
|
|
4584
|
+
function isPascalCase(name) {
|
|
4585
|
+
return /^[A-Z][a-zA-Z0-9]*$/.test(name);
|
|
4586
|
+
}
|
|
4587
|
+
function hasPropsParameter(node) {
|
|
4588
|
+
if (!node.params.length)
|
|
4589
|
+
return false;
|
|
4590
|
+
const firstParam = node.params[0];
|
|
4591
|
+
if (firstParam.type === utils_1.AST_NODE_TYPES.ObjectPattern) {
|
|
4592
|
+
return true; // Destructured props
|
|
4593
|
+
}
|
|
4594
|
+
if (firstParam.type === utils_1.AST_NODE_TYPES.Identifier) {
|
|
4595
|
+
const paramName = firstParam.name.toLowerCase();
|
|
4596
|
+
return paramName === 'props';
|
|
4597
|
+
}
|
|
4598
|
+
return false;
|
|
4599
|
+
}
|
|
4600
|
+
function hasJsxReturn(node) {
|
|
4601
|
+
const sourceCode = context.getSourceCode();
|
|
4602
|
+
const text = sourceCode.getText(node);
|
|
4603
|
+
// Check for direct JSX returns
|
|
4604
|
+
if (text.includes('return <') || text.includes('=> <')) {
|
|
4605
|
+
return true;
|
|
4606
|
+
}
|
|
4607
|
+
// Check for JSX assigned to variables then returned
|
|
4608
|
+
if (text.includes('const ') && text.includes('<') && text.includes('return')) {
|
|
4609
|
+
return true;
|
|
4610
|
+
}
|
|
4611
|
+
return false;
|
|
4612
|
+
}
|
|
4584
4613
|
function isReactComponent(node) {
|
|
4585
4614
|
if (node.type !== utils_1.AST_NODE_TYPES.FunctionDeclaration &&
|
|
4586
4615
|
node.type !== utils_1.AST_NODE_TYPES.ArrowFunctionExpression &&
|
|
4587
4616
|
node.type !== utils_1.AST_NODE_TYPES.FunctionExpression) {
|
|
4588
4617
|
return false;
|
|
4589
4618
|
}
|
|
4590
|
-
//
|
|
4591
|
-
|
|
4619
|
+
// Get the function name
|
|
4620
|
+
let functionName = '';
|
|
4621
|
+
if (node.type === utils_1.AST_NODE_TYPES.FunctionDeclaration && node.id) {
|
|
4622
|
+
functionName = node.id.name;
|
|
4623
|
+
}
|
|
4624
|
+
else if (node.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression || node.type === utils_1.AST_NODE_TYPES.FunctionExpression) {
|
|
4592
4625
|
const parent = node.parent;
|
|
4593
|
-
if (parent?.type === utils_1.AST_NODE_TYPES.VariableDeclarator) {
|
|
4594
|
-
|
|
4595
|
-
if (id.type === utils_1.AST_NODE_TYPES.Identifier && id.typeAnnotation?.type === utils_1.AST_NODE_TYPES.TSTypeAnnotation) {
|
|
4596
|
-
const typeText = context.getSourceCode().getText(id.typeAnnotation.typeAnnotation);
|
|
4597
|
-
if (typeText.includes('React.') || typeText.includes('FC') || typeText.includes('FunctionComponent')) {
|
|
4598
|
-
return true;
|
|
4599
|
-
}
|
|
4600
|
-
}
|
|
4626
|
+
if (parent?.type === utils_1.AST_NODE_TYPES.VariableDeclarator && parent.id.type === utils_1.AST_NODE_TYPES.Identifier) {
|
|
4627
|
+
functionName = parent.id.name;
|
|
4601
4628
|
}
|
|
4602
4629
|
}
|
|
4603
|
-
// Check
|
|
4604
|
-
const
|
|
4605
|
-
|
|
4606
|
-
|
|
4630
|
+
// Check for React component indicators
|
|
4631
|
+
const indicators = [
|
|
4632
|
+
// 1. PascalCase naming
|
|
4633
|
+
functionName && isPascalCase(functionName),
|
|
4634
|
+
// 2. Props parameter
|
|
4635
|
+
hasPropsParameter(node),
|
|
4636
|
+
// 3. JSX return
|
|
4637
|
+
hasJsxReturn(node),
|
|
4638
|
+
// 4. React type annotations
|
|
4639
|
+
(() => {
|
|
4640
|
+
if (node.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression) {
|
|
4641
|
+
const parent = node.parent;
|
|
4642
|
+
if (parent?.type === utils_1.AST_NODE_TYPES.VariableDeclarator) {
|
|
4643
|
+
const id = parent.id;
|
|
4644
|
+
if (id.type === utils_1.AST_NODE_TYPES.Identifier && id.typeAnnotation?.type === utils_1.AST_NODE_TYPES.TSTypeAnnotation) {
|
|
4645
|
+
const typeText = context.getSourceCode().getText(id.typeAnnotation.typeAnnotation);
|
|
4646
|
+
return typeText.includes('React.') || typeText.includes('FC') || typeText.includes('FunctionComponent');
|
|
4647
|
+
}
|
|
4648
|
+
}
|
|
4649
|
+
}
|
|
4650
|
+
return false;
|
|
4651
|
+
})()
|
|
4652
|
+
];
|
|
4653
|
+
// Consider it a React component if it matches at least 2 indicators
|
|
4654
|
+
return indicators.filter(Boolean).length >= 2;
|
|
4607
4655
|
}
|
|
4608
4656
|
return {
|
|
4609
4657
|
FunctionDeclaration(node) {
|