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,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger
|
|
3
|
+
* Production-ready logging system with verbosity levels
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Log levels in order of verbosity
|
|
7
|
+
*/
|
|
8
|
+
export declare enum LogLevel {
|
|
9
|
+
QUIET = 0,// Only critical errors and final results
|
|
10
|
+
NORMAL = 1,// Standard output
|
|
11
|
+
VERBOSE = 2,// Detailed information
|
|
12
|
+
DEBUG = 3
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Log entry interface
|
|
16
|
+
*/
|
|
17
|
+
export interface LogEntry {
|
|
18
|
+
timestamp: Date;
|
|
19
|
+
level: LogLevel;
|
|
20
|
+
category: string;
|
|
21
|
+
message: string;
|
|
22
|
+
data?: any;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Logger configuration
|
|
26
|
+
*/
|
|
27
|
+
export interface LoggerConfig {
|
|
28
|
+
level: LogLevel;
|
|
29
|
+
enableTimestamps: boolean;
|
|
30
|
+
enableColors: boolean;
|
|
31
|
+
logToFile?: string;
|
|
32
|
+
maxLogFileSize?: number;
|
|
33
|
+
maxLogFiles?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Production-ready Logger class
|
|
37
|
+
* Supports multiple verbosity levels, file logging, and structured output
|
|
38
|
+
*/
|
|
39
|
+
export declare class Logger {
|
|
40
|
+
private config;
|
|
41
|
+
private logEntries;
|
|
42
|
+
private fileHandle?;
|
|
43
|
+
constructor(config?: Partial<LoggerConfig>);
|
|
44
|
+
/**
|
|
45
|
+
* Initialize file logging with rotation
|
|
46
|
+
*/
|
|
47
|
+
private initializeFileLogging;
|
|
48
|
+
/**
|
|
49
|
+
* Rotate log file if it exceeds size limit
|
|
50
|
+
*/
|
|
51
|
+
private rotateLogFileIfNeeded;
|
|
52
|
+
/**
|
|
53
|
+
* Rotate log files (keep maxLogFiles)
|
|
54
|
+
*/
|
|
55
|
+
private rotateLogFiles;
|
|
56
|
+
/**
|
|
57
|
+
* Set log level
|
|
58
|
+
*/
|
|
59
|
+
setLevel(level: LogLevel): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get current log level
|
|
62
|
+
*/
|
|
63
|
+
getLevel(): LogLevel;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a log level should be output
|
|
66
|
+
*/
|
|
67
|
+
private shouldLog;
|
|
68
|
+
/**
|
|
69
|
+
* Format timestamp
|
|
70
|
+
*/
|
|
71
|
+
private formatTimestamp;
|
|
72
|
+
/**
|
|
73
|
+
* Apply color to text if colors are enabled
|
|
74
|
+
*/
|
|
75
|
+
private colorize;
|
|
76
|
+
/**
|
|
77
|
+
* Get color for log level
|
|
78
|
+
*/
|
|
79
|
+
private getLevelColor;
|
|
80
|
+
/**
|
|
81
|
+
* Get level name
|
|
82
|
+
*/
|
|
83
|
+
private getLevelName;
|
|
84
|
+
/**
|
|
85
|
+
* Core logging method
|
|
86
|
+
*/
|
|
87
|
+
private log;
|
|
88
|
+
/**
|
|
89
|
+
* Critical error logging (always shown)
|
|
90
|
+
*/
|
|
91
|
+
error(category: string, message: string, data?: any): void;
|
|
92
|
+
/**
|
|
93
|
+
* Standard information logging
|
|
94
|
+
*/
|
|
95
|
+
info(category: string, message: string, data?: any): void;
|
|
96
|
+
/**
|
|
97
|
+
* Success message logging
|
|
98
|
+
*/
|
|
99
|
+
success(category: string, message: string, data?: any): void;
|
|
100
|
+
/**
|
|
101
|
+
* Warning message logging
|
|
102
|
+
*/
|
|
103
|
+
warn(category: string, message: string, data?: any): void;
|
|
104
|
+
/**
|
|
105
|
+
* Verbose logging (--verbose flag)
|
|
106
|
+
*/
|
|
107
|
+
verbose(category: string, message: string, data?: any): void;
|
|
108
|
+
/**
|
|
109
|
+
* Debug logging (--debug flag)
|
|
110
|
+
*/
|
|
111
|
+
debug(category: string, message: string, data?: any): void;
|
|
112
|
+
/**
|
|
113
|
+
* Log file scanning activity
|
|
114
|
+
*/
|
|
115
|
+
logFileScanning(filePath: string, action: 'scanning' | 'skipped' | 'ignored', reason?: string): void;
|
|
116
|
+
/**
|
|
117
|
+
* Log pattern checking activity
|
|
118
|
+
*/
|
|
119
|
+
logPatternCheck(filePath: string, patternName: string, matched: boolean): void;
|
|
120
|
+
/**
|
|
121
|
+
* Log scan progress
|
|
122
|
+
*/
|
|
123
|
+
logProgress(filesScanned: number, totalFiles: number, currentFile?: string): void;
|
|
124
|
+
/**
|
|
125
|
+
* Log scan summary
|
|
126
|
+
*/
|
|
127
|
+
logSummary(summary: {
|
|
128
|
+
filesScanned: number;
|
|
129
|
+
issuesFound: number;
|
|
130
|
+
duration: number;
|
|
131
|
+
securityScore: number;
|
|
132
|
+
}): void;
|
|
133
|
+
/**
|
|
134
|
+
* Get all log entries
|
|
135
|
+
*/
|
|
136
|
+
getLogEntries(): LogEntry[];
|
|
137
|
+
/**
|
|
138
|
+
* Get log entries by level
|
|
139
|
+
*/
|
|
140
|
+
getLogEntriesByLevel(level: LogLevel): LogEntry[];
|
|
141
|
+
/**
|
|
142
|
+
* Clear log entries (keep file logging)
|
|
143
|
+
*/
|
|
144
|
+
clearEntries(): void;
|
|
145
|
+
/**
|
|
146
|
+
* Get log statistics
|
|
147
|
+
*/
|
|
148
|
+
getStats(): {
|
|
149
|
+
totalEntries: number;
|
|
150
|
+
entriesByLevel: Record<LogLevel, number>;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Close file handle and cleanup
|
|
154
|
+
*/
|
|
155
|
+
close(): void;
|
|
156
|
+
/**
|
|
157
|
+
* Create logger from CLI flags
|
|
158
|
+
*/
|
|
159
|
+
static fromFlags(flags: {
|
|
160
|
+
verbose?: boolean;
|
|
161
|
+
debug?: boolean;
|
|
162
|
+
quiet?: boolean;
|
|
163
|
+
logFile?: string;
|
|
164
|
+
}): Logger;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Default logger instance
|
|
168
|
+
*/
|
|
169
|
+
export declare const logger: Logger;
|
|
170
|
+
/**
|
|
171
|
+
* Convenience functions for common logging patterns
|
|
172
|
+
*/
|
|
173
|
+
export declare const log: {
|
|
174
|
+
error: (message: string, data?: any) => void;
|
|
175
|
+
info: (message: string, data?: any) => void;
|
|
176
|
+
success: (message: string, data?: any) => void;
|
|
177
|
+
warn: (message: string, data?: any) => void;
|
|
178
|
+
verbose: (message: string, data?: any) => void;
|
|
179
|
+
debug: (message: string, data?: any) => void;
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logger
|
|
4
|
+
* Production-ready logging system with verbosity levels
|
|
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.log = exports.logger = exports.Logger = exports.LogLevel = void 0;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
/**
|
|
44
|
+
* Log levels in order of verbosity
|
|
45
|
+
*/
|
|
46
|
+
var LogLevel;
|
|
47
|
+
(function (LogLevel) {
|
|
48
|
+
LogLevel[LogLevel["QUIET"] = 0] = "QUIET";
|
|
49
|
+
LogLevel[LogLevel["NORMAL"] = 1] = "NORMAL";
|
|
50
|
+
LogLevel[LogLevel["VERBOSE"] = 2] = "VERBOSE";
|
|
51
|
+
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG"; // Maximum detail for debugging
|
|
52
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
53
|
+
/**
|
|
54
|
+
* ANSI color codes for terminal output
|
|
55
|
+
*/
|
|
56
|
+
const Colors = {
|
|
57
|
+
RESET: '\x1b[0m',
|
|
58
|
+
BRIGHT: '\x1b[1m',
|
|
59
|
+
DIM: '\x1b[2m',
|
|
60
|
+
RED: '\x1b[31m',
|
|
61
|
+
GREEN: '\x1b[32m',
|
|
62
|
+
YELLOW: '\x1b[33m',
|
|
63
|
+
BLUE: '\x1b[34m',
|
|
64
|
+
MAGENTA: '\x1b[35m',
|
|
65
|
+
CYAN: '\x1b[36m',
|
|
66
|
+
WHITE: '\x1b[37m',
|
|
67
|
+
GRAY: '\x1b[90m'
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Production-ready Logger class
|
|
71
|
+
* Supports multiple verbosity levels, file logging, and structured output
|
|
72
|
+
*/
|
|
73
|
+
class Logger {
|
|
74
|
+
config;
|
|
75
|
+
logEntries = [];
|
|
76
|
+
fileHandle;
|
|
77
|
+
constructor(config = {}) {
|
|
78
|
+
this.config = {
|
|
79
|
+
level: LogLevel.NORMAL,
|
|
80
|
+
enableTimestamps: true,
|
|
81
|
+
enableColors: process.stdout.isTTY, // Auto-detect terminal support
|
|
82
|
+
maxLogFileSize: 10 * 1024 * 1024, // 10MB
|
|
83
|
+
maxLogFiles: 5,
|
|
84
|
+
...config
|
|
85
|
+
};
|
|
86
|
+
if (this.config.logToFile) {
|
|
87
|
+
this.initializeFileLogging();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Initialize file logging with rotation
|
|
92
|
+
*/
|
|
93
|
+
initializeFileLogging() {
|
|
94
|
+
if (!this.config.logToFile)
|
|
95
|
+
return;
|
|
96
|
+
try {
|
|
97
|
+
// Ensure log directory exists
|
|
98
|
+
const logDir = path.dirname(this.config.logToFile);
|
|
99
|
+
if (!fs.existsSync(logDir)) {
|
|
100
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
// Rotate log file if it's too large
|
|
103
|
+
this.rotateLogFileIfNeeded();
|
|
104
|
+
// Open file for appending (synchronously for tests)
|
|
105
|
+
this.fileHandle = fs.createWriteStream(this.config.logToFile, { flags: 'a' });
|
|
106
|
+
this.fileHandle.on('error', (error) => {
|
|
107
|
+
console.error(`Logger: Failed to write to log file: ${error.message}`);
|
|
108
|
+
this.fileHandle = undefined; // Disable file logging on error
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(`Logger: Failed to initialize file logging: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Rotate log file if it exceeds size limit
|
|
117
|
+
*/
|
|
118
|
+
rotateLogFileIfNeeded() {
|
|
119
|
+
if (!this.config.logToFile || !this.config.maxLogFileSize)
|
|
120
|
+
return;
|
|
121
|
+
try {
|
|
122
|
+
if (fs.existsSync(this.config.logToFile)) {
|
|
123
|
+
const stats = fs.statSync(this.config.logToFile);
|
|
124
|
+
if (stats.size >= this.config.maxLogFileSize) {
|
|
125
|
+
this.rotateLogFiles();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// Ignore rotation errors, continue with logging
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Rotate log files (keep maxLogFiles)
|
|
135
|
+
*/
|
|
136
|
+
rotateLogFiles() {
|
|
137
|
+
if (!this.config.logToFile || !this.config.maxLogFiles)
|
|
138
|
+
return;
|
|
139
|
+
try {
|
|
140
|
+
const logFile = this.config.logToFile;
|
|
141
|
+
const maxFiles = this.config.maxLogFiles;
|
|
142
|
+
// Remove oldest log file
|
|
143
|
+
const oldestLog = `${logFile}.${maxFiles}`;
|
|
144
|
+
if (fs.existsSync(oldestLog)) {
|
|
145
|
+
fs.unlinkSync(oldestLog);
|
|
146
|
+
}
|
|
147
|
+
// Shift all log files
|
|
148
|
+
for (let i = maxFiles - 1; i >= 1; i--) {
|
|
149
|
+
const currentLog = i === 1 ? logFile : `${logFile}.${i}`;
|
|
150
|
+
const nextLog = `${logFile}.${i + 1}`;
|
|
151
|
+
if (fs.existsSync(currentLog)) {
|
|
152
|
+
fs.renameSync(currentLog, nextLog);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Ignore rotation errors, continue with logging
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Set log level
|
|
162
|
+
*/
|
|
163
|
+
setLevel(level) {
|
|
164
|
+
this.config.level = level;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get current log level
|
|
168
|
+
*/
|
|
169
|
+
getLevel() {
|
|
170
|
+
return this.config.level;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if a log level should be output
|
|
174
|
+
*/
|
|
175
|
+
shouldLog(level) {
|
|
176
|
+
return level <= this.config.level;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Format timestamp
|
|
180
|
+
*/
|
|
181
|
+
formatTimestamp() {
|
|
182
|
+
if (!this.config.enableTimestamps)
|
|
183
|
+
return '';
|
|
184
|
+
const now = new Date();
|
|
185
|
+
return `[${now.toISOString()}] `;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Apply color to text if colors are enabled
|
|
189
|
+
*/
|
|
190
|
+
colorize(text, color) {
|
|
191
|
+
if (!this.config.enableColors)
|
|
192
|
+
return text;
|
|
193
|
+
return `${color}${text}${Colors.RESET}`;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get color for log level
|
|
197
|
+
*/
|
|
198
|
+
getLevelColor(level) {
|
|
199
|
+
switch (level) {
|
|
200
|
+
case LogLevel.QUIET: return Colors.RED;
|
|
201
|
+
case LogLevel.NORMAL: return Colors.WHITE;
|
|
202
|
+
case LogLevel.VERBOSE: return Colors.CYAN;
|
|
203
|
+
case LogLevel.DEBUG: return Colors.GRAY;
|
|
204
|
+
default: return Colors.WHITE;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get level name
|
|
209
|
+
*/
|
|
210
|
+
getLevelName(level) {
|
|
211
|
+
switch (level) {
|
|
212
|
+
case LogLevel.QUIET: return 'ERROR';
|
|
213
|
+
case LogLevel.NORMAL: return 'INFO';
|
|
214
|
+
case LogLevel.VERBOSE: return 'VERBOSE';
|
|
215
|
+
case LogLevel.DEBUG: return 'DEBUG';
|
|
216
|
+
default: return 'INFO';
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Core logging method
|
|
221
|
+
*/
|
|
222
|
+
log(level, category, message, data) {
|
|
223
|
+
if (!this.shouldLog(level))
|
|
224
|
+
return;
|
|
225
|
+
const entry = {
|
|
226
|
+
timestamp: new Date(),
|
|
227
|
+
level,
|
|
228
|
+
category,
|
|
229
|
+
message,
|
|
230
|
+
data
|
|
231
|
+
};
|
|
232
|
+
// Store entry for retrieval
|
|
233
|
+
this.logEntries.push(entry);
|
|
234
|
+
// Format for console output
|
|
235
|
+
const timestamp = this.formatTimestamp();
|
|
236
|
+
const levelName = this.colorize(`[${this.getLevelName(level)}]`, this.getLevelColor(level));
|
|
237
|
+
const categoryText = this.colorize(`[${category}]`, Colors.BLUE);
|
|
238
|
+
const messageText = message;
|
|
239
|
+
const consoleOutput = `${timestamp}${levelName} ${categoryText} ${messageText}`;
|
|
240
|
+
// Output to console
|
|
241
|
+
if (level === LogLevel.QUIET) {
|
|
242
|
+
console.error(consoleOutput);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
console.log(consoleOutput);
|
|
246
|
+
}
|
|
247
|
+
// Output to file (without colors)
|
|
248
|
+
if (this.fileHandle && !this.fileHandle.destroyed) {
|
|
249
|
+
const fileOutput = `${timestamp}[${this.getLevelName(level)}] [${category}] ${message}`;
|
|
250
|
+
this.fileHandle.write(fileOutput + '\n');
|
|
251
|
+
if (data) {
|
|
252
|
+
this.fileHandle.write(` Data: ${JSON.stringify(data, null, 2)}\n`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Critical error logging (always shown)
|
|
258
|
+
*/
|
|
259
|
+
error(category, message, data) {
|
|
260
|
+
this.log(LogLevel.QUIET, category, this.colorize(message, Colors.RED), data);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Standard information logging
|
|
264
|
+
*/
|
|
265
|
+
info(category, message, data) {
|
|
266
|
+
this.log(LogLevel.NORMAL, category, message, data);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Success message logging
|
|
270
|
+
*/
|
|
271
|
+
success(category, message, data) {
|
|
272
|
+
this.log(LogLevel.NORMAL, category, this.colorize(message, Colors.GREEN), data);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Warning message logging
|
|
276
|
+
*/
|
|
277
|
+
warn(category, message, data) {
|
|
278
|
+
this.log(LogLevel.NORMAL, category, this.colorize(message, Colors.YELLOW), data);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Verbose logging (--verbose flag)
|
|
282
|
+
*/
|
|
283
|
+
verbose(category, message, data) {
|
|
284
|
+
this.log(LogLevel.VERBOSE, category, message, data);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Debug logging (--debug flag)
|
|
288
|
+
*/
|
|
289
|
+
debug(category, message, data) {
|
|
290
|
+
this.log(LogLevel.DEBUG, category, message, data);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Log file scanning activity
|
|
294
|
+
*/
|
|
295
|
+
logFileScanning(filePath, action, reason) {
|
|
296
|
+
const message = reason ? `${action} ${filePath} (${reason})` : `${action} ${filePath}`;
|
|
297
|
+
if (action === 'scanning') {
|
|
298
|
+
this.verbose('SCAN', message);
|
|
299
|
+
}
|
|
300
|
+
else if (action === 'skipped') {
|
|
301
|
+
this.verbose('SKIP', message);
|
|
302
|
+
}
|
|
303
|
+
else if (action === 'ignored') {
|
|
304
|
+
this.verbose('IGNORE', message);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Log pattern checking activity
|
|
309
|
+
*/
|
|
310
|
+
logPatternCheck(filePath, patternName, matched) {
|
|
311
|
+
const status = matched ? 'MATCH' : 'NO_MATCH';
|
|
312
|
+
this.debug('PATTERN', `${status} ${patternName} in ${filePath}`);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Log scan progress
|
|
316
|
+
*/
|
|
317
|
+
logProgress(filesScanned, totalFiles, currentFile) {
|
|
318
|
+
const percentage = Math.round((filesScanned / totalFiles) * 100);
|
|
319
|
+
const message = currentFile
|
|
320
|
+
? `Progress: ${filesScanned}/${totalFiles} (${percentage}%) - ${currentFile}`
|
|
321
|
+
: `Progress: ${filesScanned}/${totalFiles} (${percentage}%)`;
|
|
322
|
+
this.verbose('PROGRESS', message);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Log scan summary
|
|
326
|
+
*/
|
|
327
|
+
logSummary(summary) {
|
|
328
|
+
this.info('SUMMARY', `Scanned ${summary.filesScanned} files in ${summary.duration}ms`);
|
|
329
|
+
this.info('SUMMARY', `Found ${summary.issuesFound} security issues`);
|
|
330
|
+
this.info('SUMMARY', `Security score: ${summary.securityScore}/100`);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Get all log entries
|
|
334
|
+
*/
|
|
335
|
+
getLogEntries() {
|
|
336
|
+
return [...this.logEntries];
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get log entries by level
|
|
340
|
+
*/
|
|
341
|
+
getLogEntriesByLevel(level) {
|
|
342
|
+
return this.logEntries.filter(entry => entry.level === level);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Clear log entries (keep file logging)
|
|
346
|
+
*/
|
|
347
|
+
clearEntries() {
|
|
348
|
+
this.logEntries = [];
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get log statistics
|
|
352
|
+
*/
|
|
353
|
+
getStats() {
|
|
354
|
+
const entriesByLevel = {
|
|
355
|
+
[LogLevel.QUIET]: 0,
|
|
356
|
+
[LogLevel.NORMAL]: 0,
|
|
357
|
+
[LogLevel.VERBOSE]: 0,
|
|
358
|
+
[LogLevel.DEBUG]: 0
|
|
359
|
+
};
|
|
360
|
+
this.logEntries.forEach(entry => {
|
|
361
|
+
entriesByLevel[entry.level]++;
|
|
362
|
+
});
|
|
363
|
+
return {
|
|
364
|
+
totalEntries: this.logEntries.length,
|
|
365
|
+
entriesByLevel
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Close file handle and cleanup
|
|
370
|
+
*/
|
|
371
|
+
close() {
|
|
372
|
+
if (this.fileHandle && !this.fileHandle.destroyed) {
|
|
373
|
+
this.fileHandle.end();
|
|
374
|
+
this.fileHandle = undefined;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Create logger from CLI flags
|
|
379
|
+
*/
|
|
380
|
+
static fromFlags(flags) {
|
|
381
|
+
let level = LogLevel.NORMAL;
|
|
382
|
+
if (flags.quiet) {
|
|
383
|
+
level = LogLevel.QUIET;
|
|
384
|
+
}
|
|
385
|
+
else if (flags.debug) {
|
|
386
|
+
level = LogLevel.DEBUG;
|
|
387
|
+
}
|
|
388
|
+
else if (flags.verbose) {
|
|
389
|
+
level = LogLevel.VERBOSE;
|
|
390
|
+
}
|
|
391
|
+
return new Logger({
|
|
392
|
+
level,
|
|
393
|
+
logToFile: flags.logFile,
|
|
394
|
+
enableColors: !flags.quiet // Disable colors in quiet mode
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
exports.Logger = Logger;
|
|
399
|
+
/**
|
|
400
|
+
* Default logger instance
|
|
401
|
+
*/
|
|
402
|
+
exports.logger = new Logger();
|
|
403
|
+
/**
|
|
404
|
+
* Convenience functions for common logging patterns
|
|
405
|
+
*/
|
|
406
|
+
exports.log = {
|
|
407
|
+
error: (message, data) => exports.logger.error('APP', message, data),
|
|
408
|
+
info: (message, data) => exports.logger.info('APP', message, data),
|
|
409
|
+
success: (message, data) => exports.logger.success('APP', message, data),
|
|
410
|
+
warn: (message, data) => exports.logger.warn('APP', message, data),
|
|
411
|
+
verbose: (message, data) => exports.logger.verbose('APP', message, data),
|
|
412
|
+
debug: (message, data) => exports.logger.debug('APP', message, data),
|
|
413
|
+
};
|
|
414
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown Output Formatter
|
|
3
|
+
* Formats scan results as readable Markdown reports
|
|
4
|
+
*/
|
|
5
|
+
import type { ScanResult } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Options for Markdown formatting
|
|
8
|
+
*/
|
|
9
|
+
export interface MarkdownOptions {
|
|
10
|
+
includeMetadata?: boolean;
|
|
11
|
+
includeSummary?: boolean;
|
|
12
|
+
includeDetails?: boolean;
|
|
13
|
+
includeRecommendations?: boolean;
|
|
14
|
+
groupBySeverity?: boolean;
|
|
15
|
+
maxIssuesPerSeverity?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Markdown Output Formatter class
|
|
19
|
+
* Formats security scan results as readable Markdown reports
|
|
20
|
+
*/
|
|
21
|
+
export declare class MarkdownOutputFormatter {
|
|
22
|
+
private options;
|
|
23
|
+
constructor(options?: MarkdownOptions);
|
|
24
|
+
/**
|
|
25
|
+
* Format scan results as Markdown
|
|
26
|
+
*/
|
|
27
|
+
format(result: ScanResult, securityScore?: number): string;
|
|
28
|
+
/**
|
|
29
|
+
* Format the report header
|
|
30
|
+
*/
|
|
31
|
+
private formatHeader;
|
|
32
|
+
/**
|
|
33
|
+
* Format metadata section
|
|
34
|
+
*/
|
|
35
|
+
private formatMetadata;
|
|
36
|
+
/**
|
|
37
|
+
* Format summary section
|
|
38
|
+
*/
|
|
39
|
+
private formatSummary;
|
|
40
|
+
/**
|
|
41
|
+
* Format issues section
|
|
42
|
+
*/
|
|
43
|
+
private formatIssues;
|
|
44
|
+
/**
|
|
45
|
+
* Format issues grouped by severity
|
|
46
|
+
*/
|
|
47
|
+
private formatIssuesBySeverity;
|
|
48
|
+
/**
|
|
49
|
+
* Format issues as a simple list
|
|
50
|
+
*/
|
|
51
|
+
private formatIssuesList;
|
|
52
|
+
/**
|
|
53
|
+
* Format a single issue
|
|
54
|
+
*/
|
|
55
|
+
private formatSingleIssue;
|
|
56
|
+
/**
|
|
57
|
+
* Format recommendations section
|
|
58
|
+
*/
|
|
59
|
+
private formatRecommendations;
|
|
60
|
+
/**
|
|
61
|
+
* Generate a filename for the markdown report
|
|
62
|
+
*/
|
|
63
|
+
generateFilename(prefix?: string): string;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=markdown-output-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-output-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-output-formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,UAAU,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,GAAE,eAAoB;IAWzC;;OAEG;IACI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM;IA6BjE;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6G7B;;OAEG;IACI,gBAAgB,CAAC,MAAM,GAAE,MAAgC,GAAG,MAAM;CAI1E"}
|