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,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result Cache
|
|
3
|
+
* Caches scan results to skip unchanged files for faster subsequent scans
|
|
4
|
+
*/
|
|
5
|
+
export interface CacheEntry {
|
|
6
|
+
hash: string;
|
|
7
|
+
timestamp: number;
|
|
8
|
+
results: any[];
|
|
9
|
+
fileSize: number;
|
|
10
|
+
modifiedTime: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CacheStats {
|
|
13
|
+
totalEntries: number;
|
|
14
|
+
hitCount: number;
|
|
15
|
+
missCount: number;
|
|
16
|
+
hitRate: number;
|
|
17
|
+
cacheSize: number;
|
|
18
|
+
expiredEntries: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class ResultCache {
|
|
21
|
+
private readonly cacheDir;
|
|
22
|
+
private readonly cacheFile;
|
|
23
|
+
private cache;
|
|
24
|
+
private hitCount;
|
|
25
|
+
private missCount;
|
|
26
|
+
private readonly maxAge;
|
|
27
|
+
private isDirty;
|
|
28
|
+
constructor(cacheDir?: string, maxAgeHours?: number);
|
|
29
|
+
/**
|
|
30
|
+
* Get cached results for a file
|
|
31
|
+
*/
|
|
32
|
+
get(filePath: string): any[] | null;
|
|
33
|
+
/**
|
|
34
|
+
* Set cached results for a file
|
|
35
|
+
*/
|
|
36
|
+
set(filePath: string, results: any[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* Clear all cached results
|
|
39
|
+
*/
|
|
40
|
+
clear(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Remove expired entries from cache
|
|
43
|
+
*/
|
|
44
|
+
cleanup(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Get cache statistics
|
|
47
|
+
*/
|
|
48
|
+
getStats(): CacheStats;
|
|
49
|
+
/**
|
|
50
|
+
* Save cache to disk
|
|
51
|
+
*/
|
|
52
|
+
save(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Load cache from disk
|
|
55
|
+
*/
|
|
56
|
+
private loadCache;
|
|
57
|
+
/**
|
|
58
|
+
* Ensure cache directory exists
|
|
59
|
+
*/
|
|
60
|
+
private ensureCacheDirectory;
|
|
61
|
+
/**
|
|
62
|
+
* Generate cache key for a file path
|
|
63
|
+
*/
|
|
64
|
+
private getCacheKey;
|
|
65
|
+
/**
|
|
66
|
+
* Calculate hash for file based on size and modification time
|
|
67
|
+
*/
|
|
68
|
+
private calculateFileHash;
|
|
69
|
+
/**
|
|
70
|
+
* Get file statistics
|
|
71
|
+
*/
|
|
72
|
+
private getFileStats;
|
|
73
|
+
/**
|
|
74
|
+
* Check if cache entry is expired
|
|
75
|
+
*/
|
|
76
|
+
private isExpired;
|
|
77
|
+
/**
|
|
78
|
+
* Get cache directory path
|
|
79
|
+
*/
|
|
80
|
+
getCacheDir(): string;
|
|
81
|
+
/**
|
|
82
|
+
* Check if cache is enabled (directory is writable)
|
|
83
|
+
*/
|
|
84
|
+
isEnabled(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Get cache file size in bytes
|
|
87
|
+
*/
|
|
88
|
+
getCacheFileSize(): number;
|
|
89
|
+
}
|
|
90
|
+
export declare let resultCache: ResultCache | null;
|
|
91
|
+
/**
|
|
92
|
+
* Initialize global result cache
|
|
93
|
+
*/
|
|
94
|
+
export declare function initializeResultCache(cacheDir?: string, maxAgeHours?: number): ResultCache;
|
|
95
|
+
/**
|
|
96
|
+
* Get the global result cache instance
|
|
97
|
+
*/
|
|
98
|
+
export declare function getResultCache(): ResultCache | null;
|
|
99
|
+
//# sourceMappingURL=result-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-cache.d.ts","sourceRoot":"","sources":["../../src/utils/result-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,OAAO,CAAkB;gBAErB,QAAQ,GAAE,MAAuB,EAAE,WAAW,GAAE,MAAW;IASvE;;OAEG;IACI,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI;IAgD1C;;OAEG;IACI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;IA4BlD;;OAEG;IACI,KAAK,IAAI,IAAI;IAOpB;;OAEG;IACI,OAAO,IAAI,MAAM;IAkBxB;;OAEG;IACI,QAAQ,IAAI,UAAU;IA6B7B;;OAEG;IACI,IAAI,IAAI,IAAI;IAuBnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAoBjB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACI,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACI,SAAS,IAAI,OAAO;IAY3B;;OAEG;IACI,gBAAgB,IAAI,MAAM;CAUlC;AAGD,eAAO,IAAI,WAAW,EAAE,WAAW,GAAG,IAAW,CAAC;AAElD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAG1F;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAEnD"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Result Cache
|
|
4
|
+
* Caches scan results to skip unchanged files for faster subsequent scans
|
|
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.resultCache = exports.ResultCache = void 0;
|
|
41
|
+
exports.initializeResultCache = initializeResultCache;
|
|
42
|
+
exports.getResultCache = getResultCache;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const crypto = __importStar(require("crypto"));
|
|
46
|
+
class ResultCache {
|
|
47
|
+
cacheDir;
|
|
48
|
+
cacheFile;
|
|
49
|
+
cache = new Map();
|
|
50
|
+
hitCount = 0;
|
|
51
|
+
missCount = 0;
|
|
52
|
+
maxAge; // in milliseconds
|
|
53
|
+
isDirty = false;
|
|
54
|
+
constructor(cacheDir = '.avana-cache', maxAgeHours = 24) {
|
|
55
|
+
this.cacheDir = path.resolve(cacheDir);
|
|
56
|
+
this.cacheFile = path.join(this.cacheDir, 'scan-results.json');
|
|
57
|
+
this.maxAge = maxAgeHours * 60 * 60 * 1000; // Convert hours to milliseconds
|
|
58
|
+
this.ensureCacheDirectory();
|
|
59
|
+
this.loadCache();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get cached results for a file
|
|
63
|
+
*/
|
|
64
|
+
get(filePath) {
|
|
65
|
+
try {
|
|
66
|
+
const absolutePath = path.resolve(filePath);
|
|
67
|
+
const cacheKey = this.getCacheKey(absolutePath);
|
|
68
|
+
const entry = this.cache.get(cacheKey);
|
|
69
|
+
if (!entry) {
|
|
70
|
+
this.missCount++;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// Check if entry is expired
|
|
74
|
+
if (this.isExpired(entry)) {
|
|
75
|
+
this.cache.delete(cacheKey);
|
|
76
|
+
this.isDirty = true;
|
|
77
|
+
this.missCount++;
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Check if file has been modified
|
|
81
|
+
const fileStats = this.getFileStats(absolutePath);
|
|
82
|
+
if (!fileStats) {
|
|
83
|
+
// File doesn't exist anymore, remove from cache
|
|
84
|
+
this.cache.delete(cacheKey);
|
|
85
|
+
this.isDirty = true;
|
|
86
|
+
this.missCount++;
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const currentHash = this.calculateFileHash(fileStats.size, fileStats.mtime);
|
|
90
|
+
if (entry.hash !== currentHash) {
|
|
91
|
+
// File has been modified, remove from cache
|
|
92
|
+
this.cache.delete(cacheKey);
|
|
93
|
+
this.isDirty = true;
|
|
94
|
+
this.missCount++;
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
// Cache hit!
|
|
98
|
+
this.hitCount++;
|
|
99
|
+
return entry.results;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// On any error, treat as cache miss
|
|
103
|
+
this.missCount++;
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Set cached results for a file
|
|
109
|
+
*/
|
|
110
|
+
set(filePath, results) {
|
|
111
|
+
try {
|
|
112
|
+
const absolutePath = path.resolve(filePath);
|
|
113
|
+
const fileStats = this.getFileStats(absolutePath);
|
|
114
|
+
if (!fileStats) {
|
|
115
|
+
return; // Can't cache if file doesn't exist
|
|
116
|
+
}
|
|
117
|
+
const cacheKey = this.getCacheKey(absolutePath);
|
|
118
|
+
const hash = this.calculateFileHash(fileStats.size, fileStats.mtime);
|
|
119
|
+
const entry = {
|
|
120
|
+
hash,
|
|
121
|
+
timestamp: Date.now(),
|
|
122
|
+
results: results,
|
|
123
|
+
fileSize: fileStats.size,
|
|
124
|
+
modifiedTime: fileStats.mtime
|
|
125
|
+
};
|
|
126
|
+
this.cache.set(cacheKey, entry);
|
|
127
|
+
this.isDirty = true;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// Silently fail on cache set errors
|
|
131
|
+
// Caching is optional and shouldn't break the main functionality
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Clear all cached results
|
|
136
|
+
*/
|
|
137
|
+
clear() {
|
|
138
|
+
this.cache.clear();
|
|
139
|
+
this.hitCount = 0;
|
|
140
|
+
this.missCount = 0;
|
|
141
|
+
this.isDirty = true;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Remove expired entries from cache
|
|
145
|
+
*/
|
|
146
|
+
cleanup() {
|
|
147
|
+
let removedCount = 0;
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
150
|
+
if (this.isExpired(entry, now)) {
|
|
151
|
+
this.cache.delete(key);
|
|
152
|
+
removedCount++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (removedCount > 0) {
|
|
156
|
+
this.isDirty = true;
|
|
157
|
+
}
|
|
158
|
+
return removedCount;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get cache statistics
|
|
162
|
+
*/
|
|
163
|
+
getStats() {
|
|
164
|
+
const totalRequests = this.hitCount + this.missCount;
|
|
165
|
+
const hitRate = totalRequests > 0 ? (this.hitCount / totalRequests) * 100 : 0;
|
|
166
|
+
// Calculate cache size in bytes (approximate)
|
|
167
|
+
let cacheSize = 0;
|
|
168
|
+
for (const entry of this.cache.values()) {
|
|
169
|
+
cacheSize += JSON.stringify(entry).length * 2; // Rough estimate (UTF-16)
|
|
170
|
+
}
|
|
171
|
+
// Count expired entries
|
|
172
|
+
const now = Date.now();
|
|
173
|
+
let expiredEntries = 0;
|
|
174
|
+
for (const entry of this.cache.values()) {
|
|
175
|
+
if (this.isExpired(entry, now)) {
|
|
176
|
+
expiredEntries++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
totalEntries: this.cache.size,
|
|
181
|
+
hitCount: this.hitCount,
|
|
182
|
+
missCount: this.missCount,
|
|
183
|
+
hitRate: Math.round(hitRate * 100) / 100, // Round to 2 decimal places
|
|
184
|
+
cacheSize,
|
|
185
|
+
expiredEntries
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Save cache to disk
|
|
190
|
+
*/
|
|
191
|
+
save() {
|
|
192
|
+
if (!this.isDirty) {
|
|
193
|
+
return; // No changes to save
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
// Clean up expired entries before saving
|
|
197
|
+
this.cleanup();
|
|
198
|
+
const cacheData = {
|
|
199
|
+
version: '1.0',
|
|
200
|
+
timestamp: Date.now(),
|
|
201
|
+
entries: Array.from(this.cache.entries())
|
|
202
|
+
};
|
|
203
|
+
fs.writeFileSync(this.cacheFile, JSON.stringify(cacheData, null, 2), 'utf8');
|
|
204
|
+
this.isDirty = false;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
// Silently fail on save errors
|
|
208
|
+
// Caching is optional and shouldn't break the main functionality
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Load cache from disk
|
|
213
|
+
*/
|
|
214
|
+
loadCache() {
|
|
215
|
+
try {
|
|
216
|
+
if (!fs.existsSync(this.cacheFile)) {
|
|
217
|
+
return; // No cache file exists yet
|
|
218
|
+
}
|
|
219
|
+
const cacheData = JSON.parse(fs.readFileSync(this.cacheFile, 'utf8'));
|
|
220
|
+
if (cacheData.version === '1.0' && Array.isArray(cacheData.entries)) {
|
|
221
|
+
this.cache = new Map(cacheData.entries);
|
|
222
|
+
// Clean up expired entries on load
|
|
223
|
+
this.cleanup();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
// If cache file is corrupted, start with empty cache
|
|
228
|
+
this.cache.clear();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Ensure cache directory exists
|
|
233
|
+
*/
|
|
234
|
+
ensureCacheDirectory() {
|
|
235
|
+
try {
|
|
236
|
+
if (!fs.existsSync(this.cacheDir)) {
|
|
237
|
+
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
// If we can't create cache directory, caching will be disabled
|
|
242
|
+
// This is acceptable as caching is optional
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Generate cache key for a file path
|
|
247
|
+
*/
|
|
248
|
+
getCacheKey(absolutePath) {
|
|
249
|
+
// Use the absolute path as the cache key
|
|
250
|
+
// Normalize path separators for cross-platform compatibility
|
|
251
|
+
return absolutePath.replace(/\\/g, '/');
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Calculate hash for file based on size and modification time
|
|
255
|
+
*/
|
|
256
|
+
calculateFileHash(size, mtime) {
|
|
257
|
+
// Use file size and modification time to create a hash
|
|
258
|
+
// This is much faster than reading the entire file content
|
|
259
|
+
const data = `${size}-${mtime}`;
|
|
260
|
+
return crypto.createHash('md5').update(data).digest('hex');
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get file statistics
|
|
264
|
+
*/
|
|
265
|
+
getFileStats(filePath) {
|
|
266
|
+
try {
|
|
267
|
+
const stats = fs.statSync(filePath);
|
|
268
|
+
return {
|
|
269
|
+
size: stats.size,
|
|
270
|
+
mtime: stats.mtime.getTime()
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Check if cache entry is expired
|
|
279
|
+
*/
|
|
280
|
+
isExpired(entry, now = Date.now()) {
|
|
281
|
+
return (now - entry.timestamp) > this.maxAge;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Get cache directory path
|
|
285
|
+
*/
|
|
286
|
+
getCacheDir() {
|
|
287
|
+
return this.cacheDir;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Check if cache is enabled (directory is writable)
|
|
291
|
+
*/
|
|
292
|
+
isEnabled() {
|
|
293
|
+
try {
|
|
294
|
+
// Try to write a test file to check if directory is writable
|
|
295
|
+
const testFile = path.join(this.cacheDir, '.test');
|
|
296
|
+
fs.writeFileSync(testFile, 'test');
|
|
297
|
+
fs.unlinkSync(testFile);
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get cache file size in bytes
|
|
306
|
+
*/
|
|
307
|
+
getCacheFileSize() {
|
|
308
|
+
try {
|
|
309
|
+
if (fs.existsSync(this.cacheFile)) {
|
|
310
|
+
return fs.statSync(this.cacheFile).size;
|
|
311
|
+
}
|
|
312
|
+
return 0;
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
exports.ResultCache = ResultCache;
|
|
320
|
+
// Global result cache instance
|
|
321
|
+
exports.resultCache = null;
|
|
322
|
+
/**
|
|
323
|
+
* Initialize global result cache
|
|
324
|
+
*/
|
|
325
|
+
function initializeResultCache(cacheDir, maxAgeHours) {
|
|
326
|
+
exports.resultCache = new ResultCache(cacheDir, maxAgeHours);
|
|
327
|
+
return exports.resultCache;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get the global result cache instance
|
|
331
|
+
*/
|
|
332
|
+
function getResultCache() {
|
|
333
|
+
return exports.resultCache;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=result-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-cache.js","sourceRoot":"","sources":["../../src/utils/result-cache.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6UH,sDAGC;AAKD,wCAEC;AArVD,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAiC;AAmBjC,MAAa,WAAW;IACL,QAAQ,CAAS;IACjB,SAAS,CAAS;IAC3B,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC3C,QAAQ,GAAW,CAAC,CAAC;IACrB,SAAS,GAAW,CAAC,CAAC;IACb,MAAM,CAAS,CAAC,kBAAkB;IAC3C,OAAO,GAAY,KAAK,CAAC;IAEjC,YAAY,WAAmB,cAAc,EAAE,cAAsB,EAAE;QACrE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,gCAAgC;QAE5E,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,QAAgB;QACzB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,kCAAkC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,gDAAgD;gBAChD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,4CAA4C;gBAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,aAAa;YACb,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oCAAoC;YACpC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,QAAgB,EAAE,OAAc;QACzC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAElD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,oCAAoC;YAC9C,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAErE,MAAM,KAAK,GAAe;gBACxB,IAAI;gBACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,YAAY,EAAE,SAAS,CAAC,KAAK;aAC9B,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oCAAoC;YACpC,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QACrD,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9E,8CAA8C;QAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,0BAA0B;QAC3E,CAAC;QAED,wBAAwB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/B,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,4BAA4B;YACtE,SAAS;YACT,cAAc;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,IAAI;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,qBAAqB;QAC/B,CAAC;QAED,IAAI,CAAC;YACH,yCAAyC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YAEf,MAAM,SAAS,GAAG;gBAChB,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aAC1C,CAAC;YAEF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7E,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+BAA+B;YAC/B,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS;QACf,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,2BAA2B;YACrC,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YAEtE,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAExC,mCAAmC;gBACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qDAAqD;YACrD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+DAA+D;YAC/D,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,YAAoB;QACtC,yCAAyC;QACzC,6DAA6D;QAC7D,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,IAAY,EAAE,KAAa;QACnD,uDAAuD;QACvD,2DAA2D;QAC3D,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;aAC7B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAiB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QAC3D,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,SAAS;QACd,IAAI,CAAC;YACH,6DAA6D;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACI,gBAAgB;QACrB,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;YAC1C,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;CACF;AA9SD,kCA8SC;AAED,+BAA+B;AACpB,QAAA,WAAW,GAAuB,IAAI,CAAC;AAElD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,QAAiB,EAAE,WAAoB;IAC3E,mBAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO,mBAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO,mBAAW,CAAC;AACrB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "avana-cli",
|
|
3
|
+
"version": "2.11.0",
|
|
4
|
+
"description": "A robust, production-ready CLI tool for detecting secrets and credentials in your codebase",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"avana-cli": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"scan": "node dist/cli.js scan",
|
|
14
|
+
"scan:verbose": "node dist/cli.js scan --verbose",
|
|
15
|
+
"prepare": "husky || true",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:unit-only": "vitest run tests/unit",
|
|
18
|
+
"test:property": "vitest run tests/property",
|
|
19
|
+
"test:integration": "vitest run tests/integration",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"lint": "eslint src --ext .ts",
|
|
23
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
24
|
+
"prepublishOnly": "npm run build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"security",
|
|
28
|
+
"secrets",
|
|
29
|
+
"scanner",
|
|
30
|
+
"cli",
|
|
31
|
+
"credentials",
|
|
32
|
+
"api-keys",
|
|
33
|
+
"git-hooks",
|
|
34
|
+
"devops",
|
|
35
|
+
"security-tools",
|
|
36
|
+
"secret-detection",
|
|
37
|
+
"credential-scanning",
|
|
38
|
+
"pre-commit",
|
|
39
|
+
"security-scanner"
|
|
40
|
+
],
|
|
41
|
+
"author": "Innocent",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/innookeke/avana-cli.git"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/innookeke/avana-cli/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/innookeke/avana-cli#readme",
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18.0.0"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"husky": "^9.0.0",
|
|
56
|
+
"minimatch": "^10.1.1"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/cli-progress": "^3.11.6",
|
|
60
|
+
"@types/minimatch": "^5.1.2",
|
|
61
|
+
"@types/node": "^20.14.0",
|
|
62
|
+
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
63
|
+
"@typescript-eslint/parser": "^7.0.0",
|
|
64
|
+
"@vitest/coverage-v8": "^2.0.0",
|
|
65
|
+
"chardet": "^2.1.1",
|
|
66
|
+
"cli-progress": "^3.12.0",
|
|
67
|
+
"eslint": "^8.57.0",
|
|
68
|
+
"fast-check": "^3.23.2",
|
|
69
|
+
"iconv-lite": "^0.7.2",
|
|
70
|
+
"prettier": "^3.2.0",
|
|
71
|
+
"typescript": "^5.5.0",
|
|
72
|
+
"vitest": "^2.1.9"
|
|
73
|
+
},
|
|
74
|
+
"files": [
|
|
75
|
+
"dist",
|
|
76
|
+
"README.md",
|
|
77
|
+
"LICENSE",
|
|
78
|
+
"CHANGELOG.md"
|
|
79
|
+
]
|
|
80
|
+
}
|