@checkdigit/eslint-plugin 6.6.0-PR.75-9c39 → 6.6.0-PR.75-d1a6

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.
@@ -12569,6 +12569,48 @@
12569
12569
  ],
12570
12570
  "format": "esm"
12571
12571
  },
12572
+ "src/agent/no-unused-imports.ts": {
12573
+ "bytes": 3439,
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": "src/get-documentation-url.ts",
12582
+ "kind": "import-statement",
12583
+ "original": "../get-documentation-url"
12584
+ }
12585
+ ],
12586
+ "format": "esm"
12587
+ },
12588
+ "src/agent/no-unused-service-variable.ts": {
12589
+ "bytes": 3080,
12590
+ "imports": [
12591
+ {
12592
+ "path": "node_modules/@typescript-eslint/utils/dist/index.js",
12593
+ "kind": "import-statement",
12594
+ "original": "@typescript-eslint/utils"
12595
+ },
12596
+ {
12597
+ "path": "node:assert",
12598
+ "kind": "import-statement",
12599
+ "external": true
12600
+ },
12601
+ {
12602
+ "path": "src/get-documentation-url.ts",
12603
+ "kind": "import-statement",
12604
+ "original": "../get-documentation-url"
12605
+ },
12606
+ {
12607
+ "path": "src/library/ts-tree.ts",
12608
+ "kind": "import-statement",
12609
+ "original": "../library/ts-tree"
12610
+ }
12611
+ ],
12612
+ "format": "esm"
12613
+ },
12572
12614
  "src/require-fixed-services-import.ts": {
12573
12615
  "bytes": 1467,
12574
12616
  "imports": [
@@ -12683,7 +12725,7 @@
12683
12725
  "format": "esm"
12684
12726
  },
12685
12727
  "src/index.ts": {
12686
- "bytes": 6677,
12728
+ "bytes": 7256,
12687
12729
  "imports": [
12688
12730
  {
12689
12731
  "path": "src/agent/add-url-domain.ts",
@@ -12750,6 +12792,16 @@
12750
12792
  "kind": "import-statement",
12751
12793
  "original": "./agent/no-unused-function-argument"
12752
12794
  },
12795
+ {
12796
+ "path": "src/agent/no-unused-imports.ts",
12797
+ "kind": "import-statement",
12798
+ "original": "./agent/no-unused-imports"
12799
+ },
12800
+ {
12801
+ "path": "src/agent/no-unused-service-variable.ts",
12802
+ "kind": "import-statement",
12803
+ "original": "./agent/no-unused-service-variable"
12804
+ },
12753
12805
  {
12754
12806
  "path": "src/require-fixed-services-import.ts",
12755
12807
  "kind": "import-statement",
@@ -13357,6 +13409,11 @@
13357
13409
  "kind": "require-call",
13358
13410
  "external": true
13359
13411
  },
13412
+ {
13413
+ "path": "node:assert",
13414
+ "kind": "require-call",
13415
+ "external": true
13416
+ },
13360
13417
  {
13361
13418
  "path": "node:assert",
13362
13419
  "kind": "require-call",
@@ -15614,7 +15671,7 @@
15614
15671
  "bytesInOutput": 2219
15615
15672
  },
15616
15673
  "src/index.ts": {
15617
- "bytesInOutput": 3993
15674
+ "bytesInOutput": 4272
15618
15675
  },
15619
15676
  "src/agent/url.ts": {
15620
15677
  "bytesInOutput": 745
@@ -15682,11 +15739,17 @@
15682
15739
  "src/agent/no-unused-function-argument.ts": {
15683
15740
  "bytesInOutput": 2865
15684
15741
  },
15742
+ "src/agent/no-unused-imports.ts": {
15743
+ "bytesInOutput": 3007
15744
+ },
15745
+ "src/agent/no-unused-service-variable.ts": {
15746
+ "bytesInOutput": 2647
15747
+ },
15685
15748
  "src/require-fixed-services-import.ts": {
15686
15749
  "bytesInOutput": 1262
15687
15750
  },
15688
15751
  "src/require-resolve-full-response.ts": {
15689
- "bytesInOutput": 7200
15752
+ "bytesInOutput": 7208
15690
15753
  },
15691
15754
  "src/require-type-out-of-type-only-imports.ts": {
15692
15755
  "bytesInOutput": 1637
@@ -15719,7 +15782,7 @@
15719
15782
  "bytesInOutput": 3362
15720
15783
  }
15721
15784
  },
15722
- "bytes": 4350469
15785
+ "bytes": 4361261
15723
15786
  }
15724
15787
  }
15725
15788
  }
