@vaultcompass/vault-guard-core 1.0.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/LICENSE +21 -0
- package/dist/baseline.d.ts +24 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +87 -0
- package/dist/baseline.js.map +1 -0
- package/dist/config-validate.d.ts +13 -0
- package/dist/config-validate.d.ts.map +1 -0
- package/dist/config-validate.js +111 -0
- package/dist/config-validate.js.map +1 -0
- package/dist/config.d.ts +69 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +106 -0
- package/dist/config.js.map +1 -0
- package/dist/diagnostics.d.ts +64 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +59 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.d.ts +63 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +98 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/match-fingerprint.d.ts +7 -0
- package/dist/match-fingerprint.d.ts.map +1 -0
- package/dist/match-fingerprint.js +28 -0
- package/dist/match-fingerprint.js.map +1 -0
- package/dist/scan-output.d.ts +65 -0
- package/dist/scan-output.d.ts.map +1 -0
- package/dist/scan-output.js +140 -0
- package/dist/scan-output.js.map +1 -0
- package/dist/scanners/index.d.ts +5 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +21 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/pre-commit-hook.d.ts +41 -0
- package/dist/scanners/pre-commit-hook.d.ts.map +1 -0
- package/dist/scanners/pre-commit-hook.js +389 -0
- package/dist/scanners/pre-commit-hook.js.map +1 -0
- package/dist/scanners/secret-scanner.d.ts +99 -0
- package/dist/scanners/secret-scanner.d.ts.map +1 -0
- package/dist/scanners/secret-scanner.js +422 -0
- package/dist/scanners/secret-scanner.js.map +1 -0
- package/dist/scanners/token-counter.d.ts +27 -0
- package/dist/scanners/token-counter.d.ts.map +1 -0
- package/dist/scanners/token-counter.js +121 -0
- package/dist/scanners/token-counter.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/entropy.d.ts +17 -0
- package/dist/utils/entropy.d.ts.map +1 -0
- package/dist/utils/entropy.js +35 -0
- package/dist/utils/entropy.js.map +1 -0
- package/dist/utils/file-utils.d.ts +39 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +442 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/git-utils.d.ts +12 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +55 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/path-severity.d.ts +17 -0
- package/dist/utils/path-severity.d.ts.map +1 -0
- package/dist/utils/path-severity.js +96 -0
- package/dist/utils/path-severity.js.map +1 -0
- package/dist/utils/placeholder.d.ts +53 -0
- package/dist/utils/placeholder.d.ts.map +1 -0
- package/dist/utils/placeholder.js +198 -0
- package/dist/utils/placeholder.js.map +1 -0
- package/dist/utils/regex-safety.d.ts +102 -0
- package/dist/utils/regex-safety.d.ts.map +1 -0
- package/dist/utils/regex-safety.js +193 -0
- package/dist/utils/regex-safety.js.map +1 -0
- package/dist/utils/scan-file.d.ts +29 -0
- package/dist/utils/scan-file.d.ts.map +1 -0
- package/dist/utils/scan-file.js +125 -0
- package/dist/utils/scan-file.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute Shannon entropy (bits per character) for a string.
|
|
3
|
+
*
|
|
4
|
+
* High-entropy strings (≥ ~3.5 bits/char) look random — the hallmark of a
|
|
5
|
+
* generated secret. Low-entropy strings (< 3.5 bits/char) are readable
|
|
6
|
+
* words, git SHAs composed of a small alphabet, or repetitive padding.
|
|
7
|
+
*
|
|
8
|
+
* Used as a secondary gate for broad "generic" patterns that cannot be
|
|
9
|
+
* anchored to a vendor-specific prefix.
|
|
10
|
+
*/
|
|
11
|
+
export declare function shannonEntropy(value: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* Default entropy threshold for generic / catch-all patterns.
|
|
14
|
+
* Values below this are likely false positives (readable words, hex hashes…).
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_ENTROPY_THRESHOLD = 3.5;
|
|
17
|
+
//# sourceMappingURL=entropy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entropy.d.ts","sourceRoot":"","sources":["../../src/utils/entropy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBpD;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_ENTROPY_THRESHOLD = void 0;
|
|
4
|
+
exports.shannonEntropy = shannonEntropy;
|
|
5
|
+
/**
|
|
6
|
+
* Compute Shannon entropy (bits per character) for a string.
|
|
7
|
+
*
|
|
8
|
+
* High-entropy strings (≥ ~3.5 bits/char) look random — the hallmark of a
|
|
9
|
+
* generated secret. Low-entropy strings (< 3.5 bits/char) are readable
|
|
10
|
+
* words, git SHAs composed of a small alphabet, or repetitive padding.
|
|
11
|
+
*
|
|
12
|
+
* Used as a secondary gate for broad "generic" patterns that cannot be
|
|
13
|
+
* anchored to a vendor-specific prefix.
|
|
14
|
+
*/
|
|
15
|
+
function shannonEntropy(value) {
|
|
16
|
+
if (value.length === 0)
|
|
17
|
+
return 0;
|
|
18
|
+
const freq = {};
|
|
19
|
+
for (const ch of value) {
|
|
20
|
+
freq[ch] = (freq[ch] ?? 0) + 1;
|
|
21
|
+
}
|
|
22
|
+
let h = 0;
|
|
23
|
+
const len = value.length;
|
|
24
|
+
for (const count of Object.values(freq)) {
|
|
25
|
+
const p = count / len;
|
|
26
|
+
h -= p * Math.log2(p);
|
|
27
|
+
}
|
|
28
|
+
return h;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Default entropy threshold for generic / catch-all patterns.
|
|
32
|
+
* Values below this are likely false positives (readable words, hex hashes…).
|
|
33
|
+
*/
|
|
34
|
+
exports.DEFAULT_ENTROPY_THRESHOLD = 3.5;
|
|
35
|
+
//# sourceMappingURL=entropy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entropy.js","sourceRoot":"","sources":["../../src/utils/entropy.ts"],"names":[],"mappings":";;;AAUA,wCAgBC;AA1BD;;;;;;;;;GASG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;QACtB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACU,QAAA,yBAAyB,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { DiagnosticBus } from '../diagnostics';
|
|
2
|
+
/**
|
|
3
|
+
* Build a filter from `config.ignore.paths` / `config.ignore.patterns` entries.
|
|
4
|
+
*
|
|
5
|
+
* Patterns follow gitignore syntax (handled by the `ignore` package). Paths are
|
|
6
|
+
* matched against file paths relative to `root` so that patterns like
|
|
7
|
+
* `packages/**\/__tests__\/**` work as expected from the repo root.
|
|
8
|
+
*
|
|
9
|
+
* @returns A predicate that returns `true` when a file should be **excluded**.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildConfigIgnoreFilter(patterns: string[], root: string): (filePath: string) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Drop all cached `.gitignore` matchers. Call after long-lived processes
|
|
14
|
+
* detect an out-of-band change that `mtime` cannot observe, or in tests.
|
|
15
|
+
*/
|
|
16
|
+
export declare function clearGitignoreCache(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get all files in directory recursively (async version)
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAllFilesAsync(dirPath: string, visited?: Set<string>, verbose?: boolean, bus?: DiagnosticBus): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get all files in directory recursively (sync version for backwards compatibility)
|
|
23
|
+
*/
|
|
24
|
+
export declare function getAllFiles(dirPath: string, visited?: Set<string>, verbose?: boolean, bus?: DiagnosticBus): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Get files to scan (filters out ignored directories/files) - async version
|
|
27
|
+
*
|
|
28
|
+
* @param configIgnorePatterns - gitignore-style patterns from `config.ignore.paths`
|
|
29
|
+
* / `config.ignore.patterns`. Matched relative to `targetPath`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getFilesToScanAsync(targetPath: string, verbose?: boolean, bus?: DiagnosticBus, configIgnorePatterns?: string[]): Promise<string[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Get files to scan (filters out ignored directories/files) - sync version
|
|
34
|
+
*
|
|
35
|
+
* @param configIgnorePatterns - gitignore-style patterns from `config.ignore.paths`
|
|
36
|
+
* / `config.ignore.patterns`. Matched relative to `targetPath`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getFilesToScan(targetPath: string, verbose?: boolean, bus?: DiagnosticBus, configIgnorePatterns?: string[]): string[];
|
|
39
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,EAAE,MAAM,GACX,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAQ/B;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AA2JD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,cAAoB,EAC3B,OAAO,UAAQ,EACf,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmEnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,cAAoB,EAC3B,OAAO,UAAQ,EACf,GAAG,CAAC,EAAE,aAAa,GAClB,MAAM,EAAE,CAgEV;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,UAAQ,EACf,GAAG,CAAC,EAAE,aAAa,EACnB,oBAAoB,GAAE,MAAM,EAAO,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,OAAO,UAAQ,EACf,GAAG,CAAC,EAAE,aAAa,EACnB,oBAAoB,GAAE,MAAM,EAAO,GAClC,MAAM,EAAE,CAOV"}
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.buildConfigIgnoreFilter = buildConfigIgnoreFilter;
|
|
40
|
+
exports.clearGitignoreCache = clearGitignoreCache;
|
|
41
|
+
exports.getAllFilesAsync = getAllFilesAsync;
|
|
42
|
+
exports.getAllFiles = getAllFiles;
|
|
43
|
+
exports.getFilesToScanAsync = getFilesToScanAsync;
|
|
44
|
+
exports.getFilesToScan = getFilesToScan;
|
|
45
|
+
const fs_1 = __importStar(require("fs"));
|
|
46
|
+
const path_1 = __importDefault(require("path"));
|
|
47
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
48
|
+
/**
|
|
49
|
+
* Build a filter from `config.ignore.paths` / `config.ignore.patterns` entries.
|
|
50
|
+
*
|
|
51
|
+
* Patterns follow gitignore syntax (handled by the `ignore` package). Paths are
|
|
52
|
+
* matched against file paths relative to `root` so that patterns like
|
|
53
|
+
* `packages/**\/__tests__\/**` work as expected from the repo root.
|
|
54
|
+
*
|
|
55
|
+
* @returns A predicate that returns `true` when a file should be **excluded**.
|
|
56
|
+
*/
|
|
57
|
+
function buildConfigIgnoreFilter(patterns, root) {
|
|
58
|
+
if (patterns.length === 0)
|
|
59
|
+
return () => false;
|
|
60
|
+
const ig = (0, ignore_1.default)().add(patterns);
|
|
61
|
+
return (filePath) => {
|
|
62
|
+
const rel = path_1.default.relative(root, path_1.default.resolve(filePath)).split(path_1.default.sep).join('/');
|
|
63
|
+
if (!rel || rel.startsWith('..') || path_1.default.isAbsolute(rel))
|
|
64
|
+
return false;
|
|
65
|
+
return ig.ignores(rel);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const GITIGNORE_CACHE_MAX = 32;
|
|
69
|
+
const gitignoreCache = new Map();
|
|
70
|
+
/**
|
|
71
|
+
* Drop all cached `.gitignore` matchers. Call after long-lived processes
|
|
72
|
+
* detect an out-of-band change that `mtime` cannot observe, or in tests.
|
|
73
|
+
*/
|
|
74
|
+
function clearGitignoreCache() {
|
|
75
|
+
gitignoreCache.clear();
|
|
76
|
+
}
|
|
77
|
+
function touchCache(key, entry) {
|
|
78
|
+
gitignoreCache.delete(key);
|
|
79
|
+
gitignoreCache.set(key, { ...entry, lastUsed: Date.now() });
|
|
80
|
+
while (gitignoreCache.size > GITIGNORE_CACHE_MAX) {
|
|
81
|
+
const oldest = gitignoreCache.keys().next().value;
|
|
82
|
+
if (oldest === undefined)
|
|
83
|
+
break;
|
|
84
|
+
gitignoreCache.delete(oldest);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function isStale(entry) {
|
|
88
|
+
for (let i = 0; i < entry.watchPaths.length; i++) {
|
|
89
|
+
const p = entry.watchPaths[i];
|
|
90
|
+
const expected = entry.mtimesMs[i];
|
|
91
|
+
try {
|
|
92
|
+
if (fs_1.default.statSync(p).mtimeMs !== expected)
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
function findGitRoot(startDir) {
|
|
102
|
+
let dir = path_1.default.resolve(startDir);
|
|
103
|
+
while (true) {
|
|
104
|
+
if (fs_1.default.existsSync(path_1.default.join(dir, '.git'))) {
|
|
105
|
+
return dir;
|
|
106
|
+
}
|
|
107
|
+
const parent = path_1.default.dirname(dir);
|
|
108
|
+
if (parent === dir)
|
|
109
|
+
return null;
|
|
110
|
+
dir = parent;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function filesystemRootFor(resolvedPath) {
|
|
114
|
+
return path_1.default.parse(resolvedPath).root;
|
|
115
|
+
}
|
|
116
|
+
/** Prefix a single `.gitignore` line for rules defined in a subdirectory. */
|
|
117
|
+
function qualifyGitignoreLine(line, posixPrefix) {
|
|
118
|
+
if (!posixPrefix)
|
|
119
|
+
return line;
|
|
120
|
+
const trimmed = line.trimEnd();
|
|
121
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
122
|
+
return line;
|
|
123
|
+
const neg = trimmed.startsWith('!');
|
|
124
|
+
const body = neg ? trimmed.slice(1) : trimmed;
|
|
125
|
+
if (!body)
|
|
126
|
+
return line;
|
|
127
|
+
let out;
|
|
128
|
+
if (body.startsWith('/')) {
|
|
129
|
+
out = `${posixPrefix}${body}`;
|
|
130
|
+
}
|
|
131
|
+
else if (body.includes('/')) {
|
|
132
|
+
out = `${posixPrefix}/${body}`;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
out = `${posixPrefix}/**/${body}`;
|
|
136
|
+
}
|
|
137
|
+
return neg ? `!${out}` : out;
|
|
138
|
+
}
|
|
139
|
+
function qualifyGitignoreContent(content, posixPrefix) {
|
|
140
|
+
if (!posixPrefix)
|
|
141
|
+
return content;
|
|
142
|
+
return content.split('\n').map(l => qualifyGitignoreLine(l, posixPrefix)).join('\n');
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Walk upward from `resolvedScan` through `stopAt` (inclusive), collect each
|
|
146
|
+
* `.gitignore`, then return entries in shallow-to-deep order for merging.
|
|
147
|
+
*/
|
|
148
|
+
function collectGitignoreChain(resolvedScan, stopAt) {
|
|
149
|
+
const stop = path_1.default.resolve(stopAt);
|
|
150
|
+
const raw = [];
|
|
151
|
+
let dir = path_1.default.resolve(resolvedScan);
|
|
152
|
+
while (true) {
|
|
153
|
+
const absGitignore = path_1.default.join(dir, '.gitignore');
|
|
154
|
+
if (fs_1.default.existsSync(absGitignore)) {
|
|
155
|
+
try {
|
|
156
|
+
raw.push({
|
|
157
|
+
dir,
|
|
158
|
+
absGitignore,
|
|
159
|
+
content: fs_1.default.readFileSync(absGitignore, 'utf-8'),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
/* unreadable .gitignore — treat as absent */
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (dir === stop)
|
|
167
|
+
break;
|
|
168
|
+
const parent = path_1.default.dirname(dir);
|
|
169
|
+
if (parent === dir)
|
|
170
|
+
break;
|
|
171
|
+
dir = parent;
|
|
172
|
+
}
|
|
173
|
+
raw.reverse();
|
|
174
|
+
return raw;
|
|
175
|
+
}
|
|
176
|
+
function buildIgnoreFilter(resolvedScanRoot) {
|
|
177
|
+
const gitRoot = findGitRoot(resolvedScanRoot);
|
|
178
|
+
const stopAt = gitRoot ?? filesystemRootFor(resolvedScanRoot);
|
|
179
|
+
const chain = collectGitignoreChain(resolvedScanRoot, stopAt);
|
|
180
|
+
const ig = (0, ignore_1.default)();
|
|
181
|
+
for (const { dir, content } of chain) {
|
|
182
|
+
const relDir = path_1.default.relative(stopAt, dir).split(path_1.default.sep).join('/');
|
|
183
|
+
const posixPrefix = relDir === '' || relDir === '.' ? '' : relDir;
|
|
184
|
+
ig.add(qualifyGitignoreContent(content, posixPrefix));
|
|
185
|
+
}
|
|
186
|
+
const watchPaths = chain.map(c => c.absGitignore);
|
|
187
|
+
const mtimesMs = watchPaths.map(p => {
|
|
188
|
+
try {
|
|
189
|
+
return fs_1.default.statSync(p).mtimeMs;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return -1;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
const tester = (filePath) => {
|
|
196
|
+
const rel = path_1.default.relative(stopAt, path_1.default.resolve(filePath)).split(path_1.default.sep).join('/');
|
|
197
|
+
if (rel.startsWith('..') || path_1.default.isAbsolute(rel)) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
const posixPath = rel === '' ? '.' : rel;
|
|
201
|
+
return ig.ignores(posixPath);
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
lastUsed: Date.now(),
|
|
205
|
+
tester,
|
|
206
|
+
watchPaths,
|
|
207
|
+
mtimesMs,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function getGitignoreTester(scanRoot) {
|
|
211
|
+
const key = path_1.default.resolve(scanRoot);
|
|
212
|
+
const hit = gitignoreCache.get(key);
|
|
213
|
+
if (hit && !isStale(hit)) {
|
|
214
|
+
touchCache(key, hit);
|
|
215
|
+
return hit.tester;
|
|
216
|
+
}
|
|
217
|
+
const built = buildIgnoreFilter(key);
|
|
218
|
+
touchCache(key, built);
|
|
219
|
+
return built.tester;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get all files in directory recursively (async version)
|
|
223
|
+
*/
|
|
224
|
+
async function getAllFilesAsync(dirPath, visited = new Set(), verbose = false, bus) {
|
|
225
|
+
const files = [];
|
|
226
|
+
try {
|
|
227
|
+
try {
|
|
228
|
+
await fs_1.promises.access(dirPath);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
if (bus) {
|
|
232
|
+
bus.add({
|
|
233
|
+
code: 'fs.permission_denied',
|
|
234
|
+
severity: 'warning',
|
|
235
|
+
ctx: { dir: dirPath },
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
return files;
|
|
239
|
+
}
|
|
240
|
+
const realPath = fs_1.default.realpathSync(dirPath);
|
|
241
|
+
if (visited.has(realPath)) {
|
|
242
|
+
return files;
|
|
243
|
+
}
|
|
244
|
+
visited.add(realPath);
|
|
245
|
+
const items = await fs_1.promises.readdir(dirPath);
|
|
246
|
+
for (const item of items) {
|
|
247
|
+
try {
|
|
248
|
+
const fullPath = path_1.default.join(dirPath, item);
|
|
249
|
+
const lstat = await fs_1.promises.lstat(fullPath);
|
|
250
|
+
if (lstat.isSymbolicLink()) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (lstat.isDirectory() && !shouldIgnoreDirectory(item)) {
|
|
254
|
+
const subFiles = await getAllFilesAsync(fullPath, visited, verbose, bus);
|
|
255
|
+
files.push(...subFiles);
|
|
256
|
+
}
|
|
257
|
+
else if (lstat.isFile() && !shouldIgnoreFile(fullPath)) {
|
|
258
|
+
files.push(fullPath);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
if (bus) {
|
|
263
|
+
bus.add({
|
|
264
|
+
code: 'fs.permission_denied',
|
|
265
|
+
severity: 'warning',
|
|
266
|
+
ctx: { path: path_1.default.join(dirPath, item), detail: String(error) },
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
if (verbose) {
|
|
270
|
+
console.error(`Warning: Cannot access ${path_1.default.join(dirPath, item)}:`, error);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
if (bus) {
|
|
277
|
+
bus.add({
|
|
278
|
+
code: 'fs.permission_denied',
|
|
279
|
+
severity: 'warning',
|
|
280
|
+
ctx: { dir: dirPath, detail: String(error) },
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
if (verbose) {
|
|
284
|
+
console.error(`Warning: Cannot read directory ${dirPath}:`, error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return files;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get all files in directory recursively (sync version for backwards compatibility)
|
|
291
|
+
*/
|
|
292
|
+
function getAllFiles(dirPath, visited = new Set(), verbose = false, bus) {
|
|
293
|
+
const files = [];
|
|
294
|
+
try {
|
|
295
|
+
if (!fs_1.default.existsSync(dirPath)) {
|
|
296
|
+
if (bus) {
|
|
297
|
+
bus.add({
|
|
298
|
+
code: 'fs.permission_denied',
|
|
299
|
+
severity: 'warning',
|
|
300
|
+
ctx: { dir: dirPath },
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
return files;
|
|
304
|
+
}
|
|
305
|
+
const realPath = fs_1.default.realpathSync(dirPath);
|
|
306
|
+
if (visited.has(realPath)) {
|
|
307
|
+
return files;
|
|
308
|
+
}
|
|
309
|
+
visited.add(realPath);
|
|
310
|
+
const items = fs_1.default.readdirSync(dirPath);
|
|
311
|
+
for (const item of items) {
|
|
312
|
+
try {
|
|
313
|
+
const fullPath = path_1.default.join(dirPath, item);
|
|
314
|
+
const lstat = fs_1.default.lstatSync(fullPath);
|
|
315
|
+
if (lstat.isSymbolicLink()) {
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (lstat.isDirectory() && !shouldIgnoreDirectory(item)) {
|
|
319
|
+
files.push(...getAllFiles(fullPath, visited, verbose, bus));
|
|
320
|
+
}
|
|
321
|
+
else if (lstat.isFile() && !shouldIgnoreFile(fullPath)) {
|
|
322
|
+
files.push(fullPath);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
if (bus) {
|
|
327
|
+
bus.add({
|
|
328
|
+
code: 'fs.permission_denied',
|
|
329
|
+
severity: 'warning',
|
|
330
|
+
ctx: { path: path_1.default.join(dirPath, item), detail: String(error) },
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
if (verbose) {
|
|
334
|
+
console.error(`Warning: Cannot access ${path_1.default.join(dirPath, item)}:`, error);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
if (bus) {
|
|
341
|
+
bus.add({
|
|
342
|
+
code: 'fs.permission_denied',
|
|
343
|
+
severity: 'warning',
|
|
344
|
+
ctx: { dir: dirPath, detail: String(error) },
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (verbose) {
|
|
348
|
+
console.error(`Warning: Cannot read directory ${dirPath}:`, error);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return files;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get files to scan (filters out ignored directories/files) - async version
|
|
355
|
+
*
|
|
356
|
+
* @param configIgnorePatterns - gitignore-style patterns from `config.ignore.paths`
|
|
357
|
+
* / `config.ignore.patterns`. Matched relative to `targetPath`.
|
|
358
|
+
*/
|
|
359
|
+
async function getFilesToScanAsync(targetPath, verbose = false, bus, configIgnorePatterns = []) {
|
|
360
|
+
const allFiles = await getAllFilesAsync(targetPath, new Set(), verbose, bus);
|
|
361
|
+
const gitignoreTester = getGitignoreTester(targetPath);
|
|
362
|
+
const configIgnoreTester = buildConfigIgnoreFilter(configIgnorePatterns, targetPath);
|
|
363
|
+
return allFiles.filter(file => !shouldIgnoreFile(file, gitignoreTester) && !configIgnoreTester(file));
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get files to scan (filters out ignored directories/files) - sync version
|
|
367
|
+
*
|
|
368
|
+
* @param configIgnorePatterns - gitignore-style patterns from `config.ignore.paths`
|
|
369
|
+
* / `config.ignore.patterns`. Matched relative to `targetPath`.
|
|
370
|
+
*/
|
|
371
|
+
function getFilesToScan(targetPath, verbose = false, bus, configIgnorePatterns = []) {
|
|
372
|
+
const allFiles = getAllFiles(targetPath, new Set(), verbose, bus);
|
|
373
|
+
const gitignoreTester = getGitignoreTester(targetPath);
|
|
374
|
+
const configIgnoreTester = buildConfigIgnoreFilter(configIgnorePatterns, targetPath);
|
|
375
|
+
return allFiles.filter(file => !shouldIgnoreFile(file, gitignoreTester) && !configIgnoreTester(file));
|
|
376
|
+
}
|
|
377
|
+
function shouldIgnoreDirectory(name) {
|
|
378
|
+
const ignoreDirs = [
|
|
379
|
+
'node_modules',
|
|
380
|
+
'.git',
|
|
381
|
+
'dist',
|
|
382
|
+
'build',
|
|
383
|
+
'coverage',
|
|
384
|
+
'.next',
|
|
385
|
+
'.turbo',
|
|
386
|
+
// Vendored / generated trees: third-party or tool-managed content where
|
|
387
|
+
// matches are not the user's secrets and the volume drowns real findings.
|
|
388
|
+
'.yarn',
|
|
389
|
+
'vendor',
|
|
390
|
+
'.venv',
|
|
391
|
+
'venv',
|
|
392
|
+
'__pycache__',
|
|
393
|
+
'.mypy_cache',
|
|
394
|
+
'.pytest_cache',
|
|
395
|
+
'.gradle',
|
|
396
|
+
'.svelte-kit',
|
|
397
|
+
];
|
|
398
|
+
return ignoreDirs.includes(name);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Minified / bundled / generated single-file artifacts. These are never
|
|
402
|
+
* hand-authored, routinely committed, and a major false-positive source:
|
|
403
|
+
* broad key shapes (e.g. `AKIA…`) occur by chance inside large minified blobs.
|
|
404
|
+
*/
|
|
405
|
+
function isGeneratedArtifact(basename) {
|
|
406
|
+
return (/\.min\.(js|mjs|cjs|css)$/.test(basename) ||
|
|
407
|
+
/\.bundle\.(js|mjs|cjs)$/.test(basename) ||
|
|
408
|
+
basename === '.pnp.cjs' ||
|
|
409
|
+
basename === '.pnp.loader.mjs');
|
|
410
|
+
}
|
|
411
|
+
function shouldIgnoreFile(filePath, gitignoreTester) {
|
|
412
|
+
const ext = path_1.default.extname(filePath);
|
|
413
|
+
const ignoreExts = [
|
|
414
|
+
'.png',
|
|
415
|
+
'.jpg',
|
|
416
|
+
'.jpeg',
|
|
417
|
+
'.gif',
|
|
418
|
+
'.ico',
|
|
419
|
+
'.pdf',
|
|
420
|
+
'.zip',
|
|
421
|
+
'.tar',
|
|
422
|
+
'.gz',
|
|
423
|
+
'.lock',
|
|
424
|
+
'.log',
|
|
425
|
+
'.map',
|
|
426
|
+
];
|
|
427
|
+
if (ignoreExts.includes(ext)) {
|
|
428
|
+
return true;
|
|
429
|
+
}
|
|
430
|
+
const basename = path_1.default.basename(filePath);
|
|
431
|
+
if (basename === 'package-lock.json' || basename === 'pnpm-lock.yaml' || basename === 'yarn.lock') {
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
if (isGeneratedArtifact(basename)) {
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
if (gitignoreTester && gitignoreTester(filePath)) {
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return absolute paths of files staged for commit (cached index vs HEAD).
|
|
3
|
+
* Excludes deleted paths; only returns paths that still exist on disk.
|
|
4
|
+
*
|
|
5
|
+
* Throws `GitError` on git failure rather than returning an empty list.
|
|
6
|
+
* Returning `[]` silently on git failure would produce a false "✅ nothing
|
|
7
|
+
* staged" result in pre-commit, letting secrets through undetected.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getGitStagedFilePaths(cwd?: string): string[];
|
|
10
|
+
/** True when `cwd` is inside a work tree with a `.git` directory or file. */
|
|
11
|
+
export declare function isInsideGitWorkTree(cwd?: string): boolean;
|
|
12
|
+
//# sourceMappingURL=git-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAuB3E;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAWxE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getGitStagedFilePaths = getGitStagedFilePaths;
|
|
7
|
+
exports.isInsideGitWorkTree = isInsideGitWorkTree;
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const errors_1 = require("../errors");
|
|
12
|
+
/**
|
|
13
|
+
* Return absolute paths of files staged for commit (cached index vs HEAD).
|
|
14
|
+
* Excludes deleted paths; only returns paths that still exist on disk.
|
|
15
|
+
*
|
|
16
|
+
* Throws `GitError` on git failure rather than returning an empty list.
|
|
17
|
+
* Returning `[]` silently on git failure would produce a false "✅ nothing
|
|
18
|
+
* staged" result in pre-commit, letting secrets through undetected.
|
|
19
|
+
*/
|
|
20
|
+
function getGitStagedFilePaths(cwd = process.cwd()) {
|
|
21
|
+
const cmd = 'git diff --cached --name-only --diff-filter=ACMRT';
|
|
22
|
+
let out;
|
|
23
|
+
try {
|
|
24
|
+
out = (0, child_process_1.execSync)(cmd, {
|
|
25
|
+
cwd,
|
|
26
|
+
encoding: 'utf-8',
|
|
27
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
throw new errors_1.GitError(`Failed to list staged files — is this a git repository? (cwd: ${cwd})\n` +
|
|
32
|
+
`Run 'git status' to verify.\nUnderlying error: ${String(err)}`, cmd, err);
|
|
33
|
+
}
|
|
34
|
+
return out
|
|
35
|
+
.split('\n')
|
|
36
|
+
.map((line) => line.trim())
|
|
37
|
+
.filter(Boolean)
|
|
38
|
+
.map((rel) => path_1.default.resolve(cwd, rel))
|
|
39
|
+
.filter((abs) => fs_1.default.existsSync(abs) && fs_1.default.statSync(abs).isFile());
|
|
40
|
+
}
|
|
41
|
+
/** True when `cwd` is inside a work tree with a `.git` directory or file. */
|
|
42
|
+
function isInsideGitWorkTree(cwd = process.cwd()) {
|
|
43
|
+
try {
|
|
44
|
+
(0, child_process_1.execSync)('git rev-parse --is-inside-work-tree', {
|
|
45
|
+
cwd,
|
|
46
|
+
encoding: 'utf-8',
|
|
47
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
48
|
+
});
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=git-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":";;;;;AAaA,sDAuBC;AAGD,kDAWC;AAlDD,iDAAyC;AACzC,4CAAoB;AACpB,gDAAwB;AACxB,sCAAqC;AAErC;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,mDAAmD,CAAC;IAChE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAA,wBAAQ,EAAC,GAAG,EAAE;YAClB,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAQ,CAChB,iEAAiE,GAAG,KAAK;YACvE,kDAAkD,MAAM,CAAC,GAAG,CAAC,EAAE,EACjE,GAAG,EACH,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,6EAA6E;AAC7E,SAAgB,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7D,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,qCAAqC,EAAE;YAC9C,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SecretMatch } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Return `true` when `filePath` looks like a test or fixture file.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isTestFilePath(filePath: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Downgrade low-precision generic pattern findings to `'low'` severity when
|
|
8
|
+
* they appear inside a test / fixture file.
|
|
9
|
+
*
|
|
10
|
+
* Rationale: password assignments, bearer tokens, and generic api-key patterns
|
|
11
|
+
* are common in test scaffolding (`const password = 'Admin1234!'`) and are
|
|
12
|
+
* rarely real leaked credentials in that context. Vendor-anchored patterns
|
|
13
|
+
* (aws-access, anthropic, stripe, …) are unaffected — a real key in a test
|
|
14
|
+
* file is still worth a `critical` alert.
|
|
15
|
+
*/
|
|
16
|
+
export declare function applyPathAwareSeverity(matches: SecretMatch[], filePath: string): SecretMatch[];
|
|
17
|
+
//# sourceMappingURL=path-severity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-severity.d.ts","sourceRoot":"","sources":["../../src/utils/path-severity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA2D5C;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,GACf,WAAW,EAAE,CASf"}
|