@agilebot/eslint-plugin 0.3.14 → 0.4.0

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.
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
  }