@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 CHANGED
@@ -59,7 +59,7 @@ const no_jsx_in_hooks_1 = require("./rules/no-jsx-in-hooks");
59
59
  module.exports = {
60
60
  meta: {
61
61
  name: '@blumintinc/eslint-plugin-blumint',
62
- version: '1.5.3',
62
+ version: '1.5.4',
63
63
  },
64
64
  parseOptions: {
65
65
  ecmaVersion: 2020,
@@ -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
- // Check if function has React component type annotation
4591
- if (node.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression) {
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
- const id = parent.id;
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 if function returns JSX
4604
- const sourceCode = context.getSourceCode();
4605
- const text = sourceCode.getText(node);
4606
- return text.includes('return <') || text.includes('=> <');
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blumintinc/eslint-plugin-blumint",
3
- "version": "1.5.3",
3
+ "version": "1.5.4",
4
4
  "description": "Custom eslint rules for use within BluMint",
5
5
  "author": {
6
6
  "name": "Brodie McGuire",