@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
|
@@ -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
|
-
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
-
//
|
|
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({
|