@agilebot/eslint-plugin 0.3.13 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.js +48 -11
- package/package.json +7 -6
package/dist/index.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license @agilebot/eslint-plugin v0.
|
2
|
+
* @license @agilebot/eslint-plugin v0.4.0
|
3
3
|
*
|
4
4
|
* Copyright (c) Agilebot, Inc. and its affiliates.
|
5
5
|
*
|
@@ -32,6 +32,9 @@ function _interopNamespaceDefault(e) {
|
|
32
32
|
var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
|
33
33
|
var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
|
34
34
|
|
35
|
+
const rule = require('eslint-plugin-deprecation/dist/rules/deprecation')["default"];
|
36
|
+
var deprecation = eslintUtils.fixupRule(rule);
|
37
|
+
|
35
38
|
var enforceMuiIconAlias = eslintUtils.createESLintRule({
|
36
39
|
meta: {
|
37
40
|
type: 'problem',
|
@@ -674,15 +677,20 @@ var noThenCatchFinally = eslintUtils.createESLintRule({
|
|
674
677
|
create(context) {
|
675
678
|
const configuration = context.options[0] || {};
|
676
679
|
const restrictedFunctions = configuration.restrictedFunctions || [];
|
677
|
-
function
|
678
|
-
return context.getScope()
|
680
|
+
const getScope = typeof context.getScope === 'function' ? () => {
|
681
|
+
return context.getScope();
|
682
|
+
} : node => {
|
683
|
+
return context.sourceCode.getScope(node);
|
684
|
+
};
|
685
|
+
function isTopLevelScoped(node) {
|
686
|
+
return getScope(node).block.type === 'Program';
|
679
687
|
}
|
680
688
|
function isThenCatchFinally(node) {
|
681
689
|
return node.property && (node.property.name === 'then' || node.property.name === 'catch' || node.property.name === 'finally');
|
682
690
|
}
|
683
691
|
return {
|
684
692
|
'CallExpression > MemberExpression.callee'(node) {
|
685
|
-
if (isTopLevelScoped()) {
|
693
|
+
if (isTopLevelScoped(node)) {
|
686
694
|
return;
|
687
695
|
}
|
688
696
|
if (!isThenCatchFinally(node)) {
|
@@ -797,6 +805,16 @@ var reactBetterExhaustiveDeps = {
|
|
797
805
|
}
|
798
806
|
context.report(problem);
|
799
807
|
}
|
808
|
+
const getSource = typeof context.getSource === 'function' ? node => {
|
809
|
+
return context.getSource(node);
|
810
|
+
} : node => {
|
811
|
+
return context.sourceCode.getText(node);
|
812
|
+
};
|
813
|
+
const getScope = typeof context.getScope === 'function' ? () => {
|
814
|
+
return context.getScope();
|
815
|
+
} : node => {
|
816
|
+
return context.sourceCode.getScope(node);
|
817
|
+
};
|
800
818
|
const scopeManager = context.getSourceCode().scopeManager;
|
801
819
|
const setStateCallSites = new WeakMap();
|
802
820
|
const stateVariables = new WeakSet();
|
@@ -1099,7 +1117,7 @@ var reactBetterExhaustiveDeps = {
|
|
1099
1117
|
staleAssignments.add(key);
|
1100
1118
|
reportProblem({
|
1101
1119
|
node: writeExpr,
|
1102
|
-
message: "Assignments to the '".concat(key, "' variable from inside React Hook ") + "".concat(
|
1120
|
+
message: "Assignments to the '".concat(key, "' variable from inside React Hook ") + "".concat(getSource(reactiveHook), " will be lost after each ") + "render. To preserve the value over time, store it in a useRef " + "Hook and keep the mutable value in the '.current' property. " + "Otherwise, you can move this variable directly inside " + "".concat(getSource(reactiveHook), ".")
|
1103
1121
|
});
|
1104
1122
|
}
|
1105
1123
|
const stableDependencies = new Set();
|
@@ -1174,7 +1192,7 @@ var reactBetterExhaustiveDeps = {
|
|
1174
1192
|
if (declaredDependenciesNode.type !== 'ArrayExpression') {
|
1175
1193
|
reportProblem({
|
1176
1194
|
node: declaredDependenciesNode,
|
1177
|
-
message: "React Hook ".concat(
|
1195
|
+
message: "React Hook ".concat(getSource(reactiveHook), " was passed a ") + 'dependency list that is not an array literal. This means we ' + "can't statically verify whether you've passed the correct " + 'dependencies.'
|
1178
1196
|
});
|
1179
1197
|
} else {
|
1180
1198
|
declaredDependenciesNode.elements.forEach(declaredDependencyNode => {
|
@@ -1184,7 +1202,7 @@ var reactBetterExhaustiveDeps = {
|
|
1184
1202
|
if (declaredDependencyNode.type === 'SpreadElement') {
|
1185
1203
|
reportProblem({
|
1186
1204
|
node: declaredDependencyNode,
|
1187
|
-
message: "React Hook ".concat(
|
1205
|
+
message: "React Hook ".concat(getSource(reactiveHook), " has a spread ") + "element in its dependency array. This means we can't " + "statically verify whether you've passed the " + 'correct dependencies.'
|
1188
1206
|
});
|
1189
1207
|
return;
|
1190
1208
|
}
|
@@ -1208,7 +1226,7 @@ var reactBetterExhaustiveDeps = {
|
|
1208
1226
|
} else {
|
1209
1227
|
reportProblem({
|
1210
1228
|
node: declaredDependencyNode,
|
1211
|
-
message: "React Hook ".concat(
|
1229
|
+
message: "React Hook ".concat(getSource(reactiveHook), " has a ") + "complex expression in the dependency array. " + 'Extract it to a separate variable so it can be statically checked.'
|
1212
1230
|
});
|
1213
1231
|
}
|
1214
1232
|
return;
|
@@ -1368,7 +1386,7 @@ var reactBetterExhaustiveDeps = {
|
|
1368
1386
|
}
|
1369
1387
|
}
|
1370
1388
|
if (isPropsOnlyUsedInMembers) {
|
1371
|
-
extraWarning = " However, 'props' will change when *any* prop changes, so the " + "preferred fix is to destructure the 'props' object outside of " + "the ".concat(reactiveHookName, " call and refer to those specific props ") + "inside ".concat(
|
1389
|
+
extraWarning = " However, 'props' will change when *any* prop changes, so the " + "preferred fix is to destructure the 'props' object outside of " + "the ".concat(reactiveHookName, " call and refer to those specific props ") + "inside ".concat(getSource(reactiveHook), ".");
|
1372
1390
|
}
|
1373
1391
|
}
|
1374
1392
|
if (!extraWarning && missingDependencies.size > 0) {
|
@@ -1474,7 +1492,7 @@ var reactBetterExhaustiveDeps = {
|
|
1474
1492
|
}
|
1475
1493
|
reportProblem({
|
1476
1494
|
node: declaredDependenciesNode,
|
1477
|
-
message: "React Hook ".concat(
|
1495
|
+
message: "React Hook ".concat(getSource(reactiveHook), " has ") + (
|
1478
1496
|
getWarningMessage(missingDependencies, 'a', 'missing', 'include') || getWarningMessage(unnecessaryDependencies, 'an', 'unnecessary', 'exclude') || getWarningMessage(duplicateDependencies, 'a', 'duplicate', 'omit')) + extraWarning,
|
1479
1497
|
suggest: [{
|
1480
1498
|
desc: "Update the dependencies array to be: [".concat(suggestedDeps.map(element => formatDependency(element)).join(', '), "]"),
|
@@ -1522,7 +1540,7 @@ var reactBetterExhaustiveDeps = {
|
|
1522
1540
|
if (declaredDependenciesNode.elements && declaredDependenciesNode.elements.some(el => el && el.type === 'Identifier' && el.name === callback.name)) {
|
1523
1541
|
return;
|
1524
1542
|
}
|
1525
|
-
const variable =
|
1543
|
+
const variable = getScope(callback).set.get(callback.name);
|
1526
1544
|
if (variable == null || variable.defs == null) {
|
1527
1545
|
return;
|
1528
1546
|
}
|
@@ -2713,6 +2731,24 @@ var varNaming = eslintUtils.createESLintRule({
|
|
2713
2731
|
name: fnName
|
2714
2732
|
});
|
2715
2733
|
}
|
2734
|
+
} else if (node.id && node.init && node.init.type === 'LogicalExpression') {
|
2735
|
+
const varName = node.id.name;
|
2736
|
+
const parts = [node.init.left, node.init.right];
|
2737
|
+
let partIsReactComponent = false;
|
2738
|
+
for (const part of parts) {
|
2739
|
+
if (['FunctionExpression', 'ArrowFunctionExpression'].includes(part.type)) {
|
2740
|
+
const isReactComponent = checkJSXElement(part.body);
|
2741
|
+
if (isReactComponent) {
|
2742
|
+
partIsReactComponent = true;
|
2743
|
+
}
|
2744
|
+
}
|
2745
|
+
}
|
2746
|
+
if (!partIsReactComponent) {
|
2747
|
+
validate('var', {
|
2748
|
+
node,
|
2749
|
+
name: varName
|
2750
|
+
});
|
2751
|
+
}
|
2716
2752
|
} else if (node.id) {
|
2717
2753
|
const varName = node.id.name;
|
2718
2754
|
for (const excludeRegex of exclude) {
|
@@ -2755,6 +2791,7 @@ var varNaming = eslintUtils.createESLintRule({
|
|
2755
2791
|
|
2756
2792
|
var ruleFiles = /*#__PURE__*/Object.freeze({
|
2757
2793
|
__proto__: null,
|
2794
|
+
rules_deprecation: deprecation,
|
2758
2795
|
rules_enforce_mui_icon_alias: enforceMuiIconAlias,
|
2759
2796
|
rules_import_monorepo: importMonorepo,
|
2760
2797
|
rules_intl_id_missing: intlIdMissing,
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@agilebot/eslint-plugin",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.4.0",
|
4
4
|
"description": "Agilebot's ESLint plugin",
|
5
5
|
"main": "dist/index.js",
|
6
6
|
"types": "dist/index.d.ts",
|
@@ -18,11 +18,12 @@
|
|
18
18
|
"node": "^18.18.0 || >=20.0.0"
|
19
19
|
},
|
20
20
|
"dependencies": {
|
21
|
+
"eslint-plugin-deprecation": "^3.0.0",
|
21
22
|
"eslint-plugin-react": "^7.35.0",
|
22
|
-
"@agilebot/eslint-utils": "0.
|
23
|
+
"@agilebot/eslint-utils": "0.4.0"
|
23
24
|
},
|
24
25
|
"peerDependencies": {
|
25
|
-
"eslint": "^7.0.0 || ^8.0.0"
|
26
|
+
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
|
26
27
|
},
|
27
28
|
"files": [
|
28
29
|
"dist"
|
@@ -31,11 +32,11 @@
|
|
31
32
|
"@types/color-name": "^1.1.4",
|
32
33
|
"@types/estree": "^1.0.5",
|
33
34
|
"color-name": "^2.0.0",
|
34
|
-
"eslint-vitest-rule-tester": "^0.
|
35
|
-
"typescript-eslint": "^
|
35
|
+
"eslint-vitest-rule-tester": "^0.6.1",
|
36
|
+
"typescript-eslint": "^8.0.0"
|
36
37
|
},
|
37
38
|
"scripts": {
|
38
39
|
"build": "rollup -c rollup.config.mjs",
|
39
|
-
"lint": "eslint src
|
40
|
+
"lint": "eslint-agilebot src"
|
40
41
|
}
|
41
42
|
}
|