@methiu/raigal 0.16.2

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.
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { i as APP_VERSION, n as withFindingAssessments, r as ENGINE_INFO, t as summarizeFindingAssessments } from "./cli.js";
3
+ //#region src/output/json.ts
4
+ const buildJsonOutput = (results, scoreResult, fileCount, elapsedMs, coverage) => {
5
+ const allDiagnostics = results.flatMap((r) => r.diagnostics);
6
+ const assessedDiagnostics = withFindingAssessments(allDiagnostics);
7
+ const engines = {};
8
+ for (const result of results) engines[result.engine] = {
9
+ issues: result.diagnostics.length,
10
+ skipped: result.skipped,
11
+ elapsed: result.elapsed
12
+ };
13
+ return {
14
+ schemaVersion: "1",
15
+ cliVersion: APP_VERSION,
16
+ version: APP_VERSION,
17
+ score: coverage.scoreable ? scoreResult.score : null,
18
+ label: coverage.scoreable ? scoreResult.label : "not scored",
19
+ scoreable: coverage.scoreable,
20
+ coverage,
21
+ engines,
22
+ engineDefinitions: ENGINE_INFO,
23
+ diagnostics: assessedDiagnostics,
24
+ findingAssessment: summarizeFindingAssessments(allDiagnostics),
25
+ summary: {
26
+ errors: allDiagnostics.filter((d) => d.severity === "error").length,
27
+ warnings: allDiagnostics.filter((d) => d.severity === "warning").length,
28
+ fixable: allDiagnostics.filter((d) => d.fixable).length,
29
+ files: fileCount,
30
+ elapsed: elapsedMs < 1e3 ? `${Math.round(elapsedMs)}ms` : `${(elapsedMs / 1e3).toFixed(1)}s`
31
+ }
32
+ };
33
+ };
34
+ //#endregion
35
+ export { buildJsonOutput };
@@ -0,0 +1,35 @@
1
+ import { t as APP_VERSION } from "./version-CVfOxP_O.js";
2
+ import { i as ENGINE_INFO, n as withFindingAssessments, t as summarizeFindingAssessments } from "./finding-assessment-M5fUTE-C.js";
3
+ //#region src/output/json.ts
4
+ const buildJsonOutput = (results, scoreResult, fileCount, elapsedMs, coverage) => {
5
+ const allDiagnostics = results.flatMap((r) => r.diagnostics);
6
+ const assessedDiagnostics = withFindingAssessments(allDiagnostics);
7
+ const engines = {};
8
+ for (const result of results) engines[result.engine] = {
9
+ issues: result.diagnostics.length,
10
+ skipped: result.skipped,
11
+ elapsed: result.elapsed
12
+ };
13
+ return {
14
+ schemaVersion: "1",
15
+ cliVersion: APP_VERSION,
16
+ version: APP_VERSION,
17
+ score: coverage.scoreable ? scoreResult.score : null,
18
+ label: coverage.scoreable ? scoreResult.label : "not scored",
19
+ scoreable: coverage.scoreable,
20
+ coverage,
21
+ engines,
22
+ engineDefinitions: ENGINE_INFO,
23
+ diagnostics: assessedDiagnostics,
24
+ findingAssessment: summarizeFindingAssessments(allDiagnostics),
25
+ summary: {
26
+ errors: allDiagnostics.filter((d) => d.severity === "error").length,
27
+ warnings: allDiagnostics.filter((d) => d.severity === "warning").length,
28
+ fixable: allDiagnostics.filter((d) => d.fixable).length,
29
+ files: fileCount,
30
+ elapsed: elapsedMs < 1e3 ? `${Math.round(elapsedMs)}ms` : `${(elapsedMs / 1e3).toFixed(1)}s`
31
+ }
32
+ };
33
+ };
34
+ //#endregion
35
+ export { buildJsonOutput };
@@ -0,0 +1,71 @@
1
+ //#region src/utils/mask-secrets.ts
2
+ const BEGIN_KEY = "-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----";
3
+ const MASK_PATTERNS = [
4
+ {
5
+ kind: "private_key",
6
+ pattern: new RegExp(`${BEGIN_KEY}[\\s\\S]*?-----END (?:RSA |EC |DSA )?PRIVATE KEY-----`, "g")
7
+ },
8
+ {
9
+ kind: "private_key",
10
+ pattern: new RegExp(BEGIN_KEY, "g")
11
+ },
12
+ {
13
+ kind: "aws",
14
+ pattern: /\bAKIA[0-9A-Z]{16}\b/g
15
+ },
16
+ {
17
+ kind: "github",
18
+ pattern: /\bgh[pousr]_[A-Za-z0-9_]{36,}\b/g
19
+ },
20
+ {
21
+ kind: "slack",
22
+ pattern: /\bxox[baprs]-[A-Za-z0-9-]+\b/g
23
+ },
24
+ {
25
+ kind: "database_url",
26
+ pattern: /(?:mongodb(?:\+srv)?|postgres|mysql|redis):\/\/[^:@/"'`\s]+:[^@"'`\s]+@[^"'`\s]+/gi
27
+ },
28
+ {
29
+ kind: "jwt",
30
+ pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g
31
+ },
32
+ {
33
+ kind: "password",
34
+ pattern: /((?:password|passwd|pwd|secret|key|apikey|api[_-]?key|token|bearer)\s*[:=]\s*(?:\\?["'])?)([\w\-~@#$%^&*+=/]{8,})((?:\\?["'])?)/gi,
35
+ replaceGroup: 2
36
+ },
37
+ {
38
+ kind: "aws_secret",
39
+ pattern: /((?:aws[_-]?secret|secret[_-]?key)\s*[:=]\s*(?:\\?["'])?)([A-Za-z0-9/+=]{40})((?:\\?["'])?)/gi,
40
+ replaceGroup: 2
41
+ },
42
+ {
43
+ kind: "api_key",
44
+ pattern: /((?:api[_-]?key|apikey)\s*[:=]\s*(?:\\?["'])?)([A-Za-z0-9_-]{20,})((?:\\?["'])?)/gi,
45
+ replaceGroup: 2
46
+ },
47
+ {
48
+ kind: "token",
49
+ pattern: /((?:token|bearer)\s*[:=]\s*(?:\\?["'])?)([A-Za-z0-9_-]{20,})((?:\\?["'])?)/gi,
50
+ replaceGroup: 2
51
+ }
52
+ ];
53
+ const isSecretClassRule = (rule) => {
54
+ const lower = rule.toLowerCase();
55
+ return lower === "security/hardcoded-secret" || lower.includes("secret") || lower.includes("credential") || lower.includes("private-key");
56
+ };
57
+ const FIXED_SECRET_DIAGNOSTIC_MESSAGE = "Hardcoded credential. Rotate it and load it from the environment.";
58
+ const maskSecrets = (text) => {
59
+ if (!text || typeof text !== "string") return text;
60
+ let result = text;
61
+ for (const { kind, pattern, replaceGroup } of MASK_PATTERNS) {
62
+ const regex = new RegExp(pattern.source, pattern.flags);
63
+ if (replaceGroup !== void 0) result = result.replace(regex, (match, prefix, secret, suffix) => {
64
+ return `${prefix}[REDACTED:${kind}]${suffix}`;
65
+ });
66
+ else result = result.replace(regex, `[REDACTED:${kind}]`);
67
+ }
68
+ return result;
69
+ };
70
+ //#endregion
71
+ export { isSecretClassRule as n, maskSecrets as r, FIXED_SECRET_DIAGNOSTIC_MESSAGE as t };