sourceverity 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/README.md +188 -0
- package/bin/sourceverity.js +12 -0
- package/dist/analysis/controlFlow.d.ts +10 -0
- package/dist/analysis/controlFlow.d.ts.map +1 -0
- package/dist/analysis/controlFlow.js +278 -0
- package/dist/analysis/controlFlow.js.map +1 -0
- package/dist/analysis/frameworks.d.ts +11 -0
- package/dist/analysis/frameworks.d.ts.map +1 -0
- package/dist/analysis/frameworks.js +189 -0
- package/dist/analysis/frameworks.js.map +1 -0
- package/dist/analysis/functions.d.ts +27 -0
- package/dist/analysis/functions.d.ts.map +1 -0
- package/dist/analysis/functions.js +628 -0
- package/dist/analysis/functions.js.map +1 -0
- package/dist/analysis/promiseFlow.d.ts +44 -0
- package/dist/analysis/promiseFlow.d.ts.map +1 -0
- package/dist/analysis/promiseFlow.js +261 -0
- package/dist/analysis/promiseFlow.js.map +1 -0
- package/dist/analysis/values.d.ts +24 -0
- package/dist/analysis/values.d.ts.map +1 -0
- package/dist/analysis/values.js +189 -0
- package/dist/analysis/values.js.map +1 -0
- package/dist/baseline/manager.d.ts +20 -0
- package/dist/baseline/manager.d.ts.map +1 -0
- package/dist/baseline/manager.js +77 -0
- package/dist/baseline/manager.js.map +1 -0
- package/dist/baseline/types.d.ts +20 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +2 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/cli/args.d.ts +26 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +126 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/exitCodes.d.ts +8 -0
- package/dist/cli/exitCodes.d.ts.map +1 -0
- package/dist/cli/exitCodes.js +7 -0
- package/dist/cli/exitCodes.js.map +1 -0
- package/dist/cli/help.d.ts +5 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +46 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +156 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/core/fingerprint.d.ts +18 -0
- package/dist/core/fingerprint.d.ts.map +1 -0
- package/dist/core/fingerprint.js +26 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/paths.d.ts +10 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +30 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/suppressions.d.ts +24 -0
- package/dist/core/suppressions.d.ts.map +1 -0
- package/dist/core/suppressions.js +100 -0
- package/dist/core/suppressions.js.map +1 -0
- package/dist/core/terminal.d.ts +18 -0
- package/dist/core/terminal.d.ts.map +1 -0
- package/dist/core/terminal.js +39 -0
- package/dist/core/terminal.js.map +1 -0
- package/dist/core/types.d.ts +119 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/engine/context.d.ts +16 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +57 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/registry.d.ts +26 -0
- package/dist/engine/registry.d.ts.map +1 -0
- package/dist/engine/registry.js +38 -0
- package/dist/engine/registry.js.map +1 -0
- package/dist/engine/runner.d.ts +14 -0
- package/dist/engine/runner.d.ts.map +1 -0
- package/dist/engine/runner.js +166 -0
- package/dist/engine/runner.js.map +1 -0
- package/dist/engine/symbols.d.ts +46 -0
- package/dist/engine/symbols.d.ts.map +1 -0
- package/dist/engine/symbols.js +278 -0
- package/dist/engine/symbols.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/agent.d.ts +45 -0
- package/dist/reporters/agent.d.ts.map +1 -0
- package/dist/reporters/agent.js +40 -0
- package/dist/reporters/agent.js.map +1 -0
- package/dist/reporters/json.d.ts +6 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +7 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/sarif.d.ts +6 -0
- package/dist/reporters/sarif.d.ts.map +1 -0
- package/dist/reporters/sarif.js +60 -0
- package/dist/reporters/sarif.js.map +1 -0
- package/dist/reporters/terminal.d.ts +10 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +105 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/repository/detector.d.ts +6 -0
- package/dist/repository/detector.d.ts.map +1 -0
- package/dist/repository/detector.js +231 -0
- package/dist/repository/detector.js.map +1 -0
- package/dist/repository/fileFilter.d.ts +10 -0
- package/dist/repository/fileFilter.d.ts.map +1 -0
- package/dist/repository/fileFilter.js +78 -0
- package/dist/repository/fileFilter.js.map +1 -0
- package/dist/repository/git.d.ts +7 -0
- package/dist/repository/git.d.ts.map +1 -0
- package/dist/repository/git.js +53 -0
- package/dist/repository/git.js.map +1 -0
- package/dist/repository/tsLoader.d.ts +15 -0
- package/dist/repository/tsLoader.d.ts.map +1 -0
- package/dist/repository/tsLoader.js +27 -0
- package/dist/repository/tsLoader.js.map +1 -0
- package/dist/repository/types.d.ts +38 -0
- package/dist/repository/types.d.ts.map +1 -0
- package/dist/repository/types.js +2 -0
- package/dist/repository/types.js.map +1 -0
- package/dist/rules/async/asyncForeach.d.ts +3 -0
- package/dist/rules/async/asyncForeach.d.ts.map +1 -0
- package/dist/rules/async/asyncForeach.js +76 -0
- package/dist/rules/async/asyncForeach.js.map +1 -0
- package/dist/rules/async/floatingPromise.d.ts +3 -0
- package/dist/rules/async/floatingPromise.d.ts.map +1 -0
- package/dist/rules/async/floatingPromise.js +359 -0
- package/dist/rules/async/floatingPromise.js.map +1 -0
- package/dist/rules/browser/eventListenerCleanup.d.ts +3 -0
- package/dist/rules/browser/eventListenerCleanup.d.ts.map +1 -0
- package/dist/rules/browser/eventListenerCleanup.js +378 -0
- package/dist/rules/browser/eventListenerCleanup.js.map +1 -0
- package/dist/rules/browser/observerCleanup.d.ts +3 -0
- package/dist/rules/browser/observerCleanup.d.ts.map +1 -0
- package/dist/rules/browser/observerCleanup.js +184 -0
- package/dist/rules/browser/observerCleanup.js.map +1 -0
- package/dist/rules/browser/timerCleanup.d.ts +3 -0
- package/dist/rules/browser/timerCleanup.d.ts.map +1 -0
- package/dist/rules/browser/timerCleanup.js +115 -0
- package/dist/rules/browser/timerCleanup.js.map +1 -0
- package/dist/rules/index.d.ts +19 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +41 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/network/fetchStatusUnchecked.d.ts +3 -0
- package/dist/rules/network/fetchStatusUnchecked.d.ts.map +1 -0
- package/dist/rules/network/fetchStatusUnchecked.js +96 -0
- package/dist/rules/network/fetchStatusUnchecked.js.map +1 -0
- package/dist/rules/react/asyncEffectCallback.d.ts +3 -0
- package/dist/rules/react/asyncEffectCallback.d.ts.map +1 -0
- package/dist/rules/react/asyncEffectCallback.js +62 -0
- package/dist/rules/react/asyncEffectCallback.js.map +1 -0
- package/dist/rules/react/derivedStateEffect.d.ts +3 -0
- package/dist/rules/react/derivedStateEffect.d.ts.map +1 -0
- package/dist/rules/react/derivedStateEffect.js +172 -0
- package/dist/rules/react/derivedStateEffect.js.map +1 -0
- package/dist/rules/react/missingEffectCleanup.d.ts +3 -0
- package/dist/rules/react/missingEffectCleanup.d.ts.map +1 -0
- package/dist/rules/react/missingEffectCleanup.js +86 -0
- package/dist/rules/react/missingEffectCleanup.js.map +1 -0
- package/dist/rules/typescript/nonNullAssertionRisk.d.ts +3 -0
- package/dist/rules/typescript/nonNullAssertionRisk.d.ts.map +1 -0
- package/dist/rules/typescript/nonNullAssertionRisk.js +65 -0
- package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -0
- package/dist/rules/typescript/uncheckedIndexAccess.d.ts +3 -0
- package/dist/rules/typescript/uncheckedIndexAccess.d.ts.map +1 -0
- package/dist/rules/typescript/uncheckedIndexAccess.js +79 -0
- package/dist/rules/typescript/uncheckedIndexAccess.js.map +1 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts +3 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts.map +1 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.js +94 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.js.map +1 -0
- package/dist/strictness/evaluator.d.ts +28 -0
- package/dist/strictness/evaluator.d.ts.map +1 -0
- package/dist/strictness/evaluator.js +141 -0
- package/dist/strictness/evaluator.js.map +1 -0
- package/dist/strictness/matrix.d.ts +8 -0
- package/dist/strictness/matrix.d.ts.map +1 -0
- package/dist/strictness/matrix.js +63 -0
- package/dist/strictness/matrix.js.map +1 -0
- package/dist/typescript/programManager.d.ts +18 -0
- package/dist/typescript/programManager.d.ts.map +1 -0
- package/dist/typescript/programManager.js +46 -0
- package/dist/typescript/programManager.js.map +1 -0
- package/dist/typescript/projectResolver.d.ts +17 -0
- package/dist/typescript/projectResolver.d.ts.map +1 -0
- package/dist/typescript/projectResolver.js +75 -0
- package/dist/typescript/projectResolver.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes any file system path into a standardized POSIX relative path.
|
|
4
|
+
* Ensures consistent output across Windows and POSIX systems.
|
|
5
|
+
*/
|
|
6
|
+
export function normalizePath(filePath, relativeTo) {
|
|
7
|
+
if (!filePath) {
|
|
8
|
+
return "";
|
|
9
|
+
}
|
|
10
|
+
let resolved = filePath;
|
|
11
|
+
if (relativeTo && path.isAbsolute(filePath)) {
|
|
12
|
+
resolved = path.relative(relativeTo, filePath);
|
|
13
|
+
}
|
|
14
|
+
// Convert Windows backslashes to POSIX forward slashes
|
|
15
|
+
let normalized = resolved.replace(/\\/g, "/");
|
|
16
|
+
// Remove leading './' if present
|
|
17
|
+
if (normalized.startsWith("./")) {
|
|
18
|
+
normalized = normalized.slice(2);
|
|
19
|
+
}
|
|
20
|
+
// Normalize duplicate slashes
|
|
21
|
+
normalized = normalized.replace(/\/{2,}/g, "/");
|
|
22
|
+
return normalized;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Determines whether a file path has an accepted TypeScript or JavaScript extension.
|
|
26
|
+
*/
|
|
27
|
+
export function isSourceFile(filePath) {
|
|
28
|
+
return /\.(?:[cm]?[jt]sx?|json)$/i.test(filePath);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,UAAmB;IACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,IAAI,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,uDAAuD;IACvD,IAAI,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE9C,iCAAiC;IACjC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,8BAA8B;IAC9B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEhD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Finding } from "./types.js";
|
|
2
|
+
export interface LineSuppression {
|
|
3
|
+
readonly line: number;
|
|
4
|
+
readonly ruleIds: readonly string[];
|
|
5
|
+
readonly reason?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface BlockSuppression {
|
|
8
|
+
readonly startLine: number;
|
|
9
|
+
readonly endLine?: number | undefined;
|
|
10
|
+
readonly ruleIds: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
export interface FileSuppressions {
|
|
13
|
+
readonly nextLineSuppressions: readonly LineSuppression[];
|
|
14
|
+
readonly blockSuppressions: readonly BlockSuppression[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parses source text to identify all line and block level sourceverity suppressions.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseSourceSuppressions(sourceText: string): FileSuppressions;
|
|
20
|
+
/**
|
|
21
|
+
* Evaluates whether a specific finding is suppressed by comment directives.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isFindingSuppressed(finding: Finding, suppressions: FileSuppressions): boolean;
|
|
24
|
+
//# sourceMappingURL=suppressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../../src/core/suppressions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,SAAS,eAAe,EAAE,CAAC;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAiF5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAsB7F"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses source text to identify all line and block level sourceverity suppressions.
|
|
3
|
+
*/
|
|
4
|
+
export function parseSourceSuppressions(sourceText) {
|
|
5
|
+
const lines = sourceText.split("\n");
|
|
6
|
+
const nextLineSuppressions = [];
|
|
7
|
+
const blockSuppressions = [];
|
|
8
|
+
const activeBlocks = new Map();
|
|
9
|
+
for (let i = 0; i < lines.length; i++) {
|
|
10
|
+
const lineIndex = i + 1; // 1-indexed line
|
|
11
|
+
const line = lines[i] ?? "";
|
|
12
|
+
const trimmed = line.trim();
|
|
13
|
+
// 1. Check // sourceverity-disable-next-line <ruleIds> [-- <reason>]
|
|
14
|
+
const disableNextIdx = trimmed.indexOf("sourceverity-disable-next-line");
|
|
15
|
+
if (trimmed.startsWith("//") && disableNextIdx !== -1) {
|
|
16
|
+
const rest = trimmed.slice(disableNextIdx + "sourceverity-disable-next-line".length).trim();
|
|
17
|
+
const parts = rest.split(/\s+--\s*/);
|
|
18
|
+
const rulesPart = parts[0]?.trim() ?? "";
|
|
19
|
+
const reason = parts[1]?.trim();
|
|
20
|
+
const ruleIds = rulesPart
|
|
21
|
+
.split(",")
|
|
22
|
+
.map((r) => r.trim())
|
|
23
|
+
.filter((r) => r.length > 0);
|
|
24
|
+
if (ruleIds.length > 0) {
|
|
25
|
+
nextLineSuppressions.push({
|
|
26
|
+
line: lineIndex + 1, // Target line is the NEXT line
|
|
27
|
+
ruleIds,
|
|
28
|
+
reason: reason || undefined,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// 2. Check /* sourceverity-disable <ruleIds> */
|
|
34
|
+
const blockDisableMatch = trimmed.match(/\/\*\s*sourceverity-disable\s+([^*]+)\*\//);
|
|
35
|
+
if (blockDisableMatch && !trimmed.includes("sourceverity-disable-next-line")) {
|
|
36
|
+
const rawRules = blockDisableMatch[1]?.trim() ?? "";
|
|
37
|
+
const ruleIds = rawRules
|
|
38
|
+
.split(",")
|
|
39
|
+
.map((r) => r.trim())
|
|
40
|
+
.filter((r) => r.length > 0);
|
|
41
|
+
for (const ruleId of ruleIds) {
|
|
42
|
+
activeBlocks.set(ruleId, lineIndex);
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// 3. Check /* sourceverity-enable <ruleIds> */
|
|
47
|
+
const blockEnableMatch = trimmed.match(/\/\*\s*sourceverity-enable\s+([^*]+)\*\//);
|
|
48
|
+
if (blockEnableMatch) {
|
|
49
|
+
const rawRules = blockEnableMatch[1]?.trim() ?? "";
|
|
50
|
+
const ruleIds = rawRules
|
|
51
|
+
.split(",")
|
|
52
|
+
.map((r) => r.trim())
|
|
53
|
+
.filter((r) => r.length > 0);
|
|
54
|
+
for (const ruleId of ruleIds) {
|
|
55
|
+
const startLine = activeBlocks.get(ruleId);
|
|
56
|
+
if (startLine !== undefined) {
|
|
57
|
+
blockSuppressions.push({
|
|
58
|
+
startLine,
|
|
59
|
+
endLine: lineIndex,
|
|
60
|
+
ruleIds: [ruleId],
|
|
61
|
+
});
|
|
62
|
+
activeBlocks.delete(ruleId);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Any unclosed block suppressions extend to the end of the file
|
|
68
|
+
for (const [ruleId, startLine] of activeBlocks.entries()) {
|
|
69
|
+
blockSuppressions.push({
|
|
70
|
+
startLine,
|
|
71
|
+
endLine: undefined,
|
|
72
|
+
ruleIds: [ruleId],
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return { nextLineSuppressions, blockSuppressions };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Evaluates whether a specific finding is suppressed by comment directives.
|
|
79
|
+
*/
|
|
80
|
+
export function isFindingSuppressed(finding, suppressions) {
|
|
81
|
+
const line = finding.range.start.line;
|
|
82
|
+
// Check next-line suppressions
|
|
83
|
+
for (const supp of suppressions.nextLineSuppressions) {
|
|
84
|
+
if (supp.line === line) {
|
|
85
|
+
if (supp.ruleIds.includes(finding.ruleId) || supp.ruleIds.includes("all")) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check block suppressions
|
|
91
|
+
for (const block of suppressions.blockSuppressions) {
|
|
92
|
+
if (line >= block.startLine && (block.endLine === undefined || line <= block.endLine)) {
|
|
93
|
+
if (block.ruleIds.includes(finding.ruleId) || block.ruleIds.includes("all")) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=suppressions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suppressions.js","sourceRoot":"","sources":["../../src/core/suppressions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface TerminalStyler {
|
|
2
|
+
readonly enabled: boolean;
|
|
3
|
+
bold(text: string): string;
|
|
4
|
+
dim(text: string): string;
|
|
5
|
+
red(text: string): string;
|
|
6
|
+
green(text: string): string;
|
|
7
|
+
yellow(text: string): string;
|
|
8
|
+
blue(text: string): string;
|
|
9
|
+
cyan(text: string): string;
|
|
10
|
+
gray(text: string): string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Creates an ANSI terminal styler respecting NO_COLOR, FORCE_COLOR, and TTY status.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createStyler(options?: {
|
|
16
|
+
readonly color?: boolean;
|
|
17
|
+
}): TerminalStyler;
|
|
18
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/core/terminal.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,cAAc,CAkCnF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an ANSI terminal styler respecting NO_COLOR, FORCE_COLOR, and TTY status.
|
|
3
|
+
*/
|
|
4
|
+
export function createStyler(options) {
|
|
5
|
+
const envNoColor = Boolean(process.env["NO_COLOR"]);
|
|
6
|
+
const envForceColor = Boolean(process.env["FORCE_COLOR"]);
|
|
7
|
+
const isTTY = Boolean(process.stdout && process.stdout.isTTY);
|
|
8
|
+
let enabled = false;
|
|
9
|
+
if (options?.color !== undefined) {
|
|
10
|
+
enabled = options.color;
|
|
11
|
+
}
|
|
12
|
+
else if (envNoColor) {
|
|
13
|
+
enabled = false;
|
|
14
|
+
}
|
|
15
|
+
else if (envForceColor) {
|
|
16
|
+
enabled = true;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
enabled = isTTY;
|
|
20
|
+
}
|
|
21
|
+
const wrap = (open, close) => (text) => {
|
|
22
|
+
if (!enabled || !text) {
|
|
23
|
+
return text;
|
|
24
|
+
}
|
|
25
|
+
return `\u001B[${open}m${text}\u001B[${close}m`;
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
enabled,
|
|
29
|
+
bold: wrap("1", "22"),
|
|
30
|
+
dim: wrap("2", "22"),
|
|
31
|
+
red: wrap("31", "39"),
|
|
32
|
+
green: wrap("32", "39"),
|
|
33
|
+
yellow: wrap("33", "39"),
|
|
34
|
+
blue: wrap("34", "39"),
|
|
35
|
+
cyan: wrap("36", "39"),
|
|
36
|
+
gray: wrap("90", "39"),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/core/terminal.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;QAC7D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,UAAU,IAAI,IAAI,IAAI,UAAU,KAAK,GAAG,CAAC;IAClD,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;QACpB,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACrB,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACvB,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type * as ts from "typescript";
|
|
2
|
+
export type Severity = "error" | "warning" | "info";
|
|
3
|
+
export type Confidence = "high" | "medium" | "low";
|
|
4
|
+
export type RuleCategory = "typescript" | "react" | "async" | "browser" | "network" | "security" | "performance" | "a11y" | "config";
|
|
5
|
+
export interface SourcePosition {
|
|
6
|
+
readonly line: number;
|
|
7
|
+
readonly column: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SourceRange {
|
|
10
|
+
readonly start: SourcePosition;
|
|
11
|
+
readonly end: SourcePosition;
|
|
12
|
+
}
|
|
13
|
+
export interface Evidence {
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly range?: SourceRange | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface Finding {
|
|
18
|
+
readonly fingerprint: string;
|
|
19
|
+
readonly ruleId: string;
|
|
20
|
+
readonly category: RuleCategory;
|
|
21
|
+
readonly severity: Severity;
|
|
22
|
+
readonly confidence: Confidence;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
readonly file: string;
|
|
25
|
+
readonly projectRoot?: string | undefined;
|
|
26
|
+
readonly range: SourceRange;
|
|
27
|
+
readonly evidence: readonly Evidence[];
|
|
28
|
+
readonly suggestedAction?: string | null | undefined;
|
|
29
|
+
readonly safeAutomaticFix: boolean;
|
|
30
|
+
readonly repositoryAccepted?: boolean | undefined;
|
|
31
|
+
}
|
|
32
|
+
export type FindingInput = Omit<Finding, "fingerprint"> & {
|
|
33
|
+
readonly fingerprint?: string | undefined;
|
|
34
|
+
};
|
|
35
|
+
export interface RuleMetadata {
|
|
36
|
+
readonly id: string;
|
|
37
|
+
readonly category: RuleCategory;
|
|
38
|
+
readonly defaultSeverity: Severity;
|
|
39
|
+
readonly defaultConfidence: Confidence;
|
|
40
|
+
readonly description: string;
|
|
41
|
+
readonly requiresTypeInformation: boolean;
|
|
42
|
+
readonly framework?: string | undefined;
|
|
43
|
+
}
|
|
44
|
+
export interface RepositorySummary {
|
|
45
|
+
readonly typescriptVersion?: string | undefined;
|
|
46
|
+
readonly reactVersion?: string | undefined;
|
|
47
|
+
readonly packageManager: string;
|
|
48
|
+
readonly projectCount: number;
|
|
49
|
+
readonly workspaceType?: string | undefined;
|
|
50
|
+
}
|
|
51
|
+
export interface AuditSummary {
|
|
52
|
+
readonly errors: number;
|
|
53
|
+
readonly warnings: number;
|
|
54
|
+
readonly info: number;
|
|
55
|
+
readonly highConfidence: number;
|
|
56
|
+
readonly mediumConfidence: number;
|
|
57
|
+
readonly lowConfidence: number;
|
|
58
|
+
readonly filesAnalyzed: number;
|
|
59
|
+
readonly projectsCount: number;
|
|
60
|
+
}
|
|
61
|
+
export interface AuditResult {
|
|
62
|
+
readonly findings: readonly Finding[];
|
|
63
|
+
readonly summary: AuditSummary;
|
|
64
|
+
readonly repository: RepositorySummary;
|
|
65
|
+
readonly skippedSemanticRules?: readonly string[] | undefined;
|
|
66
|
+
}
|
|
67
|
+
export interface PackageJsonData {
|
|
68
|
+
readonly name?: string | undefined;
|
|
69
|
+
readonly version?: string | undefined;
|
|
70
|
+
readonly private?: boolean | undefined;
|
|
71
|
+
readonly workspaces?: readonly string[] | {
|
|
72
|
+
readonly packages?: readonly string[] | undefined;
|
|
73
|
+
} | undefined;
|
|
74
|
+
readonly dependencies?: Record<string, string> | undefined;
|
|
75
|
+
readonly devDependencies?: Record<string, string> | undefined;
|
|
76
|
+
readonly peerDependencies?: Record<string, string> | undefined;
|
|
77
|
+
}
|
|
78
|
+
export interface WorkspacePackage {
|
|
79
|
+
readonly name: string;
|
|
80
|
+
readonly packageDir: string;
|
|
81
|
+
readonly relativePath: string;
|
|
82
|
+
readonly packageJson: PackageJsonData;
|
|
83
|
+
readonly isRoot: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface FrameworkInfo {
|
|
86
|
+
readonly name: string;
|
|
87
|
+
readonly version?: string | undefined;
|
|
88
|
+
}
|
|
89
|
+
export interface RepositoryContext {
|
|
90
|
+
readonly rootDir: string;
|
|
91
|
+
readonly packageManager: "npm" | "pnpm" | "yarn" | "bun" | "unknown";
|
|
92
|
+
readonly rootManifest?: PackageJsonData | undefined;
|
|
93
|
+
readonly isMonorepo: boolean;
|
|
94
|
+
readonly workspaceType?: "pnpm" | "npm" | "yarn" | "bun" | undefined;
|
|
95
|
+
readonly packages: readonly WorkspacePackage[];
|
|
96
|
+
readonly reactVersion?: string | undefined;
|
|
97
|
+
readonly reactDomVersion?: string | undefined;
|
|
98
|
+
readonly hasReactCompiler: boolean;
|
|
99
|
+
readonly reactCompilerConfig?: Record<string, unknown> | undefined;
|
|
100
|
+
readonly frameworks: readonly FrameworkInfo[];
|
|
101
|
+
}
|
|
102
|
+
export interface RuleContext {
|
|
103
|
+
readonly ts?: typeof ts | undefined;
|
|
104
|
+
readonly program?: ts.Program | undefined;
|
|
105
|
+
readonly checker?: ts.TypeChecker | undefined;
|
|
106
|
+
readonly sourceFile: ts.SourceFile;
|
|
107
|
+
readonly repoContext: RepositoryContext;
|
|
108
|
+
readonly projectRoot: string;
|
|
109
|
+
readonly typeScriptAvailable: boolean;
|
|
110
|
+
report(finding: FindingInput): void;
|
|
111
|
+
visitNodes(visitor: (node: ts.Node) => void): void;
|
|
112
|
+
findEnclosingScope(node: ts.Node): ts.Node | undefined;
|
|
113
|
+
resolveSymbol(node: ts.Node): ts.Symbol | undefined;
|
|
114
|
+
}
|
|
115
|
+
export interface Rule {
|
|
116
|
+
readonly meta: RuleMetadata;
|
|
117
|
+
analyze(context: RuleContext): void | Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type * as tsType from "typescript";
|
|
2
|
+
import type { FindingInput, RepositoryContext, RuleContext } from "../core/types.js";
|
|
3
|
+
export interface CreateRuleContextOptions {
|
|
4
|
+
readonly ts?: typeof tsType | undefined;
|
|
5
|
+
readonly program?: tsType.Program | undefined;
|
|
6
|
+
readonly checker?: tsType.TypeChecker | undefined;
|
|
7
|
+
readonly sourceFile: tsType.SourceFile;
|
|
8
|
+
readonly repoContext: RepositoryContext;
|
|
9
|
+
readonly projectRoot: string;
|
|
10
|
+
readonly reportFinding: (finding: FindingInput) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Creates an execution context for a single SourceFile during rule analysis.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createRuleContext(options: CreateRuleContextOptions): RuleContext;
|
|
16
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAwDhF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an execution context for a single SourceFile during rule analysis.
|
|
3
|
+
*/
|
|
4
|
+
export function createRuleContext(options) {
|
|
5
|
+
const { ts, program, checker, sourceFile, repoContext, projectRoot, reportFinding } = options;
|
|
6
|
+
return {
|
|
7
|
+
ts,
|
|
8
|
+
program,
|
|
9
|
+
checker,
|
|
10
|
+
sourceFile,
|
|
11
|
+
repoContext,
|
|
12
|
+
projectRoot,
|
|
13
|
+
typeScriptAvailable: Boolean(program && checker),
|
|
14
|
+
report(finding) {
|
|
15
|
+
reportFinding(finding);
|
|
16
|
+
},
|
|
17
|
+
visitNodes(visitor) {
|
|
18
|
+
function walk(node) {
|
|
19
|
+
if (!node)
|
|
20
|
+
return;
|
|
21
|
+
visitor(node);
|
|
22
|
+
node.forEachChild(walk);
|
|
23
|
+
}
|
|
24
|
+
walk(sourceFile);
|
|
25
|
+
},
|
|
26
|
+
findEnclosingScope(node) {
|
|
27
|
+
let current = node.parent;
|
|
28
|
+
while (current) {
|
|
29
|
+
if (ts) {
|
|
30
|
+
if (ts.isFunctionDeclaration(current) ||
|
|
31
|
+
ts.isArrowFunction(current) ||
|
|
32
|
+
ts.isFunctionExpression(current) ||
|
|
33
|
+
ts.isMethodDeclaration(current) ||
|
|
34
|
+
ts.isClassDeclaration(current) ||
|
|
35
|
+
ts.isSourceFile(current)) {
|
|
36
|
+
return current;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Fallback to numeric SyntaxKind
|
|
41
|
+
const k = current.kind;
|
|
42
|
+
if (k === 262 || k === 219 || k === 218 || k === 173 || k === 263 || k === 312) {
|
|
43
|
+
return current;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
current = current.parent;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
},
|
|
50
|
+
resolveSymbol(node) {
|
|
51
|
+
if (!checker)
|
|
52
|
+
return undefined;
|
|
53
|
+
return checker.getSymbolAtLocation(node);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAiC;IACjE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAE9F,OAAO;QACL,EAAE;QACF,OAAO;QACP,OAAO;QACP,UAAU;QACV,WAAW;QACX,WAAW;QACX,mBAAmB,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;QAEhD,MAAM,CAAC,OAAqB;YAC1B,aAAa,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,UAAU,CAAC,OAAoC;YAC7C,SAAS,IAAI,CAAC,IAA6B;gBACzC,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,CAAC;QACnB,CAAC;QAED,kBAAkB,CAAC,IAAiB;YAClC,IAAI,OAAO,GAA4B,IAAI,CAAC,MAAM,CAAC;YACnD,OAAO,OAAO,EAAE,CAAC;gBACf,IAAI,EAAE,EAAE,CAAC;oBACP,IACE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC;wBACjC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;wBAC3B,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC;wBAChC,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC;wBAC/B,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;wBAC9B,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EACxB,CAAC;wBACD,OAAO,OAAO,CAAC;oBACjB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,iCAAiC;oBACjC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;oBACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC/E,OAAO,OAAO,CAAC;oBACjB,CAAC;gBACH,CAAC;gBACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC3B,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,aAAa,CAAC,IAAiB;YAC7B,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YAC/B,OAAO,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Rule, RuleCategory } from "../core/types.js";
|
|
2
|
+
export declare class RuleRegistry {
|
|
3
|
+
private readonly rulesById;
|
|
4
|
+
/**
|
|
5
|
+
* Registers a new audit rule. Throws if a duplicate rule ID is registered.
|
|
6
|
+
*/
|
|
7
|
+
register(rule: Rule): void;
|
|
8
|
+
/**
|
|
9
|
+
* Retrieves a rule by its unique ID.
|
|
10
|
+
*/
|
|
11
|
+
get(ruleId: string): Rule | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Returns all registered rules.
|
|
14
|
+
*/
|
|
15
|
+
getAll(): readonly Rule[];
|
|
16
|
+
/**
|
|
17
|
+
* Returns all rules matching a specific category.
|
|
18
|
+
*/
|
|
19
|
+
getByCategory(category: RuleCategory): readonly Rule[];
|
|
20
|
+
/**
|
|
21
|
+
* Clears all registered rules (useful for test isolation).
|
|
22
|
+
*/
|
|
23
|
+
clear(): void;
|
|
24
|
+
}
|
|
25
|
+
export declare const globalRuleRegistry: RuleRegistry;
|
|
26
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/engine/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE3D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IAErD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAO1B;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIrC;;OAEG;IACH,MAAM,IAAI,SAAS,IAAI,EAAE;IAIzB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,IAAI,EAAE;IAItD;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,kBAAkB,cAAqB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class RuleRegistry {
|
|
2
|
+
rulesById = new Map();
|
|
3
|
+
/**
|
|
4
|
+
* Registers a new audit rule. Throws if a duplicate rule ID is registered.
|
|
5
|
+
*/
|
|
6
|
+
register(rule) {
|
|
7
|
+
if (this.rulesById.has(rule.meta.id)) {
|
|
8
|
+
throw new Error(`Duplicate rule ID registered: '${rule.meta.id}'`);
|
|
9
|
+
}
|
|
10
|
+
this.rulesById.set(rule.meta.id, rule);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Retrieves a rule by its unique ID.
|
|
14
|
+
*/
|
|
15
|
+
get(ruleId) {
|
|
16
|
+
return this.rulesById.get(ruleId);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Returns all registered rules.
|
|
20
|
+
*/
|
|
21
|
+
getAll() {
|
|
22
|
+
return Array.from(this.rulesById.values());
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns all rules matching a specific category.
|
|
26
|
+
*/
|
|
27
|
+
getByCategory(category) {
|
|
28
|
+
return this.getAll().filter((rule) => rule.meta.category === category);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Clears all registered rules (useful for test isolation).
|
|
32
|
+
*/
|
|
33
|
+
clear() {
|
|
34
|
+
this.rulesById.clear();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export const globalRuleRegistry = new RuleRegistry();
|
|
38
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/engine/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACN,SAAS,GAAG,IAAI,GAAG,EAAgB,CAAC;IAErD;;OAEG;IACH,QAAQ,CAAC,IAAU;QACjB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAsB;QAClC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "../rules/index.js";
|
|
2
|
+
import type { AuditResult, Rule } from "../core/types.js";
|
|
3
|
+
export interface RunAuditOptions {
|
|
4
|
+
readonly targetDir: string;
|
|
5
|
+
readonly minConfidence?: "high" | "medium" | "low" | undefined;
|
|
6
|
+
readonly rules?: readonly Rule[] | undefined;
|
|
7
|
+
readonly customIgnores?: readonly string[] | undefined;
|
|
8
|
+
readonly changedFiles?: readonly string[] | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Executes a full SourceVerity audit across the target repository.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runAudit(options: RunAuditOptions): Promise<AuditResult>;
|
|
14
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/engine/runner.ts"],"names":[],"mappings":"AAWA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAKV,WAAW,EAGX,IAAI,EACL,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACvD;AAcD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAuJ7E"}
|