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,166 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { normalizePath } from "../core/paths.js";
|
|
3
|
+
import { computeFingerprint } from "../core/fingerprint.js";
|
|
4
|
+
import { parseSourceSuppressions, isFindingSuppressed } from "../core/suppressions.js";
|
|
5
|
+
import { discoverRepository } from "../repository/detector.js";
|
|
6
|
+
import { loadRepositoryTypeScript } from "../repository/tsLoader.js";
|
|
7
|
+
import { createFileFilter } from "../repository/fileFilter.js";
|
|
8
|
+
import { resolveTsProjects } from "../typescript/projectResolver.js";
|
|
9
|
+
import { createProjectPrograms } from "../typescript/programManager.js";
|
|
10
|
+
import { createRuleContext } from "./context.js";
|
|
11
|
+
import { globalRuleRegistry } from "./registry.js";
|
|
12
|
+
import "../rules/index.js";
|
|
13
|
+
const SEVERITY_ORDER = {
|
|
14
|
+
error: 0,
|
|
15
|
+
warning: 1,
|
|
16
|
+
info: 2,
|
|
17
|
+
};
|
|
18
|
+
const CONFIDENCE_LEVELS = {
|
|
19
|
+
high: 3,
|
|
20
|
+
medium: 2,
|
|
21
|
+
low: 1,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Executes a full SourceVerity audit across the target repository.
|
|
25
|
+
*/
|
|
26
|
+
export async function runAudit(options) {
|
|
27
|
+
const resolvedTarget = path.resolve(options.targetDir);
|
|
28
|
+
const minConfidence = options.minConfidence ?? "medium";
|
|
29
|
+
const minConfidenceLevel = CONFIDENCE_LEVELS[minConfidence];
|
|
30
|
+
// 1. Discover repository structure and frameworks
|
|
31
|
+
const repoContext = await discoverRepository(resolvedTarget);
|
|
32
|
+
const fileFilter = await createFileFilter(resolvedTarget, options.customIgnores);
|
|
33
|
+
// 2. Load repository TypeScript compiler
|
|
34
|
+
const tsInst = loadRepositoryTypeScript(resolvedTarget);
|
|
35
|
+
const skippedSemanticRules = [];
|
|
36
|
+
const rawFindings = [];
|
|
37
|
+
const rulesToRun = options.rules ?? globalRuleRegistry.getAll();
|
|
38
|
+
const analyzedFiles = new Set();
|
|
39
|
+
if (tsInst) {
|
|
40
|
+
// 3. Resolve TypeScript projects and create programs
|
|
41
|
+
const projects = resolveTsProjects(repoContext, tsInst);
|
|
42
|
+
const projectPrograms = createProjectPrograms(projects, tsInst, fileFilter);
|
|
43
|
+
for (const projectProg of projectPrograms) {
|
|
44
|
+
for (const sf of projectProg.sourceFiles) {
|
|
45
|
+
const normalizedRelPath = normalizePath(sf.fileName, resolvedTarget);
|
|
46
|
+
if (options.changedFiles && options.changedFiles.length > 0) {
|
|
47
|
+
if (!options.changedFiles.includes(normalizedRelPath)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
analyzedFiles.add(sf.fileName);
|
|
52
|
+
const suppressions = parseSourceSuppressions(sf.text);
|
|
53
|
+
for (const rule of rulesToRun) {
|
|
54
|
+
const context = createRuleContext({
|
|
55
|
+
ts: tsInst.ts,
|
|
56
|
+
program: projectProg.program,
|
|
57
|
+
checker: projectProg.checker,
|
|
58
|
+
sourceFile: sf,
|
|
59
|
+
repoContext,
|
|
60
|
+
projectRoot: projectProg.projectRoot,
|
|
61
|
+
reportFinding(input) {
|
|
62
|
+
const fingerprint = input.fingerprint ??
|
|
63
|
+
computeFingerprint({
|
|
64
|
+
ruleId: input.ruleId,
|
|
65
|
+
filePath: input.file,
|
|
66
|
+
symbolName: input.message,
|
|
67
|
+
snippet: sf.text.slice(sf.getPositionOfLineAndCharacter(input.range.start.line - 1, input.range.start.column - 1), sf.getPositionOfLineAndCharacter(input.range.end.line - 1, input.range.end.column - 1)),
|
|
68
|
+
});
|
|
69
|
+
const completeFinding = {
|
|
70
|
+
...input,
|
|
71
|
+
fingerprint,
|
|
72
|
+
file: normalizePath(input.file, resolvedTarget),
|
|
73
|
+
};
|
|
74
|
+
// Filter out suppressed findings
|
|
75
|
+
if (!isFindingSuppressed(completeFinding, suppressions)) {
|
|
76
|
+
// Filter out findings below confidence threshold
|
|
77
|
+
if (CONFIDENCE_LEVELS[completeFinding.confidence] >= minConfidenceLevel) {
|
|
78
|
+
rawFindings.push(completeFinding);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
void rule.analyze(context);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Record semantic rules as skipped if TypeScript is unavailable
|
|
90
|
+
for (const rule of rulesToRun) {
|
|
91
|
+
if (rule.meta.requiresTypeInformation) {
|
|
92
|
+
skippedSemanticRules.push(rule.meta.id);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 4. Sort findings strictly and deterministically
|
|
97
|
+
const sortedFindings = [...rawFindings].sort((a, b) => {
|
|
98
|
+
// 1. File path ASC
|
|
99
|
+
const fileCmp = a.file.localeCompare(b.file);
|
|
100
|
+
if (fileCmp !== 0)
|
|
101
|
+
return fileCmp;
|
|
102
|
+
// 2. Line ASC
|
|
103
|
+
const lineCmp = a.range.start.line - b.range.start.line;
|
|
104
|
+
if (lineCmp !== 0)
|
|
105
|
+
return lineCmp;
|
|
106
|
+
// 3. Column ASC
|
|
107
|
+
const colCmp = a.range.start.column - b.range.start.column;
|
|
108
|
+
if (colCmp !== 0)
|
|
109
|
+
return colCmp;
|
|
110
|
+
// 4. Severity (error < warning < info)
|
|
111
|
+
const sevCmp = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];
|
|
112
|
+
if (sevCmp !== 0)
|
|
113
|
+
return sevCmp;
|
|
114
|
+
// 5. Rule ID ASC
|
|
115
|
+
const ruleCmp = a.ruleId.localeCompare(b.ruleId);
|
|
116
|
+
if (ruleCmp !== 0)
|
|
117
|
+
return ruleCmp;
|
|
118
|
+
// 6. Fingerprint ASC
|
|
119
|
+
return a.fingerprint.localeCompare(b.fingerprint);
|
|
120
|
+
});
|
|
121
|
+
// 5. Build summary
|
|
122
|
+
let errors = 0;
|
|
123
|
+
let warnings = 0;
|
|
124
|
+
let info = 0;
|
|
125
|
+
let highConfidence = 0;
|
|
126
|
+
let mediumConfidence = 0;
|
|
127
|
+
let lowConfidence = 0;
|
|
128
|
+
for (const f of sortedFindings) {
|
|
129
|
+
if (f.severity === "error")
|
|
130
|
+
errors++;
|
|
131
|
+
else if (f.severity === "warning")
|
|
132
|
+
warnings++;
|
|
133
|
+
else if (f.severity === "info")
|
|
134
|
+
info++;
|
|
135
|
+
if (f.confidence === "high")
|
|
136
|
+
highConfidence++;
|
|
137
|
+
else if (f.confidence === "medium")
|
|
138
|
+
mediumConfidence++;
|
|
139
|
+
else if (f.confidence === "low")
|
|
140
|
+
lowConfidence++;
|
|
141
|
+
}
|
|
142
|
+
const summary = {
|
|
143
|
+
errors,
|
|
144
|
+
warnings,
|
|
145
|
+
info,
|
|
146
|
+
highConfidence,
|
|
147
|
+
mediumConfidence,
|
|
148
|
+
lowConfidence,
|
|
149
|
+
filesAnalyzed: analyzedFiles.size,
|
|
150
|
+
projectsCount: repoContext.packages.length || 1,
|
|
151
|
+
};
|
|
152
|
+
const repositorySummary = {
|
|
153
|
+
typescriptVersion: tsInst?.version,
|
|
154
|
+
reactVersion: repoContext.reactVersion,
|
|
155
|
+
packageManager: repoContext.packageManager,
|
|
156
|
+
projectCount: repoContext.packages.length || 1,
|
|
157
|
+
workspaceType: repoContext.workspaceType,
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
findings: sortedFindings,
|
|
161
|
+
summary,
|
|
162
|
+
repository: repositorySummary,
|
|
163
|
+
skippedSemanticRules: skippedSemanticRules.length > 0 ? skippedSemanticRules : undefined,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/engine/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type * as tsType from "typescript";
|
|
2
|
+
import type { SourceRange } from "../core/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Calculates 1-indexed source line and column coordinates for an AST node.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getNodeSourceRange(node: tsType.Node, sourceFile: tsType.SourceFile): SourceRange;
|
|
7
|
+
/**
|
|
8
|
+
* Checks whether a TypeScript type represents an active lifecycle controller or animation handle
|
|
9
|
+
* (such as AnimationPlaybackControls from framer-motion/motion)
|
|
10
|
+
* rather than a primary asynchronous Promise.
|
|
11
|
+
*
|
|
12
|
+
* Requirements:
|
|
13
|
+
* - Symbol named AnimationPlaybackControls / AnimationControls / TweenControl, OR
|
|
14
|
+
* - Originates from framer-motion / popmotion / @motionone / motion package declarations, OR
|
|
15
|
+
* - Structural animation controller containing stop, play, and playback properties (pause, time, speed, currentTime, complete).
|
|
16
|
+
*
|
|
17
|
+
* NOTE: Individual methods like `cancel()`, `abort()`, `rollback()`, or `dispose()` on arbitrary
|
|
18
|
+
* Promise-like objects DO NOT grant blanket immunity from unhandled floating promise analysis.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isControlOrHandleType(type: tsType.Type | undefined, checker: tsType.TypeChecker): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Determines whether a TypeScript type is Promise-like (implements .then() or named Promise).
|
|
23
|
+
*/
|
|
24
|
+
export declare function isPromiseLike(type: tsType.Type | undefined, checker: tsType.TypeChecker): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Verifies that an identifier refers to an authentic global DOM/browser API
|
|
27
|
+
* declared in the standard library (e.g. lib.dom.d.ts), not a shadowed local symbol.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isDOMGlobal(node: tsType.Node, checker: tsType.TypeChecker, globalName: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Verifies that a target node is a standard DOM EventTarget, Window, Document, or HTMLElement
|
|
32
|
+
* declared in standard TypeScript DOM definitions, rather than a custom user object/emitter.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isDOMEventTarget(node: tsType.Node, checker: tsType.TypeChecker | undefined, ts: typeof tsType): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Verifies that a node represents an authentic DOM AbortController instance
|
|
37
|
+
* declared in standard TypeScript DOM definitions.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isDOMAbortController(node: tsType.Node, checker: tsType.TypeChecker | undefined, ts: typeof tsType): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Resolves whether a function/call node corresponds to a standard React hook
|
|
42
|
+
* (e.g. useEffect, useState, useMemo), supporting direct imports, namespace imports,
|
|
43
|
+
* and aliased imports originating from React or @types/react.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveReactHook(node: tsType.Node, checker: tsType.TypeChecker, hookName: string): boolean;
|
|
46
|
+
//# sourceMappingURL=symbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/engine/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,WAAW,CAiBhG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CA2CzG;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAiBjG;AA4CD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAuCvG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,OAAO,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,EACvC,EAAE,EAAE,OAAO,MAAM,GAChB,OAAO,CAgCT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,OAAO,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,EACvC,EAAE,EAAE,OAAO,MAAM,GAChB,OAAO,CA0BT;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0C1G"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates 1-indexed source line and column coordinates for an AST node.
|
|
3
|
+
*/
|
|
4
|
+
export function getNodeSourceRange(node, sourceFile) {
|
|
5
|
+
const startPos = node.getStart(sourceFile);
|
|
6
|
+
const endPos = node.getEnd();
|
|
7
|
+
const startLoc = sourceFile.getLineAndCharacterOfPosition(startPos);
|
|
8
|
+
const endLoc = sourceFile.getLineAndCharacterOfPosition(endPos);
|
|
9
|
+
return {
|
|
10
|
+
start: {
|
|
11
|
+
line: startLoc.line + 1,
|
|
12
|
+
column: startLoc.character + 1,
|
|
13
|
+
},
|
|
14
|
+
end: {
|
|
15
|
+
line: endLoc.line + 1,
|
|
16
|
+
column: endLoc.character + 1,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Checks whether a TypeScript type represents an active lifecycle controller or animation handle
|
|
22
|
+
* (such as AnimationPlaybackControls from framer-motion/motion)
|
|
23
|
+
* rather than a primary asynchronous Promise.
|
|
24
|
+
*
|
|
25
|
+
* Requirements:
|
|
26
|
+
* - Symbol named AnimationPlaybackControls / AnimationControls / TweenControl, OR
|
|
27
|
+
* - Originates from framer-motion / popmotion / @motionone / motion package declarations, OR
|
|
28
|
+
* - Structural animation controller containing stop, play, and playback properties (pause, time, speed, currentTime, complete).
|
|
29
|
+
*
|
|
30
|
+
* NOTE: Individual methods like `cancel()`, `abort()`, `rollback()`, or `dispose()` on arbitrary
|
|
31
|
+
* Promise-like objects DO NOT grant blanket immunity from unhandled floating promise analysis.
|
|
32
|
+
*/
|
|
33
|
+
export function isControlOrHandleType(type, checker) {
|
|
34
|
+
if (!type)
|
|
35
|
+
return false;
|
|
36
|
+
const symbol = type.getSymbol() ?? type.aliasSymbol;
|
|
37
|
+
if (symbol) {
|
|
38
|
+
const symName = symbol.name;
|
|
39
|
+
if (symName === "AnimationPlaybackControls" ||
|
|
40
|
+
symName === "AnimationControls" ||
|
|
41
|
+
symName === "TweenControl") {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const decls = symbol.getDeclarations();
|
|
45
|
+
if (decls && decls.length > 0) {
|
|
46
|
+
for (const decl of decls) {
|
|
47
|
+
const fileName = decl.getSourceFile().fileName.replace(/\\/g, "/");
|
|
48
|
+
if (fileName.includes("/node_modules/framer-motion/") ||
|
|
49
|
+
fileName.includes("/node_modules/motion/") ||
|
|
50
|
+
fileName.includes("/node_modules/popmotion/") ||
|
|
51
|
+
fileName.includes("/node_modules/@motionone/")) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Structural animation controller check: must exhibit multi-method playback control API
|
|
58
|
+
const hasStop = Boolean(checker.getPropertyOfType(type, "stop"));
|
|
59
|
+
const hasPlay = Boolean(checker.getPropertyOfType(type, "play"));
|
|
60
|
+
const hasPause = Boolean(checker.getPropertyOfType(type, "pause"));
|
|
61
|
+
const hasTime = Boolean(checker.getPropertyOfType(type, "time") || checker.getPropertyOfType(type, "currentTime"));
|
|
62
|
+
const hasSpeed = Boolean(checker.getPropertyOfType(type, "speed"));
|
|
63
|
+
const hasComplete = Boolean(checker.getPropertyOfType(type, "complete"));
|
|
64
|
+
if (hasStop && (hasPlay || hasPause) && (hasTime || hasSpeed || hasComplete || (hasPlay && hasPause))) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const isPromiseLikeCache = new WeakMap();
|
|
70
|
+
/**
|
|
71
|
+
* Determines whether a TypeScript type is Promise-like (implements .then() or named Promise).
|
|
72
|
+
*/
|
|
73
|
+
export function isPromiseLike(type, checker) {
|
|
74
|
+
if (!type)
|
|
75
|
+
return false;
|
|
76
|
+
let checkerCache = isPromiseLikeCache.get(checker);
|
|
77
|
+
if (!checkerCache) {
|
|
78
|
+
checkerCache = new WeakMap();
|
|
79
|
+
isPromiseLikeCache.set(checker, checkerCache);
|
|
80
|
+
}
|
|
81
|
+
const cached = checkerCache.get(type);
|
|
82
|
+
if (cached !== undefined) {
|
|
83
|
+
return cached;
|
|
84
|
+
}
|
|
85
|
+
const result = computeIsPromiseLike(type, checker);
|
|
86
|
+
checkerCache.set(type, result);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
function computeIsPromiseLike(type, checker) {
|
|
90
|
+
const symbol = type.getSymbol() ?? type.aliasSymbol;
|
|
91
|
+
if (symbol && (symbol.name === "Promise" || symbol.name === "PromiseLike")) {
|
|
92
|
+
if (isControlOrHandleType(type, checker)) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
// If the type has lifecycle control methods (stop, pause, cancel, etc.), it's a control handle, not a bare Promise
|
|
98
|
+
if (isControlOrHandleType(type, checker)) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
// Check for .then property with call signatures returning a thenable/promise
|
|
102
|
+
const thenProp = checker.getPropertyOfType(type, "then");
|
|
103
|
+
if (thenProp) {
|
|
104
|
+
const thenDecl = thenProp.valueDeclaration ?? thenProp.declarations?.[0];
|
|
105
|
+
if (thenDecl) {
|
|
106
|
+
const thenType = checker.getTypeOfSymbolAtLocation(thenProp, thenDecl);
|
|
107
|
+
const signatures = thenType.getCallSignatures();
|
|
108
|
+
if (signatures.length > 0) {
|
|
109
|
+
const retType = signatures[0]?.getReturnType();
|
|
110
|
+
if (retType) {
|
|
111
|
+
// In Promise/A+, then() returns another thenable/Promise or any/unknown, not void/primitive
|
|
112
|
+
const isNonThenableReturn = (retType.flags & (16384 | 8192 | 131072 | 4 | 8 | 16 | 65536)) !== 0;
|
|
113
|
+
if (!isNonThenableReturn) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Handle union types (e.g. Promise<T> | undefined)
|
|
121
|
+
if (type.isUnion()) {
|
|
122
|
+
return type.types.some((t) => isPromiseLike(t, checker));
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Verifies that an identifier refers to an authentic global DOM/browser API
|
|
128
|
+
* declared in the standard library (e.g. lib.dom.d.ts), not a shadowed local symbol.
|
|
129
|
+
*/
|
|
130
|
+
export function isDOMGlobal(node, checker, globalName) {
|
|
131
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
132
|
+
if (!symbol) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
if (symbol.name !== globalName) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const declarations = symbol.getDeclarations();
|
|
139
|
+
if (!declarations || declarations.length === 0) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
// If any declaration is in user source code (not in standard TypeScript lib), it is user-defined/shadowed
|
|
143
|
+
const isUserDefined = declarations.some((decl) => {
|
|
144
|
+
const fileName = decl.getSourceFile().fileName.toLowerCase().replace(/\\/g, "/");
|
|
145
|
+
const isStdLib = fileName.includes("lib.dom.d.ts") ||
|
|
146
|
+
fileName.includes("lib.es") ||
|
|
147
|
+
fileName.includes("lib.webworker.d.ts") ||
|
|
148
|
+
fileName.includes("typescript/lib/");
|
|
149
|
+
return !isStdLib;
|
|
150
|
+
});
|
|
151
|
+
if (isUserDefined) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
return declarations.some((decl) => {
|
|
155
|
+
const fileName = decl.getSourceFile().fileName.toLowerCase().replace(/\\/g, "/");
|
|
156
|
+
return (fileName.includes("lib.dom.d.ts") ||
|
|
157
|
+
fileName.includes("lib.es") ||
|
|
158
|
+
fileName.includes("lib.webworker.d.ts") ||
|
|
159
|
+
fileName.includes("typescript/lib/"));
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Verifies that a target node is a standard DOM EventTarget, Window, Document, or HTMLElement
|
|
164
|
+
* declared in standard TypeScript DOM definitions, rather than a custom user object/emitter.
|
|
165
|
+
*/
|
|
166
|
+
export function isDOMEventTarget(node, checker, ts) {
|
|
167
|
+
if (ts.isIdentifier(node) &&
|
|
168
|
+
(node.text === "window" || node.text === "document" || node.text === "globalThis")) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
if (!checker) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const type = checker.getTypeAtLocation(node);
|
|
176
|
+
const addEventListenerProp = checker.getPropertyOfType(type, "addEventListener");
|
|
177
|
+
if (!addEventListenerProp)
|
|
178
|
+
return false;
|
|
179
|
+
const decls = addEventListenerProp.getDeclarations();
|
|
180
|
+
if (!decls || decls.length === 0)
|
|
181
|
+
return false;
|
|
182
|
+
return decls.some((decl) => {
|
|
183
|
+
const fileName = decl.getSourceFile().fileName.toLowerCase().replace(/\\/g, "/");
|
|
184
|
+
return (fileName.includes("lib.dom.d.ts") ||
|
|
185
|
+
fileName.includes("lib.dom.iterable.d.ts") ||
|
|
186
|
+
fileName.includes("lib.webworker.d.ts") ||
|
|
187
|
+
fileName.includes("typescript/lib/"));
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Verifies that a node represents an authentic DOM AbortController instance
|
|
196
|
+
* declared in standard TypeScript DOM definitions.
|
|
197
|
+
*/
|
|
198
|
+
export function isDOMAbortController(node, checker, ts) {
|
|
199
|
+
if (!checker) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const type = checker.getTypeAtLocation(node);
|
|
204
|
+
const abortProp = checker.getPropertyOfType(type, "abort");
|
|
205
|
+
const signalProp = checker.getPropertyOfType(type, "signal");
|
|
206
|
+
if (!abortProp || !signalProp)
|
|
207
|
+
return false;
|
|
208
|
+
const decls = abortProp.getDeclarations();
|
|
209
|
+
if (!decls || decls.length === 0)
|
|
210
|
+
return false;
|
|
211
|
+
return decls.some((decl) => {
|
|
212
|
+
const fileName = decl.getSourceFile().fileName.toLowerCase().replace(/\\/g, "/");
|
|
213
|
+
return (fileName.includes("lib.dom.d.ts") ||
|
|
214
|
+
fileName.includes("lib.dom.iterable.d.ts") ||
|
|
215
|
+
fileName.includes("lib.webworker.d.ts") ||
|
|
216
|
+
fileName.includes("typescript/lib/"));
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Resolves whether a function/call node corresponds to a standard React hook
|
|
225
|
+
* (e.g. useEffect, useState, useMemo), supporting direct imports, namespace imports,
|
|
226
|
+
* and aliased imports originating from React or @types/react.
|
|
227
|
+
*/
|
|
228
|
+
export function resolveReactHook(node, checker, hookName) {
|
|
229
|
+
let targetIdentifier;
|
|
230
|
+
// Case 1: React.useEffect(...) property access
|
|
231
|
+
if ("expression" in node && node.expression && typeof node.expression === "object") {
|
|
232
|
+
const callExpr = node.expression;
|
|
233
|
+
if ("name" in callExpr && "expression" in callExpr) {
|
|
234
|
+
const propName = callExpr.name;
|
|
235
|
+
if (propName && typeof propName === "object" && "text" in propName && propName.text === hookName) {
|
|
236
|
+
targetIdentifier = propName;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
targetIdentifier = callExpr;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
targetIdentifier = node;
|
|
245
|
+
}
|
|
246
|
+
if (!targetIdentifier) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
const symbol = checker.getSymbolAtLocation(targetIdentifier);
|
|
250
|
+
if (!symbol) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
if (symbol.name === hookName && isReactSymbol(symbol)) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
// Check alias symbol if aliased (import { useEffect as myEffect })
|
|
257
|
+
try {
|
|
258
|
+
const aliased = checker.getAliasedSymbol(symbol);
|
|
259
|
+
if (aliased && aliased.name === hookName && isReactSymbol(aliased)) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Not an aliased symbol
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
function isReactSymbol(symbol) {
|
|
269
|
+
const declarations = symbol.getDeclarations();
|
|
270
|
+
if (!declarations || declarations.length === 0) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
return declarations.some((decl) => {
|
|
274
|
+
const fileName = decl.getSourceFile().fileName.replace(/\\/g, "/");
|
|
275
|
+
return fileName.includes("react/index.d.ts") || fileName.includes("@types/react/") || fileName.includes("react.d.ts");
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=symbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/engine/symbols.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type StrictnessReport, type StrictnessFlagStatus } from "./strictness/evaluator.js";
|
|
2
|
+
export interface ScanOptions {
|
|
3
|
+
readonly targetDir?: string | undefined;
|
|
4
|
+
readonly minConfidence?: "high" | "medium" | "low" | undefined;
|
|
5
|
+
readonly customIgnores?: readonly string[] | undefined;
|
|
6
|
+
readonly changedFiles?: readonly string[] | undefined;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Programmatic entrypoint to scan a repository for correctness and quality defects.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scanRepository(options?: ScanOptions | undefined): Promise<import("./core/types.js").AuditResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Programmatic entrypoint to run strictness gap analysis on a repository's TypeScript configuration.
|
|
14
|
+
*/
|
|
15
|
+
export declare function evaluateStrictness(targetDir?: string): Promise<StrictnessReport>;
|
|
16
|
+
export type { StrictnessReport, StrictnessFlagStatus };
|
|
17
|
+
export type * from "./core/types.js";
|
|
18
|
+
export type * from "./baseline/types.js";
|
|
19
|
+
export { createBaseline, compareWithBaseline, loadBaseline, saveBaseline } from "./baseline/manager.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACpH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACvD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,kDASrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,SAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAU7F;AACD,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;AACvD,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,qBAAqB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { runAudit } from "./engine/runner.js";
|
|
3
|
+
import { discoverRepository } from "./repository/detector.js";
|
|
4
|
+
import { loadRepositoryTypeScript } from "./repository/tsLoader.js";
|
|
5
|
+
import { evaluateStrictnessGap } from "./strictness/evaluator.js";
|
|
6
|
+
/**
|
|
7
|
+
* Programmatic entrypoint to scan a repository for correctness and quality defects.
|
|
8
|
+
*/
|
|
9
|
+
export async function scanRepository(options) {
|
|
10
|
+
const targetDir = options?.targetDir ?? process.cwd();
|
|
11
|
+
const auditOpts = {
|
|
12
|
+
targetDir,
|
|
13
|
+
minConfidence: options?.minConfidence ?? "medium",
|
|
14
|
+
customIgnores: options?.customIgnores,
|
|
15
|
+
changedFiles: options?.changedFiles,
|
|
16
|
+
};
|
|
17
|
+
return runAudit(auditOpts);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Programmatic entrypoint to run strictness gap analysis on a repository's TypeScript configuration.
|
|
21
|
+
*/
|
|
22
|
+
export async function evaluateStrictness(targetDir = process.cwd()) {
|
|
23
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
24
|
+
const repo = await discoverRepository(resolvedTarget);
|
|
25
|
+
const tsInst = loadRepositoryTypeScript(resolvedTarget);
|
|
26
|
+
if (!tsInst) {
|
|
27
|
+
throw new Error(`TypeScript is not installed in target project: '${resolvedTarget}'`);
|
|
28
|
+
}
|
|
29
|
+
return evaluateStrictnessGap(repo, tsInst);
|
|
30
|
+
}
|
|
31
|
+
export { createBaseline, compareWithBaseline, loadBaseline, saveBaseline } from "./baseline/manager.js";
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAwB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAoD,MAAM,2BAA2B,CAAC;AAQpH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAiC;IACpE,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtD,MAAM,SAAS,GAAoB;QACjC,SAAS;QACT,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,QAAQ;QACjD,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,YAAY,EAAE,OAAO,EAAE,YAAY;KACpC,CAAC;IACF,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;IAChE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,cAAc,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAID,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { AuditResult } from "../core/types.js";
|
|
2
|
+
export interface AgentFinding {
|
|
3
|
+
readonly fingerprint: string;
|
|
4
|
+
readonly ruleId: string;
|
|
5
|
+
readonly category: string;
|
|
6
|
+
readonly severity: string;
|
|
7
|
+
readonly confidence: string;
|
|
8
|
+
readonly file: string;
|
|
9
|
+
readonly range: {
|
|
10
|
+
readonly start: {
|
|
11
|
+
readonly line: number;
|
|
12
|
+
readonly column: number;
|
|
13
|
+
};
|
|
14
|
+
readonly end: {
|
|
15
|
+
readonly line: number;
|
|
16
|
+
readonly column: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
readonly message: string;
|
|
20
|
+
readonly evidence: readonly string[];
|
|
21
|
+
readonly suggestedAction: string | null;
|
|
22
|
+
readonly safeAutomaticFix: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface AgentReport {
|
|
25
|
+
readonly schemaVersion: 1;
|
|
26
|
+
readonly tool: {
|
|
27
|
+
readonly name: "sourceverity";
|
|
28
|
+
readonly version: "1.0.0";
|
|
29
|
+
};
|
|
30
|
+
readonly repository: {
|
|
31
|
+
readonly typescript?: string | undefined;
|
|
32
|
+
readonly react?: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
readonly summary: {
|
|
35
|
+
readonly errors: number;
|
|
36
|
+
readonly warnings: number;
|
|
37
|
+
readonly info: number;
|
|
38
|
+
};
|
|
39
|
+
readonly findings: readonly AgentFinding[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Formats AuditResult into structured Agent JSON format for LLMs/Codex.
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderAgentReport(result: AuditResult): string;
|
|
45
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,kBAAkB,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE,QAAQ,CAAC,GAAG,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAClE,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;QAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqC7D"}
|