@@ -0,0 +1,81 @@
1
+ // src/agent/no-unused-imports.ts
2
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
3
+ import getDocumentationUrl from "../get-documentation-url.mjs";
4
+ var ruleId = "no-unused-imports";
5
+ var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
6
+ var rule = createRule({
7
+ name: ruleId,
8
+ meta: {
9
+ type: "suggestion",
10
+ docs: {
11
+ description: "Remove unused imports."
12
+ },
13
+ messages: {
14
+ removeUnusedImports: "Removing unused imports.",
15
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
16
+ },
17
+ fixable: "code",
18
+ schema: []
19
+ },
20
+ defaultOptions: [],
21
+ create(context) {
22
+ const sourceCode = context.sourceCode;
23
+ function isImportUsed(specifier, scope) {
24
+ return specifier.type !== TSESTree.AST_NODE_TYPES.ImportSpecifier || scope.references.some((ref) => ref.identifier.name === specifier.local.name) || scope.childScopes.some((childScope) => isImportUsed(specifier, childScope));
25
+ }
26
+ return {
27
+ ImportDeclaration(importDeclaration) {
28
+ try {
29
+ const moduleName = importDeclaration.source.value;
30
+ if (!importDeclaration.specifiers.every(
31
+ (specifier) => specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier
32
+ ) || // [TODO:] move to meta schema
33
+ !["@checkdigit/serve-runtime", "@checkdigit/fixture"].includes(moduleName)) {
34
+ return;
35
+ }
36
+ const originalSpecifiers = importDeclaration.specifiers;
37
+ const scope = sourceCode.getScope(importDeclaration);
38
+ const usedSpecifiers = originalSpecifiers.filter((specifier) => isImportUsed(specifier, scope));
39
+ if (usedSpecifiers.length === originalSpecifiers.length) {
40
+ return;
41
+ }
42
+ if (usedSpecifiers.length === 0) {
43
+ context.report({
44
+ messageId: "removeUnusedImports",
45
+ node: importDeclaration,
46
+ *fix(fixer) {
47
+ yield fixer.remove(importDeclaration);
48
+ }
49
+ });
50
+ return;
51
+ }
52
+ const usedSpecifierTexts = usedSpecifiers.map((specifier) => sourceCode.getText(specifier));
53
+ const updatedImportDeclaration = `import ${importDeclaration.importKind === "type" ? "type " : ""}{ ${usedSpecifierTexts.join(", ")} } from '${moduleName}';`;
54
+ context.report({
55
+ messageId: "removeUnusedImports",
56
+ node: importDeclaration,
57
+ *fix(fixer) {
58
+ yield fixer.replaceText(importDeclaration, updatedImportDeclaration);
59
+ }
60
+ });
61
+ } catch (error) {
62
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
63
+ context.report({
64
+ node: importDeclaration,
65
+ messageId: "unknownError",
66
+ data: {
67
+ fileName: context.filename,
68
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
69
+ }
70
+ });
71
+ }
72
+ }
73
+ };
74
+ }
75
+ });
76
+ var no_unused_imports_default = rule;
77
+ export {
78
+ no_unused_imports_default as default,
79
+ ruleId
80
+ };
81
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXVudXNlZC1pbXBvcnRzLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsYUFBYSxnQkFBZ0I7QUFFdEMsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBRXRCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IscUJBQXFCO0FBQUEsTUFDckIsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBRTNCLGFBQVMsYUFBYSxXQUFrQyxPQUE2QjtBQUNuRixhQUNFLFVBQVUsU0FBUyxTQUFTLGVBQWUsbUJBQzNDLE1BQU0sV0FBVyxLQUFLLENBQUMsUUFBUSxJQUFJLFdBQVcsU0FBUyxVQUFVLE1BQU0sSUFBSSxLQUMzRSxNQUFNLFlBQVksS0FBSyxDQUFDLGVBQWUsYUFBYSxXQUFXLFVBQVUsQ0FBQztBQUFBLElBRTlFO0FBRUEsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLG1CQUFtQjtBQUNuQyxZQUFJO0FBQ0YsZ0JBQU0sYUFBYSxrQkFBa0IsT0FBTztBQUM1QyxjQUNFLENBQUMsa0JBQWtCLFdBQVc7QUFBQSxZQUM1QixDQUFDLGNBQWMsVUFBVSxTQUFTLFNBQVMsZUFBZTtBQUFBLFVBQzVEO0FBQUEsVUFFQSxDQUFDLENBQUMsNkJBQTZCLHFCQUFxQixFQUFFLFNBQVMsVUFBVSxHQUN6RTtBQUNBO0FBQUEsVUFDRjtBQUVBLGdCQUFNLHFCQUFxQixrQkFBa0I7QUFDN0MsZ0JBQU0sUUFBUSxXQUFXLFNBQVMsaUJBQWlCO0FBQ25ELGdCQUFNLGlCQUFpQixtQkFBbUIsT0FBTyxDQUFDLGNBQWMsYUFBYSxXQUFXLEtBQUssQ0FBQztBQUM5RixjQUFJLGVBQWUsV0FBVyxtQkFBbUIsUUFBUTtBQUN2RDtBQUFBLFVBQ0Y7QUFFQSxjQUFJLGVBQWUsV0FBVyxHQUFHO0FBQy9CLG9CQUFRLE9BQU87QUFBQSxjQUNiLFdBQVc7QUFBQSxjQUNYLE1BQU07QUFBQSxjQUNOLENBQUMsSUFBSSxPQUFPO0FBQ1Ysc0JBQU0sTUFBTSxPQUFPLGlCQUFpQjtBQUFBLGNBQ3RDO0FBQUEsWUFDRixDQUFDO0FBQ0Q7QUFBQSxVQUNGO0FBRUEsZ0JBQU0scUJBQXFCLGVBQWUsSUFBSSxDQUFDLGNBQWMsV0FBVyxRQUFRLFNBQVMsQ0FBQztBQUMxRixnQkFBTSwyQkFBMkIsVUFBVSxrQkFBa0IsZUFBZSxTQUFTLFVBQVUsRUFBRSxLQUFLLG1CQUFtQixLQUFLLElBQUksQ0FBQyxZQUFZLFVBQVU7QUFFekosa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFlBQ04sQ0FBQyxJQUFJLE9BQU87QUFDVixvQkFBTSxNQUFNLFlBQVksbUJBQW1CLHdCQUF3QjtBQUFBLFlBQ3JFO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSCxTQUFTLE9BQU87QUFFZCxrQkFBUSxNQUFNLG1CQUFtQixNQUFNLG1CQUFtQixRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ3JGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFVBQVUsUUFBUTtBQUFBLGNBQ2xCLE9BQU8saUJBQWlCLFFBQVEsTUFBTSxTQUFTLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxZQUN6RTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyw0QkFBUTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -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,8 @@ 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 noUnusedImports, { ruleId as noUnusedImportsRuleId } from "./agent/no-unused-imports.mjs";
20
+ import noUnusedServiceVariables, { ruleId as noUnusedServiceVariablesRuleId } from "./agent/no-unused-service-variable.mjs";
19
21
  import requireFixedServicesImport, {
20
22
  ruleId as requireFixedServicesImportRuleId
21
23
  } from "./require-fixed-services-import.mjs";
