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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant Reference Finder
|
|
3
|
+
*
|
|
4
|
+
* Finds all usages of constants across the codebase.
|
|
5
|
+
* Supports cross-file reference tracking.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default reference find config
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_REFERENCE_FIND_CONFIG = {
|
|
11
|
+
maxFiles: 10000,
|
|
12
|
+
includeTests: true,
|
|
13
|
+
excludePatterns: ['node_modules', 'dist', 'build', '.git'],
|
|
14
|
+
trackContext: true,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Reference finder for constants
|
|
18
|
+
*/
|
|
19
|
+
export class ConstantReferenceFinder {
|
|
20
|
+
config;
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
this.config = { ...DEFAULT_REFERENCE_FIND_CONFIG, ...config };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find all references to a constant in the given files
|
|
26
|
+
*/
|
|
27
|
+
findReferences(constant, files) {
|
|
28
|
+
const startTime = performance.now();
|
|
29
|
+
const references = [];
|
|
30
|
+
const filesWithReferences = new Set();
|
|
31
|
+
// Build search patterns for this constant
|
|
32
|
+
const patterns = this.buildSearchPatterns(constant);
|
|
33
|
+
for (const [filePath, content] of files) {
|
|
34
|
+
// Skip excluded patterns
|
|
35
|
+
if (this.shouldExcludeFile(filePath)) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Skip the definition file for the same line
|
|
39
|
+
const isDefinitionFile = filePath === constant.file;
|
|
40
|
+
// Search for references
|
|
41
|
+
const fileRefs = this.findInFile(constant, patterns, filePath, content, isDefinitionFile);
|
|
42
|
+
if (fileRefs.length > 0) {
|
|
43
|
+
references.push(...fileRefs);
|
|
44
|
+
filesWithReferences.add(filePath);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
constant,
|
|
49
|
+
references,
|
|
50
|
+
totalCount: references.length,
|
|
51
|
+
filesWithReferences: Array.from(filesWithReferences),
|
|
52
|
+
searchTimeMs: performance.now() - startTime,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find references in a single file
|
|
57
|
+
*/
|
|
58
|
+
findInFile(constant, patterns, filePath, content, isDefinitionFile) {
|
|
59
|
+
const references = [];
|
|
60
|
+
const lines = content.split('\n');
|
|
61
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
62
|
+
const line = lines[lineIndex];
|
|
63
|
+
if (!line)
|
|
64
|
+
continue;
|
|
65
|
+
const lineNumber = lineIndex + 1;
|
|
66
|
+
// Skip the definition line
|
|
67
|
+
if (isDefinitionFile && lineNumber === constant.line) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
for (const pattern of patterns) {
|
|
71
|
+
pattern.lastIndex = 0; // Reset regex state
|
|
72
|
+
let match;
|
|
73
|
+
while ((match = pattern.exec(line)) !== null) {
|
|
74
|
+
const column = match.index + 1;
|
|
75
|
+
// Determine reference type
|
|
76
|
+
const referenceType = this.inferReferenceType(line, match.index);
|
|
77
|
+
// Get containing function if tracking context
|
|
78
|
+
const containingFunction = this.config.trackContext
|
|
79
|
+
? this.findContainingFunction(lines, lineIndex)
|
|
80
|
+
: undefined;
|
|
81
|
+
// Get containing class
|
|
82
|
+
const containingClass = this.config.trackContext
|
|
83
|
+
? this.findContainingClass(lines, lineIndex)
|
|
84
|
+
: undefined;
|
|
85
|
+
references.push({
|
|
86
|
+
constantId: constant.id,
|
|
87
|
+
constantName: constant.name,
|
|
88
|
+
file: filePath,
|
|
89
|
+
line: lineNumber,
|
|
90
|
+
column,
|
|
91
|
+
context: this.extractContext(lines, lineIndex),
|
|
92
|
+
...(containingFunction ? { containingFunction } : {}),
|
|
93
|
+
...(containingClass ? { containingClass } : {}),
|
|
94
|
+
referenceType,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return references;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Build search patterns for a constant
|
|
103
|
+
*/
|
|
104
|
+
buildSearchPatterns(constant) {
|
|
105
|
+
const patterns = [];
|
|
106
|
+
const name = constant.name;
|
|
107
|
+
// Direct name reference (word boundary)
|
|
108
|
+
patterns.push(new RegExp(`\\b${this.escapeRegex(name)}\\b`, 'g'));
|
|
109
|
+
// Qualified name if different
|
|
110
|
+
if (constant.qualifiedName !== name) {
|
|
111
|
+
patterns.push(new RegExp(`\\b${this.escapeRegex(constant.qualifiedName)}\\b`, 'g'));
|
|
112
|
+
}
|
|
113
|
+
// For enums, also search for member access
|
|
114
|
+
if ('members' in constant) {
|
|
115
|
+
for (const member of constant.members) {
|
|
116
|
+
// EnumName.MemberName
|
|
117
|
+
patterns.push(new RegExp(`\\b${this.escapeRegex(name)}\\.${this.escapeRegex(member.name)}\\b`, 'g'));
|
|
118
|
+
// EnumName::MemberName (PHP)
|
|
119
|
+
patterns.push(new RegExp(`\\b${this.escapeRegex(name)}::${this.escapeRegex(member.name)}\\b`, 'g'));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Class constant access patterns
|
|
123
|
+
if ('parentName' in constant && constant.parentName) {
|
|
124
|
+
// ClassName.CONSTANT (Java, C#)
|
|
125
|
+
patterns.push(new RegExp(`\\b${this.escapeRegex(constant.parentName)}\\.${this.escapeRegex(name)}\\b`, 'g'));
|
|
126
|
+
// ClassName::CONSTANT (PHP)
|
|
127
|
+
patterns.push(new RegExp(`\\b${this.escapeRegex(constant.parentName)}::${this.escapeRegex(name)}\\b`, 'g'));
|
|
128
|
+
}
|
|
129
|
+
return patterns;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Infer the type of reference from context
|
|
133
|
+
*/
|
|
134
|
+
inferReferenceType(line, matchIndex) {
|
|
135
|
+
const beforeMatch = line.slice(0, matchIndex).trim();
|
|
136
|
+
const afterMatch = line.slice(matchIndex).trim();
|
|
137
|
+
// Check for assignment (constant on left side)
|
|
138
|
+
if (beforeMatch.endsWith('=') && !beforeMatch.endsWith('==') && !beforeMatch.endsWith('!=')) {
|
|
139
|
+
return 'assignment';
|
|
140
|
+
}
|
|
141
|
+
// Check for comparison
|
|
142
|
+
if (afterMatch.startsWith('==') ||
|
|
143
|
+
afterMatch.startsWith('===') ||
|
|
144
|
+
afterMatch.startsWith('!=') ||
|
|
145
|
+
afterMatch.startsWith('!==') ||
|
|
146
|
+
beforeMatch.endsWith('==') ||
|
|
147
|
+
beforeMatch.endsWith('===') ||
|
|
148
|
+
beforeMatch.endsWith('!=') ||
|
|
149
|
+
beforeMatch.endsWith('!==')) {
|
|
150
|
+
return 'comparison';
|
|
151
|
+
}
|
|
152
|
+
// Check for function parameter (inside parentheses)
|
|
153
|
+
if (beforeMatch.includes('(') && !beforeMatch.includes(')')) {
|
|
154
|
+
return 'parameter';
|
|
155
|
+
}
|
|
156
|
+
return 'read';
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Find the containing function for a line
|
|
160
|
+
*/
|
|
161
|
+
findContainingFunction(lines, lineIndex) {
|
|
162
|
+
// Search backwards for function definition
|
|
163
|
+
for (let i = lineIndex - 1; i >= 0; i--) {
|
|
164
|
+
const line = lines[i];
|
|
165
|
+
if (!line)
|
|
166
|
+
continue;
|
|
167
|
+
// TypeScript/JavaScript function patterns
|
|
168
|
+
const tsMatch = line.match(/(?:async\s+)?(?:function\s+(\w+)|(\w+)\s*(?:=|:)\s*(?:async\s+)?(?:\([^)]*\)|[^=]+)\s*=>|(\w+)\s*\([^)]*\)\s*\{)/);
|
|
169
|
+
if (tsMatch) {
|
|
170
|
+
return tsMatch[1] || tsMatch[2] || tsMatch[3];
|
|
171
|
+
}
|
|
172
|
+
// Python function pattern
|
|
173
|
+
const pyMatch = line.match(/def\s+(\w+)\s*\(/);
|
|
174
|
+
if (pyMatch) {
|
|
175
|
+
return pyMatch[1];
|
|
176
|
+
}
|
|
177
|
+
// Java/C# method pattern
|
|
178
|
+
const javaMatch = line.match(/(?:public|private|protected|static|async|override|virtual)?\s*(?:\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:\{|=>|:)/);
|
|
179
|
+
if (javaMatch) {
|
|
180
|
+
return javaMatch[1];
|
|
181
|
+
}
|
|
182
|
+
// PHP function pattern
|
|
183
|
+
const phpMatch = line.match(/(?:public|private|protected|static)?\s*function\s+(\w+)\s*\(/);
|
|
184
|
+
if (phpMatch) {
|
|
185
|
+
return phpMatch[1];
|
|
186
|
+
}
|
|
187
|
+
// Go function pattern
|
|
188
|
+
const goMatch = line.match(/func\s+(?:\([^)]+\)\s+)?(\w+)\s*\(/);
|
|
189
|
+
if (goMatch) {
|
|
190
|
+
return goMatch[1];
|
|
191
|
+
}
|
|
192
|
+
// Stop at class/module boundary
|
|
193
|
+
if (line.match(/^(?:class|interface|struct|enum|module|namespace)\s+/)) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Find the containing class for a line
|
|
201
|
+
*/
|
|
202
|
+
findContainingClass(lines, lineIndex) {
|
|
203
|
+
// Search backwards for class definition
|
|
204
|
+
for (let i = lineIndex - 1; i >= 0; i--) {
|
|
205
|
+
const line = lines[i];
|
|
206
|
+
if (!line)
|
|
207
|
+
continue;
|
|
208
|
+
const classMatch = line.match(/(?:class|interface|struct|enum)\s+(\w+)/);
|
|
209
|
+
if (classMatch) {
|
|
210
|
+
return classMatch[1];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract context snippet around a line
|
|
217
|
+
*/
|
|
218
|
+
extractContext(lines, lineIndex) {
|
|
219
|
+
const line = lines[lineIndex];
|
|
220
|
+
if (!line)
|
|
221
|
+
return '';
|
|
222
|
+
// Return trimmed line, max 100 chars
|
|
223
|
+
const trimmed = line.trim();
|
|
224
|
+
if (trimmed.length <= 100) {
|
|
225
|
+
return trimmed;
|
|
226
|
+
}
|
|
227
|
+
return trimmed.slice(0, 97) + '...';
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if a file should be excluded
|
|
231
|
+
*/
|
|
232
|
+
shouldExcludeFile(filePath) {
|
|
233
|
+
// Check exclude patterns
|
|
234
|
+
for (const pattern of this.config.excludePatterns) {
|
|
235
|
+
if (filePath.includes(pattern)) {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Check test files if not including tests
|
|
240
|
+
if (!this.config.includeTests) {
|
|
241
|
+
if (filePath.includes('.test.') ||
|
|
242
|
+
filePath.includes('.spec.') ||
|
|
243
|
+
filePath.includes('__tests__') ||
|
|
244
|
+
filePath.includes('__mocks__')) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Escape special regex characters
|
|
252
|
+
*/
|
|
253
|
+
escapeRegex(str) {
|
|
254
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Batch find references for multiple constants
|
|
259
|
+
*/
|
|
260
|
+
export function findAllReferences(constants, files, config) {
|
|
261
|
+
const finder = new ConstantReferenceFinder(config);
|
|
262
|
+
const results = new Map();
|
|
263
|
+
for (const constant of constants) {
|
|
264
|
+
const result = finder.findReferences(constant, files);
|
|
265
|
+
results.set(constant.id, result);
|
|
266
|
+
}
|
|
267
|
+
return results;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=reference-finder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-finder.js","sourceRoot":"","sources":["../../../src/constants/analysis/reference-finder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner for Constants
|
|
3
|
+
*
|
|
4
|
+
* Detects potential hardcoded secrets, credentials, and sensitive
|
|
5
|
+
* values in constants.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConstantExtraction, PotentialSecret, SecretType, IssueSeverity } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for security scanning
|
|
10
|
+
*/
|
|
11
|
+
export interface SecurityScanConfig {
|
|
12
|
+
/** Enable entropy-based detection */
|
|
13
|
+
enableEntropyDetection: boolean;
|
|
14
|
+
/** Minimum entropy threshold (0-8) */
|
|
15
|
+
entropyThreshold: number;
|
|
16
|
+
/** Custom patterns to detect */
|
|
17
|
+
customPatterns: SecretPattern[];
|
|
18
|
+
/** File patterns to allowlist */
|
|
19
|
+
allowlistPatterns: string[];
|
|
20
|
+
/** Value patterns to allowlist */
|
|
21
|
+
allowlistValues: RegExp[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A custom secret detection pattern
|
|
25
|
+
*/
|
|
26
|
+
export interface SecretPattern {
|
|
27
|
+
/** Pattern name */
|
|
28
|
+
name: string;
|
|
29
|
+
/** Regex pattern for name */
|
|
30
|
+
namePattern?: RegExp;
|
|
31
|
+
/** Regex pattern for value */
|
|
32
|
+
valuePattern?: RegExp;
|
|
33
|
+
/** Secret type */
|
|
34
|
+
type: SecretType;
|
|
35
|
+
/** Severity */
|
|
36
|
+
severity: IssueSeverity;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Default security scan config
|
|
40
|
+
*/
|
|
41
|
+
export declare const DEFAULT_SECURITY_SCAN_CONFIG: SecurityScanConfig;
|
|
42
|
+
/**
|
|
43
|
+
* Result of security scanning
|
|
44
|
+
*/
|
|
45
|
+
export interface SecurityScanResult {
|
|
46
|
+
/** Potential secrets found */
|
|
47
|
+
secrets: PotentialSecret[];
|
|
48
|
+
/** Total constants scanned */
|
|
49
|
+
totalScanned: number;
|
|
50
|
+
/** Scan time in ms */
|
|
51
|
+
scanTimeMs: number;
|
|
52
|
+
/** Breakdown by severity */
|
|
53
|
+
bySeverity: Record<IssueSeverity, number>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Security scanner for constants
|
|
57
|
+
*/
|
|
58
|
+
export declare class ConstantSecurityScanner {
|
|
59
|
+
private config;
|
|
60
|
+
private patterns;
|
|
61
|
+
constructor(config?: Partial<SecurityScanConfig>);
|
|
62
|
+
/**
|
|
63
|
+
* Scan constants for potential secrets
|
|
64
|
+
*/
|
|
65
|
+
scan(constants: ConstantExtraction[]): SecurityScanResult;
|
|
66
|
+
/**
|
|
67
|
+
* Analyze a single constant for secrets
|
|
68
|
+
*/
|
|
69
|
+
private analyzeConstant;
|
|
70
|
+
/**
|
|
71
|
+
* Create a potential secret object
|
|
72
|
+
*/
|
|
73
|
+
private createSecret;
|
|
74
|
+
/**
|
|
75
|
+
* Mask a value for safe display
|
|
76
|
+
*/
|
|
77
|
+
private maskValue;
|
|
78
|
+
/**
|
|
79
|
+
* Generate recommendation for a secret type
|
|
80
|
+
*/
|
|
81
|
+
private generateRecommendation;
|
|
82
|
+
/**
|
|
83
|
+
* Calculate confidence score for a detection
|
|
84
|
+
*/
|
|
85
|
+
private calculateConfidence;
|
|
86
|
+
/**
|
|
87
|
+
* Check if a value looks like a real secret (not placeholder)
|
|
88
|
+
*/
|
|
89
|
+
private looksLikeRealSecret;
|
|
90
|
+
/**
|
|
91
|
+
* Check if a value looks like a placeholder
|
|
92
|
+
*/
|
|
93
|
+
private looksLikePlaceholder;
|
|
94
|
+
/**
|
|
95
|
+
* Check if name suggests it might be a secret
|
|
96
|
+
*/
|
|
97
|
+
private nameSuggestsSecret;
|
|
98
|
+
/**
|
|
99
|
+
* Calculate Shannon entropy of a string
|
|
100
|
+
*/
|
|
101
|
+
private calculateEntropy;
|
|
102
|
+
/**
|
|
103
|
+
* Check if file is allowlisted
|
|
104
|
+
*/
|
|
105
|
+
private isAllowlistedFile;
|
|
106
|
+
/**
|
|
107
|
+
* Check if value is allowlisted
|
|
108
|
+
*/
|
|
109
|
+
private isAllowlistedValue;
|
|
110
|
+
/**
|
|
111
|
+
* Check if file is a test file
|
|
112
|
+
*/
|
|
113
|
+
private isTestFile;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=security-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../../../src/constants/analysis/security-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,iCAAiC;IACjC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kCAAkC;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,eAAe;IACf,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,kBAqB1C,CAAC;AA2IF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAKpD;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,kBAAkB;IA2CzD;;OAEG;IACH,OAAO,CAAC,eAAe;IAwCvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,UAAU;CAUnB"}
|