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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats AuditResult into structured Agent JSON format for LLMs/Codex.
|
|
3
|
+
*/
|
|
4
|
+
export function renderAgentReport(result) {
|
|
5
|
+
const agentFindings = result.findings.map((f) => ({
|
|
6
|
+
fingerprint: f.fingerprint,
|
|
7
|
+
ruleId: f.ruleId,
|
|
8
|
+
category: f.category,
|
|
9
|
+
severity: f.severity,
|
|
10
|
+
confidence: f.confidence,
|
|
11
|
+
file: f.file,
|
|
12
|
+
range: {
|
|
13
|
+
start: { line: f.range.start.line, column: f.range.start.column },
|
|
14
|
+
end: { line: f.range.end.line, column: f.range.end.column },
|
|
15
|
+
},
|
|
16
|
+
message: f.message,
|
|
17
|
+
evidence: f.evidence.map((e) => e.message),
|
|
18
|
+
suggestedAction: f.suggestedAction ?? null,
|
|
19
|
+
safeAutomaticFix: f.safeAutomaticFix,
|
|
20
|
+
}));
|
|
21
|
+
const report = {
|
|
22
|
+
schemaVersion: 1,
|
|
23
|
+
tool: {
|
|
24
|
+
name: "sourceverity",
|
|
25
|
+
version: "1.0.0",
|
|
26
|
+
},
|
|
27
|
+
repository: {
|
|
28
|
+
typescript: result.repository.typescriptVersion,
|
|
29
|
+
react: result.repository.reactVersion,
|
|
30
|
+
},
|
|
31
|
+
summary: {
|
|
32
|
+
errors: result.summary.errors,
|
|
33
|
+
warnings: result.summary.warnings,
|
|
34
|
+
info: result.summary.info,
|
|
35
|
+
},
|
|
36
|
+
findings: agentFindings,
|
|
37
|
+
};
|
|
38
|
+
return JSON.stringify(report, null, 2);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"AAqCA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,aAAa,GAAmB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC;QACzE,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;YACjE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;SAC5D;QACD,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;QAC1C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;KACrC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAgB;QAC1B,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE;YACJ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAO;SACjB;QACD,UAAU,EAAE;YACV,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,iBAAiB;YAC/C,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY;SACtC;QACD,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;SAC1B;QACD,QAAQ,EAAE,aAAa;KACxB,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4D7D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats AuditResult as standard SARIF 2.1.0 log format for GitHub Code Scanning.
|
|
3
|
+
*/
|
|
4
|
+
export function renderSarifReport(result) {
|
|
5
|
+
const ruleMap = new Map();
|
|
6
|
+
for (const f of result.findings) {
|
|
7
|
+
if (!ruleMap.has(f.ruleId)) {
|
|
8
|
+
ruleMap.set(f.ruleId, { id: f.ruleId, name: f.ruleId });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const sarifResults = result.findings.map((f) => {
|
|
12
|
+
const level = f.severity === "error" ? "error" : f.severity === "warning" ? "warning" : "note";
|
|
13
|
+
return {
|
|
14
|
+
ruleId: f.ruleId,
|
|
15
|
+
level,
|
|
16
|
+
message: {
|
|
17
|
+
text: f.message,
|
|
18
|
+
},
|
|
19
|
+
locations: [
|
|
20
|
+
{
|
|
21
|
+
physicalLocation: {
|
|
22
|
+
artifactLocation: {
|
|
23
|
+
uri: f.file,
|
|
24
|
+
},
|
|
25
|
+
region: {
|
|
26
|
+
startLine: f.range.start.line,
|
|
27
|
+
startColumn: f.range.start.column,
|
|
28
|
+
endLine: f.range.end.line,
|
|
29
|
+
endColumn: f.range.end.column,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
partialFingerprints: {
|
|
35
|
+
primaryLocationLineHash: f.fingerprint,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const sarifLog = {
|
|
40
|
+
$schema: "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
|
|
41
|
+
version: "2.1.0",
|
|
42
|
+
runs: [
|
|
43
|
+
{
|
|
44
|
+
tool: {
|
|
45
|
+
driver: {
|
|
46
|
+
name: "sourceverity",
|
|
47
|
+
version: "1.0.0",
|
|
48
|
+
rules: Array.from(ruleMap.values()).map((r) => ({
|
|
49
|
+
id: r.id,
|
|
50
|
+
name: r.name,
|
|
51
|
+
})),
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
results: sarifResults,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
return JSON.stringify(sarifLog, null, 2);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=sarif.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEhE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAE/F,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK;YACL,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC,CAAC,OAAO;aAChB;YACD,SAAS,EAAE;gBACT;oBACE,gBAAgB,EAAE;wBAChB,gBAAgB,EAAE;4BAChB,GAAG,EAAE,CAAC,CAAC,IAAI;yBACZ;wBACD,MAAM,EAAE;4BACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;4BAC7B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;4BACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;4BACzB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;yBAC9B;qBACF;iBACF;aACF;YACD,mBAAmB,EAAE;gBACnB,uBAAuB,EAAE,CAAC,CAAC,WAAW;aACvC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,gGAAgG;QACzG,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,OAAO;wBAChB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC9C,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,IAAI,EAAE,CAAC,CAAC,IAAI;yBACb,CAAC,CAAC;qBACJ;iBACF;gBACD,OAAO,EAAE,YAAY;aACtB;SACF;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AuditResult } from "../core/types.js";
|
|
2
|
+
export interface TerminalReporterOptions {
|
|
3
|
+
readonly color?: boolean | undefined;
|
|
4
|
+
readonly verbose?: boolean | undefined;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Formats AuditResult as a clean, human-readable terminal report.
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderTerminalReport(result: AuditResult, options?: TerminalReporterOptions | undefined): string;
|
|
10
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAcD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,SAAS,GAAG,MAAM,CAyE/G"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createStyler } from "../core/terminal.js";
|
|
2
|
+
const CATEGORY_NAMES = {
|
|
3
|
+
typescript: "Type safety",
|
|
4
|
+
react: "React",
|
|
5
|
+
async: "Async",
|
|
6
|
+
browser: "Browser",
|
|
7
|
+
network: "Network",
|
|
8
|
+
security: "Security",
|
|
9
|
+
performance: "Performance",
|
|
10
|
+
a11y: "Accessibility",
|
|
11
|
+
config: "Configuration",
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Formats AuditResult as a clean, human-readable terminal report.
|
|
15
|
+
*/
|
|
16
|
+
export function renderTerminalReport(result, options) {
|
|
17
|
+
const styler = createStyler(options?.color !== undefined ? { color: options.color } : undefined);
|
|
18
|
+
const lines = [];
|
|
19
|
+
// 1. Header & Repository Overview
|
|
20
|
+
lines.push(styler.bold("SourceVerity 1.0.0"));
|
|
21
|
+
lines.push("");
|
|
22
|
+
lines.push(styler.bold("Repository"));
|
|
23
|
+
if (result.repository.typescriptVersion) {
|
|
24
|
+
lines.push(` TypeScript ${result.repository.typescriptVersion}`);
|
|
25
|
+
}
|
|
26
|
+
if (result.repository.reactVersion) {
|
|
27
|
+
lines.push(` React ${result.repository.reactVersion}`);
|
|
28
|
+
}
|
|
29
|
+
lines.push(` Workspace ${result.repository.workspaceType ?? result.repository.packageManager}`);
|
|
30
|
+
lines.push(` Projects ${result.repository.projectCount}`);
|
|
31
|
+
lines.push("");
|
|
32
|
+
lines.push(`Analyzing ${result.summary.filesAnalyzed} source files...`);
|
|
33
|
+
lines.push("");
|
|
34
|
+
// 2. Category Summary Table
|
|
35
|
+
const categoryCounts = new Map();
|
|
36
|
+
for (const f of result.findings) {
|
|
37
|
+
const cat = f.category;
|
|
38
|
+
let counts = categoryCounts.get(cat);
|
|
39
|
+
if (!counts) {
|
|
40
|
+
counts = { errors: 0, warnings: 0, info: 0 };
|
|
41
|
+
categoryCounts.set(cat, counts);
|
|
42
|
+
}
|
|
43
|
+
if (f.severity === "error")
|
|
44
|
+
counts.errors++;
|
|
45
|
+
else if (f.severity === "warning")
|
|
46
|
+
counts.warnings++;
|
|
47
|
+
else if (f.severity === "info")
|
|
48
|
+
counts.info++;
|
|
49
|
+
}
|
|
50
|
+
for (const [cat, name] of Object.entries(CATEGORY_NAMES)) {
|
|
51
|
+
const counts = categoryCounts.get(cat) ?? { errors: 0, warnings: 0, info: 0 };
|
|
52
|
+
if (counts.errors > 0 || counts.warnings > 0 || counts.info > 0 || options?.verbose) {
|
|
53
|
+
const paddedName = name.padEnd(16, " ");
|
|
54
|
+
const errStr = counts.errors > 0 ? styler.red(`${counts.errors} error${counts.errors === 1 ? "" : "s"}`) : `0 errors`;
|
|
55
|
+
const warnStr = counts.warnings > 0 ? styler.yellow(`${counts.warnings} warning${counts.warnings === 1 ? "" : "s"}`) : `0 warnings`;
|
|
56
|
+
lines.push(`${paddedName} ${errStr} ${warnStr}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
lines.push("");
|
|
60
|
+
// 3. Individual Finding Cards
|
|
61
|
+
if (result.findings.length > 0) {
|
|
62
|
+
for (const finding of result.findings) {
|
|
63
|
+
lines.push(formatFindingCard(finding, styler));
|
|
64
|
+
lines.push("");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 4. Skipped Semantic Rules Notice (if TS missing)
|
|
68
|
+
if (result.skippedSemanticRules && result.skippedSemanticRules.length > 0) {
|
|
69
|
+
lines.push(styler.yellow("Type-aware TypeScript analysis unavailable."));
|
|
70
|
+
lines.push("No local TypeScript installation was found.");
|
|
71
|
+
lines.push(`${result.skippedSemanticRules.length} semantic rules were skipped.`);
|
|
72
|
+
lines.push("");
|
|
73
|
+
}
|
|
74
|
+
// 5. Summary Footer
|
|
75
|
+
lines.push("────────────────────────────────────────");
|
|
76
|
+
lines.push(`${result.summary.highConfidence} high-confidence findings`);
|
|
77
|
+
if (result.summary.mediumConfidence > 0 || result.summary.lowConfidence > 0) {
|
|
78
|
+
lines.push(`${result.summary.mediumConfidence + result.summary.lowConfidence} advisory findings`);
|
|
79
|
+
}
|
|
80
|
+
lines.push("");
|
|
81
|
+
return lines.join("\n");
|
|
82
|
+
}
|
|
83
|
+
function formatFindingCard(finding, styler) {
|
|
84
|
+
const lines = [];
|
|
85
|
+
const loc = `${finding.file}:${finding.range.start.line}:${finding.range.start.column}`;
|
|
86
|
+
lines.push(styler.bold(loc));
|
|
87
|
+
lines.push("");
|
|
88
|
+
const sevStr = finding.severity === "error" ? styler.red("error") : finding.severity === "warning" ? styler.yellow("warning") : styler.dim("info");
|
|
89
|
+
lines.push(`${finding.ruleId}`);
|
|
90
|
+
lines.push(`${sevStr} · ${finding.confidence} confidence`);
|
|
91
|
+
lines.push("");
|
|
92
|
+
lines.push(finding.message);
|
|
93
|
+
if (finding.evidence.length > 0) {
|
|
94
|
+
lines.push("");
|
|
95
|
+
for (const ev of finding.evidence) {
|
|
96
|
+
lines.push(` Evidence: ${ev.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (finding.suggestedAction) {
|
|
100
|
+
lines.push("");
|
|
101
|
+
lines.push(styler.dim(` Suggested: ${finding.suggestedAction}`));
|
|
102
|
+
}
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RepositoryContext } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Audits repository directory and discovers packages, workspaces, package manager, and framework configuration.
|
|
4
|
+
*/
|
|
5
|
+
export declare function discoverRepository(rootDir: string): Promise<RepositoryContext>;
|
|
6
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/repository/detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AA8JpB;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgFpF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { normalizePath } from "../core/paths.js";
|
|
4
|
+
/**
|
|
5
|
+
* Safely parses a JSON file, returning undefined if missing or malformed.
|
|
6
|
+
*/
|
|
7
|
+
async function readJsonFile(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
const raw = await fs.readFile(filePath, "utf-8");
|
|
10
|
+
// sourceverity-disable-next-line typescript/unsafe-unvalidated-assertion -- generic raw JSON parser helper
|
|
11
|
+
return JSON.parse(raw);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Checks if a file or directory exists.
|
|
19
|
+
*/
|
|
20
|
+
async function pathExists(p) {
|
|
21
|
+
try {
|
|
22
|
+
await fs.access(p);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Detects the package manager used in the repository root.
|
|
31
|
+
*/
|
|
32
|
+
async function detectPackageManager(rootDir) {
|
|
33
|
+
if (await pathExists(path.join(rootDir, "pnpm-lock.yaml")))
|
|
34
|
+
return "pnpm";
|
|
35
|
+
if (await pathExists(path.join(rootDir, "package-lock.json")))
|
|
36
|
+
return "npm";
|
|
37
|
+
if (await pathExists(path.join(rootDir, "yarn.lock")))
|
|
38
|
+
return "yarn";
|
|
39
|
+
if ((await pathExists(path.join(rootDir, "bun.lockb"))) || (await pathExists(path.join(rootDir, "bun.lock"))))
|
|
40
|
+
return "bun";
|
|
41
|
+
return "unknown";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parses pnpm-workspace.yaml package patterns without external YAML libraries.
|
|
45
|
+
*/
|
|
46
|
+
async function parsePnpmWorkspaceYaml(pnpmYamlPath) {
|
|
47
|
+
try {
|
|
48
|
+
const content = await fs.readFile(pnpmYamlPath, "utf-8");
|
|
49
|
+
const patterns = [];
|
|
50
|
+
let inPackagesBlock = false;
|
|
51
|
+
for (const line of content.split("\n")) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (trimmed.startsWith("packages:")) {
|
|
54
|
+
inPackagesBlock = true;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (inPackagesBlock) {
|
|
58
|
+
if (trimmed.startsWith("-")) {
|
|
59
|
+
const raw = trimmed.replace(/^-\s*/, "").replace(/['"]/g, "").trim();
|
|
60
|
+
if (raw)
|
|
61
|
+
patterns.push(raw);
|
|
62
|
+
}
|
|
63
|
+
else if (trimmed.length > 0 && !trimmed.startsWith("#")) {
|
|
64
|
+
inPackagesBlock = false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return patterns;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Expands workspace directory globs (e.g. "apps/*", "packages/*").
|
|
76
|
+
*/
|
|
77
|
+
async function expandWorkspacePatterns(rootDir, patterns) {
|
|
78
|
+
const result = [];
|
|
79
|
+
for (const pattern of patterns) {
|
|
80
|
+
const normalized = pattern.replace(/\\/g, "/");
|
|
81
|
+
if (normalized.endsWith("/*")) {
|
|
82
|
+
const parentDir = path.join(rootDir, normalized.slice(0, -2));
|
|
83
|
+
try {
|
|
84
|
+
const entries = await fs.readdir(parentDir, { withFileTypes: true });
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
if (entry.isDirectory() && !entry.name.startsWith(".")) {
|
|
87
|
+
const pkgDir = path.join(parentDir, entry.name);
|
|
88
|
+
if (await pathExists(path.join(pkgDir, "package.json"))) {
|
|
89
|
+
result.push(pkgDir);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Parent dir does not exist; continue
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const directDir = path.join(rootDir, normalized);
|
|
100
|
+
if (await pathExists(path.join(directDir, "package.json"))) {
|
|
101
|
+
result.push(directDir);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Extracts framework and tool dependencies across all discovered packages.
|
|
109
|
+
*/
|
|
110
|
+
function extractFrameworks(manifests) {
|
|
111
|
+
let reactVersion;
|
|
112
|
+
let reactDomVersion;
|
|
113
|
+
let hasReactCompiler = false;
|
|
114
|
+
const frameworksMap = new Map();
|
|
115
|
+
const KNOWN_FRAMEWORKS = [
|
|
116
|
+
{ key: "next", name: "Next.js" },
|
|
117
|
+
{ key: "vite", name: "Vite" },
|
|
118
|
+
{ key: "@remix-run/react", name: "Remix" },
|
|
119
|
+
{ key: "react-router", name: "React Router" },
|
|
120
|
+
{ key: "astro", name: "Astro" },
|
|
121
|
+
{ key: "gatsby", name: "Gatsby" },
|
|
122
|
+
];
|
|
123
|
+
for (const manifest of manifests) {
|
|
124
|
+
const allDeps = {
|
|
125
|
+
...manifest.peerDependencies,
|
|
126
|
+
...manifest.devDependencies,
|
|
127
|
+
...manifest.dependencies,
|
|
128
|
+
};
|
|
129
|
+
if (!reactVersion && allDeps["react"]) {
|
|
130
|
+
reactVersion = allDeps["react"];
|
|
131
|
+
}
|
|
132
|
+
if (!reactDomVersion && allDeps["react-dom"]) {
|
|
133
|
+
reactDomVersion = allDeps["react-dom"];
|
|
134
|
+
}
|
|
135
|
+
if (allDeps["babel-plugin-react-compiler"] || allDeps["eslint-plugin-react-compiler"]) {
|
|
136
|
+
hasReactCompiler = true;
|
|
137
|
+
}
|
|
138
|
+
for (const fw of KNOWN_FRAMEWORKS) {
|
|
139
|
+
const version = allDeps[fw.key];
|
|
140
|
+
if (version && !frameworksMap.has(fw.name)) {
|
|
141
|
+
frameworksMap.set(fw.name, version);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const frameworks = Array.from(frameworksMap.entries()).map(([name, version]) => ({
|
|
146
|
+
name,
|
|
147
|
+
version,
|
|
148
|
+
}));
|
|
149
|
+
return { reactVersion, reactDomVersion, hasReactCompiler, frameworks };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Audits repository directory and discovers packages, workspaces, package manager, and framework configuration.
|
|
153
|
+
*/
|
|
154
|
+
export async function discoverRepository(rootDir) {
|
|
155
|
+
const resolvedRoot = path.resolve(rootDir);
|
|
156
|
+
const packageManager = await detectPackageManager(resolvedRoot);
|
|
157
|
+
const rootManifestPath = path.join(resolvedRoot, "package.json");
|
|
158
|
+
const rootManifest = await readJsonFile(rootManifestPath);
|
|
159
|
+
const packages = [];
|
|
160
|
+
let isMonorepo = false;
|
|
161
|
+
let workspaceType;
|
|
162
|
+
// 1. Check pnpm-workspace.yaml
|
|
163
|
+
const pnpmWorkspacePath = path.join(resolvedRoot, "pnpm-workspace.yaml");
|
|
164
|
+
if (await pathExists(pnpmWorkspacePath)) {
|
|
165
|
+
isMonorepo = true;
|
|
166
|
+
workspaceType = "pnpm";
|
|
167
|
+
const patterns = await parsePnpmWorkspaceYaml(pnpmWorkspacePath);
|
|
168
|
+
const dirs = await expandWorkspacePatterns(resolvedRoot, patterns);
|
|
169
|
+
for (const pkgDir of dirs) {
|
|
170
|
+
const pkgManifest = await readJsonFile(path.join(pkgDir, "package.json"));
|
|
171
|
+
if (pkgManifest) {
|
|
172
|
+
packages.push({
|
|
173
|
+
name: pkgManifest.name ?? path.basename(pkgDir),
|
|
174
|
+
packageDir: pkgDir,
|
|
175
|
+
relativePath: normalizePath(pkgDir, resolvedRoot),
|
|
176
|
+
packageJson: pkgManifest,
|
|
177
|
+
isRoot: false,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (rootManifest?.workspaces) {
|
|
183
|
+
// 2. Check package.json workspaces
|
|
184
|
+
isMonorepo = true;
|
|
185
|
+
workspaceType = packageManager === "unknown" ? "npm" : packageManager;
|
|
186
|
+
const rawWorkspaces = rootManifest.workspaces;
|
|
187
|
+
const rawPatterns = Array.isArray(rawWorkspaces)
|
|
188
|
+
? rawWorkspaces
|
|
189
|
+
: typeof rawWorkspaces === "object" && rawWorkspaces && "packages" in rawWorkspaces && Array.isArray(rawWorkspaces.packages)
|
|
190
|
+
? rawWorkspaces.packages
|
|
191
|
+
: [];
|
|
192
|
+
const dirs = await expandWorkspacePatterns(resolvedRoot, rawPatterns);
|
|
193
|
+
for (const pkgDir of dirs) {
|
|
194
|
+
const pkgManifest = await readJsonFile(path.join(pkgDir, "package.json"));
|
|
195
|
+
if (pkgManifest) {
|
|
196
|
+
packages.push({
|
|
197
|
+
name: pkgManifest.name ?? path.basename(pkgDir),
|
|
198
|
+
packageDir: pkgDir,
|
|
199
|
+
relativePath: normalizePath(pkgDir, resolvedRoot),
|
|
200
|
+
packageJson: pkgManifest,
|
|
201
|
+
isRoot: false,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Add root package if package.json exists
|
|
207
|
+
if (rootManifest) {
|
|
208
|
+
packages.unshift({
|
|
209
|
+
name: rootManifest.name ?? "root",
|
|
210
|
+
packageDir: resolvedRoot,
|
|
211
|
+
relativePath: ".",
|
|
212
|
+
packageJson: rootManifest,
|
|
213
|
+
isRoot: true,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const allManifests = packages.map((p) => p.packageJson);
|
|
217
|
+
const frameworkData = extractFrameworks(allManifests);
|
|
218
|
+
return {
|
|
219
|
+
rootDir: resolvedRoot,
|
|
220
|
+
packageManager,
|
|
221
|
+
isMonorepo,
|
|
222
|
+
workspaceType,
|
|
223
|
+
rootManifest,
|
|
224
|
+
packages,
|
|
225
|
+
reactVersion: frameworkData.reactVersion,
|
|
226
|
+
reactDomVersion: frameworkData.reactDomVersion,
|
|
227
|
+
hasReactCompiler: frameworkData.hasReactCompiler,
|
|
228
|
+
frameworks: frameworkData.frameworks,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/repository/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const DEFAULT_IGNORE_PATTERNS: readonly ["node_modules", "node_modules/**", "dist", "dist/**", "build", "build/**", "coverage", "coverage/**", ".git", ".git/**", ".next", ".next/**", ".turbo", ".turbo/**", ".nuxt", ".nuxt/**", ".cache", ".cache/**", ".sourceverity-cache", ".sourceverity-cache/**", "*.log", ".DS_Store"];
|
|
2
|
+
/**
|
|
3
|
+
* Creates a repository file filter that checks file paths against default ignore rules,
|
|
4
|
+
* local .gitignore files, and optional custom patterns.
|
|
5
|
+
*
|
|
6
|
+
* Returns a predicate that returns true if the file should be INCLUDED in analysis,
|
|
7
|
+
* and false if the file should be IGNORED.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createFileFilter(rootDir: string, customIgnores?: readonly string[] | undefined): Promise<(filePath: string) => boolean>;
|
|
10
|
+
//# sourceMappingURL=fileFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileFilter.d.ts","sourceRoot":"","sources":["../../src/repository/fileFilter.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,uBAAuB,mSAuB1B,CAAC;AAEX;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAC5C,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CA+CxC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import ignore from "ignore";
|
|
4
|
+
import { normalizePath } from "../core/paths.js";
|
|
5
|
+
const createIgnore = typeof ignore === "function"
|
|
6
|
+
? ignore
|
|
7
|
+
: ignore.default;
|
|
8
|
+
export const DEFAULT_IGNORE_PATTERNS = [
|
|
9
|
+
"node_modules",
|
|
10
|
+
"node_modules/**",
|
|
11
|
+
"dist",
|
|
12
|
+
"dist/**",
|
|
13
|
+
"build",
|
|
14
|
+
"build/**",
|
|
15
|
+
"coverage",
|
|
16
|
+
"coverage/**",
|
|
17
|
+
".git",
|
|
18
|
+
".git/**",
|
|
19
|
+
".next",
|
|
20
|
+
".next/**",
|
|
21
|
+
".turbo",
|
|
22
|
+
".turbo/**",
|
|
23
|
+
".nuxt",
|
|
24
|
+
".nuxt/**",
|
|
25
|
+
".cache",
|
|
26
|
+
".cache/**",
|
|
27
|
+
".sourceverity-cache",
|
|
28
|
+
".sourceverity-cache/**",
|
|
29
|
+
"*.log",
|
|
30
|
+
".DS_Store",
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Creates a repository file filter that checks file paths against default ignore rules,
|
|
34
|
+
* local .gitignore files, and optional custom patterns.
|
|
35
|
+
*
|
|
36
|
+
* Returns a predicate that returns true if the file should be INCLUDED in analysis,
|
|
37
|
+
* and false if the file should be IGNORED.
|
|
38
|
+
*/
|
|
39
|
+
export async function createFileFilter(rootDir, customIgnores) {
|
|
40
|
+
const ig = createIgnore();
|
|
41
|
+
// 1. Add default ignore patterns
|
|
42
|
+
ig.add(DEFAULT_IGNORE_PATTERNS);
|
|
43
|
+
// 2. Add custom ignore patterns if provided
|
|
44
|
+
if (customIgnores && customIgnores.length > 0) {
|
|
45
|
+
ig.add(customIgnores);
|
|
46
|
+
}
|
|
47
|
+
// 3. Read root .gitignore if present
|
|
48
|
+
const rootGitignore = path.join(rootDir, ".gitignore");
|
|
49
|
+
try {
|
|
50
|
+
const content = await fs.readFile(rootGitignore, "utf-8");
|
|
51
|
+
ig.add(content);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// No .gitignore present, continue with defaults
|
|
55
|
+
}
|
|
56
|
+
const resolvedRoot = path.resolve(rootDir);
|
|
57
|
+
return (filePath) => {
|
|
58
|
+
if (!filePath)
|
|
59
|
+
return false;
|
|
60
|
+
// Resolve absolute path and compute relative path from repository root
|
|
61
|
+
const absoluteTarget = path.isAbsolute(filePath)
|
|
62
|
+
? path.resolve(filePath)
|
|
63
|
+
: path.resolve(resolvedRoot, filePath);
|
|
64
|
+
const relativeFromRoot = path.relative(resolvedRoot, absoluteTarget);
|
|
65
|
+
// If path resolves outside the repository root, do not include it in repository scan
|
|
66
|
+
if (relativeFromRoot.startsWith("..") ||
|
|
67
|
+
relativeFromRoot === ".." ||
|
|
68
|
+
path.isAbsolute(relativeFromRoot)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const normalized = normalizePath(relativeFromRoot);
|
|
72
|
+
if (!normalized || normalized === ".")
|
|
73
|
+
return false;
|
|
74
|
+
// ig.ignores returns true if path matches ignore rules -> invert for inclusion
|
|
75
|
+
return !ig.ignores(normalized);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=fileFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileFilter.js","sourceRoot":"","sources":["../../src/repository/fileFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,YAAY,GAChB,OAAO,MAAM,KAAK,UAAU;IAC1B,CAAC,CAAE,MAAmC;IACtC,CAAC,CAAE,MAAgD,CAAC,OAAO,CAAC;AAEhE,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,cAAc;IACd,iBAAiB;IACjB,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;IACV,UAAU;IACV,aAAa;IACb,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,WAAW;IACX,OAAO;IACP,UAAU;IACV,QAAQ;IACR,WAAW;IACX,qBAAqB;IACrB,wBAAwB;IACxB,OAAO;IACP,WAAW;CACH,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,aAA6C;IAE7C,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAE1B,iCAAiC;IACjC,EAAE,CAAC,GAAG,CAAC,uBAA8C,CAAC,CAAC;IAEvD,4CAA4C;IAC5C,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,aAAyB,CAAC,CAAC;IACpC,CAAC;IAED,qCAAqC;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC1D,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,uEAAuE;QACvE,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAErE,qFAAqF;QACrF,IACE,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC;YACjC,gBAAgB,KAAK,IAAI;YACzB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACjC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QAEpD,+EAA+E;QAC/E,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovers modified, added, or uncommitted files in a git repository.
|
|
3
|
+
* Uses safe argument arrays without shell interpolation.
|
|
4
|
+
* Returns null if Git is unavailable or target directory is not a git repository.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getChangedFiles(rootDir: string): Promise<string[] | null>;
|
|
7
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/repository/git.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CA6C/E"}
|