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.
Files changed (141) 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/constraints/store/constraint-store.d.ts.map +1 -1
  87. package/dist/constraints/store/constraint-store.js +37 -2
  88. package/dist/constraints/store/constraint-store.js.map +1 -1
  89. package/dist/environment/env-scanner.d.ts +53 -0
  90. package/dist/environment/env-scanner.d.ts.map +1 -0
  91. package/dist/environment/env-scanner.js +290 -0
  92. package/dist/environment/env-scanner.js.map +1 -0
  93. package/dist/environment/env-store.d.ts +70 -0
  94. package/dist/environment/env-store.d.ts.map +1 -0
  95. package/dist/environment/env-store.js +201 -0
  96. package/dist/environment/env-store.js.map +1 -0
  97. package/dist/environment/extractors/base-env-extractor.d.ts +56 -0
  98. package/dist/environment/extractors/base-env-extractor.d.ts.map +1 -0
  99. package/dist/environment/extractors/base-env-extractor.js +74 -0
  100. package/dist/environment/extractors/base-env-extractor.js.map +1 -0
  101. package/dist/environment/extractors/csharp-env-extractor.d.ts +49 -0
  102. package/dist/environment/extractors/csharp-env-extractor.d.ts.map +1 -0
  103. package/dist/environment/extractors/csharp-env-extractor.js +240 -0
  104. package/dist/environment/extractors/csharp-env-extractor.js.map +1 -0
  105. package/dist/environment/extractors/go-env-extractor.d.ts +53 -0
  106. package/dist/environment/extractors/go-env-extractor.d.ts.map +1 -0
  107. package/dist/environment/extractors/go-env-extractor.js +267 -0
  108. package/dist/environment/extractors/go-env-extractor.js.map +1 -0
  109. package/dist/environment/extractors/index.d.ts +13 -0
  110. package/dist/environment/extractors/index.d.ts.map +1 -0
  111. package/dist/environment/extractors/index.js +13 -0
  112. package/dist/environment/extractors/index.js.map +1 -0
  113. package/dist/environment/extractors/java-env-extractor.d.ts +58 -0
  114. package/dist/environment/extractors/java-env-extractor.d.ts.map +1 -0
  115. package/dist/environment/extractors/java-env-extractor.js +219 -0
  116. package/dist/environment/extractors/java-env-extractor.js.map +1 -0
  117. package/dist/environment/extractors/php-env-extractor.d.ts +58 -0
  118. package/dist/environment/extractors/php-env-extractor.d.ts.map +1 -0
  119. package/dist/environment/extractors/php-env-extractor.js +231 -0
  120. package/dist/environment/extractors/php-env-extractor.js.map +1 -0
  121. package/dist/environment/extractors/python-env-extractor.d.ts +50 -0
  122. package/dist/environment/extractors/python-env-extractor.d.ts.map +1 -0
  123. package/dist/environment/extractors/python-env-extractor.js +219 -0
  124. package/dist/environment/extractors/python-env-extractor.js.map +1 -0
  125. package/dist/environment/extractors/typescript-env-extractor.d.ts +54 -0
  126. package/dist/environment/extractors/typescript-env-extractor.d.ts.map +1 -0
  127. package/dist/environment/extractors/typescript-env-extractor.js +228 -0
  128. package/dist/environment/extractors/typescript-env-extractor.js.map +1 -0
  129. package/dist/environment/index.d.ts +11 -0
  130. package/dist/environment/index.d.ts.map +1 -0
  131. package/dist/environment/index.js +15 -0
  132. package/dist/environment/index.js.map +1 -0
  133. package/dist/environment/types.d.ts +145 -0
  134. package/dist/environment/types.d.ts.map +1 -0
  135. package/dist/environment/types.js +84 -0
  136. package/dist/environment/types.js.map +1 -0
  137. package/dist/index.d.ts +4 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +40 -0
  140. package/dist/index.js.map +1 -1
  141. 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"}