@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.
- package/dist-cjs/index.cjs +667 -516
- package/dist-cjs/metafile.json +67 -4
- package/dist-mjs/agent/no-unused-imports.mjs +81 -0
- package/dist-mjs/agent/no-unused-service-variable.mjs +75 -0
- package/dist-mjs/index.mjs +12 -4
- package/dist-types/agent/no-unused-imports.d.ts +4 -0
- package/dist-types/agent/no-unused-service-variable.d.ts +4 -0
- package/dist-types/index.d.ts +6 -0
- package/package.json +1 -1
- package/src/agent/no-unused-imports.ts +102 -0
- package/src/agent/no-unused-service-variable.ts +92 -0
- package/src/index.ts +8 -0
package/dist-cjs/metafile.json
CHANGED
|
@@ -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":
|
|
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":
|
|
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":
|
|
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":
|
|
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
|
package/dist-mjs/index.mjs
CHANGED
|
@@ -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,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,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
|
package/dist-types/index.d.ts
CHANGED
|
@@ -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-
|
|
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
|
},
|