driftdetect-core 0.6.1 → 0.7.0
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/LICENSE +21 -0
- package/dist/constants/analysis/categorizer.d.ts +27 -0
- package/dist/constants/analysis/categorizer.d.ts.map +1 -0
- package/dist/constants/analysis/categorizer.js +364 -0
- package/dist/constants/analysis/categorizer.js.map +1 -0
- package/dist/constants/analysis/consistency-analyzer.d.ts +77 -0
- package/dist/constants/analysis/consistency-analyzer.d.ts.map +1 -0
- package/dist/constants/analysis/consistency-analyzer.js +176 -0
- package/dist/constants/analysis/consistency-analyzer.js.map +1 -0
- package/dist/constants/analysis/dead-constant-detector.d.ts +79 -0
- package/dist/constants/analysis/dead-constant-detector.d.ts.map +1 -0
- package/dist/constants/analysis/dead-constant-detector.js +242 -0
- package/dist/constants/analysis/dead-constant-detector.js.map +1 -0
- package/dist/constants/analysis/magic-detector.d.ts +116 -0
- package/dist/constants/analysis/magic-detector.d.ts.map +1 -0
- package/dist/constants/analysis/magic-detector.js +425 -0
- package/dist/constants/analysis/magic-detector.js.map +1 -0
- package/dist/constants/analysis/reference-finder.d.ts +87 -0
- package/dist/constants/analysis/reference-finder.d.ts.map +1 -0
- package/dist/constants/analysis/reference-finder.js +269 -0
- package/dist/constants/analysis/reference-finder.js.map +1 -0
- package/dist/constants/analysis/security-scanner.d.ts +115 -0
- package/dist/constants/analysis/security-scanner.d.ts.map +1 -0
- package/dist/constants/analysis/security-scanner.js +429 -0
- package/dist/constants/analysis/security-scanner.js.map +1 -0
- package/dist/constants/extractors/base-extractor.d.ts +97 -0
- package/dist/constants/extractors/base-extractor.d.ts.map +1 -0
- package/dist/constants/extractors/base-extractor.js +285 -0
- package/dist/constants/extractors/base-extractor.js.map +1 -0
- package/dist/constants/extractors/regex/base-regex.d.ts +67 -0
- package/dist/constants/extractors/regex/base-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/base-regex.js +209 -0
- package/dist/constants/extractors/regex/base-regex.js.map +1 -0
- package/dist/constants/extractors/regex/csharp-regex.d.ts +39 -0
- package/dist/constants/extractors/regex/csharp-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/csharp-regex.js +316 -0
- package/dist/constants/extractors/regex/csharp-regex.js.map +1 -0
- package/dist/constants/extractors/regex/go-regex.d.ts +40 -0
- package/dist/constants/extractors/regex/go-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/go-regex.js +297 -0
- package/dist/constants/extractors/regex/go-regex.js.map +1 -0
- package/dist/constants/extractors/regex/java-regex.d.ts +43 -0
- package/dist/constants/extractors/regex/java-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/java-regex.js +276 -0
- package/dist/constants/extractors/regex/java-regex.js.map +1 -0
- package/dist/constants/extractors/regex/php-regex.d.ts +39 -0
- package/dist/constants/extractors/regex/php-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/php-regex.js +270 -0
- package/dist/constants/extractors/regex/php-regex.js.map +1 -0
- package/dist/constants/extractors/regex/python-regex.d.ts +39 -0
- package/dist/constants/extractors/regex/python-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/python-regex.js +287 -0
- package/dist/constants/extractors/regex/python-regex.js.map +1 -0
- package/dist/constants/extractors/regex/typescript-regex.d.ts +35 -0
- package/dist/constants/extractors/regex/typescript-regex.d.ts.map +1 -0
- package/dist/constants/extractors/regex/typescript-regex.js +313 -0
- package/dist/constants/extractors/regex/typescript-regex.js.map +1 -0
- package/dist/constants/index.d.ts +26 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +36 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/integration/callgraph-adapter.d.ts +167 -0
- package/dist/constants/integration/callgraph-adapter.d.ts.map +1 -0
- package/dist/constants/integration/callgraph-adapter.js +287 -0
- package/dist/constants/integration/callgraph-adapter.js.map +1 -0
- package/dist/constants/integration/index.d.ts +10 -0
- package/dist/constants/integration/index.d.ts.map +1 -0
- package/dist/constants/integration/index.js +13 -0
- package/dist/constants/integration/index.js.map +1 -0
- package/dist/constants/integration/pattern-adapter.d.ts +171 -0
- package/dist/constants/integration/pattern-adapter.d.ts.map +1 -0
- package/dist/constants/integration/pattern-adapter.js +331 -0
- package/dist/constants/integration/pattern-adapter.js.map +1 -0
- package/dist/constants/integration/scanner-adapter.d.ts +153 -0
- package/dist/constants/integration/scanner-adapter.d.ts.map +1 -0
- package/dist/constants/integration/scanner-adapter.js +337 -0
- package/dist/constants/integration/scanner-adapter.js.map +1 -0
- package/dist/constants/store/constant-store.d.ts +117 -0
- package/dist/constants/store/constant-store.d.ts.map +1 -0
- package/dist/constants/store/constant-store.js +367 -0
- package/dist/constants/store/constant-store.js.map +1 -0
- package/dist/constants/types.d.ts +423 -0
- package/dist/constants/types.d.ts.map +1 -0
- package/dist/constants/types.js +43 -0
- package/dist/constants/types.js.map +1 -0
- package/dist/environment/env-scanner.d.ts +53 -0
- package/dist/environment/env-scanner.d.ts.map +1 -0
- package/dist/environment/env-scanner.js +290 -0
- package/dist/environment/env-scanner.js.map +1 -0
- package/dist/environment/env-store.d.ts +70 -0
- package/dist/environment/env-store.d.ts.map +1 -0
- package/dist/environment/env-store.js +201 -0
- package/dist/environment/env-store.js.map +1 -0
- package/dist/environment/extractors/base-env-extractor.d.ts +56 -0
- package/dist/environment/extractors/base-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/base-env-extractor.js +74 -0
- package/dist/environment/extractors/base-env-extractor.js.map +1 -0
- package/dist/environment/extractors/csharp-env-extractor.d.ts +49 -0
- package/dist/environment/extractors/csharp-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/csharp-env-extractor.js +240 -0
- package/dist/environment/extractors/csharp-env-extractor.js.map +1 -0
- package/dist/environment/extractors/go-env-extractor.d.ts +53 -0
- package/dist/environment/extractors/go-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/go-env-extractor.js +267 -0
- package/dist/environment/extractors/go-env-extractor.js.map +1 -0
- package/dist/environment/extractors/index.d.ts +13 -0
- package/dist/environment/extractors/index.d.ts.map +1 -0
- package/dist/environment/extractors/index.js +13 -0
- package/dist/environment/extractors/index.js.map +1 -0
- package/dist/environment/extractors/java-env-extractor.d.ts +58 -0
- package/dist/environment/extractors/java-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/java-env-extractor.js +219 -0
- package/dist/environment/extractors/java-env-extractor.js.map +1 -0
- package/dist/environment/extractors/php-env-extractor.d.ts +58 -0
- package/dist/environment/extractors/php-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/php-env-extractor.js +231 -0
- package/dist/environment/extractors/php-env-extractor.js.map +1 -0
- package/dist/environment/extractors/python-env-extractor.d.ts +50 -0
- package/dist/environment/extractors/python-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/python-env-extractor.js +219 -0
- package/dist/environment/extractors/python-env-extractor.js.map +1 -0
- package/dist/environment/extractors/typescript-env-extractor.d.ts +54 -0
- package/dist/environment/extractors/typescript-env-extractor.d.ts.map +1 -0
- package/dist/environment/extractors/typescript-env-extractor.js +228 -0
- package/dist/environment/extractors/typescript-env-extractor.js.map +1 -0
- package/dist/environment/index.d.ts +11 -0
- package/dist/environment/index.d.ts.map +1 -0
- package/dist/environment/index.js +15 -0
- package/dist/environment/index.js.map +1 -0
- package/dist/environment/types.d.ts +145 -0
- package/dist/environment/types.d.ts.map +1 -0
- package/dist/environment/types.js +84 -0
- package/dist/environment/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency-analyzer.js","sourceRoot":"","sources":["../../../src/constants/analysis/consistency-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead Constant Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects constants that are defined but never used (dead code).
|
|
5
|
+
*/
|
|
6
|
+
import type { ConstantExtraction, EnumExtraction, DeadConstant, ConstantReference } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for dead constant detection
|
|
9
|
+
*/
|
|
10
|
+
export interface DeadConstantConfig {
|
|
11
|
+
/** Include test-only references as "used" */
|
|
12
|
+
countTestReferences: boolean;
|
|
13
|
+
/** Include deprecated constants */
|
|
14
|
+
includeDeprecated: boolean;
|
|
15
|
+
/** File patterns to exclude from analysis */
|
|
16
|
+
excludePatterns: string[];
|
|
17
|
+
/** Minimum confidence to report */
|
|
18
|
+
minConfidence: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Default dead constant config
|
|
22
|
+
*/
|
|
23
|
+
export declare const DEFAULT_DEAD_CONSTANT_CONFIG: DeadConstantConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Result of dead constant detection
|
|
26
|
+
*/
|
|
27
|
+
export interface DeadConstantResult {
|
|
28
|
+
/** Dead constants found */
|
|
29
|
+
deadConstants: DeadConstant[];
|
|
30
|
+
/** Total constants analyzed */
|
|
31
|
+
totalAnalyzed: number;
|
|
32
|
+
/** Detection time in ms */
|
|
33
|
+
detectionTimeMs: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Dead constant detector
|
|
37
|
+
*/
|
|
38
|
+
export declare class DeadConstantDetector {
|
|
39
|
+
private config;
|
|
40
|
+
constructor(config?: Partial<DeadConstantConfig>);
|
|
41
|
+
/**
|
|
42
|
+
* Detect dead constants
|
|
43
|
+
*/
|
|
44
|
+
detect(constants: ConstantExtraction[], enums: EnumExtraction[], references: Map<string, ConstantReference[]>): DeadConstantResult;
|
|
45
|
+
/**
|
|
46
|
+
* Analyze a single constant for dead code
|
|
47
|
+
*/
|
|
48
|
+
private analyzeConstant;
|
|
49
|
+
/**
|
|
50
|
+
* Analyze an enum for dead code
|
|
51
|
+
*/
|
|
52
|
+
private analyzeEnum;
|
|
53
|
+
/**
|
|
54
|
+
* Filter references based on configuration
|
|
55
|
+
*/
|
|
56
|
+
private filterReferences;
|
|
57
|
+
/**
|
|
58
|
+
* Check if a constant has deprecated annotation
|
|
59
|
+
*/
|
|
60
|
+
private isDeprecated;
|
|
61
|
+
/**
|
|
62
|
+
* Check if an enum has deprecated annotation
|
|
63
|
+
*/
|
|
64
|
+
private isEnumDeprecated;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a file is a test file
|
|
67
|
+
*/
|
|
68
|
+
private isTestFile;
|
|
69
|
+
/**
|
|
70
|
+
* Check if a file should be excluded
|
|
71
|
+
*/
|
|
72
|
+
private shouldExcludeFile;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Quick check if a constant is potentially dead
|
|
76
|
+
* (for use during scanning without full reference analysis)
|
|
77
|
+
*/
|
|
78
|
+
export declare function isLikelyDead(constant: ConstantExtraction, fileContent: string): boolean;
|
|
79
|
+
//# sourceMappingURL=dead-constant-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-constant-detector.d.ts","sourceRoot":"","sources":["../../../src/constants/analysis/dead-constant-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mCAAmC;IACnC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,6CAA6C;IAC7C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,kBAK1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAIpD;;OAEG;IACH,MAAM,CACJ,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,cAAc,EAAE,EACvB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAC3C,kBAAkB;IAwCrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwDvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAQ1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAOT"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead Constant Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects constants that are defined but never used (dead code).
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default dead constant config
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_DEAD_CONSTANT_CONFIG = {
|
|
10
|
+
countTestReferences: false,
|
|
11
|
+
includeDeprecated: true,
|
|
12
|
+
excludePatterns: ['node_modules', 'dist', 'build', '.git'],
|
|
13
|
+
minConfidence: 0.7,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Dead constant detector
|
|
17
|
+
*/
|
|
18
|
+
export class DeadConstantDetector {
|
|
19
|
+
config;
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.config = { ...DEFAULT_DEAD_CONSTANT_CONFIG, ...config };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Detect dead constants
|
|
25
|
+
*/
|
|
26
|
+
detect(constants, enums, references) {
|
|
27
|
+
const startTime = performance.now();
|
|
28
|
+
const deadConstants = [];
|
|
29
|
+
// Check each constant
|
|
30
|
+
for (const constant of constants) {
|
|
31
|
+
// Skip excluded files
|
|
32
|
+
if (this.shouldExcludeFile(constant.file)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const result = this.analyzeConstant(constant, references);
|
|
36
|
+
if (result && result.confidence >= this.config.minConfidence) {
|
|
37
|
+
deadConstants.push(result);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Check each enum
|
|
41
|
+
for (const enumDef of enums) {
|
|
42
|
+
// Skip excluded files
|
|
43
|
+
if (this.shouldExcludeFile(enumDef.file)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const result = this.analyzeEnum(enumDef, references);
|
|
47
|
+
if (result && result.confidence >= this.config.minConfidence) {
|
|
48
|
+
deadConstants.push(result);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Sort by confidence (highest first)
|
|
52
|
+
deadConstants.sort((a, b) => b.confidence - a.confidence);
|
|
53
|
+
return {
|
|
54
|
+
deadConstants,
|
|
55
|
+
totalAnalyzed: constants.length + enums.length,
|
|
56
|
+
detectionTimeMs: performance.now() - startTime,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Analyze a single constant for dead code
|
|
61
|
+
*/
|
|
62
|
+
analyzeConstant(constant, references) {
|
|
63
|
+
const refs = references.get(constant.id) || [];
|
|
64
|
+
// Check for deprecated annotation
|
|
65
|
+
if (this.isDeprecated(constant)) {
|
|
66
|
+
if (!this.config.includeDeprecated) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
id: constant.id,
|
|
71
|
+
name: constant.name,
|
|
72
|
+
file: constant.file,
|
|
73
|
+
line: constant.line,
|
|
74
|
+
confidence: 0.9,
|
|
75
|
+
reason: 'deprecated_annotation',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Filter references based on config
|
|
79
|
+
const effectiveRefs = this.filterReferences(refs, constant.file);
|
|
80
|
+
// No references at all
|
|
81
|
+
if (effectiveRefs.length === 0) {
|
|
82
|
+
// Check if it's exported - exported constants might be used externally
|
|
83
|
+
const confidence = constant.isExported ? 0.6 : 0.95;
|
|
84
|
+
return {
|
|
85
|
+
id: constant.id,
|
|
86
|
+
name: constant.name,
|
|
87
|
+
file: constant.file,
|
|
88
|
+
line: constant.line,
|
|
89
|
+
confidence,
|
|
90
|
+
reason: 'no_references',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Only test references
|
|
94
|
+
if (!this.config.countTestReferences) {
|
|
95
|
+
const nonTestRefs = effectiveRefs.filter(r => !this.isTestFile(r.file));
|
|
96
|
+
if (nonTestRefs.length === 0 && effectiveRefs.length > 0) {
|
|
97
|
+
return {
|
|
98
|
+
id: constant.id,
|
|
99
|
+
name: constant.name,
|
|
100
|
+
file: constant.file,
|
|
101
|
+
line: constant.line,
|
|
102
|
+
confidence: 0.8,
|
|
103
|
+
reason: 'only_test_references',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Analyze an enum for dead code
|
|
111
|
+
*/
|
|
112
|
+
analyzeEnum(enumDef, references) {
|
|
113
|
+
const refs = references.get(enumDef.id) || [];
|
|
114
|
+
// Check for deprecated annotation
|
|
115
|
+
if (this.isEnumDeprecated(enumDef)) {
|
|
116
|
+
if (!this.config.includeDeprecated) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
id: enumDef.id,
|
|
121
|
+
name: enumDef.name,
|
|
122
|
+
file: enumDef.file,
|
|
123
|
+
line: enumDef.line,
|
|
124
|
+
confidence: 0.9,
|
|
125
|
+
reason: 'deprecated_annotation',
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Filter references
|
|
129
|
+
const effectiveRefs = this.filterReferences(refs, enumDef.file);
|
|
130
|
+
// No references
|
|
131
|
+
if (effectiveRefs.length === 0) {
|
|
132
|
+
const confidence = enumDef.isExported ? 0.6 : 0.95;
|
|
133
|
+
return {
|
|
134
|
+
id: enumDef.id,
|
|
135
|
+
name: enumDef.name,
|
|
136
|
+
file: enumDef.file,
|
|
137
|
+
line: enumDef.line,
|
|
138
|
+
confidence,
|
|
139
|
+
reason: 'no_references',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Only test references
|
|
143
|
+
if (!this.config.countTestReferences) {
|
|
144
|
+
const nonTestRefs = effectiveRefs.filter(r => !this.isTestFile(r.file));
|
|
145
|
+
if (nonTestRefs.length === 0 && effectiveRefs.length > 0) {
|
|
146
|
+
return {
|
|
147
|
+
id: enumDef.id,
|
|
148
|
+
name: enumDef.name,
|
|
149
|
+
file: enumDef.file,
|
|
150
|
+
line: enumDef.line,
|
|
151
|
+
confidence: 0.8,
|
|
152
|
+
reason: 'only_test_references',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Filter references based on configuration
|
|
160
|
+
*/
|
|
161
|
+
filterReferences(refs, definitionFile) {
|
|
162
|
+
return refs.filter(ref => {
|
|
163
|
+
// Exclude self-references (same file, same line)
|
|
164
|
+
if (ref.file === definitionFile) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
// Exclude references in excluded patterns
|
|
168
|
+
if (this.shouldExcludeFile(ref.file)) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if a constant has deprecated annotation
|
|
176
|
+
*/
|
|
177
|
+
isDeprecated(constant) {
|
|
178
|
+
// Check decorators
|
|
179
|
+
if (constant.decorators.some(d => d.toLowerCase().includes('deprecated') ||
|
|
180
|
+
d.toLowerCase().includes('obsolete'))) {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
// Check doc comment
|
|
184
|
+
if (constant.docComment?.toLowerCase().includes('@deprecated')) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if an enum has deprecated annotation
|
|
191
|
+
*/
|
|
192
|
+
isEnumDeprecated(enumDef) {
|
|
193
|
+
if (enumDef.decorators.some(d => d.toLowerCase().includes('deprecated') ||
|
|
194
|
+
d.toLowerCase().includes('obsolete'))) {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
if (enumDef.docComment?.toLowerCase().includes('@deprecated')) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Check if a file is a test file
|
|
204
|
+
*/
|
|
205
|
+
isTestFile(filePath) {
|
|
206
|
+
return (filePath.includes('.test.') ||
|
|
207
|
+
filePath.includes('.spec.') ||
|
|
208
|
+
filePath.includes('__tests__') ||
|
|
209
|
+
filePath.includes('__mocks__') ||
|
|
210
|
+
filePath.includes('/test/') ||
|
|
211
|
+
filePath.includes('/tests/'));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if a file should be excluded
|
|
215
|
+
*/
|
|
216
|
+
shouldExcludeFile(filePath) {
|
|
217
|
+
for (const pattern of this.config.excludePatterns) {
|
|
218
|
+
if (filePath.includes(pattern)) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Quick check if a constant is potentially dead
|
|
227
|
+
* (for use during scanning without full reference analysis)
|
|
228
|
+
*/
|
|
229
|
+
export function isLikelyDead(constant, fileContent) {
|
|
230
|
+
// Count occurrences of the constant name in the file
|
|
231
|
+
const pattern = new RegExp(`\\b${escapeRegex(constant.name)}\\b`, 'g');
|
|
232
|
+
const matches = fileContent.match(pattern);
|
|
233
|
+
// If only appears once (the definition), likely dead
|
|
234
|
+
return !matches || matches.length <= 1;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Escape special regex characters
|
|
238
|
+
*/
|
|
239
|
+
function escapeRegex(str) {
|
|
240
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=dead-constant-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-constant-detector.js","sourceRoot":"","sources":["../../../src/constants/analysis/dead-constant-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic Value Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects hardcoded "magic" values (numbers and strings) that should
|
|
5
|
+
* be extracted into named constants.
|
|
6
|
+
*/
|
|
7
|
+
import type { MagicValue } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for magic value detection
|
|
10
|
+
*/
|
|
11
|
+
export interface MagicDetectorConfig {
|
|
12
|
+
/** Minimum occurrences to flag as magic */
|
|
13
|
+
minOccurrences: number;
|
|
14
|
+
/** Values to ignore (common acceptable values) */
|
|
15
|
+
ignoreValues: (string | number)[];
|
|
16
|
+
/** File patterns to ignore */
|
|
17
|
+
ignorePatterns: string[];
|
|
18
|
+
/** Include string literals */
|
|
19
|
+
includeStrings: boolean;
|
|
20
|
+
/** Include numeric literals */
|
|
21
|
+
includeNumbers: boolean;
|
|
22
|
+
/** Minimum string length to consider */
|
|
23
|
+
minStringLength: number;
|
|
24
|
+
/** Maximum string length to consider */
|
|
25
|
+
maxStringLength: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Default magic detector config
|
|
29
|
+
*/
|
|
30
|
+
export declare const DEFAULT_MAGIC_DETECTOR_CONFIG: MagicDetectorConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Result of magic value detection
|
|
33
|
+
*/
|
|
34
|
+
export interface MagicDetectionResult {
|
|
35
|
+
/** All magic values found */
|
|
36
|
+
magicValues: MagicValue[];
|
|
37
|
+
/** Total occurrences across all magic values */
|
|
38
|
+
totalOccurrences: number;
|
|
39
|
+
/** Files with magic values */
|
|
40
|
+
filesAffected: number;
|
|
41
|
+
/** Detection time in ms */
|
|
42
|
+
detectionTimeMs: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Magic value detector
|
|
46
|
+
*/
|
|
47
|
+
export declare class MagicValueDetector {
|
|
48
|
+
private config;
|
|
49
|
+
private ignoreSet;
|
|
50
|
+
constructor(config?: Partial<MagicDetectorConfig>);
|
|
51
|
+
/**
|
|
52
|
+
* Detect magic values in the given files
|
|
53
|
+
*/
|
|
54
|
+
detect(files: Map<string, string>): MagicDetectionResult;
|
|
55
|
+
/**
|
|
56
|
+
* Extract literals from a file
|
|
57
|
+
*/
|
|
58
|
+
private extractLiterals;
|
|
59
|
+
/**
|
|
60
|
+
* Extract string literals from a line
|
|
61
|
+
*/
|
|
62
|
+
private extractStringLiterals;
|
|
63
|
+
/**
|
|
64
|
+
* Extract numeric literals from a line
|
|
65
|
+
*/
|
|
66
|
+
private extractNumericLiterals;
|
|
67
|
+
/**
|
|
68
|
+
* Add an occurrence to the value map
|
|
69
|
+
*/
|
|
70
|
+
private addOccurrence;
|
|
71
|
+
/**
|
|
72
|
+
* Check if a value should be ignored
|
|
73
|
+
*/
|
|
74
|
+
private shouldIgnoreValue;
|
|
75
|
+
/**
|
|
76
|
+
* Build magic values from occurrence map
|
|
77
|
+
*/
|
|
78
|
+
private buildMagicValues;
|
|
79
|
+
/**
|
|
80
|
+
* Suggest a constant name for a magic value
|
|
81
|
+
*/
|
|
82
|
+
private suggestConstantName;
|
|
83
|
+
/**
|
|
84
|
+
* Suggest a category for a magic value
|
|
85
|
+
*/
|
|
86
|
+
private suggestCategory;
|
|
87
|
+
/**
|
|
88
|
+
* Calculate severity based on occurrences and value type
|
|
89
|
+
*/
|
|
90
|
+
private calculateSeverity;
|
|
91
|
+
/**
|
|
92
|
+
* Check if a line is a comment
|
|
93
|
+
*/
|
|
94
|
+
private isCommentLine;
|
|
95
|
+
/**
|
|
96
|
+
* Check if a line is a constant definition
|
|
97
|
+
*/
|
|
98
|
+
private isConstantDefinition;
|
|
99
|
+
/**
|
|
100
|
+
* Check if a file should be excluded
|
|
101
|
+
*/
|
|
102
|
+
private shouldExcludeFile;
|
|
103
|
+
/**
|
|
104
|
+
* Infer language from file path
|
|
105
|
+
*/
|
|
106
|
+
private inferLanguage;
|
|
107
|
+
/**
|
|
108
|
+
* Extract context snippet
|
|
109
|
+
*/
|
|
110
|
+
private extractContext;
|
|
111
|
+
/**
|
|
112
|
+
* Find containing function
|
|
113
|
+
*/
|
|
114
|
+
private findContainingFunction;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=magic-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-detector.d.ts","sourceRoot":"","sources":["../../../src/constants/analysis/magic-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,UAAU,EAKX,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,YAAY,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAClC,8BAA8B;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,8BAA8B;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,mBAmB3C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAc;gBAEnB,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAKrD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,oBAAoB;IAiCxD;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmC7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,OAAO,CAAC,aAAa;IA+BrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAoB/B"}
|