@checkdigit/eslint-plugin 6.6.0-PR.75-0fc6 → 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,22 @@
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
+ },
12572
12588
  "src/agent/no-unused-service-variable.ts": {
12573
12589
  "bytes": 3080,
12574
12590
  "imports": [
@@ -12709,7 +12725,7 @@
12709
12725
  "format": "esm"
12710
12726
  },
12711
12727
  "src/index.ts": {
12712
- "bytes": 6998,
12728
+ "bytes": 7256,
12713
12729
  "imports": [
12714
12730
  {
12715
12731
  "path": "src/agent/add-url-domain.ts",
@@ -12776,6 +12792,11 @@
12776
12792
  "kind": "import-statement",
12777
12793
  "original": "./agent/no-unused-function-argument"
12778
12794
  },
12795
+ {
12796
+ "path": "src/agent/no-unused-imports.ts",
12797
+ "kind": "import-statement",
12798
+ "original": "./agent/no-unused-imports"
12799
+ },
12779
12800
  {
12780
12801
  "path": "src/agent/no-unused-service-variable.ts",
12781
12802
  "kind": "import-statement",
@@ -15650,7 +15671,7 @@
15650
15671
  "bytesInOutput": 2219
15651
15672
  },
15652
15673
  "src/index.ts": {
15653
- "bytesInOutput": 4137
15674
+ "bytesInOutput": 4272
15654
15675
  },
15655
15676
  "src/agent/url.ts": {
15656
15677
  "bytesInOutput": 745
@@ -15718,6 +15739,9 @@
15718
15739
  "src/agent/no-unused-function-argument.ts": {
15719
15740
  "bytesInOutput": 2865
15720
15741
  },
15742
+ "src/agent/no-unused-imports.ts": {
15743
+ "bytesInOutput": 3007
15744
+ },
15721
15745
  "src/agent/no-unused-service-variable.ts": {
15722
15746
  "bytesInOutput": 2647
15723
15747
  },
@@ -15758,7 +15782,7 @@
15758
15782
  "bytesInOutput": 3362
15759
15783
  }
15760
15784
  },
15761
- "bytes": 4355564
15785
+ "bytes": 4361261
15762
15786
  }
15763
15787
  }
15764
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
@@ -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 noUnusedImports, { ruleId as noUnusedImportsRuleId } from "./agent/no-unused-imports.mjs";
19
20
  import noUnusedServiceVariables, { ruleId as noUnusedServiceVariablesRuleId } from "./agent/no-unused-service-variable.mjs";
20
21
  import requireFixedServicesImport, {
21
22
  ruleId as requireFixedServicesImportRuleId
@@ -62,7 +63,8 @@ var src_default = {
62
63
  [requireFixedServicesImportRuleId]: requireFixedServicesImport,
63
64
  [requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
64
65
  [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments,
65
- [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables
66
+ [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables,
67
+ [noUnusedImportsRuleId]: noUnusedImports
66
68
  },
67
69
  configs: {
68
70
  all: {
@@ -116,7 +118,8 @@ var src_default = {
116
118
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: "error",
117
119
  [`@checkdigit/${fetchThenRuleId}`]: "error",
118
120
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error",
119
- [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error"
121
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error",
122
+ [`@checkdigit/${noUnusedImportsRuleId}`]: "error"
120
123
  }
121
124
  },
122
125
  "agent-phase-2-production": {
@@ -131,7 +134,8 @@ var src_default = {
131
134
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: "error",
132
135
  [`@checkdigit/${fetchThenRuleId}`]: "error",
133
136
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: "error",
134
- [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error"
137
+ [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: "error",
138
+ [`@checkdigit/${noUnusedImportsRuleId}`]: "error"
135
139
  }
136
140
  }
137
141
  }
@@ -139,4 +143,4 @@ var src_default = {
139
143
  export {
140
144
  src_default as default
141
145
  };
142
- //# 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;
@@ -26,6 +26,7 @@ declare const _default: {
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
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>;
29
30
  };
30
31
  configs: {
31
32
  all: {
@@ -78,6 +79,7 @@ declare const _default: {
78
79
  "@checkdigit/fetch-then": string;
79
80
  "@checkdigit/no-unused-function-argument": string;
80
81
  "@checkdigit/no-unused-service-variable": string;
82
+ "@checkdigit/no-unused-imports": string;
81
83
  };
82
84
  };
83
85
  'agent-phase-2-production': {
@@ -93,6 +95,7 @@ declare const _default: {
93
95
  "@checkdigit/fetch-then": string;
94
96
  "@checkdigit/no-unused-function-argument": string;
95
97
  "@checkdigit/no-unused-service-variable": string;
98
+ "@checkdigit/no-unused-imports": string;
96
99
  };
97
100
  };
98
101
  };
package/package.json CHANGED
@@ -1 +1 @@
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"}}
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;
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 noUnusedImports, { ruleId as noUnusedImportsRuleId } from './agent/no-unused-imports';
26
27
  import noUnusedServiceVariables, { ruleId as noUnusedServiceVariablesRuleId } from './agent/no-unused-service-variable';
27
28
  import requireFixedServicesImport, {
28
29
  ruleId as requireFixedServicesImportRuleId,
@@ -71,6 +72,7 @@ export default {
71
72
  [requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
72
73
  [noUnusedFunctionArgumentsRuleId]: noUnusedFunctionArguments,
73
74
  [noUnusedServiceVariablesRuleId]: noUnusedServiceVariables,
75
+ [noUnusedImportsRuleId]: noUnusedImports,
74
76
  },
75
77
  configs: {
76
78
  all: {
@@ -125,6 +127,7 @@ export default {
125
127
  [`@checkdigit/${fetchThenRuleId}`]: 'error',
126
128
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
127
129
  [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
130
+ [`@checkdigit/${noUnusedImportsRuleId}`]: 'error',
128
131
  },
129
132
  },
130
133
  'agent-phase-2-production': {
@@ -140,6 +143,7 @@ export default {
140
143
  [`@checkdigit/${fetchThenRuleId}`]: 'error',
141
144
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
142
145
  [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
146
+ [`@checkdigit/${noUnusedImportsRuleId}`]: 'error',
143
147
  },
144
148
  },
145
149
  },