@blumintinc/eslint-plugin-blumint 1.5.2 → 1.5.3

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.2',
62
+ version: '1.5.3',
63
63
  },
64
64
  parseOptions: {
65
65
  ecmaVersion: 2020,
@@ -137,15 +137,16 @@ exports.enforceExportedFunctionTypes = (0, createRule_1.createRule)({
137
137
  function isTypeExported(typeName) {
138
138
  const sourceCode = context.getSourceCode();
139
139
  const program = sourceCode.ast;
140
- // Check for imported types
141
- const importedTypes = program.body.filter((node) => {
140
+ // Check for imported types first - if found, return true immediately
141
+ // since imported types are already available to consumers
142
+ const hasImportedType = program.body.some((node) => {
142
143
  if (node.type === utils_1.AST_NODE_TYPES.ImportDeclaration) {
143
144
  return node.specifiers.some((specifier) => specifier.type === utils_1.AST_NODE_TYPES.ImportSpecifier &&
144
145
  specifier.local.name === typeName);
145
146
  }
146
147
  return false;
147
148
  });
148
- if (importedTypes.length > 0) {
149
+ if (hasImportedType) {
149
150
  return true;
150
151
  }
151
152
  // Check for exported type declarations
@@ -4581,12 +4581,25 @@ exports.enforceVerbNounNaming = (0, createRule_1.createRule)({
4581
4581
  }
4582
4582
  return isVerb;
4583
4583
  }
4584
- function isJsxReturnFunction(node) {
4584
+ function isReactComponent(node) {
4585
4585
  if (node.type !== utils_1.AST_NODE_TYPES.FunctionDeclaration &&
4586
4586
  node.type !== utils_1.AST_NODE_TYPES.ArrowFunctionExpression &&
4587
4587
  node.type !== utils_1.AST_NODE_TYPES.FunctionExpression) {
4588
4588
  return false;
4589
4589
  }
4590
+ // Check if function has React component type annotation
4591
+ if (node.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression) {
4592
+ 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
+ }
4601
+ }
4602
+ }
4590
4603
  // Check if function returns JSX
4591
4604
  const sourceCode = context.getSourceCode();
4592
4605
  const text = sourceCode.getText(node);
@@ -4596,7 +4609,7 @@ exports.enforceVerbNounNaming = (0, createRule_1.createRule)({
4596
4609
  FunctionDeclaration(node) {
4597
4610
  if (!node.id)
4598
4611
  return;
4599
- if (isJsxReturnFunction(node)) {
4612
+ if (isReactComponent(node)) {
4600
4613
  return;
4601
4614
  }
4602
4615
  if (!isVerbPhrase(node.id.name)) {
@@ -4612,7 +4625,7 @@ exports.enforceVerbNounNaming = (0, createRule_1.createRule)({
4612
4625
  // Only check if it's a function
4613
4626
  if (node.init?.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
4614
4627
  node.init?.type === utils_1.AST_NODE_TYPES.FunctionExpression) {
4615
- if (isJsxReturnFunction(node.init)) {
4628
+ if (isReactComponent(node.init)) {
4616
4629
  return;
4617
4630
  }
4618
4631
  if (!isVerbPhrase(node.id.name)) {
@@ -89,6 +89,18 @@ function getObjectUsagesInHook(hookBody, objectName) {
89
89
  }
90
90
  });
91
91
  }
92
+ else if (node.type === utils_1.AST_NODE_TYPES.JSXElement || node.type === utils_1.AST_NODE_TYPES.JSXFragment) {
93
+ // If we find a JSX element, check its attributes for spread operator
94
+ if (node.type === utils_1.AST_NODE_TYPES.JSXElement) {
95
+ node.openingElement.attributes.forEach((attr) => {
96
+ if (attr.type === utils_1.AST_NODE_TYPES.JSXSpreadAttribute &&
97
+ attr.argument.type === utils_1.AST_NODE_TYPES.Identifier &&
98
+ attr.argument.name === objectName) {
99
+ needsEntireObject = true;
100
+ }
101
+ });
102
+ }
103
+ }
92
104
  else if (node.type === utils_1.AST_NODE_TYPES.SpreadElement) {
93
105
  // If we find a spread operator with our target object, consider it as accessing all properties
94
106
  if (node.argument.type === utils_1.AST_NODE_TYPES.Identifier &&
@@ -48,6 +48,9 @@ exports.preferSettingsObject = (0, createRule_1.createRule)({
48
48
  create(context, [options]) {
49
49
  const finalOptions = { ...defaultOptions, ...options };
50
50
  function getParameterType(param) {
51
+ if (param.type === utils_1.AST_NODE_TYPES.AssignmentPattern) {
52
+ return getParameterType(param.left);
53
+ }
51
54
  if (param.type === utils_1.AST_NODE_TYPES.Identifier && param.typeAnnotation) {
52
55
  const typeNode = param.typeAnnotation.typeAnnotation;
53
56
  if (typeNode.type === utils_1.AST_NODE_TYPES.TSTypeReference) {
@@ -55,6 +58,12 @@ exports.preferSettingsObject = (0, createRule_1.createRule)({
55
58
  ? typeNode.typeName.name
56
59
  : 'unknown';
57
60
  }
61
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSStringKeyword)
62
+ return 'string';
63
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSNumberKeyword)
64
+ return 'number';
65
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSBooleanKeyword)
66
+ return 'boolean';
58
67
  return typeNode.type;
59
68
  }
60
69
  return 'unknown';
@@ -95,7 +104,7 @@ exports.preferSettingsObject = (0, createRule_1.createRule)({
95
104
  if (shouldIgnoreNode(node))
96
105
  return;
97
106
  const params = node.params;
98
- // Check for too many parameters
107
+ // Check for too many parameters first
99
108
  const minParams = finalOptions.minimumParameters !== undefined
100
109
  ? finalOptions.minimumParameters
101
110
  : defaultOptions.minimumParameters;
@@ -107,7 +116,7 @@ exports.preferSettingsObject = (0, createRule_1.createRule)({
107
116
  });
108
117
  return;
109
118
  }
110
- // Check for same type parameters if enabled
119
+ // Then check for same type parameters if enabled
111
120
  if (finalOptions.checkSameTypeParameters && params.length >= 2) {
112
121
  if (hasSameTypeParameters(params)) {
113
122
  context.report({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blumintinc/eslint-plugin-blumint",
3
- "version": "1.5.2",
3
+ "version": "1.5.3",
4
4
  "description": "Custom eslint rules for use within BluMint",
5
5
  "author": {
6
6
  "name": "Brodie McGuire",