@checkdigit/eslint-plugin 6.6.0-PR.75-3c91 → 6.6.0-PR.75-0fc6

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.
@@ -12549,7 +12549,7 @@
12549
12549
  "format": "esm"
12550
12550
  },
12551
12551
  "src/agent/no-unused-function-argument.ts": {
12552
- "bytes": 2957,
12552
+ "bytes": 3290,
12553
12553
  "imports": [
12554
12554
  {
12555
12555
  "path": "node_modules/@typescript-eslint/utils/dist/index.js",
@@ -12569,6 +12569,32 @@
12569
12569
  ],
12570
12570
  "format": "esm"
12571
12571
  },
12572
+ "src/agent/no-unused-service-variable.ts": {
12573
+ "bytes": 3080,
12574
+ "imports": [
12575
+ {
12576
+ "path": "node_modules/@typescript-eslint/utils/dist/index.js",
12577
+ "kind": "import-statement",
12578
+ "original": "@typescript-eslint/utils"
12579
+ },
12580
+ {
12581
+ "path": "node:assert",
12582
+ "kind": "import-statement",
12583
+ "external": true
12584
+ },
12585
+ {
12586
+ "path": "src/get-documentation-url.ts",
12587
+ "kind": "import-statement",
12588
+ "original": "../get-documentation-url"
12589
+ },
12590
+ {
12591
+ "path": "src/library/ts-tree.ts",
12592
+ "kind": "import-statement",
12593
+ "original": "../library/ts-tree"
12594
+ }
12595
+ ],
12596
+ "format": "esm"
12597
+ },
12572
12598
  "src/require-fixed-services-import.ts": {
12573
12599
  "bytes": 1467,
12574
12600
  "imports": [
@@ -12683,7 +12709,7 @@
12683
12709
  "format": "esm"
12684
12710
  },
12685
12711
  "src/index.ts": {
12686
- "bytes": 6677,
12712
+ "bytes": 6998,
12687
12713
  "imports": [
12688
12714
  {
12689
12715
  "path": "src/agent/add-url-domain.ts",
@@ -12750,6 +12776,11 @@
12750
12776
  "kind": "import-statement",
12751
12777
  "original": "./agent/no-unused-function-argument"
12752
12778
  },
12779
+ {
12780
+ "path": "src/agent/no-unused-service-variable.ts",
12781
+ "kind": "import-statement",
12782
+ "original": "./agent/no-unused-service-variable"
12783
+ },
12753
12784
  {
12754
12785
  "path": "src/require-fixed-services-import.ts",
12755
12786
  "kind": "import-statement",
@@ -13357,6 +13388,11 @@
13357
13388
  "kind": "require-call",
13358
13389
  "external": true
13359
13390
  },
13391
+ {
13392
+ "path": "node:assert",
13393
+ "kind": "require-call",
13394
+ "external": true
13395
+ },
13360
13396
  {
13361
13397
  "path": "node:assert",
13362
13398
  "kind": "require-call",
@@ -15614,7 +15650,7 @@
15614
15650
  "bytesInOutput": 2219
15615
15651
  },
15616
15652
  "src/index.ts": {
15617
- "bytesInOutput": 3993
15653
+ "bytesInOutput": 4137
15618
15654
  },
15619
15655
  "src/agent/url.ts": {
15620
15656
  "bytesInOutput": 745
@@ -15680,13 +15716,16 @@
15680
15716
  "bytesInOutput": 2042
15681
15717
  },
15682
15718
  "src/agent/no-unused-function-argument.ts": {
15683
- "bytesInOutput": 2570
15719
+ "bytesInOutput": 2865
15720
+ },
15721
+ "src/agent/no-unused-service-variable.ts": {
15722
+ "bytesInOutput": 2647
15684
15723
  },
15685
15724
  "src/require-fixed-services-import.ts": {
15686
15725
  "bytesInOutput": 1262
15687
15726
  },
15688
15727
  "src/require-resolve-full-response.ts": {
15689
- "bytesInOutput": 7200
15728
+ "bytesInOutput": 7208
15690
15729
  },
15691
15730
  "src/require-type-out-of-type-only-imports.ts": {
15692
15731
  "bytesInOutput": 1637
@@ -15719,7 +15758,7 @@
15719
15758
  "bytesInOutput": 3362
15720
15759
  }
15721
15760
  },
15722
- "bytes": 4350018
15761
+ "bytes": 4355564
15723
15762
  }
15724
15763
  }
15725
15764
  }
