@agilebot/eslint-plugin 0.3.14 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/dist/index.js +48 -11
  2. package/package.json +7 -6
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license @agilebot/eslint-plugin v0.3.14
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 isTopLevelScoped() {
678
- return context.getScope().block.type === 'Program';
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(context.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(context.getSource(reactiveHook), ".")
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(context.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.'
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(context.getSource(reactiveHook), " has a spread ") + "element in its dependency array. This means we can't " + "statically verify whether you've passed the " + 'correct dependencies.'
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(context.getSource(reactiveHook), " has a ") + "complex expression in the dependency array. " + 'Extract it to a separate variable so it can be statically checked.'
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(context.getSource(reactiveHook), ".");
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(context.getSource(reactiveHook), " has ") + (
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 = context.getScope().set.get(callback.name);
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.14",
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.3.14"
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.3.3",
35
- "typescript-eslint": "^7.16.0"
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 --fix"
40
+ "lint": "eslint-agilebot src"
40
41
  }
41
42
  }