@@ -60,7 +62,9 @@ var src_default = {
60
62
  [noDuplicatedImportsRuleId]: noDuplicatedImports,
61
63
  [requireFixedServicesImportRuleId]: requireFixedServicesImport,
62
64
  [requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
63
- [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments
65
+ [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments,
66
+ [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables,
67
+ [noUnusedImportsRuleId]: noUnusedImports
64
68
  },
65
69
  configs: {
66
70
  all: {
@@ -113,7 +117,9 @@ var src_default = {
113
117
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "error",
114
118
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: "error",
115
119
  [`@checkdigit/${fetchThenRuleId}`]: "error",
116
- [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error"
120
+ [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error",
121
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error",
122
+ [`@checkdigit/${noUnusedImportsRuleId}`]: "error"
117
123
  }
118
124
  },
119
125
  "agent-phase-2-production": {
@@ -127,7 +133,9 @@ var src_default = {
127
133
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "error",
128
134
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: "error",
129
135
  [`@checkdigit/${fetchThenRuleId}`]: "error",
130
- [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error"
136
+ [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error",
137
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error",
138
+ [`@checkdigit/${noUnusedImportsRuleId}`]: "error"
131
139
  }
132
140
  }
133
141
  }
@@ -135,4 +143,4 @@ var src_default = {
135
143
  export {
136
144
  src_default as default
137
145
  };
138
- //# sourceMappingURL=data:application/json;base64,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
146
+ //# 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-imports";
3
+ declare const rule: ESLintUtils.RuleModule<"unknownError" | "removeUnusedImports", never[], ESLintUtils.RuleListener>;
4
+ export default rule;
@@ -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,8 @@ 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>;
29
+ "no-unused-imports": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "removeUnusedImports", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
28
30
  };
29
31
  configs: {
30
32
  all: {
@@ -76,6 +78,8 @@ declare const _default: {
76
78
  "@checkdigit/fetch-response-header-getter-ts": string;
77
79
  "@checkdigit/fetch-then": string;
78
80
  "@checkdigit/no-unused-function-argument": string;
81
+ "@checkdigit/no-unused-service-variable": string;
82
+ "@checkdigit/no-unused-imports": string;
79
83
  };
80
84
  };
81
85
  'agent-phase-2-production': {
@@ -90,6 +94,8 @@ declare const _default: {
90
94
  "@checkdigit/fetch-response-header-getter-ts": string;
91
95
  "@checkdigit/fetch-then": string;
92
96
  "@checkdigit/no-unused-function-argument": string;
97
+ "@checkdigit/no-unused-service-variable": string;
98
+ "@checkdigit/no-unused-imports": string;
93
99
  };
94
100
  };
95
101
  };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-9c39","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-d1a6","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"}}
@@ -0,0 +1,102 @@
1
+ // agent/no-unused-imports.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 getDocumentationUrl from '../get-documentation-url';
12
+
13
+ export const ruleId = 'no-unused-imports';
14
+
15
+ const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
16
+
17
+ const rule = createRule({
18
+ name: ruleId,
19
+ meta: {
20
+ type: 'suggestion',
21
+ docs: {
22
+ description: 'Remove unused imports.',
23
+ },
24
+ messages: {
25
+ removeUnusedImports: 'Removing unused imports.',
26
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
27
+ },
28
+ fixable: 'code',
29
+ schema: [],
30
+ },
31
+ defaultOptions: [],
32
+ create(context) {
33
+ const sourceCode = context.sourceCode;
34
+
35
+ function isImportUsed(specifier: TSESTree.ImportClause, scope: Scope.Scope): boolean {
36
+ return (
37
+ specifier.type !== TSESTree.AST_NODE_TYPES.ImportSpecifier ||
38
+ scope.references.some((ref) => ref.identifier.name === specifier.local.name) ||
39
+ scope.childScopes.some((childScope) => isImportUsed(specifier, childScope))
40
+ );
41
+ }
42
+
43
+ return {
44
+ ImportDeclaration(importDeclaration) {
45
+ try {
46
+ const moduleName = importDeclaration.source.value;
47
+ if (
48
+ !importDeclaration.specifiers.every(
49
+ (specifier) => specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier,
50
+ ) ||
51
+ // [TODO:] move to meta schema
52
+ !['@checkdigit/serve-runtime', '@checkdigit/fixture'].includes(moduleName)
53
+ ) {
54
+ return;
55
+ }
56
+
57
+ const originalSpecifiers = importDeclaration.specifiers;
58
+ const scope = sourceCode.getScope(importDeclaration);
59
+ const usedSpecifiers = originalSpecifiers.filter((specifier) => isImportUsed(specifier, scope));
60
+ if (usedSpecifiers.length === originalSpecifiers.length) {
61
+ return;
62
+ }
63
+
64
+ if (usedSpecifiers.length === 0) {
65
+ context.report({
66
+ messageId: 'removeUnusedImports',
67
+ node: importDeclaration,
68
+ *fix(fixer) {
69
+ yield fixer.remove(importDeclaration);
70
+ },
71
+ });
72
+ return;
73
+ }
74
+
75
+ const usedSpecifierTexts = usedSpecifiers.map((specifier) => sourceCode.getText(specifier));
76
+ const updatedImportDeclaration = `import ${importDeclaration.importKind === 'type' ? 'type ' : ''}{ ${usedSpecifierTexts.join(', ')} } from '${moduleName}';`;
77
+
78
+ context.report({
79
+ messageId: 'removeUnusedImports',
80
+ node: importDeclaration,
81
+ *fix(fixer) {
82
+ yield fixer.replaceText(importDeclaration, updatedImportDeclaration);
83
+ },
84
+ });
85
+ } catch (error) {
86
+ // eslint-disable-next-line no-console
87
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
88
+ context.report({
89
+ node: importDeclaration,
90
+ messageId: 'unknownError',
91
+ data: {
92
+ fileName: context.filename,
93
+ error: error instanceof Error ? error.toString() : JSON.stringify(error),
94
+ },
95
+ });
96
+ }
97
+ },
98
+ };
99
+ },
100
+ });
101
+
102
+ export default rule;
@@ -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,8 @@ 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 noUnusedImports, { ruleId as noUnusedImportsRuleId } from './agent/no-unused-imports';
27
+ import noUnusedServiceVariables, { ruleId as noUnusedServiceVariablesRuleId } from './agent/no-unused-service-variable';
26
28
  import requireFixedServicesImport, {
27
29
  ruleId as requireFixedServicesImportRuleId,
28
30
  } from './require-fixed-services-import';
@@ -69,6 +71,8 @@ export default {
69
71
  [requireFixedServicesImportRuleId]: requireFixedServicesImport,
70
72
  [requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
71
73
  [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments,
74
+ [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables,
75
+ [noUnusedImportsRuleId]: noUnusedImports,
72
76
  },
73
77
  configs: {
74
78
  all: {
@@ -122,6 +126,8 @@ export default {
122
126
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'error',
123
127
  [`@checkdigit/${fetchThenRuleId}`]: 'error',
124
128
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
129
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
130
+ [`@checkdigit/${noUnusedImportsRuleId}`]: 'error',
125
131
  },
126
132
  },
127
133
  'agent-phase-2-production': {
@@ -136,6 +142,8 @@ export default {
136
142
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'error',
137
143
  [`@checkdigit/${fetchThenRuleId}`]: 'error',
138
144
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
145
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
146
+ [`@checkdigit/${noUnusedImportsRuleId}`]: 'error',
139
147
  },
140
148
  },
141
149
  },