driftdetect-core 0.6.1 → 0.7.1
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/constraints/store/constraint-store.d.ts.map +1 -1
- package/dist/constraints/store/constraint-store.js +37 -2
- package/dist/constraints/store/constraint-store.js.map +1 -1
- 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,425 @@
|
|
|
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 { inferCategory } from './categorizer.js';
|
|
8
|
+
/**
|
|
9
|
+
* Default magic detector config
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_MAGIC_DETECTOR_CONFIG = {
|
|
12
|
+
minOccurrences: 2,
|
|
13
|
+
ignoreValues: [
|
|
14
|
+
// Common acceptable numbers
|
|
15
|
+
0, 1, -1, 2, 10, 100, 1000,
|
|
16
|
+
// Common acceptable strings
|
|
17
|
+
'', ' ', '\n', '\t', '\r\n',
|
|
18
|
+
'true', 'false', 'null', 'undefined', 'none', 'nil',
|
|
19
|
+
// Common format strings
|
|
20
|
+
'%s', '%d', '%f', '{}',
|
|
21
|
+
],
|
|
22
|
+
ignorePatterns: [
|
|
23
|
+
'test', 'spec', 'mock', '__tests__', '__mocks__',
|
|
24
|
+
'node_modules', 'dist', 'build',
|
|
25
|
+
],
|
|
26
|
+
includeStrings: true,
|
|
27
|
+
includeNumbers: true,
|
|
28
|
+
minStringLength: 3,
|
|
29
|
+
maxStringLength: 200,
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Magic value detector
|
|
33
|
+
*/
|
|
34
|
+
export class MagicValueDetector {
|
|
35
|
+
config;
|
|
36
|
+
ignoreSet;
|
|
37
|
+
constructor(config = {}) {
|
|
38
|
+
this.config = { ...DEFAULT_MAGIC_DETECTOR_CONFIG, ...config };
|
|
39
|
+
this.ignoreSet = new Set(this.config.ignoreValues.map(v => String(v)));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Detect magic values in the given files
|
|
43
|
+
*/
|
|
44
|
+
detect(files) {
|
|
45
|
+
const startTime = performance.now();
|
|
46
|
+
const valueMap = new Map();
|
|
47
|
+
for (const [filePath, content] of files) {
|
|
48
|
+
// Skip excluded files
|
|
49
|
+
if (this.shouldExcludeFile(filePath)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const language = this.inferLanguage(filePath);
|
|
53
|
+
this.extractLiterals(filePath, content, language, valueMap);
|
|
54
|
+
}
|
|
55
|
+
// Filter to magic values (multiple occurrences)
|
|
56
|
+
const magicValues = this.buildMagicValues(valueMap);
|
|
57
|
+
// Count affected files
|
|
58
|
+
const affectedFiles = new Set();
|
|
59
|
+
for (const mv of magicValues) {
|
|
60
|
+
for (const occ of mv.occurrences) {
|
|
61
|
+
affectedFiles.add(occ.file);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
magicValues,
|
|
66
|
+
totalOccurrences: magicValues.reduce((sum, mv) => sum + mv.occurrences.length, 0),
|
|
67
|
+
filesAffected: affectedFiles.size,
|
|
68
|
+
detectionTimeMs: performance.now() - startTime,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract literals from a file
|
|
73
|
+
*/
|
|
74
|
+
extractLiterals(filePath, content, language, valueMap) {
|
|
75
|
+
const lines = content.split('\n');
|
|
76
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
77
|
+
const line = lines[lineIndex];
|
|
78
|
+
if (!line)
|
|
79
|
+
continue;
|
|
80
|
+
const lineNumber = lineIndex + 1;
|
|
81
|
+
// Skip comment lines
|
|
82
|
+
if (this.isCommentLine(line, language)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Skip constant definitions (we want usages, not definitions)
|
|
86
|
+
if (this.isConstantDefinition(line, language)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Extract string literals
|
|
90
|
+
if (this.config.includeStrings) {
|
|
91
|
+
this.extractStringLiterals(filePath, line, lineNumber, lines, lineIndex, valueMap);
|
|
92
|
+
}
|
|
93
|
+
// Extract numeric literals
|
|
94
|
+
if (this.config.includeNumbers) {
|
|
95
|
+
this.extractNumericLiterals(filePath, line, lineNumber, lines, lineIndex, valueMap);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract string literals from a line
|
|
101
|
+
*/
|
|
102
|
+
extractStringLiterals(filePath, line, lineNumber, lines, lineIndex, valueMap) {
|
|
103
|
+
// Match double-quoted strings
|
|
104
|
+
const doubleQuotePattern = /"([^"\\]|\\.)*"/g;
|
|
105
|
+
let match;
|
|
106
|
+
while ((match = doubleQuotePattern.exec(line)) !== null) {
|
|
107
|
+
const value = match[0].slice(1, -1); // Remove quotes
|
|
108
|
+
this.addOccurrence(filePath, value, 'string', lineNumber, match.index, lines, lineIndex, valueMap);
|
|
109
|
+
}
|
|
110
|
+
// Match single-quoted strings
|
|
111
|
+
const singleQuotePattern = /'([^'\\]|\\.)*'/g;
|
|
112
|
+
while ((match = singleQuotePattern.exec(line)) !== null) {
|
|
113
|
+
const value = match[0].slice(1, -1);
|
|
114
|
+
this.addOccurrence(filePath, value, 'string', lineNumber, match.index, lines, lineIndex, valueMap);
|
|
115
|
+
}
|
|
116
|
+
// Match template literals (backticks) - only simple ones
|
|
117
|
+
const templatePattern = /`([^`\\]|\\.)*`/g;
|
|
118
|
+
while ((match = templatePattern.exec(line)) !== null) {
|
|
119
|
+
const value = match[0].slice(1, -1);
|
|
120
|
+
// Skip if contains interpolation
|
|
121
|
+
if (!value.includes('${')) {
|
|
122
|
+
this.addOccurrence(filePath, value, 'string', lineNumber, match.index, lines, lineIndex, valueMap);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Extract numeric literals from a line
|
|
128
|
+
*/
|
|
129
|
+
extractNumericLiterals(filePath, line, lineNumber, lines, lineIndex, valueMap) {
|
|
130
|
+
// Match numbers (integers and floats)
|
|
131
|
+
// Avoid matching numbers in identifiers or version strings
|
|
132
|
+
const numberPattern = /(?<![.\w])(-?\d+\.?\d*(?:[eE][+-]?\d+)?)\b(?![.\d])/g;
|
|
133
|
+
let match;
|
|
134
|
+
while ((match = numberPattern.exec(line)) !== null) {
|
|
135
|
+
const value = match[1];
|
|
136
|
+
if (!value)
|
|
137
|
+
continue;
|
|
138
|
+
// Skip if it looks like part of a version string
|
|
139
|
+
const beforeMatch = line.slice(Math.max(0, match.index - 5), match.index);
|
|
140
|
+
if (beforeMatch.match(/\d\./)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
this.addOccurrence(filePath, value, 'number', lineNumber, match.index, lines, lineIndex, valueMap);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Add an occurrence to the value map
|
|
148
|
+
*/
|
|
149
|
+
addOccurrence(filePath, value, type, lineNumber, column, lines, lineIndex, valueMap) {
|
|
150
|
+
// Check if should ignore
|
|
151
|
+
if (this.shouldIgnoreValue(value, type)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const key = `${type}:${value}`;
|
|
155
|
+
const occurrences = valueMap.get(key) || [];
|
|
156
|
+
const containingFunction = this.findContainingFunction(lines, lineIndex);
|
|
157
|
+
occurrences.push({
|
|
158
|
+
file: filePath,
|
|
159
|
+
line: lineNumber,
|
|
160
|
+
column: column + 1,
|
|
161
|
+
context: this.extractContext(lines, lineIndex),
|
|
162
|
+
...(containingFunction ? { containingFunction } : {}),
|
|
163
|
+
});
|
|
164
|
+
valueMap.set(key, occurrences);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if a value should be ignored
|
|
168
|
+
*/
|
|
169
|
+
shouldIgnoreValue(value, type) {
|
|
170
|
+
// Check ignore set
|
|
171
|
+
if (this.ignoreSet.has(value)) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
if (type === 'string') {
|
|
175
|
+
// Check length constraints
|
|
176
|
+
if (value.length < this.config.minStringLength || value.length > this.config.maxStringLength) {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
// Ignore URLs (they're often unique)
|
|
180
|
+
if (value.match(/^https?:\/\//)) {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
// Ignore file paths
|
|
184
|
+
if (value.match(/^[./\\]/) && value.includes('/')) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
// Ignore CSS classes and selectors
|
|
188
|
+
if (value.match(/^[.#][\w-]+$/)) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
// Ignore HTML tags
|
|
192
|
+
if (value.match(/^<\/?[\w-]+/)) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
// Ignore regex patterns
|
|
196
|
+
if (value.match(/^\^.*\$$/)) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (type === 'number') {
|
|
201
|
+
const num = parseFloat(value);
|
|
202
|
+
// Ignore common acceptable numbers
|
|
203
|
+
if ([0, 1, -1, 2, 10, 100, 1000].includes(num)) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
// Ignore very large numbers (likely IDs or timestamps)
|
|
207
|
+
if (Math.abs(num) > 1000000000) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Build magic values from occurrence map
|
|
215
|
+
*/
|
|
216
|
+
buildMagicValues(valueMap) {
|
|
217
|
+
const magicValues = [];
|
|
218
|
+
for (const [key, occurrences] of valueMap) {
|
|
219
|
+
// Only include if meets minimum occurrences
|
|
220
|
+
if (occurrences.length < this.config.minOccurrences) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const [type, ...valueParts] = key.split(':');
|
|
224
|
+
const value = valueParts.join(':'); // Rejoin in case value contained ':'
|
|
225
|
+
const parsedValue = type === 'number' ? parseFloat(value) : value;
|
|
226
|
+
const suggestedName = this.suggestConstantName(value, type);
|
|
227
|
+
const suggestedCategory = this.suggestCategory(value, type);
|
|
228
|
+
const severity = this.calculateSeverity(occurrences.length, type, value);
|
|
229
|
+
magicValues.push({
|
|
230
|
+
value: parsedValue,
|
|
231
|
+
type: type,
|
|
232
|
+
occurrences,
|
|
233
|
+
suggestedName,
|
|
234
|
+
suggestedCategory,
|
|
235
|
+
severity,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
// Sort by occurrence count (most frequent first)
|
|
239
|
+
magicValues.sort((a, b) => b.occurrences.length - a.occurrences.length);
|
|
240
|
+
return magicValues;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Suggest a constant name for a magic value
|
|
244
|
+
*/
|
|
245
|
+
suggestConstantName(value, type) {
|
|
246
|
+
if (type === 'number') {
|
|
247
|
+
const num = parseFloat(value);
|
|
248
|
+
// Common patterns
|
|
249
|
+
if (num === 60)
|
|
250
|
+
return 'SECONDS_PER_MINUTE';
|
|
251
|
+
if (num === 3600)
|
|
252
|
+
return 'SECONDS_PER_HOUR';
|
|
253
|
+
if (num === 86400)
|
|
254
|
+
return 'SECONDS_PER_DAY';
|
|
255
|
+
if (num === 1024)
|
|
256
|
+
return 'BYTES_PER_KB';
|
|
257
|
+
if (num === 1048576)
|
|
258
|
+
return 'BYTES_PER_MB';
|
|
259
|
+
// Generic number name
|
|
260
|
+
if (Number.isInteger(num)) {
|
|
261
|
+
return `VALUE_${Math.abs(num)}`;
|
|
262
|
+
}
|
|
263
|
+
return `VALUE_${value.replace('.', '_').replace('-', 'NEG_')}`;
|
|
264
|
+
}
|
|
265
|
+
// String value - convert to UPPER_SNAKE_CASE
|
|
266
|
+
let name = value
|
|
267
|
+
.toUpperCase()
|
|
268
|
+
.replace(/[^A-Z0-9]+/g, '_')
|
|
269
|
+
.replace(/^_+|_+$/g, '')
|
|
270
|
+
.slice(0, 30);
|
|
271
|
+
if (!name || /^\d/.test(name)) {
|
|
272
|
+
name = 'STRING_' + name;
|
|
273
|
+
}
|
|
274
|
+
return name || 'UNNAMED_CONSTANT';
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Suggest a category for a magic value
|
|
278
|
+
*/
|
|
279
|
+
suggestCategory(value, type) {
|
|
280
|
+
// Use the categorizer with a mock constant
|
|
281
|
+
const mockConstant = {
|
|
282
|
+
id: '',
|
|
283
|
+
name: this.suggestConstantName(value, type),
|
|
284
|
+
qualifiedName: '',
|
|
285
|
+
file: '',
|
|
286
|
+
line: 0,
|
|
287
|
+
column: 0,
|
|
288
|
+
endLine: 0,
|
|
289
|
+
language: 'typescript',
|
|
290
|
+
kind: 'primitive',
|
|
291
|
+
category: 'uncategorized',
|
|
292
|
+
value: type === 'number' ? parseFloat(value) : value,
|
|
293
|
+
isExported: false,
|
|
294
|
+
decorators: [],
|
|
295
|
+
modifiers: [],
|
|
296
|
+
confidence: 1,
|
|
297
|
+
};
|
|
298
|
+
return inferCategory(mockConstant);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Calculate severity based on occurrences and value type
|
|
302
|
+
*/
|
|
303
|
+
calculateSeverity(occurrenceCount, type, _value) {
|
|
304
|
+
// High severity for potential secrets
|
|
305
|
+
if (type === 'string') {
|
|
306
|
+
// Note: value-based checks removed - use security scanner for secrets
|
|
307
|
+
}
|
|
308
|
+
// Severity based on occurrence count
|
|
309
|
+
if (occurrenceCount >= 10)
|
|
310
|
+
return 'high';
|
|
311
|
+
if (occurrenceCount >= 5)
|
|
312
|
+
return 'medium';
|
|
313
|
+
if (occurrenceCount >= 3)
|
|
314
|
+
return 'low';
|
|
315
|
+
return 'info';
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Check if a line is a comment
|
|
319
|
+
*/
|
|
320
|
+
isCommentLine(line, _language) {
|
|
321
|
+
const trimmed = line.trim();
|
|
322
|
+
// Single-line comments
|
|
323
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*')) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
// Block comment markers
|
|
327
|
+
if (trimmed.startsWith('/*') || trimmed.startsWith('*/')) {
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
// Python docstrings
|
|
331
|
+
if (trimmed.startsWith('"""') || trimmed.startsWith("'''")) {
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Check if a line is a constant definition
|
|
338
|
+
*/
|
|
339
|
+
isConstantDefinition(line, _language) {
|
|
340
|
+
const trimmed = line.trim();
|
|
341
|
+
// TypeScript/JavaScript const
|
|
342
|
+
if (trimmed.match(/^(?:export\s+)?const\s+[A-Z][A-Z0-9_]*\s*=/)) {
|
|
343
|
+
return true;
|
|
344
|
+
}
|
|
345
|
+
// Python UPPER_CASE assignment
|
|
346
|
+
if (trimmed.match(/^[A-Z][A-Z0-9_]*\s*=/)) {
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
// Java/C# static final/const
|
|
350
|
+
if (trimmed.match(/(?:static\s+final|const)\s+\w+\s+[A-Z][A-Z0-9_]*\s*=/)) {
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
// PHP class constant
|
|
354
|
+
if (trimmed.match(/(?:public|private|protected)?\s*const\s+[A-Z][A-Z0-9_]*\s*=/)) {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
// Go const
|
|
358
|
+
if (trimmed.match(/^const\s+\w+\s*=/)) {
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Check if a file should be excluded
|
|
365
|
+
*/
|
|
366
|
+
shouldExcludeFile(filePath) {
|
|
367
|
+
for (const pattern of this.config.ignorePatterns) {
|
|
368
|
+
if (filePath.includes(pattern)) {
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Infer language from file path
|
|
376
|
+
*/
|
|
377
|
+
inferLanguage(filePath) {
|
|
378
|
+
if (filePath.endsWith('.ts') || filePath.endsWith('.tsx'))
|
|
379
|
+
return 'typescript';
|
|
380
|
+
if (filePath.endsWith('.js') || filePath.endsWith('.jsx'))
|
|
381
|
+
return 'javascript';
|
|
382
|
+
if (filePath.endsWith('.py'))
|
|
383
|
+
return 'python';
|
|
384
|
+
if (filePath.endsWith('.java'))
|
|
385
|
+
return 'java';
|
|
386
|
+
if (filePath.endsWith('.cs'))
|
|
387
|
+
return 'csharp';
|
|
388
|
+
if (filePath.endsWith('.php'))
|
|
389
|
+
return 'php';
|
|
390
|
+
if (filePath.endsWith('.go'))
|
|
391
|
+
return 'go';
|
|
392
|
+
return 'typescript'; // Default
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Extract context snippet
|
|
396
|
+
*/
|
|
397
|
+
extractContext(lines, lineIndex) {
|
|
398
|
+
const line = lines[lineIndex];
|
|
399
|
+
if (!line)
|
|
400
|
+
return '';
|
|
401
|
+
const trimmed = line.trim();
|
|
402
|
+
return trimmed.length <= 100 ? trimmed : trimmed.slice(0, 97) + '...';
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Find containing function
|
|
406
|
+
*/
|
|
407
|
+
findContainingFunction(lines, lineIndex) {
|
|
408
|
+
for (let i = lineIndex - 1; i >= 0; i--) {
|
|
409
|
+
const line = lines[i];
|
|
410
|
+
if (!line)
|
|
411
|
+
continue;
|
|
412
|
+
// Function patterns
|
|
413
|
+
const match = line.match(/(?:function\s+(\w+)|(\w+)\s*(?:=|:)\s*(?:async\s+)?(?:\([^)]*\)|[^=]+)\s*=>|def\s+(\w+)|func\s+(?:\([^)]+\)\s+)?(\w+))/);
|
|
414
|
+
if (match) {
|
|
415
|
+
return match[1] || match[2] || match[3] || match[4];
|
|
416
|
+
}
|
|
417
|
+
// Stop at class boundary
|
|
418
|
+
if (line.match(/^(?:class|interface|struct)\s+/)) {
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return undefined;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=magic-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-detector.js","sourceRoot":"","sources":["../../../src/constants/analysis/magic-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant Reference Finder
|
|
3
|
+
*
|
|
4
|
+
* Finds all usages of constants across the codebase.
|
|
5
|
+
* Supports cross-file reference tracking.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConstantExtraction, EnumExtraction, ConstantReference } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for reference finding
|
|
10
|
+
*/
|
|
11
|
+
export interface ReferenceFindConfig {
|
|
12
|
+
/** Maximum files to scan */
|
|
13
|
+
maxFiles?: number;
|
|
14
|
+
/** Include test files */
|
|
15
|
+
includeTests?: boolean;
|
|
16
|
+
/** File patterns to exclude */
|
|
17
|
+
excludePatterns?: string[];
|
|
18
|
+
/** Track reference context (containing function) */
|
|
19
|
+
trackContext?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Default reference find config
|
|
23
|
+
*/
|
|
24
|
+
export declare const DEFAULT_REFERENCE_FIND_CONFIG: Required<ReferenceFindConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Result of finding references for a constant
|
|
27
|
+
*/
|
|
28
|
+
export interface ReferenceResult {
|
|
29
|
+
/** The constant being referenced */
|
|
30
|
+
constant: ConstantExtraction | EnumExtraction;
|
|
31
|
+
/** All references found */
|
|
32
|
+
references: ConstantReference[];
|
|
33
|
+
/** Total count */
|
|
34
|
+
totalCount: number;
|
|
35
|
+
/** Files containing references */
|
|
36
|
+
filesWithReferences: string[];
|
|
37
|
+
/** Search time in ms */
|
|
38
|
+
searchTimeMs: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reference finder for constants
|
|
42
|
+
*/
|
|
43
|
+
export declare class ConstantReferenceFinder {
|
|
44
|
+
private config;
|
|
45
|
+
constructor(config?: ReferenceFindConfig);
|
|
46
|
+
/**
|
|
47
|
+
* Find all references to a constant in the given files
|
|
48
|
+
*/
|
|
49
|
+
findReferences(constant: ConstantExtraction | EnumExtraction, files: Map<string, string>): ReferenceResult;
|
|
50
|
+
/**
|
|
51
|
+
* Find references in a single file
|
|
52
|
+
*/
|
|
53
|
+
private findInFile;
|
|
54
|
+
/**
|
|
55
|
+
* Build search patterns for a constant
|
|
56
|
+
*/
|
|
57
|
+
private buildSearchPatterns;
|
|
58
|
+
/**
|
|
59
|
+
* Infer the type of reference from context
|
|
60
|
+
*/
|
|
61
|
+
private inferReferenceType;
|
|
62
|
+
/**
|
|
63
|
+
* Find the containing function for a line
|
|
64
|
+
*/
|
|
65
|
+
private findContainingFunction;
|
|
66
|
+
/**
|
|
67
|
+
* Find the containing class for a line
|
|
68
|
+
*/
|
|
69
|
+
private findContainingClass;
|
|
70
|
+
/**
|
|
71
|
+
* Extract context snippet around a line
|
|
72
|
+
*/
|
|
73
|
+
private extractContext;
|
|
74
|
+
/**
|
|
75
|
+
* Check if a file should be excluded
|
|
76
|
+
*/
|
|
77
|
+
private shouldExcludeFile;
|
|
78
|
+
/**
|
|
79
|
+
* Escape special regex characters
|
|
80
|
+
*/
|
|
81
|
+
private escapeRegex;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Batch find references for multiple constants
|
|
85
|
+
*/
|
|
86
|
+
export declare function findAllReferences(constants: (ConstantExtraction | EnumExtraction)[], files: Map<string, string>, config?: ReferenceFindConfig): Map<string, ReferenceResult>;
|
|
87
|
+
//# sourceMappingURL=reference-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-finder.d.ts","sourceRoot":"","sources":["../../../src/constants/analysis/reference-finder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,mBAAmB,CAKvE,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,QAAQ,EAAE,kBAAkB,GAAG,cAAc,CAAC;IAC9C,2BAA2B;IAC3B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAgC;gBAElC,MAAM,GAAE,mBAAwB;IAI5C;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,kBAAkB,GAAG,cAAc,EAC7C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzB,eAAe;IAyClB;;OAEG;IACH,OAAO,CAAC,UAAU;IA0DlB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyC3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6C9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuBzB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,CAAC,kBAAkB,GAAG,cAAc,CAAC,EAAE,EAClD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,MAAM,CAAC,EAAE,mBAAmB,GAC3B,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAU9B"}
|