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.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/dist/constants/analysis/categorizer.d.ts +27 -0
  3. package/dist/constants/analysis/categorizer.d.ts.map +1 -0
  4. package/dist/constants/analysis/categorizer.js +364 -0
  5. package/dist/constants/analysis/categorizer.js.map +1 -0
  6. package/dist/constants/analysis/consistency-analyzer.d.ts +77 -0
  7. package/dist/constants/analysis/consistency-analyzer.d.ts.map +1 -0
  8. package/dist/constants/analysis/consistency-analyzer.js +176 -0
  9. package/dist/constants/analysis/consistency-analyzer.js.map +1 -0
  10. package/dist/constants/analysis/dead-constant-detector.d.ts +79 -0
  11. package/dist/constants/analysis/dead-constant-detector.d.ts.map +1 -0
  12. package/dist/constants/analysis/dead-constant-detector.js +242 -0
  13. package/dist/constants/analysis/dead-constant-detector.js.map +1 -0
  14. package/dist/constants/analysis/magic-detector.d.ts +116 -0
  15. package/dist/constants/analysis/magic-detector.d.ts.map +1 -0
  16. package/dist/constants/analysis/magic-detector.js +425 -0
  17. package/dist/constants/analysis/magic-detector.js.map +1 -0
  18. package/dist/constants/analysis/reference-finder.d.ts +87 -0
  19. package/dist/constants/analysis/reference-finder.d.ts.map +1 -0
  20. package/dist/constants/analysis/reference-finder.js +269 -0
  21. package/dist/constants/analysis/reference-finder.js.map +1 -0
  22. package/dist/constants/analysis/security-scanner.d.ts +115 -0
  23. package/dist/constants/analysis/security-scanner.d.ts.map +1 -0
  24. package/dist/constants/analysis/security-scanner.js +429 -0
  25. package/dist/constants/analysis/security-scanner.js.map +1 -0
  26. package/dist/constants/extractors/base-extractor.d.ts +97 -0
  27. package/dist/constants/extractors/base-extractor.d.ts.map +1 -0
  28. package/dist/constants/extractors/base-extractor.js +285 -0
  29. package/dist/constants/extractors/base-extractor.js.map +1 -0
  30. package/dist/constants/extractors/regex/base-regex.d.ts +67 -0
  31. package/dist/constants/extractors/regex/base-regex.d.ts.map +1 -0
  32. package/dist/constants/extractors/regex/base-regex.js +209 -0
  33. package/dist/constants/extractors/regex/base-regex.js.map +1 -0
  34. package/dist/constants/extractors/regex/csharp-regex.d.ts +39 -0
  35. package/dist/constants/extractors/regex/csharp-regex.d.ts.map +1 -0
  36. package/dist/constants/extractors/regex/csharp-regex.js +316 -0
  37. package/dist/constants/extractors/regex/csharp-regex.js.map +1 -0
  38. package/dist/constants/extractors/regex/go-regex.d.ts +40 -0
  39. package/dist/constants/extractors/regex/go-regex.d.ts.map +1 -0
  40. package/dist/constants/extractors/regex/go-regex.js +297 -0
  41. package/dist/constants/extractors/regex/go-regex.js.map +1 -0
  42. package/dist/constants/extractors/regex/java-regex.d.ts +43 -0
  43. package/dist/constants/extractors/regex/java-regex.d.ts.map +1 -0
  44. package/dist/constants/extractors/regex/java-regex.js +276 -0
  45. package/dist/constants/extractors/regex/java-regex.js.map +1 -0
  46. package/dist/constants/extractors/regex/php-regex.d.ts +39 -0
  47. package/dist/constants/extractors/regex/php-regex.d.ts.map +1 -0
  48. package/dist/constants/extractors/regex/php-regex.js +270 -0
  49. package/dist/constants/extractors/regex/php-regex.js.map +1 -0
  50. package/dist/constants/extractors/regex/python-regex.d.ts +39 -0
  51. package/dist/constants/extractors/regex/python-regex.d.ts.map +1 -0
  52. package/dist/constants/extractors/regex/python-regex.js +287 -0
  53. package/dist/constants/extractors/regex/python-regex.js.map +1 -0
  54. package/dist/constants/extractors/regex/typescript-regex.d.ts +35 -0
  55. package/dist/constants/extractors/regex/typescript-regex.d.ts.map +1 -0
  56. package/dist/constants/extractors/regex/typescript-regex.js +313 -0
  57. package/dist/constants/extractors/regex/typescript-regex.js.map +1 -0
  58. package/dist/constants/index.d.ts +26 -0
  59. package/dist/constants/index.d.ts.map +1 -0
  60. package/dist/constants/index.js +36 -0
  61. package/dist/constants/index.js.map +1 -0
  62. package/dist/constants/integration/callgraph-adapter.d.ts +167 -0
  63. package/dist/constants/integration/callgraph-adapter.d.ts.map +1 -0
  64. package/dist/constants/integration/callgraph-adapter.js +287 -0
  65. package/dist/constants/integration/callgraph-adapter.js.map +1 -0
  66. package/dist/constants/integration/index.d.ts +10 -0
  67. package/dist/constants/integration/index.d.ts.map +1 -0
  68. package/dist/constants/integration/index.js +13 -0
  69. package/dist/constants/integration/index.js.map +1 -0
  70. package/dist/constants/integration/pattern-adapter.d.ts +171 -0
  71. package/dist/constants/integration/pattern-adapter.d.ts.map +1 -0
  72. package/dist/constants/integration/pattern-adapter.js +331 -0
  73. package/dist/constants/integration/pattern-adapter.js.map +1 -0
  74. package/dist/constants/integration/scanner-adapter.d.ts +153 -0
  75. package/dist/constants/integration/scanner-adapter.d.ts.map +1 -0
  76. package/dist/constants/integration/scanner-adapter.js +337 -0
  77. package/dist/constants/integration/scanner-adapter.js.map +1 -0
  78. package/dist/constants/store/constant-store.d.ts +117 -0
  79. package/dist/constants/store/constant-store.d.ts.map +1 -0
  80. package/dist/constants/store/constant-store.js +367 -0
  81. package/dist/constants/store/constant-store.js.map +1 -0
  82. package/dist/constants/types.d.ts +423 -0
  83. package/dist/constants/types.d.ts.map +1 -0
  84. package/dist/constants/types.js +43 -0
  85. package/dist/constants/types.js.map +1 -0
  86. package/dist/environment/env-scanner.d.ts +53 -0
  87. package/dist/environment/env-scanner.d.ts.map +1 -0
  88. package/dist/environment/env-scanner.js +290 -0
  89. package/dist/environment/env-scanner.js.map +1 -0
  90. package/dist/environment/env-store.d.ts +70 -0
  91. package/dist/environment/env-store.d.ts.map +1 -0
  92. package/dist/environment/env-store.js +201 -0
  93. package/dist/environment/env-store.js.map +1 -0
  94. package/dist/environment/extractors/base-env-extractor.d.ts +56 -0
  95. package/dist/environment/extractors/base-env-extractor.d.ts.map +1 -0
  96. package/dist/environment/extractors/base-env-extractor.js +74 -0
  97. package/dist/environment/extractors/base-env-extractor.js.map +1 -0
  98. package/dist/environment/extractors/csharp-env-extractor.d.ts +49 -0
  99. package/dist/environment/extractors/csharp-env-extractor.d.ts.map +1 -0
  100. package/dist/environment/extractors/csharp-env-extractor.js +240 -0
  101. package/dist/environment/extractors/csharp-env-extractor.js.map +1 -0
  102. package/dist/environment/extractors/go-env-extractor.d.ts +53 -0
  103. package/dist/environment/extractors/go-env-extractor.d.ts.map +1 -0
  104. package/dist/environment/extractors/go-env-extractor.js +267 -0
  105. package/dist/environment/extractors/go-env-extractor.js.map +1 -0
  106. package/dist/environment/extractors/index.d.ts +13 -0
  107. package/dist/environment/extractors/index.d.ts.map +1 -0
  108. package/dist/environment/extractors/index.js +13 -0
  109. package/dist/environment/extractors/index.js.map +1 -0
  110. package/dist/environment/extractors/java-env-extractor.d.ts +58 -0
  111. package/dist/environment/extractors/java-env-extractor.d.ts.map +1 -0
  112. package/dist/environment/extractors/java-env-extractor.js +219 -0
  113. package/dist/environment/extractors/java-env-extractor.js.map +1 -0
  114. package/dist/environment/extractors/php-env-extractor.d.ts +58 -0
  115. package/dist/environment/extractors/php-env-extractor.d.ts.map +1 -0
  116. package/dist/environment/extractors/php-env-extractor.js +231 -0
  117. package/dist/environment/extractors/php-env-extractor.js.map +1 -0
  118. package/dist/environment/extractors/python-env-extractor.d.ts +50 -0
  119. package/dist/environment/extractors/python-env-extractor.d.ts.map +1 -0
  120. package/dist/environment/extractors/python-env-extractor.js +219 -0
  121. package/dist/environment/extractors/python-env-extractor.js.map +1 -0
  122. package/dist/environment/extractors/typescript-env-extractor.d.ts +54 -0
  123. package/dist/environment/extractors/typescript-env-extractor.d.ts.map +1 -0
  124. package/dist/environment/extractors/typescript-env-extractor.js +228 -0
  125. package/dist/environment/extractors/typescript-env-extractor.js.map +1 -0
  126. package/dist/environment/index.d.ts +11 -0
  127. package/dist/environment/index.d.ts.map +1 -0
  128. package/dist/environment/index.js +15 -0
  129. package/dist/environment/index.js.map +1 -0
  130. package/dist/environment/types.d.ts +145 -0
  131. package/dist/environment/types.d.ts.map +1 -0
  132. package/dist/environment/types.js +84 -0
  133. package/dist/environment/types.js.map +1 -0
  134. package/dist/index.d.ts +4 -0
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +40 -0
  137. package/dist/index.js.map +1 -1
  138. 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"}