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,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"}