avana-cli 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/LICENSE +21 -0
- package/README.md +584 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +153 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +101 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/scan.d.ts +19 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +383 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/uninstall.d.ts +6 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +80 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +475 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/additional-patterns.d.ts +12 -0
- package/dist/rules/additional-patterns.d.ts.map +1 -0
- package/dist/rules/additional-patterns.js +170 -0
- package/dist/rules/additional-patterns.js.map +1 -0
- package/dist/rules/code-patterns.d.ts +26 -0
- package/dist/rules/code-patterns.d.ts.map +1 -0
- package/dist/rules/code-patterns.js +220 -0
- package/dist/rules/code-patterns.js.map +1 -0
- package/dist/rules/secret-patterns.d.ts +28 -0
- package/dist/rules/secret-patterns.d.ts.map +1 -0
- package/dist/rules/secret-patterns.js +1729 -0
- package/dist/rules/secret-patterns.js.map +1 -0
- package/dist/scanners/secret-scanner.d.ts +34 -0
- package/dist/scanners/secret-scanner.d.ts.map +1 -0
- package/dist/scanners/secret-scanner.js +281 -0
- package/dist/scanners/secret-scanner.js.map +1 -0
- package/dist/types/index.d.ts +116 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/error-handler.d.ts +126 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +222 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +52 -0
- package/dist/utils/exit-codes.d.ts.map +1 -0
- package/dist/utils/exit-codes.js +89 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/file-stream-scanner.d.ts +31 -0
- package/dist/utils/file-stream-scanner.d.ts.map +1 -0
- package/dist/utils/file-stream-scanner.js +159 -0
- package/dist/utils/file-stream-scanner.js.map +1 -0
- package/dist/utils/file-type-detector.d.ts +45 -0
- package/dist/utils/file-type-detector.d.ts.map +1 -0
- package/dist/utils/file-type-detector.js +237 -0
- package/dist/utils/file-type-detector.js.map +1 -0
- package/dist/utils/ignore-pattern-manager.d.ts +61 -0
- package/dist/utils/ignore-pattern-manager.d.ts.map +1 -0
- package/dist/utils/ignore-pattern-manager.js +204 -0
- package/dist/utils/ignore-pattern-manager.js.map +1 -0
- package/dist/utils/json-output-formatter.d.ts +232 -0
- package/dist/utils/json-output-formatter.d.ts.map +1 -0
- package/dist/utils/json-output-formatter.js +367 -0
- package/dist/utils/json-output-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +181 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +414 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-output-formatter.d.ts +65 -0
- package/dist/utils/markdown-output-formatter.d.ts.map +1 -0
- package/dist/utils/markdown-output-formatter.js +316 -0
- package/dist/utils/markdown-output-formatter.js.map +1 -0
- package/dist/utils/memory-manager.d.ts +77 -0
- package/dist/utils/memory-manager.d.ts.map +1 -0
- package/dist/utils/memory-manager.js +157 -0
- package/dist/utils/memory-manager.js.map +1 -0
- package/dist/utils/parallel-scanner-worker.d.ts +19 -0
- package/dist/utils/parallel-scanner-worker.d.ts.map +1 -0
- package/dist/utils/parallel-scanner-worker.js +51 -0
- package/dist/utils/parallel-scanner-worker.js.map +1 -0
- package/dist/utils/parallel-scanner.d.ts +82 -0
- package/dist/utils/parallel-scanner.d.ts.map +1 -0
- package/dist/utils/parallel-scanner.js +229 -0
- package/dist/utils/parallel-scanner.js.map +1 -0
- package/dist/utils/pattern-validator.d.ts +108 -0
- package/dist/utils/pattern-validator.d.ts.map +1 -0
- package/dist/utils/pattern-validator.js +315 -0
- package/dist/utils/pattern-validator.js.map +1 -0
- package/dist/utils/progress-reporter.d.ts +68 -0
- package/dist/utils/progress-reporter.d.ts.map +1 -0
- package/dist/utils/progress-reporter.js +194 -0
- package/dist/utils/progress-reporter.js.map +1 -0
- package/dist/utils/result-cache.d.ts +99 -0
- package/dist/utils/result-cache.d.ts.map +1 -0
- package/dist/utils/result-cache.js +335 -0
- package/dist/utils/result-cache.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Scanner
|
|
3
|
+
* Distributes file scanning across multiple worker threads for improved performance
|
|
4
|
+
*/
|
|
5
|
+
export interface ScanResult {
|
|
6
|
+
file: string;
|
|
7
|
+
issues: any[];
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkerMessage {
|
|
11
|
+
type: 'result' | 'error' | 'complete';
|
|
12
|
+
data?: ScanResult;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ParallelScanOptions {
|
|
16
|
+
workerCount?: number;
|
|
17
|
+
patterns?: any[];
|
|
18
|
+
ignorePatterns?: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare class ParallelScanner {
|
|
21
|
+
private readonly workerCount;
|
|
22
|
+
private workers;
|
|
23
|
+
private activeWorkers;
|
|
24
|
+
private completedFiles;
|
|
25
|
+
private totalFiles;
|
|
26
|
+
private results;
|
|
27
|
+
private errors;
|
|
28
|
+
constructor(options?: ParallelScanOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Scan files in parallel using worker threads
|
|
31
|
+
*/
|
|
32
|
+
scanFiles(files: string[], patterns: any[], ignorePatterns?: string[]): Promise<ScanResult[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Distribute files evenly across workers
|
|
35
|
+
*/
|
|
36
|
+
private distributeFiles;
|
|
37
|
+
/**
|
|
38
|
+
* Create and manage a worker thread
|
|
39
|
+
*/
|
|
40
|
+
private createWorker;
|
|
41
|
+
/**
|
|
42
|
+
* Handle messages from worker threads
|
|
43
|
+
*/
|
|
44
|
+
private handleWorkerMessage;
|
|
45
|
+
/**
|
|
46
|
+
* Get scan progress (0-1)
|
|
47
|
+
*/
|
|
48
|
+
getProgress(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Get scan statistics
|
|
51
|
+
*/
|
|
52
|
+
getStats(): {
|
|
53
|
+
totalFiles: number;
|
|
54
|
+
completedFiles: number;
|
|
55
|
+
activeWorkers: number;
|
|
56
|
+
workerCount: number;
|
|
57
|
+
errors: number;
|
|
58
|
+
results: number;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Terminate all workers
|
|
62
|
+
*/
|
|
63
|
+
terminate(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if parallel scanning is supported
|
|
66
|
+
*/
|
|
67
|
+
static isSupported(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get optimal worker count for the current system
|
|
70
|
+
*/
|
|
71
|
+
static getOptimalWorkerCount(): number;
|
|
72
|
+
}
|
|
73
|
+
export declare let parallelScanner: ParallelScanner | null;
|
|
74
|
+
/**
|
|
75
|
+
* Initialize global parallel scanner
|
|
76
|
+
*/
|
|
77
|
+
export declare function initializeParallelScanner(options?: ParallelScanOptions): ParallelScanner;
|
|
78
|
+
/**
|
|
79
|
+
* Get the global parallel scanner instance
|
|
80
|
+
*/
|
|
81
|
+
export declare function getParallelScanner(): ParallelScanner | null;
|
|
82
|
+
//# sourceMappingURL=parallel-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-scanner.d.ts","sourceRoot":"","sources":["../../src/utils/parallel-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;IACtC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,GAAE,mBAAwB;IAK7C;;OAEG;IACU,SAAS,CACpB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,GAAG,EAAE,EACf,cAAc,GAAE,MAAM,EAAO,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC;IAgCxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;YACW,YAAY;IAmD1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACI,WAAW,IAAI,MAAM;IAK5B;;OAEG;IACI,QAAQ;;;;;;;;IAWf;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;WACW,WAAW,IAAI,OAAO;IAUpC;;OAEG;WACW,qBAAqB,IAAI,MAAM;CAG9C;AAGD,eAAO,IAAI,eAAe,EAAE,eAAe,GAAG,IAAW,CAAC;AAE1D;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,eAAe,CAGxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAE3D"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Parallel Scanner
|
|
4
|
+
* Distributes file scanning across multiple worker threads for improved performance
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.parallelScanner = exports.ParallelScanner = void 0;
|
|
41
|
+
exports.initializeParallelScanner = initializeParallelScanner;
|
|
42
|
+
exports.getParallelScanner = getParallelScanner;
|
|
43
|
+
const worker_threads_1 = require("worker_threads");
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
class ParallelScanner {
|
|
47
|
+
workerCount;
|
|
48
|
+
workers = [];
|
|
49
|
+
activeWorkers = 0;
|
|
50
|
+
completedFiles = 0;
|
|
51
|
+
totalFiles = 0;
|
|
52
|
+
results = [];
|
|
53
|
+
errors = [];
|
|
54
|
+
constructor(options = {}) {
|
|
55
|
+
// Default to CPU count - 1, but at least 1 worker
|
|
56
|
+
this.workerCount = options.workerCount || Math.max(1, os.cpus().length - 1);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Scan files in parallel using worker threads
|
|
60
|
+
*/
|
|
61
|
+
async scanFiles(files, patterns, ignorePatterns = []) {
|
|
62
|
+
if (files.length === 0) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
this.totalFiles = files.length;
|
|
66
|
+
this.completedFiles = 0;
|
|
67
|
+
this.results = [];
|
|
68
|
+
this.errors = [];
|
|
69
|
+
// Distribute files evenly across workers
|
|
70
|
+
const fileChunks = this.distributeFiles(files);
|
|
71
|
+
const actualWorkerCount = Math.min(this.workerCount, fileChunks.length);
|
|
72
|
+
// Create workers
|
|
73
|
+
const workerPromises = [];
|
|
74
|
+
for (let i = 0; i < actualWorkerCount; i++) {
|
|
75
|
+
if (fileChunks[i] && fileChunks[i].length > 0) {
|
|
76
|
+
const workerPromise = this.createWorker(fileChunks[i], patterns, ignorePatterns);
|
|
77
|
+
workerPromises.push(workerPromise);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Wait for all workers to complete
|
|
81
|
+
await Promise.all(workerPromises);
|
|
82
|
+
// Sort results by file path for consistent output
|
|
83
|
+
this.results.sort((a, b) => a.file.localeCompare(b.file));
|
|
84
|
+
return this.results;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Distribute files evenly across workers
|
|
88
|
+
*/
|
|
89
|
+
distributeFiles(files) {
|
|
90
|
+
const chunks = [];
|
|
91
|
+
const chunkSize = Math.ceil(files.length / this.workerCount);
|
|
92
|
+
for (let i = 0; i < files.length; i += chunkSize) {
|
|
93
|
+
chunks.push(files.slice(i, i + chunkSize));
|
|
94
|
+
}
|
|
95
|
+
return chunks;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create and manage a worker thread
|
|
99
|
+
*/
|
|
100
|
+
async createWorker(files, patterns, ignorePatterns) {
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
// Get the worker script path - handle both src and dist directories
|
|
103
|
+
let workerScript;
|
|
104
|
+
// Check if we're running from dist (compiled) or src (tests)
|
|
105
|
+
if (__dirname.includes('dist')) {
|
|
106
|
+
workerScript = path.join(__dirname, 'parallel-scanner-worker.js');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Running from src directory (during tests), use the compiled version
|
|
110
|
+
workerScript = path.join(__dirname, '../../dist/utils/parallel-scanner-worker.js');
|
|
111
|
+
}
|
|
112
|
+
const worker = new worker_threads_1.Worker(workerScript, {
|
|
113
|
+
workerData: {
|
|
114
|
+
files,
|
|
115
|
+
patterns,
|
|
116
|
+
ignorePatterns
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
this.workers.push(worker);
|
|
120
|
+
this.activeWorkers++;
|
|
121
|
+
worker.on('message', (message) => {
|
|
122
|
+
this.handleWorkerMessage(message);
|
|
123
|
+
});
|
|
124
|
+
worker.on('error', (error) => {
|
|
125
|
+
this.errors.push(`Worker error: ${error.message}`);
|
|
126
|
+
this.activeWorkers--;
|
|
127
|
+
reject(error);
|
|
128
|
+
});
|
|
129
|
+
worker.on('exit', (code) => {
|
|
130
|
+
this.activeWorkers--;
|
|
131
|
+
if (code !== 0) {
|
|
132
|
+
const error = new Error(`Worker stopped with exit code ${code}`);
|
|
133
|
+
this.errors.push(error.message);
|
|
134
|
+
reject(error);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
resolve();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handle messages from worker threads
|
|
144
|
+
*/
|
|
145
|
+
handleWorkerMessage(message) {
|
|
146
|
+
switch (message.type) {
|
|
147
|
+
case 'result':
|
|
148
|
+
if (message.data) {
|
|
149
|
+
this.results.push(message.data);
|
|
150
|
+
this.completedFiles++;
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
case 'error':
|
|
154
|
+
if (message.error) {
|
|
155
|
+
this.errors.push(message.error);
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
case 'complete':
|
|
159
|
+
// Worker has finished processing all its files
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get scan progress (0-1)
|
|
165
|
+
*/
|
|
166
|
+
getProgress() {
|
|
167
|
+
if (this.totalFiles === 0)
|
|
168
|
+
return 1;
|
|
169
|
+
return this.completedFiles / this.totalFiles;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get scan statistics
|
|
173
|
+
*/
|
|
174
|
+
getStats() {
|
|
175
|
+
return {
|
|
176
|
+
totalFiles: this.totalFiles,
|
|
177
|
+
completedFiles: this.completedFiles,
|
|
178
|
+
activeWorkers: this.activeWorkers,
|
|
179
|
+
workerCount: this.workerCount,
|
|
180
|
+
errors: this.errors.length,
|
|
181
|
+
results: this.results.length
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Terminate all workers
|
|
186
|
+
*/
|
|
187
|
+
async terminate() {
|
|
188
|
+
const terminationPromises = this.workers.map(worker => worker.terminate());
|
|
189
|
+
await Promise.all(terminationPromises);
|
|
190
|
+
this.workers = [];
|
|
191
|
+
this.activeWorkers = 0;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if parallel scanning is supported
|
|
195
|
+
*/
|
|
196
|
+
static isSupported() {
|
|
197
|
+
try {
|
|
198
|
+
// Check if worker_threads is available
|
|
199
|
+
require('worker_threads');
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get optimal worker count for the current system
|
|
208
|
+
*/
|
|
209
|
+
static getOptimalWorkerCount() {
|
|
210
|
+
return Math.max(1, os.cpus().length - 1);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.ParallelScanner = ParallelScanner;
|
|
214
|
+
// Global parallel scanner instance
|
|
215
|
+
exports.parallelScanner = null;
|
|
216
|
+
/**
|
|
217
|
+
* Initialize global parallel scanner
|
|
218
|
+
*/
|
|
219
|
+
function initializeParallelScanner(options) {
|
|
220
|
+
exports.parallelScanner = new ParallelScanner(options);
|
|
221
|
+
return exports.parallelScanner;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get the global parallel scanner instance
|
|
225
|
+
*/
|
|
226
|
+
function getParallelScanner() {
|
|
227
|
+
return exports.parallelScanner;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=parallel-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-scanner.js","sourceRoot":"","sources":["../../src/utils/parallel-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Validator
|
|
3
|
+
* Validates and tests all detection patterns for correctness and performance
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Validation result for a pattern
|
|
7
|
+
*/
|
|
8
|
+
export interface ValidationResult {
|
|
9
|
+
isValid: boolean;
|
|
10
|
+
errors: string[];
|
|
11
|
+
warnings: string[];
|
|
12
|
+
compilationTime?: number;
|
|
13
|
+
testResults?: TestResult[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Test case for pattern validation
|
|
17
|
+
*/
|
|
18
|
+
export interface TestCase {
|
|
19
|
+
input: string;
|
|
20
|
+
shouldMatch: boolean;
|
|
21
|
+
description: string;
|
|
22
|
+
expectedMatch?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Result of running test cases against a pattern
|
|
26
|
+
*/
|
|
27
|
+
export interface TestResult {
|
|
28
|
+
testCase: TestCase;
|
|
29
|
+
passed: boolean;
|
|
30
|
+
actualMatch: string | null;
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Pattern definition for validation
|
|
35
|
+
*/
|
|
36
|
+
export interface SecretPattern {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
pattern: string | RegExp;
|
|
40
|
+
description?: string;
|
|
41
|
+
testCases?: TestCase[];
|
|
42
|
+
severity?: 'critical' | 'high' | 'medium' | 'low';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Backtracking detection result
|
|
46
|
+
*/
|
|
47
|
+
export interface BacktrackingResult {
|
|
48
|
+
hasBacktracking: boolean;
|
|
49
|
+
executionTime: number;
|
|
50
|
+
timedOut: boolean;
|
|
51
|
+
testInput?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Pattern Validator class
|
|
55
|
+
* Validates regex patterns for correctness, performance, and security
|
|
56
|
+
*/
|
|
57
|
+
export declare class PatternValidator {
|
|
58
|
+
private debugMode;
|
|
59
|
+
private backtrackingTimeout;
|
|
60
|
+
constructor(debugMode?: boolean, backtrackingTimeout?: number);
|
|
61
|
+
/**
|
|
62
|
+
* Validate a pattern for correctness and compilation
|
|
63
|
+
*/
|
|
64
|
+
validatePattern(pattern: SecretPattern): ValidationResult;
|
|
65
|
+
/**
|
|
66
|
+
* Test a pattern against positive and negative test cases
|
|
67
|
+
*/
|
|
68
|
+
testPattern(pattern: SecretPattern, testCases: TestCase[]): {
|
|
69
|
+
results: TestResult[];
|
|
70
|
+
allPassed: boolean;
|
|
71
|
+
passedCount: number;
|
|
72
|
+
failedCount: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Check if a pattern has catastrophic backtracking
|
|
76
|
+
*/
|
|
77
|
+
checkBacktracking(pattern: RegExp): BacktrackingResult;
|
|
78
|
+
/**
|
|
79
|
+
* Compile a pattern from string or RegExp
|
|
80
|
+
*/
|
|
81
|
+
private compilePattern;
|
|
82
|
+
/**
|
|
83
|
+
* Run a single test case against a regex
|
|
84
|
+
*/
|
|
85
|
+
private runTestCase;
|
|
86
|
+
/**
|
|
87
|
+
* Test pattern performance to detect backtracking
|
|
88
|
+
*/
|
|
89
|
+
private testPatternPerformance;
|
|
90
|
+
/**
|
|
91
|
+
* Validate pattern structure and provide warnings
|
|
92
|
+
*/
|
|
93
|
+
private validatePatternStructure;
|
|
94
|
+
/**
|
|
95
|
+
* Validate all patterns in a collection
|
|
96
|
+
*/
|
|
97
|
+
validateAllPatterns(patterns: SecretPattern[]): {
|
|
98
|
+
results: Map<string, ValidationResult>;
|
|
99
|
+
validCount: number;
|
|
100
|
+
invalidCount: number;
|
|
101
|
+
warningCount: number;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Generate test cases for common secret patterns
|
|
105
|
+
*/
|
|
106
|
+
generateTestCases(patternType: string): TestCase[];
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pattern-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-validator.d.ts","sourceRoot":"","sources":["../../src/utils/pattern-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAgB;gBAE/B,SAAS,GAAE,OAAe,EAAE,mBAAmB,GAAE,MAAa;IAK1E;;OAEG;IACI,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB;IAkDhE;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG;QACjE,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB;IAuCD;;OAEG;IACI,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB;IA+B7D;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsCnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuC9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2ChC;;OAEG;IACI,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG;QACrD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACvC,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB;IAuCD;;OAEG;IACI,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE;CA6C1D"}
|