@@ -21,12 +21,8 @@ var rule = createRule({
21
21
  defaultOptions: [],
22
22
  create(context) {
23
23
  const sourceCode = context.sourceCode;
24
- function isParameterUsed(parameter, body) {
25
- if (parameter.type !== TSESTree.AST_NODE_TYPES.Identifier) {
26
- return true;
27
- }
28
- const parameterName = parameter.name;
29
- return sourceCode.getScope(body).references.some((ref) => ref.identifier.name === parameterName);
24
+ function isParameterUsed(parameter, scope) {
25
+ return scope.references.some((ref) => ref.identifier.name === parameter.name) || scope.childScopes.some((childScope) => isParameterUsed(parameter, childScope));
30
26
  }
31
27
  return {
32
28
  FunctionDeclaration(functionDeclaration) {
@@ -35,8 +31,10 @@ var rule = createRule({
35
31
  if (parameters.length === 0) {
36
32
  return;
37
33
  }
38
- const body = functionDeclaration.body;
39
- const parametersToKeep = parameters.filter((parameter) => isParameterUsed(parameter, body));
34
+ const functionScope = sourceCode.getScope(functionDeclaration);
35
+ const parametersToKeep = parameters.filter(
36
+ (parameter) => parameter.type !== TSESTree.AST_NODE_TYPES.Identifier || isParameterUsed(parameter, functionScope)
37
+ );
40
38
  if (parametersToKeep.length === parameters.length) {
41
39
  return;
42
40
  }
@@ -48,7 +46,14 @@ var rule = createRule({
48
46
  const firstParameter = parameters[0];
49
47
  const lastParameter = parameters.at(-1);
50
48
  assert.ok(firstParameter !== void 0 && lastParameter !== void 0);
51
- return fixer.replaceTextRange([firstParameter.range[0], lastParameter.range[1]], updatedParameters);
49
+ const tokenAfterParameters = sourceCode.getTokenAfter(lastParameter);
50
+ return fixer.replaceTextRange(
51
+ [
52
+ firstParameter.range[0],
53
+ tokenAfterParameters?.value === "," ? tokenAfterParameters.range[1] : lastParameter.range[1]
54
+ ],
55
+ updatedParameters
56
+ );
52
57
  }
53
58
  });
54
59
  } catch (error) {
@@ -71,4 +76,4 @@ export {
71
76
  no_unused_function_argument_default as default,
72
77
  ruleId
73
78
  };
74
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXVudXNlZC1mdW5jdGlvbi1hcmd1bWVudC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGFBQWEsZ0JBQWdCO0FBQ3RDLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLCtCQUErQjtBQUFBLE1BQy9CLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGFBQWEsUUFBUTtBQUczQixhQUFTLGdCQUFnQixXQUErQixNQUErQjtBQUNyRixVQUFJLFVBQVUsU0FBUyxTQUFTLGVBQWUsWUFBWTtBQUN6RCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sZ0JBQWdCLFVBQVU7QUFDaEMsYUFBTyxXQUFXLFNBQVMsSUFBSSxFQUFFLFdBQVcsS0FBSyxDQUFDLFFBQVEsSUFBSSxXQUFXLFNBQVMsYUFBYTtBQUFBLElBQ2pHO0FBRUEsV0FBTztBQUFBLE1BQ0wsb0JBQW9CLHFCQUFtRDtBQUNyRSxZQUFJO0FBQ0YsZ0JBQU0sYUFBYSxvQkFBb0I7QUFDdkMsY0FBSSxXQUFXLFdBQVcsR0FBRztBQUMzQjtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxPQUFPLG9CQUFvQjtBQUNqQyxnQkFBTSxtQkFBbUIsV0FBVyxPQUFPLENBQUMsY0FBYyxnQkFBZ0IsV0FBVyxJQUFJLENBQUM7QUFDMUYsY0FBSSxpQkFBaUIsV0FBVyxXQUFXLFFBQVE7QUFDakQ7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sb0JBQW9CLGlCQUFpQixJQUFJLENBQUMsY0FBYyxXQUFXLFFBQVEsU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQ3RHLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLElBQUksT0FBTztBQUNULG9CQUFNLGlCQUFpQixXQUFXLENBQUM7QUFDbkMsb0JBQU0sZ0JBQWdCLFdBQVcsR0FBRyxFQUFFO0FBQ3RDLHFCQUFPLEdBQUcsbUJBQW1CLFVBQWEsa0JBQWtCLE1BQVM7QUFDckUscUJBQU8sTUFBTSxpQkFBaUIsQ0FBQyxlQUFlLE1BQU0sQ0FBQyxHQUFHLGNBQWMsTUFBTSxDQUFDLENBQUMsR0FBRyxpQkFBaUI7QUFBQSxZQUNwRztBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixVQUFVLFFBQVE7QUFBQSxjQUNsQixPQUFPLGlCQUFpQixRQUFRLE1BQU0sU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsWUFDekU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sc0NBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
79
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXVudXNlZC1mdW5jdGlvbi1hcmd1bWVudC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGFBQWEsZ0JBQWdCO0FBRXRDLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLCtCQUErQjtBQUFBLE1BQy9CLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGFBQWEsUUFBUTtBQUUzQixhQUFTLGdCQUFnQixXQUFnQyxPQUE2QjtBQUNwRixhQUNFLE1BQU0sV0FBVyxLQUFLLENBQUMsUUFBUSxJQUFJLFdBQVcsU0FBUyxVQUFVLElBQUksS0FDckUsTUFBTSxZQUFZLEtBQUssQ0FBQyxlQUFlLGdCQUFnQixXQUFXLFVBQVUsQ0FBQztBQUFBLElBRWpGO0FBRUEsV0FBTztBQUFBLE1BQ0wsb0JBQW9CLHFCQUFtRDtBQUNyRSxZQUFJO0FBQ0YsZ0JBQU0sYUFBYSxvQkFBb0I7QUFDdkMsY0FBSSxXQUFXLFdBQVcsR0FBRztBQUMzQjtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxnQkFBZ0IsV0FBVyxTQUFTLG1CQUFtQjtBQUM3RCxnQkFBTSxtQkFBbUIsV0FBVztBQUFBLFlBQ2xDLENBQUMsY0FDQyxVQUFVLFNBQVMsU0FBUyxlQUFlLGNBQWMsZ0JBQWdCLFdBQVcsYUFBYTtBQUFBLFVBQ3JHO0FBQ0EsY0FBSSxpQkFBaUIsV0FBVyxXQUFXLFFBQVE7QUFDakQ7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sb0JBQW9CLGlCQUFpQixJQUFJLENBQUMsY0FBYyxXQUFXLFFBQVEsU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQ3RHLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLElBQUksT0FBTztBQUNULG9CQUFNLGlCQUFpQixXQUFXLENBQUM7QUFDbkMsb0JBQU0sZ0JBQWdCLFdBQVcsR0FBRyxFQUFFO0FBQ3RDLHFCQUFPLEdBQUcsbUJBQW1CLFVBQWEsa0JBQWtCLE1BQVM7QUFDckUsb0JBQU0sdUJBQXVCLFdBQVcsY0FBYyxhQUFhO0FBRW5FLHFCQUFPLE1BQU07QUFBQSxnQkFDWDtBQUFBLGtCQUNFLGVBQWUsTUFBTSxDQUFDO0FBQUEsa0JBQ3RCLHNCQUFzQixVQUFVLE1BQU0scUJBQXFCLE1BQU0sQ0FBQyxJQUFJLGNBQWMsTUFBTSxDQUFDO0FBQUEsZ0JBQzdGO0FBQUEsZ0JBQ0E7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixVQUFVLFFBQVE7QUFBQSxjQUNsQixPQUFPLGlCQUFpQixRQUFRLE1BQU0sU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsWUFDekU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sc0NBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,75 @@
1
+ // src/agent/no-unused-service-variable.ts
2
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
3
+ import { strict as assert } from "node:assert";
4
+ import getDocumentationUrl from "../get-documentation-url.mjs";
5
+ import { getEnclosingScopeNode } from "../library/ts-tree.mjs";
6
+ var ruleId = "no-unused-service-variable";
7
+ var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
8
+ var rule = createRule({
9
+ name: ruleId,
10
+ meta: {
11
+ type: "suggestion",
12
+ docs: {
13
+ description: "Remove unused service variables."
14
+ },
15
+ messages: {
16
+ removeUnusedServiceVariables: "Removing unused service variables.",
17
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
18
+ },
19
+ fixable: "code",
20
+ schema: []
21
+ },
22
+ defaultOptions: [],
23
+ create(context) {
24
+ const sourceCode = context.sourceCode;
25
+ const scopeManager = sourceCode.scopeManager;
26
+ function isVariableUsed(variableIdentifier, scope) {
27
+ const variable = scope.variables.find((variableToCheck) => variableToCheck.name === variableIdentifier.name);
28
+ return variable !== void 0 && variable.references.length > 1;
29
+ }
30
+ return {
31
+ VariableDeclaration(variableDeclaration) {
32
+ try {
33
+ if (variableDeclaration.declarations.length !== 1 || !sourceCode.getText(variableDeclaration).includes(".service.")) {
34
+ return;
35
+ }
36
+ const enclosingScopeNode = getEnclosingScopeNode(variableDeclaration);
37
+ assert.ok(enclosingScopeNode, "enclosingScopeNode is undefined");
38
+ const declarator = variableDeclaration.declarations[0];
39
+ assert.ok(declarator, "variable declaration is undefined");
40
+ if (declarator.id.type !== TSESTree.AST_NODE_TYPES.Identifier) {
41
+ return;
42
+ }
43
+ const scope = scopeManager?.acquire(enclosingScopeNode);
44
+ assert.ok(scope, "variable declaration is undefined");
45
+ if (isVariableUsed(declarator.id, scope)) {
46
+ return;
47
+ }
48
+ context.report({
49
+ node: variableDeclaration,
50
+ messageId: "removeUnusedServiceVariables",
51
+ fix(fixer) {
52
+ return fixer.remove(variableDeclaration);
53
+ }
54
+ });
55
+ } catch (error) {
56
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
57
+ context.report({
58
+ node: variableDeclaration,
59
+ messageId: "unknownError",
60
+ data: {
61
+ fileName: context.filename,
62
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
63
+ }
64
+ });
65
+ }
66
+ }
67
+ };
68
+ }
69
+ });
70
+ var no_unused_service_variable_default = rule;
71
+ export {
72
+ no_unused_service_variable_default as default,
73
+ ruleId
74
+ };
75
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXVudXNlZC1zZXJ2aWNlLXZhcmlhYmxlLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsYUFBYSxnQkFBZ0I7QUFFdEMsU0FBUyxVQUFVLGNBQWM7QUFDakMsT0FBTyx5QkFBeUI7QUFDaEMsU0FBUyw2QkFBNkI7QUFFL0IsSUFBTSxTQUFTO0FBRXRCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsOEJBQThCO0FBQUEsTUFDOUIsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBQzNCLFVBQU0sZUFBZSxXQUFXO0FBRWhDLGFBQVMsZUFBZSxvQkFBeUMsT0FBNkI7QUFDNUYsWUFBTSxXQUFXLE1BQU0sVUFBVSxLQUFLLENBQUMsb0JBQW9CLGdCQUFnQixTQUFTLG1CQUFtQixJQUFJO0FBQzNHLGFBQU8sYUFBYSxVQUFhLFNBQVMsV0FBVyxTQUFTO0FBQUEsSUFDaEU7QUFFQSxXQUFPO0FBQUEsTUFDTCxvQkFBb0IscUJBQW1EO0FBQ3JFLFlBQUk7QUFDRixjQUNFLG9CQUFvQixhQUFhLFdBQVcsS0FDNUMsQ0FBQyxXQUFXLFFBQVEsbUJBQW1CLEVBQUUsU0FBUyxXQUFXLEdBQzdEO0FBQ0E7QUFBQSxVQUNGO0FBRUEsZ0JBQU0scUJBQXFCLHNCQUFzQixtQkFBbUI7QUFDcEUsaUJBQU8sR0FBRyxvQkFBb0IsaUNBQWlDO0FBRS9ELGdCQUFNLGFBQWEsb0JBQW9CLGFBQWEsQ0FBQztBQUNyRCxpQkFBTyxHQUFHLFlBQVksbUNBQW1DO0FBQ3pELGNBQUksV0FBVyxHQUFHLFNBQVMsU0FBUyxlQUFlLFlBQVk7QUFDN0Q7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sUUFBUSxjQUFjLFFBQVEsa0JBQWtCO0FBQ3RELGlCQUFPLEdBQUcsT0FBTyxtQ0FBbUM7QUFDcEQsY0FBSSxlQUFlLFdBQVcsSUFBSSxLQUFLLEdBQUc7QUFDeEM7QUFBQSxVQUNGO0FBRUEsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsSUFBSSxPQUFPO0FBQ1QscUJBQU8sTUFBTSxPQUFPLG1CQUFtQjtBQUFBLFlBQ3pDO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSCxTQUFTLE9BQU87QUFFZCxrQkFBUSxNQUFNLG1CQUFtQixNQUFNLG1CQUFtQixRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ3JGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFVBQVUsUUFBUTtBQUFBLGNBQ2xCLE9BQU8saUJBQWlCLFFBQVEsTUFBTSxTQUFTLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxZQUN6RTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyxxQ0FBUTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -16,6 +16,7 @@ import noStatusCode, { ruleId as noStatusCodeRuleId } from "./agent/no-status-co
16
16
  import noUnusedFunctionArguments, {
17
17
  ruleId as noUnusedFunctionArgumentsRuleId
18
18
  } from "./agent/no-unused-function-argument.mjs";
19
+ import noUnusedServiceVariables, { ruleId as noUnusedServiceVariablesRuleId } from "./agent/no-unused-service-variable.mjs";
19
20
  import requireFixedServicesImport, {
20
21
  ruleId as requireFixedServicesImportRuleId
21
22
  } from "./require-fixed-services-import.mjs";
@@ -60,7 +61,8 @@ var src_default = {
60
61
  [noDuplicatedImportsRuleId]: noDuplicatedImports,
61
62
  [requireFixedServicesImportRuleId]: requireFixedServicesImport,
62
63
  [requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
63
- [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments
64
+ [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments,
65
+ [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables
64
66
  },
65
67
  configs: {
66
68
  all: {
@@ -113,7 +115,8 @@ var src_default = {
113
115
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "error",
114
116
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: "error",
115
117
  [`@checkdigit/${fetchThenRuleId}`]: "error",
116
- [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error"
118
+ [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error",
119
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error"
117
120
  }
118
121
  },
119
122
  "agent-phase-2-production": {
@@ -127,7 +130,8 @@ var src_default = {
127
130
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "error",
128
131
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: "error",
129
132
  [`@checkdigit/${fetchThenRuleId}`]: "error",
130
- [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error"
133
+ [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error",
134
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error"
131
135
  }
132
136
  }
133
137
  }
@@ -135,4 +139,4 @@ var src_default = {
135
139
  export {
136
140
  src_default as default
137
141
  };
138
- //# sourceMappingURL=data:application/json;base64,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
142
+ //# sourceMappingURL=data:application/json;base64,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
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const ruleId = "no-unused-service-variable";
3
+ declare const rule: ESLintUtils.RuleModule<"unknownError" | "removeUnusedServiceVariables", never[], ESLintUtils.RuleListener>;
4
+ export default rule;
@@ -25,6 +25,7 @@ declare const _default: {
25
25
  "require-fixed-services-import": import("@typescript-eslint/utils/ts-eslint").RuleModule<"updateServicesImportFrom", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
26
26
  "require-type-out-of-type-only-imports": import("@typescript-eslint/utils/ts-eslint").RuleModule<"moveTypeOutside", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
27
27
  "no-unused-function-argument": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "removeUnusedFunctionArguments", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
28
+ "no-unused-service-variable": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "removeUnusedServiceVariables", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
28
29
  };
29
30
  configs: {
30
31
  all: {
@@ -76,6 +77,7 @@ declare const _default: {
76
77
  "@checkdigit/fetch-response-header-getter-ts": string;
77
78
  "@checkdigit/fetch-then": string;
78
79
  "@checkdigit/no-unused-function-argument": string;
80
+ "@checkdigit/no-unused-service-variable": string;
79
81
  };
80
82
  };
81
83
  'agent-phase-2-production': {
@@ -90,6 +92,7 @@ declare const _default: {
90
92
  "@checkdigit/fetch-response-header-getter-ts": string;
91
93
  "@checkdigit/fetch-then": string;
92
94
  "@checkdigit/no-unused-function-argument": string;
95
+ "@checkdigit/no-unused-service-variable": string;
93
96
  };
94
97
  };
95
98
  };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-3c91","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"7.18.0","@typescript-eslint/utils":"7.18.0","ts-api-utils":"^1.3.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"8.56.10","@typescript-eslint/eslint-plugin":"7.18.0","@typescript-eslint/parser":"7.18.0","@typescript-eslint/rule-tester":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0","http-status-codes":"^2.3.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-0fc6","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"7.18.0","@typescript-eslint/utils":"7.18.0","ts-api-utils":"^1.3.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"8.56.10","@typescript-eslint/eslint-plugin":"7.18.0","@typescript-eslint/parser":"7.18.0","@typescript-eslint/rule-tester":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0","http-status-codes":"^2.3.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
10
+ import type { Scope } from '@typescript-eslint/utils/ts-eslint';
10
11
  import { strict as assert } from 'node:assert';
11
12
  import getDocumentationUrl from '../get-documentation-url';
12
13
 
@@ -32,13 +33,11 @@ const rule = createRule({
32
33
  create(context) {
33
34
  const sourceCode = context.sourceCode;
34
35
 
35
- // Function to check if a parameter is used in the function body
36
- function isParameterUsed(parameter: TSESTree.Parameter, body: TSESTree.BlockStatement) {
37
- if (parameter.type !== TSESTree.AST_NODE_TYPES.Identifier) {
38
- return true;
39
- }
40
- const parameterName = parameter.name;
41
- return sourceCode.getScope(body).references.some((ref) => ref.identifier.name === parameterName);
36
+ function isParameterUsed(parameter: TSESTree.Identifier, scope: Scope.Scope): boolean {
37
+ return (
38
+ scope.references.some((ref) => ref.identifier.name === parameter.name) ||
39
+ scope.childScopes.some((childScope) => isParameterUsed(parameter, childScope))
40
+ );
42
41
  }
43
42
 
44
43
  return {
@@ -49,8 +48,11 @@ const rule = createRule({
49
48
  return;
50
49
  }
51
50
 
52
- const body = functionDeclaration.body;
53
- const parametersToKeep = parameters.filter((parameter) => isParameterUsed(parameter, body));
51
+ const functionScope = sourceCode.getScope(functionDeclaration);
52
+ const parametersToKeep = parameters.filter(
53
+ (parameter) =>
54
+ parameter.type !== TSESTree.AST_NODE_TYPES.Identifier || isParameterUsed(parameter, functionScope),
55
+ );
54
56
  if (parametersToKeep.length === parameters.length) {
55
57
  return;
56
58
  }
@@ -63,7 +65,15 @@ const rule = createRule({
63
65
  const firstParameter = parameters[0];
64
66
  const lastParameter = parameters.at(-1);
65
67
  assert.ok(firstParameter !== undefined && lastParameter !== undefined);
66
- return fixer.replaceTextRange([firstParameter.range[0], lastParameter.range[1]], updatedParameters);
68
+ const tokenAfterParameters = sourceCode.getTokenAfter(lastParameter);
69
+
70
+ return fixer.replaceTextRange(
71
+ [
72
+ firstParameter.range[0],
73
+ tokenAfterParameters?.value === ',' ? tokenAfterParameters.range[1] : lastParameter.range[1],
74
+ ],
75
+ updatedParameters,
76
+ );
67
77
  },
68
78
  });
69
79
  } catch (error) {
@@ -0,0 +1,92 @@
1
+ // agent/no-unused-service-variable.ts
2
+
3
+ /*
4
+ * Copyright (c) 2021-2024 Check Digit, LLC
5
+ *
6
+ * This code is licensed under the MIT license (see LICENSE.txt for details).
7
+ */
8
+
9
+ import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
10
+ import type { Scope } from '@typescript-eslint/utils/ts-eslint';
11
+ import { strict as assert } from 'node:assert';
12
+ import getDocumentationUrl from '../get-documentation-url';
13
+ import { getEnclosingScopeNode } from '../library/ts-tree';
14
+
15
+ export const ruleId = 'no-unused-service-variable';
16
+
17
+ const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
18
+
19
+ const rule = createRule({
20
+ name: ruleId,
21
+ meta: {
22
+ type: 'suggestion',
23
+ docs: {
24
+ description: 'Remove unused service variables.',
25
+ },
26
+ messages: {
27
+ removeUnusedServiceVariables: 'Removing unused service variables.',
28
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
29
+ },
30
+ fixable: 'code',
31
+ schema: [],
32
+ },
33
+ defaultOptions: [],
34
+ create(context) {
35
+ const sourceCode = context.sourceCode;
36
+ const scopeManager = sourceCode.scopeManager;
37
+
38
+ function isVariableUsed(variableIdentifier: TSESTree.Identifier, scope: Scope.Scope): boolean {
39
+ const variable = scope.variables.find((variableToCheck) => variableToCheck.name === variableIdentifier.name);
40
+ return variable !== undefined && variable.references.length > 1;
41
+ }
42
+
43
+ return {
44
+ VariableDeclaration(variableDeclaration: TSESTree.VariableDeclaration) {
45
+ try {
46
+ if (
47
+ variableDeclaration.declarations.length !== 1 ||
48
+ !sourceCode.getText(variableDeclaration).includes('.service.')
49
+ ) {
50
+ return;
51
+ }
52
+
53
+ const enclosingScopeNode = getEnclosingScopeNode(variableDeclaration);
54
+ assert.ok(enclosingScopeNode, 'enclosingScopeNode is undefined');
55
+
56
+ const declarator = variableDeclaration.declarations[0];
57
+ assert.ok(declarator, 'variable declaration is undefined');
58
+ if (declarator.id.type !== TSESTree.AST_NODE_TYPES.Identifier) {
59
+ return;
60
+ }
61
+
62
+ const scope = scopeManager?.acquire(enclosingScopeNode);
63
+ assert.ok(scope, 'variable declaration is undefined');
64
+ if (isVariableUsed(declarator.id, scope)) {
65
+ return;
66
+ }
67
+
68
+ context.report({
69
+ node: variableDeclaration,
70
+ messageId: 'removeUnusedServiceVariables',
71
+ fix(fixer) {
72
+ return fixer.remove(variableDeclaration);
73
+ },
74
+ });
75
+ } catch (error) {
76
+ // eslint-disable-next-line no-console
77
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
78
+ context.report({
79
+ node: variableDeclaration,
80
+ messageId: 'unknownError',
81
+ data: {
82
+ fileName: context.filename,
83
+ error: error instanceof Error ? error.toString() : JSON.stringify(error),
84
+ },
85
+ });
86
+ }
87
+ },
88
+ };
89
+ },
90
+ });
91
+
92
+ export default rule;
package/src/index.ts CHANGED
@@ -23,6 +23,7 @@ import noStatusCode, { ruleId as noStatusCodeRuleId } from './agent/no-status-co
23
23
  import noUnusedFunctionArguments, {
24
24
  ruleId as noUnusedFunctionArgumentsRuleId,
25
25
  } from './agent/no-unused-function-argument';
26
+ import noUnusedServiceVariables, { ruleId as noUnusedServiceVariablesRuleId } from './agent/no-unused-service-variable';
26
27
  import requireFixedServicesImport, {
27
28
  ruleId as requireFixedServicesImportRuleId,
28
29
  } from './require-fixed-services-import';
@@ -69,6 +70,7 @@ export default {
69
70
  [requireFixedServicesImportRuleId]: requireFixedServicesImport,
70
71
  [requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
71
72
  [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments,
73
+ [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables,
72
74
  },
73
75
  configs: {
74
76
  all: {
@@ -122,6 +124,7 @@ export default {
122
124
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'error',
123
125
  [`@checkdigit/${fetchThenRuleId}`]: 'error',
124
126
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
127
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
125
128
  },
126
129
  },
127
130
  'agent-phase-2-production': {
@@ -136,6 +139,7 @@ export default {
136
139
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'error',
137
140
  [`@checkdigit/${fetchThenRuleId}`]: 'error',
138
141
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
142
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
139
143
  },
140
144
  },
141
145
  },