@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.
- package/dist-cjs/index.cjs +434 -355
- package/dist-cjs/metafile.json +27 -3
- package/dist-mjs/agent/no-unused-imports.mjs +81 -0
- package/dist-mjs/index.mjs +8 -4
- package/dist-types/agent/no-unused-imports.d.ts +4 -0
- package/dist-types/index.d.ts +3 -0
- package/package.json +1 -1
- package/src/agent/no-unused-imports.ts +102 -0
- package/src/index.ts +4 -0
package/dist-cjs/metafile.json
CHANGED
|
@@ -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":
|
|
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":
|
|
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":
|
|
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
|
package/dist-mjs/index.mjs
CHANGED
|
@@ -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,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,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
|
package/dist-types/index.d.ts
CHANGED
|
@@ -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-
|
|
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
|
},
|