secureflow-cli 2.1.2 → 2.1.3
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/dist/exporters.js +88 -88
- package/dist/ignore.d.ts +34 -0
- package/dist/ignore.d.ts.map +1 -0
- package/dist/ignore.js +118 -0
- package/dist/ignore.js.map +1 -0
- package/dist/index.js +41 -5
- package/dist/index.js.map +1 -1
- package/dist/sarif.d.ts +17 -0
- package/dist/sarif.d.ts.map +1 -1
- package/dist/sarif.js +236 -1
- package/dist/sarif.js.map +1 -1
- package/dist/scanner.d.ts +4 -2
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +9 -2
- package/dist/scanner.js.map +1 -1
- package/package.json +1 -1
package/dist/exporters.js
CHANGED
|
@@ -97,97 +97,97 @@ export function formatHtml(results) {
|
|
|
97
97
|
}
|
|
98
98
|
const tableRows = violations.length > 0
|
|
99
99
|
? violations
|
|
100
|
-
.map((v) => ` <tr>
|
|
101
|
-
<td>${escapeHtml(v.path)}</td>
|
|
102
|
-
<td>${v.line}</td>
|
|
103
|
-
<td><code>${escapeHtml(v.text)}</code></td>
|
|
104
|
-
<td>${escapeHtml(v.reason)}</td>
|
|
100
|
+
.map((v) => ` <tr>
|
|
101
|
+
<td>${escapeHtml(v.path)}</td>
|
|
102
|
+
<td>${v.line}</td>
|
|
103
|
+
<td><code>${escapeHtml(v.text)}</code></td>
|
|
104
|
+
<td>${escapeHtml(v.reason)}</td>
|
|
105
105
|
</tr>`)
|
|
106
106
|
.join("\n")
|
|
107
107
|
: ` <tr><td colspan="4" class="empty">No violations detected.</td></tr>`;
|
|
108
|
-
return `<!DOCTYPE html>
|
|
109
|
-
<html lang="en">
|
|
110
|
-
<head>
|
|
111
|
-
<meta charset="UTF-8">
|
|
112
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
113
|
-
<title>SecureFlow Scan Report</title>
|
|
114
|
-
<style>
|
|
115
|
-
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
116
|
-
body {
|
|
117
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
118
|
-
background: #f6f8fa;
|
|
119
|
-
color: #24292f;
|
|
120
|
-
padding: 2rem;
|
|
121
|
-
line-height: 1.5;
|
|
122
|
-
}
|
|
123
|
-
h1 {
|
|
124
|
-
font-size: 1.5rem;
|
|
125
|
-
margin-bottom: 0.25rem;
|
|
126
|
-
}
|
|
127
|
-
.meta {
|
|
128
|
-
color: #57606a;
|
|
129
|
-
font-size: 0.875rem;
|
|
130
|
-
margin-bottom: 1.5rem;
|
|
131
|
-
}
|
|
132
|
-
table {
|
|
133
|
-
width: 100%;
|
|
134
|
-
border-collapse: collapse;
|
|
135
|
-
background: #ffffff;
|
|
136
|
-
border: 1px solid #d0d7de;
|
|
137
|
-
border-radius: 6px;
|
|
138
|
-
overflow: hidden;
|
|
139
|
-
}
|
|
140
|
-
th, td {
|
|
141
|
-
text-align: left;
|
|
142
|
-
padding: 0.5rem 0.75rem;
|
|
143
|
-
border-bottom: 1px solid #d0d7de;
|
|
144
|
-
}
|
|
145
|
-
th {
|
|
146
|
-
background: #f6f8fa;
|
|
147
|
-
font-weight: 600;
|
|
148
|
-
font-size: 0.875rem;
|
|
149
|
-
}
|
|
150
|
-
td code {
|
|
151
|
-
background: #f0f3f6;
|
|
152
|
-
padding: 0.125rem 0.375rem;
|
|
153
|
-
border-radius: 3px;
|
|
154
|
-
font-size: 0.8125rem;
|
|
155
|
-
}
|
|
156
|
-
tr:last-child td { border-bottom: none; }
|
|
157
|
-
.empty {
|
|
158
|
-
text-align: center;
|
|
159
|
-
color: #57606a;
|
|
160
|
-
padding: 1.5rem;
|
|
161
|
-
}
|
|
162
|
-
.summary {
|
|
163
|
-
margin-top: 1rem;
|
|
164
|
-
font-size: 0.875rem;
|
|
165
|
-
color: #57606a;
|
|
166
|
-
}
|
|
167
|
-
@media print {
|
|
168
|
-
body { background: #fff; padding: 0; }
|
|
169
|
-
}
|
|
170
|
-
</style>
|
|
171
|
-
</head>
|
|
172
|
-
<body>
|
|
173
|
-
<h1>SecureFlow Scan Report</h1>
|
|
174
|
-
<p class="meta">Generated by SecureFlow CLI</p>
|
|
175
|
-
<table>
|
|
176
|
-
<thead>
|
|
177
|
-
<tr>
|
|
178
|
-
<th>File</th>
|
|
179
|
-
<th>Line</th>
|
|
180
|
-
<th>Violation</th>
|
|
181
|
-
<th>Reason</th>
|
|
182
|
-
</tr>
|
|
183
|
-
</thead>
|
|
184
|
-
<tbody>
|
|
185
|
-
${tableRows}
|
|
186
|
-
</tbody>
|
|
187
|
-
</table>
|
|
188
|
-
<p class="summary">${violations.length} violation${violations.length === 1 ? "" : "s"} found.</p>
|
|
189
|
-
</body>
|
|
190
|
-
</html>
|
|
108
|
+
return `<!DOCTYPE html>
|
|
109
|
+
<html lang="en">
|
|
110
|
+
<head>
|
|
111
|
+
<meta charset="UTF-8">
|
|
112
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
113
|
+
<title>SecureFlow Scan Report</title>
|
|
114
|
+
<style>
|
|
115
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
116
|
+
body {
|
|
117
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
118
|
+
background: #f6f8fa;
|
|
119
|
+
color: #24292f;
|
|
120
|
+
padding: 2rem;
|
|
121
|
+
line-height: 1.5;
|
|
122
|
+
}
|
|
123
|
+
h1 {
|
|
124
|
+
font-size: 1.5rem;
|
|
125
|
+
margin-bottom: 0.25rem;
|
|
126
|
+
}
|
|
127
|
+
.meta {
|
|
128
|
+
color: #57606a;
|
|
129
|
+
font-size: 0.875rem;
|
|
130
|
+
margin-bottom: 1.5rem;
|
|
131
|
+
}
|
|
132
|
+
table {
|
|
133
|
+
width: 100%;
|
|
134
|
+
border-collapse: collapse;
|
|
135
|
+
background: #ffffff;
|
|
136
|
+
border: 1px solid #d0d7de;
|
|
137
|
+
border-radius: 6px;
|
|
138
|
+
overflow: hidden;
|
|
139
|
+
}
|
|
140
|
+
th, td {
|
|
141
|
+
text-align: left;
|
|
142
|
+
padding: 0.5rem 0.75rem;
|
|
143
|
+
border-bottom: 1px solid #d0d7de;
|
|
144
|
+
}
|
|
145
|
+
th {
|
|
146
|
+
background: #f6f8fa;
|
|
147
|
+
font-weight: 600;
|
|
148
|
+
font-size: 0.875rem;
|
|
149
|
+
}
|
|
150
|
+
td code {
|
|
151
|
+
background: #f0f3f6;
|
|
152
|
+
padding: 0.125rem 0.375rem;
|
|
153
|
+
border-radius: 3px;
|
|
154
|
+
font-size: 0.8125rem;
|
|
155
|
+
}
|
|
156
|
+
tr:last-child td { border-bottom: none; }
|
|
157
|
+
.empty {
|
|
158
|
+
text-align: center;
|
|
159
|
+
color: #57606a;
|
|
160
|
+
padding: 1.5rem;
|
|
161
|
+
}
|
|
162
|
+
.summary {
|
|
163
|
+
margin-top: 1rem;
|
|
164
|
+
font-size: 0.875rem;
|
|
165
|
+
color: #57606a;
|
|
166
|
+
}
|
|
167
|
+
@media print {
|
|
168
|
+
body { background: #fff; padding: 0; }
|
|
169
|
+
}
|
|
170
|
+
</style>
|
|
171
|
+
</head>
|
|
172
|
+
<body>
|
|
173
|
+
<h1>SecureFlow Scan Report</h1>
|
|
174
|
+
<p class="meta">Generated by SecureFlow CLI</p>
|
|
175
|
+
<table>
|
|
176
|
+
<thead>
|
|
177
|
+
<tr>
|
|
178
|
+
<th>File</th>
|
|
179
|
+
<th>Line</th>
|
|
180
|
+
<th>Violation</th>
|
|
181
|
+
<th>Reason</th>
|
|
182
|
+
</tr>
|
|
183
|
+
</thead>
|
|
184
|
+
<tbody>
|
|
185
|
+
${tableRows}
|
|
186
|
+
</tbody>
|
|
187
|
+
</table>
|
|
188
|
+
<p class="summary">${violations.length} violation${violations.length === 1 ? "" : "s"} found.</p>
|
|
189
|
+
</body>
|
|
190
|
+
</html>
|
|
191
191
|
`;
|
|
192
192
|
}
|
|
193
193
|
// ---------------------------------------------------------------------------
|
package/dist/ignore.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface SecureFlowIgnoreConfig {
|
|
2
|
+
ignoredPaths: string[];
|
|
3
|
+
placeholders: string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Normalizes a file path for consistent matching against ignore patterns:
|
|
7
|
+
* converts backslashes to forward slashes, removes leading `./` or `/`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeScanPath(filename: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Parses the raw text of a `.secureflowignore` file into structured configuration.
|
|
12
|
+
*
|
|
13
|
+
* Supports comments (`#`), whitespace trimming, and optional section headers:
|
|
14
|
+
* - `[paths]` or `[files]`: file paths and glob patterns to ignore
|
|
15
|
+
* - `[placeholders]` or `[mocks]`: test credential values/patterns to suppress
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseSecureFlowIgnore(content: string): SecureFlowIgnoreConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Compiles an array of glob strings into RegExp patterns for path matching.
|
|
20
|
+
*/
|
|
21
|
+
export declare function compileIgnorePatterns(patterns: string[]): RegExp[];
|
|
22
|
+
/**
|
|
23
|
+
* Checks whether a given file path matches any compiled ignore regular expression.
|
|
24
|
+
*/
|
|
25
|
+
export declare function shouldIgnorePath(filename: string, customIgnores?: RegExp[]): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Searches for and loads `.secureflowignore` from the specified path or directory root.
|
|
28
|
+
* Returns the parsed configuration and compiled regex patterns, or `null` if the file doesn't exist.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadSecureFlowIgnore(customFilePath?: string, rootDir?: string): {
|
|
31
|
+
config: SecureFlowIgnoreConfig;
|
|
32
|
+
compiledPatterns: RegExp[];
|
|
33
|
+
} | null;
|
|
34
|
+
//# sourceMappingURL=ignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CA+B7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwClE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,OAAO,CAOxF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,GAAE,MAAsB,GAC9B;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAsBvE"}
|
package/dist/ignore.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes a file path for consistent matching against ignore patterns:
|
|
5
|
+
* converts backslashes to forward slashes, removes leading `./` or `/`.
|
|
6
|
+
*/
|
|
7
|
+
export function normalizeScanPath(filename) {
|
|
8
|
+
return filename
|
|
9
|
+
.replace(/\\/g, "/")
|
|
10
|
+
.replace(/^\.\//, "")
|
|
11
|
+
.replace(/^\/+/, "");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parses the raw text of a `.secureflowignore` file into structured configuration.
|
|
15
|
+
*
|
|
16
|
+
* Supports comments (`#`), whitespace trimming, and optional section headers:
|
|
17
|
+
* - `[paths]` or `[files]`: file paths and glob patterns to ignore
|
|
18
|
+
* - `[placeholders]` or `[mocks]`: test credential values/patterns to suppress
|
|
19
|
+
*/
|
|
20
|
+
export function parseSecureFlowIgnore(content) {
|
|
21
|
+
const ignoredPaths = [];
|
|
22
|
+
const placeholders = [];
|
|
23
|
+
let currentSection = "paths";
|
|
24
|
+
const lines = content.split(/\r?\n/);
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const lower = trimmed.toLowerCase();
|
|
31
|
+
if (lower === "[placeholders]" || lower === "[mocks]") {
|
|
32
|
+
currentSection = "placeholders";
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (lower === "[paths]" || lower === "[files]") {
|
|
36
|
+
currentSection = "paths";
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (currentSection === "placeholders") {
|
|
40
|
+
placeholders.push(trimmed);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
ignoredPaths.push(trimmed);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { ignoredPaths, placeholders };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compiles an array of glob strings into RegExp patterns for path matching.
|
|
50
|
+
*/
|
|
51
|
+
export function compileIgnorePatterns(patterns) {
|
|
52
|
+
return patterns
|
|
53
|
+
.map((p) => p.trim())
|
|
54
|
+
.filter((p) => p.length > 0 && !p.startsWith("#"))
|
|
55
|
+
.map((p) => {
|
|
56
|
+
let pattern = p.replace(/\\/g, "/");
|
|
57
|
+
const hasLeadingSlash = pattern.startsWith("/");
|
|
58
|
+
const cleanPattern = hasLeadingSlash ? pattern.slice(1) : pattern;
|
|
59
|
+
let glob = cleanPattern;
|
|
60
|
+
if (glob.endsWith("/")) {
|
|
61
|
+
glob += "**";
|
|
62
|
+
}
|
|
63
|
+
const patternWithoutTrailingSlash = cleanPattern.endsWith("/")
|
|
64
|
+
? cleanPattern.slice(0, -1)
|
|
65
|
+
: cleanPattern;
|
|
66
|
+
const isRootRelative = hasLeadingSlash || patternWithoutTrailingSlash.includes("/");
|
|
67
|
+
// Escape regex special characters except *, ?
|
|
68
|
+
let regexStr = glob.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
69
|
+
// Handle question mark wildcard (single non-slash char)
|
|
70
|
+
regexStr = regexStr.replace(/\?/g, "[^/]");
|
|
71
|
+
// Handle glob double asterisks (arbitrary directories)
|
|
72
|
+
regexStr = regexStr.replace(/\/\*\*\//g, "/(?:.*/)?");
|
|
73
|
+
regexStr = regexStr.replace(/\*\*\//g, "(?:.*/)?");
|
|
74
|
+
regexStr = regexStr.replace(/\/\*\*/g, "(?:/.*)?");
|
|
75
|
+
regexStr = regexStr.replace(/\*\*/g, ".*");
|
|
76
|
+
// Handle glob single asterisk (within a single directory segment)
|
|
77
|
+
regexStr = regexStr.replace(/(?<!\.)\*(?!\.)/g, "[^/]*");
|
|
78
|
+
if (isRootRelative) {
|
|
79
|
+
return new RegExp(`^${regexStr}$`, "i");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return new RegExp(`(^|/)${regexStr}$`, "i");
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Checks whether a given file path matches any compiled ignore regular expression.
|
|
88
|
+
*/
|
|
89
|
+
export function shouldIgnorePath(filename, customIgnores = []) {
|
|
90
|
+
if (!filename || !customIgnores || customIgnores.length === 0) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const normalized = normalizeScanPath(filename);
|
|
94
|
+
return customIgnores.some((pattern) => pattern.test(normalized));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Searches for and loads `.secureflowignore` from the specified path or directory root.
|
|
98
|
+
* Returns the parsed configuration and compiled regex patterns, or `null` if the file doesn't exist.
|
|
99
|
+
*/
|
|
100
|
+
export function loadSecureFlowIgnore(customFilePath, rootDir = process.cwd()) {
|
|
101
|
+
const targetPath = customFilePath
|
|
102
|
+
? path.resolve(rootDir, customFilePath)
|
|
103
|
+
: path.join(rootDir, ".secureflowignore");
|
|
104
|
+
if (!fs.existsSync(targetPath)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const content = fs.readFileSync(targetPath, "utf-8");
|
|
109
|
+
const config = parseSecureFlowIgnore(content);
|
|
110
|
+
const compiledPatterns = compileIgnorePatterns(config.ignoredPaths);
|
|
111
|
+
return { config, compiledPatterns };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.warn(`⚠️ [SecureFlow] Failed to read ignore file at ${targetPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import { GitError, getStagedFiles, readStagedContent } from "./git.js";
|
|
4
|
-
import { scanFile, formatScanResults, parseFailOnArg, shouldFailScan, } from "./scanner.js";
|
|
4
|
+
import { scanFile, formatScanResults, parseFailOnArg, shouldFailScan, loadSecureFlowIgnore, } from "./scanner.js";
|
|
5
5
|
import { NetworkUnavailableError, requestAiFileScan, } from "./lib/api-client.js";
|
|
6
6
|
import { hostedAiScanSkipReason } from "./lib/local-mode.js";
|
|
7
7
|
const VERBOSE = process.argv.includes("--verbose");
|
|
8
|
+
const DRY_RUN = process.argv.includes("--dry-run");
|
|
8
9
|
const AI_SKIP_REASON = hostedAiScanSkipReason(process.argv);
|
|
9
10
|
/**
|
|
10
11
|
* --local flag: keep staged code on this machine (#892).
|
|
@@ -60,6 +61,21 @@ function parseOutputArg() {
|
|
|
60
61
|
}
|
|
61
62
|
return null;
|
|
62
63
|
}
|
|
64
|
+
function parseIgnoreFileArg() {
|
|
65
|
+
const idx = process.argv.findIndex((arg) => arg === "--ignore-file" || arg === "--ignore");
|
|
66
|
+
if (idx !== -1) {
|
|
67
|
+
const val = process.argv[idx + 1];
|
|
68
|
+
if (val && !val.startsWith("-")) {
|
|
69
|
+
return val;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const arg of process.argv) {
|
|
73
|
+
if (arg.startsWith("--ignore-file=")) {
|
|
74
|
+
return arg.split("=")[1];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
63
79
|
function reportSkipped(result) {
|
|
64
80
|
if (VERBOSE && result.skipped) {
|
|
65
81
|
console.log(` ↷ skipped ${result.path} (${result.skipped})`);
|
|
@@ -117,6 +133,12 @@ async function main() {
|
|
|
117
133
|
const unreadable = [];
|
|
118
134
|
const stagedForAi = [];
|
|
119
135
|
let violationCount = 0;
|
|
136
|
+
const customIgnorePath = parseIgnoreFileArg();
|
|
137
|
+
const ignoreData = loadSecureFlowIgnore(customIgnorePath);
|
|
138
|
+
const customIgnores = ignoreData?.compiledPatterns ?? [];
|
|
139
|
+
if (VERBOSE && ignoreData) {
|
|
140
|
+
console.log(`ℹ️ [SecureFlow] Loaded ${ignoreData.config.ignoredPaths.length} ignore pattern(s) from ignore configuration`);
|
|
141
|
+
}
|
|
120
142
|
if (staged.length > 0) {
|
|
121
143
|
for (const path of staged) {
|
|
122
144
|
const content = readStagedContent(path);
|
|
@@ -124,14 +146,16 @@ async function main() {
|
|
|
124
146
|
unreadable.push(path);
|
|
125
147
|
continue;
|
|
126
148
|
}
|
|
127
|
-
|
|
128
|
-
const result = scanFile(path, content);
|
|
149
|
+
const result = scanFile(path, content, customIgnores);
|
|
129
150
|
fileResults.push(result);
|
|
130
151
|
if (format === "text") {
|
|
131
152
|
reportSkipped(result);
|
|
132
153
|
reportViolations(result);
|
|
133
154
|
}
|
|
134
155
|
violationCount += result.violations.length;
|
|
156
|
+
if (!result.skipped) {
|
|
157
|
+
stagedForAi.push({ path, content });
|
|
158
|
+
}
|
|
135
159
|
}
|
|
136
160
|
}
|
|
137
161
|
// AI-powered pass, additive on top of the local scan above. Only
|
|
@@ -152,7 +176,13 @@ async function main() {
|
|
|
152
176
|
format === "markdown") {
|
|
153
177
|
const outputString = formatScanResults(fileResults, format);
|
|
154
178
|
if (outputPath) {
|
|
155
|
-
|
|
179
|
+
if (DRY_RUN) {
|
|
180
|
+
console.log(`[DRY RUN] Would write to ${outputPath}:
|
|
181
|
+
${outputString}`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
fs.writeFileSync(outputPath, outputString, "utf-8");
|
|
185
|
+
}
|
|
156
186
|
console.log(`📄 [SecureFlow] Scan report exported in ${format.toUpperCase()} format to ${outputPath}`);
|
|
157
187
|
}
|
|
158
188
|
else {
|
|
@@ -161,7 +191,13 @@ async function main() {
|
|
|
161
191
|
}
|
|
162
192
|
else if (outputPath) {
|
|
163
193
|
const textOutput = formatScanResults(fileResults, "text");
|
|
164
|
-
|
|
194
|
+
if (DRY_RUN) {
|
|
195
|
+
console.log(`[DRY RUN] Would write to ${outputPath}:
|
|
196
|
+
${textOutput}`);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
fs.writeFileSync(outputPath, textOutput, "utf-8");
|
|
200
|
+
}
|
|
165
201
|
console.log(`📄 [SecureFlow] Scan report written to ${outputPath}`);
|
|
166
202
|
}
|
|
167
203
|
if (unreadable.length > 0 && format === "text") {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,cAAc,EACd,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sarif.d.ts
CHANGED
|
@@ -68,8 +68,25 @@ export interface SarifDocument {
|
|
|
68
68
|
version: "2.1.0";
|
|
69
69
|
runs: SarifRun[];
|
|
70
70
|
}
|
|
71
|
+
export declare class SarifValidationError extends Error {
|
|
72
|
+
readonly errors: string[];
|
|
73
|
+
constructor(errors: string[]);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validates a document against the OASIS SARIF v2.1.0 specification and
|
|
77
|
+
* external CI/CD ingestion requirements (such as GitHub Advanced Security).
|
|
78
|
+
*/
|
|
79
|
+
export declare function validateSarifDocument(doc: unknown): {
|
|
80
|
+
valid: boolean;
|
|
81
|
+
errors: string[];
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Asserts that a document is a valid SARIF document, throwing a SarifValidationError if invalid.
|
|
85
|
+
*/
|
|
86
|
+
export declare function assertValidSarifDocument(doc: unknown): asserts doc is SarifDocument;
|
|
71
87
|
/**
|
|
72
88
|
* Maps CLI scan results into a valid OASIS SARIF v2.1.0 document object.
|
|
89
|
+
* Validates the schema before returning.
|
|
73
90
|
*/
|
|
74
91
|
export declare function generateSarifReport(scanResults: FileScanResult[], options?: {
|
|
75
92
|
toolVersion?: string;
|
package/dist/sarif.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,oBAAoB,CAAC,EAAE;QACrB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;KAC9C,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,KAAK,EAAE,wBAAwB,EAAE,CAAC;SACnC,CAAC;KACH,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/sarif.js
CHANGED
|
@@ -4,6 +4,238 @@
|
|
|
4
4
|
* Converts CLI scan results into standardized OASIS SARIF v2.1.0 schema format
|
|
5
5
|
* for direct ingestion by GitHub Advanced Security, GitLab Security Dashboards, and enterprise CI/CD systems.
|
|
6
6
|
*/
|
|
7
|
+
const VALID_LEVELS = ["error", "warning", "note", "none"];
|
|
8
|
+
export class SarifValidationError extends Error {
|
|
9
|
+
errors;
|
|
10
|
+
constructor(errors) {
|
|
11
|
+
super(`SARIF schema validation failed:\n${errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
12
|
+
this.name = "SarifValidationError";
|
|
13
|
+
this.errors = errors;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validates a document against the OASIS SARIF v2.1.0 specification and
|
|
18
|
+
* external CI/CD ingestion requirements (such as GitHub Advanced Security).
|
|
19
|
+
*/
|
|
20
|
+
export function validateSarifDocument(doc) {
|
|
21
|
+
const errors = [];
|
|
22
|
+
if (!doc || typeof doc !== "object" || Array.isArray(doc)) {
|
|
23
|
+
return { valid: false, errors: ["SARIF root must be a non-null object"] };
|
|
24
|
+
}
|
|
25
|
+
const root = doc;
|
|
26
|
+
// Schema validation
|
|
27
|
+
if (typeof root.$schema !== "string" || !root.$schema.trim()) {
|
|
28
|
+
errors.push("SARIF '$schema' must be a non-empty URI string");
|
|
29
|
+
}
|
|
30
|
+
else if (!root.$schema.includes("sarif")) {
|
|
31
|
+
errors.push(`SARIF '$schema' must reference a SARIF schema (got: '${root.$schema}')`);
|
|
32
|
+
}
|
|
33
|
+
// Version validation
|
|
34
|
+
if (root.version !== "2.1.0") {
|
|
35
|
+
errors.push(`SARIF 'version' must be '2.1.0' (got: '${String(root.version)}')`);
|
|
36
|
+
}
|
|
37
|
+
// Runs validation
|
|
38
|
+
if (!Array.isArray(root.runs)) {
|
|
39
|
+
errors.push("SARIF 'runs' must be an array");
|
|
40
|
+
}
|
|
41
|
+
else if (root.runs.length === 0) {
|
|
42
|
+
errors.push("SARIF 'runs' must contain at least one run object");
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
root.runs.forEach((runItem, runIdx) => {
|
|
46
|
+
const runPath = `runs[${runIdx}]`;
|
|
47
|
+
if (!runItem || typeof runItem !== "object" || Array.isArray(runItem)) {
|
|
48
|
+
errors.push(`${runPath} must be a non-null object`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const run = runItem;
|
|
52
|
+
// Tool validation
|
|
53
|
+
if (!run.tool || typeof run.tool !== "object" || Array.isArray(run.tool)) {
|
|
54
|
+
errors.push(`${runPath}.tool must be an object`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const tool = run.tool;
|
|
58
|
+
if (!tool.driver || typeof tool.driver !== "object" || Array.isArray(tool.driver)) {
|
|
59
|
+
errors.push(`${runPath}.tool.driver must be an object`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const driver = tool.driver;
|
|
63
|
+
if (typeof driver.name !== "string" || !driver.name.trim()) {
|
|
64
|
+
errors.push(`${runPath}.tool.driver.name must be a non-empty string`);
|
|
65
|
+
}
|
|
66
|
+
if (driver.semanticVersion !== undefined && typeof driver.semanticVersion !== "string") {
|
|
67
|
+
errors.push(`${runPath}.tool.driver.semanticVersion must be a string if provided`);
|
|
68
|
+
}
|
|
69
|
+
if (driver.informationUri !== undefined &&
|
|
70
|
+
(typeof driver.informationUri !== "string" || !driver.informationUri.trim())) {
|
|
71
|
+
errors.push(`${runPath}.tool.driver.informationUri must be a valid URI string if provided`);
|
|
72
|
+
}
|
|
73
|
+
if (driver.rules !== undefined) {
|
|
74
|
+
if (!Array.isArray(driver.rules)) {
|
|
75
|
+
errors.push(`${runPath}.tool.driver.rules must be an array`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
driver.rules.forEach((ruleItem, ruleIdx) => {
|
|
79
|
+
const rulePath = `${runPath}.tool.driver.rules[${ruleIdx}]`;
|
|
80
|
+
if (!ruleItem || typeof ruleItem !== "object" || Array.isArray(ruleItem)) {
|
|
81
|
+
errors.push(`${rulePath} must be an object`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const rule = ruleItem;
|
|
85
|
+
if (typeof rule.id !== "string" || !rule.id.trim()) {
|
|
86
|
+
errors.push(`${rulePath}.id must be a non-empty string`);
|
|
87
|
+
}
|
|
88
|
+
if (rule.name !== undefined && typeof rule.name !== "string") {
|
|
89
|
+
errors.push(`${rulePath}.name must be a string`);
|
|
90
|
+
}
|
|
91
|
+
if (!rule.shortDescription ||
|
|
92
|
+
typeof rule.shortDescription !== "object" ||
|
|
93
|
+
typeof rule.shortDescription.text !== "string" ||
|
|
94
|
+
!rule.shortDescription.text.trim()) {
|
|
95
|
+
errors.push(`${rulePath}.shortDescription.text must be a non-empty string`);
|
|
96
|
+
}
|
|
97
|
+
if (rule.defaultConfiguration !== undefined) {
|
|
98
|
+
if (typeof rule.defaultConfiguration !== "object" ||
|
|
99
|
+
!rule.defaultConfiguration) {
|
|
100
|
+
errors.push(`${rulePath}.defaultConfiguration must be an object`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const config = rule.defaultConfiguration;
|
|
104
|
+
if (config.level !== undefined &&
|
|
105
|
+
!VALID_LEVELS.includes(config.level)) {
|
|
106
|
+
errors.push(`${rulePath}.defaultConfiguration.level must be one of 'error' | 'warning' | 'note' | 'none'`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Results validation
|
|
116
|
+
if (!Array.isArray(run.results)) {
|
|
117
|
+
errors.push(`${runPath}.results must be an array`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const driverRules = run.tool?.driver
|
|
121
|
+
? run.tool.driver
|
|
122
|
+
?.rules
|
|
123
|
+
: undefined;
|
|
124
|
+
run.results.forEach((resItem, resIdx) => {
|
|
125
|
+
const resPath = `${runPath}.results[${resIdx}]`;
|
|
126
|
+
if (!resItem || typeof resItem !== "object" || Array.isArray(resItem)) {
|
|
127
|
+
errors.push(`${resPath} must be an object`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const res = resItem;
|
|
131
|
+
if (typeof res.ruleId !== "string" || !res.ruleId.trim()) {
|
|
132
|
+
errors.push(`${resPath}.ruleId must be a non-empty string`);
|
|
133
|
+
}
|
|
134
|
+
if (res.level !== undefined &&
|
|
135
|
+
!VALID_LEVELS.includes(res.level)) {
|
|
136
|
+
errors.push(`${resPath}.level must be one of 'error' | 'warning' | 'note' | 'none'`);
|
|
137
|
+
}
|
|
138
|
+
if (!res.message ||
|
|
139
|
+
typeof res.message !== "object" ||
|
|
140
|
+
typeof res.message.text !== "string" ||
|
|
141
|
+
!res.message.text.trim()) {
|
|
142
|
+
errors.push(`${resPath}.message.text must be a non-empty string`);
|
|
143
|
+
}
|
|
144
|
+
if (res.ruleIndex !== undefined) {
|
|
145
|
+
if (typeof res.ruleIndex !== "number" ||
|
|
146
|
+
!Number.isInteger(res.ruleIndex) ||
|
|
147
|
+
res.ruleIndex < 0) {
|
|
148
|
+
errors.push(`${resPath}.ruleIndex must be a non-negative integer`);
|
|
149
|
+
}
|
|
150
|
+
else if (Array.isArray(driverRules)) {
|
|
151
|
+
if (res.ruleIndex >= driverRules.length) {
|
|
152
|
+
errors.push(`${resPath}.ruleIndex (${res.ruleIndex}) is out of bounds for rules array of length ${driverRules.length}`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const targetRule = driverRules[res.ruleIndex];
|
|
156
|
+
if (targetRule && targetRule.id !== res.ruleId) {
|
|
157
|
+
errors.push(`${resPath}.ruleIndex (${res.ruleIndex}) points to rule id '${String(targetRule.id)}' which does not match result ruleId '${res.ruleId}'`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (res.locations !== undefined) {
|
|
163
|
+
if (!Array.isArray(res.locations)) {
|
|
164
|
+
errors.push(`${resPath}.locations must be an array`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
res.locations.forEach((locItem, locIdx) => {
|
|
168
|
+
const locPath = `${resPath}.locations[${locIdx}]`;
|
|
169
|
+
if (!locItem || typeof locItem !== "object" || Array.isArray(locItem)) {
|
|
170
|
+
errors.push(`${locPath} must be an object`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const loc = locItem;
|
|
174
|
+
if (!loc.physicalLocation ||
|
|
175
|
+
typeof loc.physicalLocation !== "object" ||
|
|
176
|
+
Array.isArray(loc.physicalLocation)) {
|
|
177
|
+
errors.push(`${locPath}.physicalLocation must be an object`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const phys = loc.physicalLocation;
|
|
181
|
+
if (!phys.artifactLocation ||
|
|
182
|
+
typeof phys.artifactLocation !== "object" ||
|
|
183
|
+
typeof phys.artifactLocation.uri !== "string" ||
|
|
184
|
+
!phys.artifactLocation.uri.trim()) {
|
|
185
|
+
errors.push(`${locPath}.physicalLocation.artifactLocation.uri must be a non-empty string`);
|
|
186
|
+
}
|
|
187
|
+
else if (phys.artifactLocation.uri.includes("\\")) {
|
|
188
|
+
errors.push(`${locPath}.physicalLocation.artifactLocation.uri must use forward slashes (no Windows backslashes)`);
|
|
189
|
+
}
|
|
190
|
+
if (!phys.region ||
|
|
191
|
+
typeof phys.region !== "object" ||
|
|
192
|
+
Array.isArray(phys.region)) {
|
|
193
|
+
errors.push(`${locPath}.physicalLocation.region must be an object`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const reg = phys.region;
|
|
197
|
+
if (typeof reg.startLine !== "number" ||
|
|
198
|
+
!Number.isInteger(reg.startLine) ||
|
|
199
|
+
reg.startLine < 1) {
|
|
200
|
+
errors.push(`${locPath}.physicalLocation.region.startLine must be an integer >= 1`);
|
|
201
|
+
}
|
|
202
|
+
if (reg.startColumn !== undefined &&
|
|
203
|
+
(typeof reg.startColumn !== "number" ||
|
|
204
|
+
!Number.isInteger(reg.startColumn) ||
|
|
205
|
+
reg.startColumn < 1)) {
|
|
206
|
+
errors.push(`${locPath}.physicalLocation.region.startColumn must be an integer >= 1`);
|
|
207
|
+
}
|
|
208
|
+
if (reg.endLine !== undefined &&
|
|
209
|
+
(typeof reg.endLine !== "number" ||
|
|
210
|
+
!Number.isInteger(reg.endLine) ||
|
|
211
|
+
reg.endLine < (typeof reg.startLine === "number" ? reg.startLine : 1))) {
|
|
212
|
+
errors.push(`${locPath}.physicalLocation.region.endLine must be an integer >= startLine`);
|
|
213
|
+
}
|
|
214
|
+
if (reg.endColumn !== undefined &&
|
|
215
|
+
(typeof reg.endColumn !== "number" ||
|
|
216
|
+
!Number.isInteger(reg.endColumn) ||
|
|
217
|
+
reg.endColumn < 1)) {
|
|
218
|
+
errors.push(`${locPath}.physicalLocation.region.endColumn must be an integer >= 1`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return { valid: errors.length === 0, errors };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Asserts that a document is a valid SARIF document, throwing a SarifValidationError if invalid.
|
|
232
|
+
*/
|
|
233
|
+
export function assertValidSarifDocument(doc) {
|
|
234
|
+
const result = validateSarifDocument(doc);
|
|
235
|
+
if (!result.valid) {
|
|
236
|
+
throw new SarifValidationError(result.errors);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
7
239
|
const DEFAULT_RULE_DEFINITIONS = {
|
|
8
240
|
"environment variable": {
|
|
9
241
|
id: "SECUREFLOW-001",
|
|
@@ -47,6 +279,7 @@ const DEFAULT_RULE_DEFINITIONS = {
|
|
|
47
279
|
};
|
|
48
280
|
/**
|
|
49
281
|
* Maps CLI scan results into a valid OASIS SARIF v2.1.0 document object.
|
|
282
|
+
* Validates the schema before returning.
|
|
50
283
|
*/
|
|
51
284
|
export function generateSarifReport(scanResults, options) {
|
|
52
285
|
const version = options?.toolVersion || "0.1.0";
|
|
@@ -107,7 +340,7 @@ export function generateSarifReport(scanResults, options) {
|
|
|
107
340
|
// Appended `!` to override 'undefined' error resulting from Record<string, ...> signature
|
|
108
341
|
rulesArray.push(DEFAULT_RULE_DEFINITIONS["generic-secret-logging"]);
|
|
109
342
|
}
|
|
110
|
-
|
|
343
|
+
const sarifDoc = {
|
|
111
344
|
$schema: "https://json.schemastore.org/sarif-2.1.0.json",
|
|
112
345
|
version: "2.1.0",
|
|
113
346
|
runs: [
|
|
@@ -124,6 +357,8 @@ export function generateSarifReport(scanResults, options) {
|
|
|
124
357
|
},
|
|
125
358
|
],
|
|
126
359
|
};
|
|
360
|
+
assertValidSarifDocument(sarifDoc);
|
|
361
|
+
return sarifDoc;
|
|
127
362
|
}
|
|
128
363
|
/**
|
|
129
364
|
* Format SARIF report as pretty JSON string.
|
package/dist/sarif.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner.d.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* the part that decides whether a commit is blocked can actually be tested
|
|
7
7
|
* (#593).
|
|
8
8
|
*/
|
|
9
|
+
import { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, type SecureFlowIgnoreConfig } from "./ignore.js";
|
|
10
|
+
export { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, type SecureFlowIgnoreConfig, };
|
|
9
11
|
/** One flagged call site. */
|
|
10
12
|
export interface Violation {
|
|
11
13
|
/** 1-based line of the `console.*` call. */
|
|
@@ -23,7 +25,7 @@ export interface Violation {
|
|
|
23
25
|
*/
|
|
24
26
|
export declare const MAX_SCANNED_BYTES: number;
|
|
25
27
|
/** Whether `path` should be scanned at all. */
|
|
26
|
-
export declare function shouldScanFile(path: string, byteLength?: number): boolean;
|
|
28
|
+
export declare function shouldScanFile(path: string, byteLength?: number, customIgnores?: RegExp[]): boolean;
|
|
27
29
|
/**
|
|
28
30
|
* Heuristic for content that is binary despite its name.
|
|
29
31
|
*
|
|
@@ -84,7 +86,7 @@ export interface FileScanResult {
|
|
|
84
86
|
skipped?: string;
|
|
85
87
|
}
|
|
86
88
|
/** Scan one staged blob. */
|
|
87
|
-
export declare function scanFile(path: string, content: string): FileScanResult;
|
|
89
|
+
export declare function scanFile(path: string, content: string, customIgnores?: RegExp[]): FileScanResult;
|
|
88
90
|
export type OutputFormat = "text" | "json" | "sarif" | "csv" | "html" | "markdown";
|
|
89
91
|
/**
|
|
90
92
|
* Format scan results based on the chosen output format ('text' | 'json' | 'sarif' | 'csv' | 'html' | 'markdown').
|
package/dist/scanner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAwFD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAa,CAAC;AAE5C,+CAA+C;AAC/C,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAWT;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4EzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYjF;AAED,uCAAuC;AACvC,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CA2B7D;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4BAA4B;AAC5B,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,cAAc,CAchB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EAAE,EACzB,MAAM,GAAE,YAAqB,GAC5B,MAAM,CA+BR;AAMD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAU7E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,cAAc,GAAG,IAAI,CAgBnF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,EAClC,eAAe,GAAE,cAAc,GAAG,IAAW,GAC5C,OAAO,CAwBT"}
|
package/dist/scanner.js
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { formatSarifJson } from "./sarif.js";
|
|
10
10
|
import { formatCsv, formatHtml, formatMarkdown } from "./exporters.js";
|
|
11
|
+
import { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, } from "./ignore.js";
|
|
12
|
+
export { shouldIgnorePath, parseSecureFlowIgnore, compileIgnorePatterns, loadSecureFlowIgnore, normalizeScanPath, };
|
|
11
13
|
/** Console methods that put their arguments somewhere durable. */
|
|
12
14
|
const CONSOLE_METHODS = ["log", "info", "warn", "error", "debug", "trace", "table", "dir"];
|
|
13
15
|
/**
|
|
@@ -97,7 +99,9 @@ const GENERATED_FILES = [
|
|
|
97
99
|
*/
|
|
98
100
|
export const MAX_SCANNED_BYTES = 512 * 1024;
|
|
99
101
|
/** Whether `path` should be scanned at all. */
|
|
100
|
-
export function shouldScanFile(path, byteLength) {
|
|
102
|
+
export function shouldScanFile(path, byteLength, customIgnores) {
|
|
103
|
+
if (customIgnores && shouldIgnorePath(path, customIgnores))
|
|
104
|
+
return false;
|
|
101
105
|
const lower = path.toLowerCase();
|
|
102
106
|
const basename = lower.split("/").pop() ?? lower;
|
|
103
107
|
if (GENERATED_FILES.some((name) => basename === name.toLowerCase()))
|
|
@@ -279,7 +283,10 @@ export function findSecretLogging(source) {
|
|
|
279
283
|
return violations;
|
|
280
284
|
}
|
|
281
285
|
/** Scan one staged blob. */
|
|
282
|
-
export function scanFile(path, content) {
|
|
286
|
+
export function scanFile(path, content, customIgnores) {
|
|
287
|
+
if (customIgnores && shouldIgnorePath(path, customIgnores)) {
|
|
288
|
+
return { path, violations: [], skipped: "matched .secureflowignore" };
|
|
289
|
+
}
|
|
283
290
|
if (!shouldScanFile(path, Buffer.byteLength(content, "utf-8"))) {
|
|
284
291
|
return { path, violations: [], skipped: "excluded by type or size" };
|
|
285
292
|
}
|
package/dist/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|