@avinashchby/aireview 0.1.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 +157 -0
- package/bin/aireview.js +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +79 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/fixer/index.d.ts +4 -0
- package/dist/fixer/index.d.ts.map +1 -0
- package/dist/fixer/index.js +54 -0
- package/dist/fixer/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/index.d.ts +8 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +47 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +4 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +235 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +4 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +300 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/reporters/ci-reporter.d.ts +4 -0
- package/dist/reporters/ci-reporter.d.ts.map +1 -0
- package/dist/reporters/ci-reporter.js +49 -0
- package/dist/reporters/ci-reporter.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +15 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json-reporter.d.ts +4 -0
- package/dist/reporters/json-reporter.d.ts.map +1 -0
- package/dist/reporters/json-reporter.js +8 -0
- package/dist/reporters/json-reporter.js.map +1 -0
- package/dist/reporters/text-reporter.d.ts +4 -0
- package/dist/reporters/text-reporter.d.ts.map +1 -0
- package/dist/reporters/text-reporter.js +110 -0
- package/dist/reporters/text-reporter.js.map +1 -0
- package/dist/rules/confidence-patterns.d.ts +4 -0
- package/dist/rules/confidence-patterns.d.ts.map +1 -0
- package/dist/rules/confidence-patterns.js +186 -0
- package/dist/rules/confidence-patterns.js.map +1 -0
- package/dist/rules/engine.d.ts +19 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +58 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/error-handling.d.ts +4 -0
- package/dist/rules/error-handling.d.ts.map +1 -0
- package/dist/rules/error-handling.js +162 -0
- package/dist/rules/error-handling.js.map +1 -0
- package/dist/rules/hallucinated-apis.d.ts +4 -0
- package/dist/rules/hallucinated-apis.d.ts.map +1 -0
- package/dist/rules/hallucinated-apis.js +196 -0
- package/dist/rules/hallucinated-apis.js.map +1 -0
- package/dist/rules/index.d.ts +4 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +27 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/phantom-imports.d.ts +4 -0
- package/dist/rules/phantom-imports.d.ts.map +1 -0
- package/dist/rules/phantom-imports.js +300 -0
- package/dist/rules/phantom-imports.js.map +1 -0
- package/dist/rules/placeholder-code.d.ts +4 -0
- package/dist/rules/placeholder-code.d.ts.map +1 -0
- package/dist/rules/placeholder-code.js +113 -0
- package/dist/rules/placeholder-code.js.map +1 -0
- package/dist/rules/security-antipatterns.d.ts +4 -0
- package/dist/rules/security-antipatterns.d.ts.map +1 -0
- package/dist/rules/security-antipatterns.js +174 -0
- package/dist/rules/security-antipatterns.js.map +1 -0
- package/dist/rules/type-safety.d.ts +4 -0
- package/dist/rules/type-safety.d.ts.map +1 -0
- package/dist/rules/type-safety.js +148 -0
- package/dist/rules/type-safety.js.map +1 -0
- package/dist/scanner/discovery.d.ts +3 -0
- package/dist/scanner/discovery.d.ts.map +1 -0
- package/dist/scanner/discovery.js +76 -0
- package/dist/scanner/discovery.js.map +1 -0
- package/dist/scanner/git-diff.d.ts +8 -0
- package/dist/scanner/git-diff.d.ts.map +1 -0
- package/dist/scanner/git-diff.js +58 -0
- package/dist/scanner/git-diff.js.map +1 -0
- package/dist/scanner/index.d.ts +4 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +110 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePython = parsePython;
|
|
4
|
+
/** Parse a Python source file using regex-based extraction. */
|
|
5
|
+
function parsePython(source, filePath) {
|
|
6
|
+
const lines = source.split('\n');
|
|
7
|
+
return {
|
|
8
|
+
language: 'python',
|
|
9
|
+
imports: extractImports(lines),
|
|
10
|
+
functionCalls: extractFunctionCalls(lines),
|
|
11
|
+
functionDecls: extractFunctionDecls(lines),
|
|
12
|
+
comments: extractComments(lines),
|
|
13
|
+
typeAnnotations: [],
|
|
14
|
+
catchBlocks: extractExceptBlocks(lines),
|
|
15
|
+
stringLiterals: extractStringLiterals(lines),
|
|
16
|
+
lines,
|
|
17
|
+
lineCount: lines.length,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Extract import and from...import statements. */
|
|
21
|
+
function extractImports(lines) {
|
|
22
|
+
const results = [];
|
|
23
|
+
const importRe = /^import\s+(\S+)/;
|
|
24
|
+
const fromRe = /^from\s+(\S+)\s+import\s+(.+)/;
|
|
25
|
+
for (let i = 0; i < lines.length; i++) {
|
|
26
|
+
const trimmed = lines[i].trimStart();
|
|
27
|
+
const fromMatch = trimmed.match(fromRe);
|
|
28
|
+
if (fromMatch) {
|
|
29
|
+
const source = fromMatch[1];
|
|
30
|
+
const specs = fromMatch[2].split(',').map((s) => s.trim()).filter(Boolean);
|
|
31
|
+
results.push({
|
|
32
|
+
source,
|
|
33
|
+
line: i + 1,
|
|
34
|
+
column: lines[i].indexOf(trimmed) + 1,
|
|
35
|
+
isRelative: source.startsWith('.'),
|
|
36
|
+
specifiers: specs,
|
|
37
|
+
});
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const impMatch = trimmed.match(importRe);
|
|
41
|
+
if (impMatch) {
|
|
42
|
+
results.push({
|
|
43
|
+
source: impMatch[1],
|
|
44
|
+
line: i + 1,
|
|
45
|
+
column: lines[i].indexOf(trimmed) + 1,
|
|
46
|
+
isRelative: impMatch[1].startsWith('.'),
|
|
47
|
+
specifiers: [impMatch[1]],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return results;
|
|
52
|
+
}
|
|
53
|
+
/** Extract function call patterns like `obj.method(...)` or `func(...)`. */
|
|
54
|
+
function extractFunctionCalls(lines) {
|
|
55
|
+
const results = [];
|
|
56
|
+
const callRe = /(?:(\w+)\.)?(\w+)\s*\(/g;
|
|
57
|
+
for (let i = 0; i < lines.length; i++) {
|
|
58
|
+
const line = lines[i];
|
|
59
|
+
if (line.trimStart().startsWith('#'))
|
|
60
|
+
continue;
|
|
61
|
+
if (line.trimStart().startsWith('def '))
|
|
62
|
+
continue;
|
|
63
|
+
if (line.trimStart().startsWith('class '))
|
|
64
|
+
continue;
|
|
65
|
+
let match;
|
|
66
|
+
callRe.lastIndex = 0;
|
|
67
|
+
while ((match = callRe.exec(line)) !== null) {
|
|
68
|
+
results.push({
|
|
69
|
+
object: match[1] || undefined,
|
|
70
|
+
method: match[2],
|
|
71
|
+
line: i + 1,
|
|
72
|
+
column: match.index + 1,
|
|
73
|
+
args: 0, // Cannot reliably count args with regex
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
/** Extract def declarations with empty body detection. */
|
|
80
|
+
function extractFunctionDecls(lines) {
|
|
81
|
+
const results = [];
|
|
82
|
+
const defRe = /^(\s*)def\s+(\w+)\s*\(([^)]*)\)/;
|
|
83
|
+
for (let i = 0; i < lines.length; i++) {
|
|
84
|
+
const match = lines[i].match(defRe);
|
|
85
|
+
if (!match)
|
|
86
|
+
continue;
|
|
87
|
+
const indent = match[1].length;
|
|
88
|
+
const name = match[2];
|
|
89
|
+
const paramsStr = match[3].trim();
|
|
90
|
+
const params = paramsStr ? paramsStr.split(',').map((p) => p.trim().split(':')[0].trim()) : [];
|
|
91
|
+
const endLine = findBlockEnd(lines, i, indent);
|
|
92
|
+
const bodyLines = lines.slice(i + 1, endLine + 1);
|
|
93
|
+
const nonEmptyBody = bodyLines.filter((l) => l.trim() && !l.trimStart().startsWith('#'));
|
|
94
|
+
const isEmpty = isEmptyPythonBody(nonEmptyBody);
|
|
95
|
+
const returnsNullish = checkPythonReturnsNone(nonEmptyBody);
|
|
96
|
+
const hasReturnType = /\)\s*->/.test(lines[i]);
|
|
97
|
+
results.push({
|
|
98
|
+
name,
|
|
99
|
+
line: i + 1,
|
|
100
|
+
endLine: endLine + 1,
|
|
101
|
+
params,
|
|
102
|
+
hasReturnType,
|
|
103
|
+
bodyLineCount: bodyLines.length,
|
|
104
|
+
isEmpty,
|
|
105
|
+
returnsNullish,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return results;
|
|
109
|
+
}
|
|
110
|
+
/** Find the last line of an indented block. */
|
|
111
|
+
function findBlockEnd(lines, startLine, defIndent) {
|
|
112
|
+
let end = startLine;
|
|
113
|
+
for (let i = startLine + 1; i < lines.length; i++) {
|
|
114
|
+
const line = lines[i];
|
|
115
|
+
if (!line.trim()) {
|
|
116
|
+
end = i;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const lineIndent = line.length - line.trimStart().length;
|
|
120
|
+
if (lineIndent <= defIndent)
|
|
121
|
+
break;
|
|
122
|
+
end = i;
|
|
123
|
+
}
|
|
124
|
+
return end;
|
|
125
|
+
}
|
|
126
|
+
/** Check if a Python function body is empty (pass or ...). */
|
|
127
|
+
function isEmptyPythonBody(bodyLines) {
|
|
128
|
+
if (bodyLines.length === 0)
|
|
129
|
+
return true;
|
|
130
|
+
if (bodyLines.length === 1) {
|
|
131
|
+
const t = bodyLines[0].trim();
|
|
132
|
+
return t === 'pass' || t === '...';
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
/** Check if a Python function only returns None. */
|
|
137
|
+
function checkPythonReturnsNone(bodyLines) {
|
|
138
|
+
if (bodyLines.length !== 1)
|
|
139
|
+
return false;
|
|
140
|
+
const t = bodyLines[0].trim();
|
|
141
|
+
return t === 'return' || t === 'return None';
|
|
142
|
+
}
|
|
143
|
+
/** Extract # comments. */
|
|
144
|
+
function extractComments(lines) {
|
|
145
|
+
const results = [];
|
|
146
|
+
for (let i = 0; i < lines.length; i++) {
|
|
147
|
+
const idx = findCommentStart(lines[i]);
|
|
148
|
+
if (idx >= 0) {
|
|
149
|
+
results.push({
|
|
150
|
+
text: lines[i].slice(idx),
|
|
151
|
+
line: i + 1,
|
|
152
|
+
column: idx + 1,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return results;
|
|
157
|
+
}
|
|
158
|
+
/** Find the start index of a # comment outside strings. */
|
|
159
|
+
function findCommentStart(line) {
|
|
160
|
+
let inString = null;
|
|
161
|
+
for (let i = 0; i < line.length; i++) {
|
|
162
|
+
const ch = line[i];
|
|
163
|
+
if (inString) {
|
|
164
|
+
if (ch === inString && line[i - 1] !== '\\')
|
|
165
|
+
inString = null;
|
|
166
|
+
}
|
|
167
|
+
else if (ch === '"' || ch === "'") {
|
|
168
|
+
inString = ch;
|
|
169
|
+
}
|
|
170
|
+
else if (ch === '#') {
|
|
171
|
+
return i;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return -1;
|
|
175
|
+
}
|
|
176
|
+
/** Extract try/except blocks. */
|
|
177
|
+
function extractExceptBlocks(lines) {
|
|
178
|
+
const results = [];
|
|
179
|
+
const exceptRe = /^(\s*)except\s*(.*?):\s*$/;
|
|
180
|
+
for (let i = 0; i < lines.length; i++) {
|
|
181
|
+
const match = lines[i].match(exceptRe);
|
|
182
|
+
if (!match)
|
|
183
|
+
continue;
|
|
184
|
+
const indent = match[1].length;
|
|
185
|
+
const paramStr = match[2].trim();
|
|
186
|
+
const paramName = extractExceptParam(paramStr);
|
|
187
|
+
const endLine = findBlockEnd(lines, i, indent);
|
|
188
|
+
const bodyLines = lines.slice(i + 1, endLine + 1).filter((l) => l.trim());
|
|
189
|
+
const isEmpty = bodyLines.length === 0 || bodyLines.every((l) => l.trim() === 'pass');
|
|
190
|
+
const onlyLogs = !isEmpty && bodyLines.every((l) => /print\s*\(/.test(l));
|
|
191
|
+
results.push({
|
|
192
|
+
line: i + 1,
|
|
193
|
+
endLine: endLine + 1,
|
|
194
|
+
paramName: paramName || undefined,
|
|
195
|
+
bodyLineCount: bodyLines.length,
|
|
196
|
+
isEmpty,
|
|
197
|
+
onlyLogs,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return results;
|
|
201
|
+
}
|
|
202
|
+
/** Extract parameter name from except clause. */
|
|
203
|
+
function extractExceptParam(paramStr) {
|
|
204
|
+
if (!paramStr)
|
|
205
|
+
return null;
|
|
206
|
+
const asMatch = paramStr.match(/\bas\s+(\w+)/);
|
|
207
|
+
if (asMatch)
|
|
208
|
+
return asMatch[1];
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
/** Extract string literals from Python source. */
|
|
212
|
+
function extractStringLiterals(lines) {
|
|
213
|
+
const results = [];
|
|
214
|
+
const strRe = /("""|'''|"|'|`)((?:\\.|(?!\1).)*?)\1/g;
|
|
215
|
+
for (let i = 0; i < lines.length; i++) {
|
|
216
|
+
let match;
|
|
217
|
+
strRe.lastIndex = 0;
|
|
218
|
+
while ((match = strRe.exec(lines[i])) !== null) {
|
|
219
|
+
const quote = match[1];
|
|
220
|
+
let quoteStyle = 'double';
|
|
221
|
+
if (quote.startsWith("'"))
|
|
222
|
+
quoteStyle = 'single';
|
|
223
|
+
else if (quote.startsWith('`'))
|
|
224
|
+
quoteStyle = 'backtick';
|
|
225
|
+
results.push({
|
|
226
|
+
value: match[2],
|
|
227
|
+
line: i + 1,
|
|
228
|
+
column: match.index + 1,
|
|
229
|
+
quoteStyle,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=python-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-parser.js","sourceRoot":"","sources":["../../src/parsers/python-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/typescript-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EASV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAuC9E"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseTypeScript = parseTypeScript;
|
|
7
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
8
|
+
/** Parse a TypeScript/JavaScript source file into a structured ParserResult. */
|
|
9
|
+
function parseTypeScript(source, filePath) {
|
|
10
|
+
const isTS = /\.tsx?$/.test(filePath);
|
|
11
|
+
const language = isTS ? 'typescript' : 'javascript';
|
|
12
|
+
const scriptKind = /\.tsx$/.test(filePath)
|
|
13
|
+
? typescript_1.default.ScriptKind.TSX
|
|
14
|
+
: /\.jsx$/.test(filePath)
|
|
15
|
+
? typescript_1.default.ScriptKind.JSX
|
|
16
|
+
: isTS
|
|
17
|
+
? typescript_1.default.ScriptKind.TS
|
|
18
|
+
: typescript_1.default.ScriptKind.JS;
|
|
19
|
+
const sourceFile = typescript_1.default.createSourceFile(filePath, source, typescript_1.default.ScriptTarget.Latest, true, scriptKind);
|
|
20
|
+
const lines = source.split('\n');
|
|
21
|
+
const imports = [];
|
|
22
|
+
const functionCalls = [];
|
|
23
|
+
const functionDecls = [];
|
|
24
|
+
const comments = [];
|
|
25
|
+
const typeAnnotations = [];
|
|
26
|
+
const catchBlocks = [];
|
|
27
|
+
const stringLiterals = [];
|
|
28
|
+
extractComments(sourceFile, source, comments);
|
|
29
|
+
visitNode(sourceFile, sourceFile, {
|
|
30
|
+
imports, functionCalls, functionDecls,
|
|
31
|
+
typeAnnotations, catchBlocks, stringLiterals,
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
language, imports, functionCalls, functionDecls,
|
|
35
|
+
comments, typeAnnotations, catchBlocks, stringLiterals,
|
|
36
|
+
lines, lineCount: lines.length,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Recursively visit AST nodes and collect data. */
|
|
40
|
+
function visitNode(node, sourceFile, collectors) {
|
|
41
|
+
collectFromNode(node, sourceFile, collectors);
|
|
42
|
+
typescript_1.default.forEachChild(node, (child) => visitNode(child, sourceFile, collectors));
|
|
43
|
+
}
|
|
44
|
+
/** Collect relevant data from a single AST node. */
|
|
45
|
+
function collectFromNode(node, sf, c) {
|
|
46
|
+
if (typescript_1.default.isImportDeclaration(node)) {
|
|
47
|
+
collectImport(node, sf, c.imports);
|
|
48
|
+
}
|
|
49
|
+
else if (typescript_1.default.isCallExpression(node)) {
|
|
50
|
+
collectFunctionCall(node, sf, c.functionCalls);
|
|
51
|
+
}
|
|
52
|
+
else if (typescript_1.default.isNewExpression(node)) {
|
|
53
|
+
collectNewExpression(node, sf, c.functionCalls);
|
|
54
|
+
}
|
|
55
|
+
else if (isFunctionLike(node)) {
|
|
56
|
+
collectFunctionDecl(node, sf, c.functionDecls);
|
|
57
|
+
}
|
|
58
|
+
else if (typescript_1.default.isTypeReferenceNode(node)) {
|
|
59
|
+
collectTypeAnnotation(node, sf, c.typeAnnotations);
|
|
60
|
+
}
|
|
61
|
+
else if (typescript_1.default.isCatchClause(node)) {
|
|
62
|
+
collectCatchBlock(node, sf, c.catchBlocks);
|
|
63
|
+
}
|
|
64
|
+
else if (typescript_1.default.isStringLiteral(node) || typescript_1.default.isNoSubstitutionTemplateLiteral(node)) {
|
|
65
|
+
collectStringLiteral(node, sf, c.stringLiterals);
|
|
66
|
+
}
|
|
67
|
+
else if (typescript_1.default.isTypeNode(node) && node.kind === typescript_1.default.SyntaxKind.AnyKeyword) {
|
|
68
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
69
|
+
c.typeAnnotations.push({ text: 'any', line: line + 1, column: character + 1, isAny: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Collect an import declaration. */
|
|
73
|
+
function collectImport(node, sf, imports) {
|
|
74
|
+
const moduleSpec = node.moduleSpecifier;
|
|
75
|
+
if (!typescript_1.default.isStringLiteral(moduleSpec))
|
|
76
|
+
return;
|
|
77
|
+
const source = moduleSpec.text;
|
|
78
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
79
|
+
const specifiers = [];
|
|
80
|
+
if (node.importClause) {
|
|
81
|
+
if (node.importClause.name) {
|
|
82
|
+
specifiers.push(node.importClause.name.text);
|
|
83
|
+
}
|
|
84
|
+
const bindings = node.importClause.namedBindings;
|
|
85
|
+
if (bindings) {
|
|
86
|
+
if (typescript_1.default.isNamedImports(bindings)) {
|
|
87
|
+
for (const el of bindings.elements) {
|
|
88
|
+
specifiers.push(el.name.text);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (typescript_1.default.isNamespaceImport(bindings)) {
|
|
92
|
+
specifiers.push(`* as ${bindings.name.text}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
imports.push({
|
|
97
|
+
source,
|
|
98
|
+
line: line + 1,
|
|
99
|
+
column: character + 1,
|
|
100
|
+
isRelative: source.startsWith('.'),
|
|
101
|
+
specifiers,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** Collect a function call expression. */
|
|
105
|
+
function collectFunctionCall(node, sf, calls) {
|
|
106
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
107
|
+
const args = node.arguments.length;
|
|
108
|
+
if (typescript_1.default.isPropertyAccessExpression(node.expression)) {
|
|
109
|
+
calls.push({
|
|
110
|
+
object: node.expression.expression.getText(sf),
|
|
111
|
+
method: node.expression.name.text,
|
|
112
|
+
line: line + 1,
|
|
113
|
+
column: character + 1,
|
|
114
|
+
args,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
else if (typescript_1.default.isIdentifier(node.expression)) {
|
|
118
|
+
calls.push({
|
|
119
|
+
method: node.expression.text,
|
|
120
|
+
line: line + 1,
|
|
121
|
+
column: character + 1,
|
|
122
|
+
args,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Collect a new expression (e.g., new Function(), new Buffer()). */
|
|
127
|
+
function collectNewExpression(node, sf, calls) {
|
|
128
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
129
|
+
const args = node.arguments?.length ?? 0;
|
|
130
|
+
if (typescript_1.default.isIdentifier(node.expression)) {
|
|
131
|
+
calls.push({
|
|
132
|
+
method: node.expression.text,
|
|
133
|
+
line: line + 1,
|
|
134
|
+
column: character + 1,
|
|
135
|
+
args,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Check if a node is a function-like declaration. */
|
|
140
|
+
function isFunctionLike(node) {
|
|
141
|
+
return (typescript_1.default.isFunctionDeclaration(node) ||
|
|
142
|
+
typescript_1.default.isArrowFunction(node) ||
|
|
143
|
+
typescript_1.default.isMethodDeclaration(node) ||
|
|
144
|
+
typescript_1.default.isFunctionExpression(node));
|
|
145
|
+
}
|
|
146
|
+
/** Collect a function declaration. */
|
|
147
|
+
function collectFunctionDecl(node, sf, decls) {
|
|
148
|
+
const fn = node;
|
|
149
|
+
const name = extractFunctionName(fn, sf);
|
|
150
|
+
const { line: startLine } = sf.getLineAndCharacterOfPosition(fn.getStart(sf));
|
|
151
|
+
const { line: endLine } = sf.getLineAndCharacterOfPosition(fn.getEnd());
|
|
152
|
+
const params = fn.parameters.map((p) => p.name.getText(sf));
|
|
153
|
+
const hasReturnType = fn.type !== undefined;
|
|
154
|
+
const body = getBody(fn);
|
|
155
|
+
const bodyLineCount = body ? computeBodyLines(body, sf) : 0;
|
|
156
|
+
const isEmpty = body ? isBodyEmpty(body) : true;
|
|
157
|
+
const returnsNullish = body ? bodyReturnsNullish(body) : false;
|
|
158
|
+
decls.push({
|
|
159
|
+
name,
|
|
160
|
+
line: startLine + 1,
|
|
161
|
+
endLine: endLine + 1,
|
|
162
|
+
params,
|
|
163
|
+
hasReturnType,
|
|
164
|
+
bodyLineCount,
|
|
165
|
+
isEmpty,
|
|
166
|
+
returnsNullish,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/** Extract a human-readable name for a function node. */
|
|
170
|
+
function extractFunctionName(fn, sf) {
|
|
171
|
+
if (typescript_1.default.isFunctionDeclaration(fn) || typescript_1.default.isFunctionExpression(fn)) {
|
|
172
|
+
return fn.name?.text ?? '<anonymous>';
|
|
173
|
+
}
|
|
174
|
+
if (typescript_1.default.isMethodDeclaration(fn)) {
|
|
175
|
+
return fn.name.getText(sf);
|
|
176
|
+
}
|
|
177
|
+
// Arrow function: try to get the variable name
|
|
178
|
+
if (typescript_1.default.isVariableDeclaration(fn.parent) && typescript_1.default.isIdentifier(fn.parent.name)) {
|
|
179
|
+
return fn.parent.name.text;
|
|
180
|
+
}
|
|
181
|
+
return '<anonymous>';
|
|
182
|
+
}
|
|
183
|
+
/** Get the body of a function-like node. */
|
|
184
|
+
function getBody(fn) {
|
|
185
|
+
return fn.body;
|
|
186
|
+
}
|
|
187
|
+
/** Count the lines in a function body. */
|
|
188
|
+
function computeBodyLines(body, sf) {
|
|
189
|
+
const { line: start } = sf.getLineAndCharacterOfPosition(body.getStart(sf));
|
|
190
|
+
const { line: end } = sf.getLineAndCharacterOfPosition(body.getEnd());
|
|
191
|
+
return end - start + 1;
|
|
192
|
+
}
|
|
193
|
+
/** Check if a function body is empty (no statements or only empty statements). */
|
|
194
|
+
function isBodyEmpty(body) {
|
|
195
|
+
if (typescript_1.default.isBlock(body)) {
|
|
196
|
+
return body.statements.length === 0;
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
/** Check if a function body only returns null or undefined. */
|
|
201
|
+
function bodyReturnsNullish(body) {
|
|
202
|
+
if (!typescript_1.default.isBlock(body))
|
|
203
|
+
return false;
|
|
204
|
+
if (body.statements.length !== 1)
|
|
205
|
+
return false;
|
|
206
|
+
const stmt = body.statements[0];
|
|
207
|
+
if (!typescript_1.default.isReturnStatement(stmt))
|
|
208
|
+
return false;
|
|
209
|
+
if (!stmt.expression)
|
|
210
|
+
return true;
|
|
211
|
+
return (stmt.expression.kind === typescript_1.default.SyntaxKind.NullKeyword ||
|
|
212
|
+
stmt.expression.kind === typescript_1.default.SyntaxKind.UndefinedKeyword ||
|
|
213
|
+
(typescript_1.default.isIdentifier(stmt.expression) && stmt.expression.text === 'undefined'));
|
|
214
|
+
}
|
|
215
|
+
/** Collect a type annotation reference. */
|
|
216
|
+
function collectTypeAnnotation(node, sf, annotations) {
|
|
217
|
+
const text = node.getText(sf);
|
|
218
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
219
|
+
annotations.push({
|
|
220
|
+
text,
|
|
221
|
+
line: line + 1,
|
|
222
|
+
column: character + 1,
|
|
223
|
+
isAny: false,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/** Collect a catch clause. */
|
|
227
|
+
function collectCatchBlock(node, sf, blocks) {
|
|
228
|
+
const { line: startLine } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
229
|
+
const { line: endLine } = sf.getLineAndCharacterOfPosition(node.getEnd());
|
|
230
|
+
const paramName = node.variableDeclaration?.name.getText(sf);
|
|
231
|
+
const stmts = node.block.statements;
|
|
232
|
+
const bodyLineCount = stmts.length;
|
|
233
|
+
const isEmpty = stmts.length === 0;
|
|
234
|
+
const onlyLogs = !isEmpty && stmts.every((s) => isConsoleLog(s));
|
|
235
|
+
blocks.push({
|
|
236
|
+
line: startLine + 1,
|
|
237
|
+
endLine: endLine + 1,
|
|
238
|
+
paramName,
|
|
239
|
+
bodyLineCount,
|
|
240
|
+
isEmpty,
|
|
241
|
+
onlyLogs,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/** Check if a statement is a console.log/warn/error call. */
|
|
245
|
+
function isConsoleLog(stmt) {
|
|
246
|
+
if (!typescript_1.default.isExpressionStatement(stmt))
|
|
247
|
+
return false;
|
|
248
|
+
const expr = stmt.expression;
|
|
249
|
+
if (!typescript_1.default.isCallExpression(expr))
|
|
250
|
+
return false;
|
|
251
|
+
const callee = expr.expression;
|
|
252
|
+
if (!typescript_1.default.isPropertyAccessExpression(callee))
|
|
253
|
+
return false;
|
|
254
|
+
return typescript_1.default.isIdentifier(callee.expression) && callee.expression.text === 'console';
|
|
255
|
+
}
|
|
256
|
+
/** Collect a string literal. */
|
|
257
|
+
function collectStringLiteral(node, sf, literals) {
|
|
258
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(node.getStart(sf));
|
|
259
|
+
const raw = node.getText(sf);
|
|
260
|
+
let quoteStyle = 'double';
|
|
261
|
+
if (raw.startsWith("'"))
|
|
262
|
+
quoteStyle = 'single';
|
|
263
|
+
else if (raw.startsWith('`'))
|
|
264
|
+
quoteStyle = 'backtick';
|
|
265
|
+
literals.push({
|
|
266
|
+
value: node.text,
|
|
267
|
+
line: line + 1,
|
|
268
|
+
column: character + 1,
|
|
269
|
+
quoteStyle,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
/** Extract comments from the source text using the TS scanner. */
|
|
273
|
+
function extractComments(sf, source, comments) {
|
|
274
|
+
const seen = new Set();
|
|
275
|
+
visitForComments(sf, sf, source, comments, seen);
|
|
276
|
+
}
|
|
277
|
+
/** Recursively visit nodes to find leading/trailing comments. */
|
|
278
|
+
function visitForComments(node, sf, source, comments, seen) {
|
|
279
|
+
addCommentsFromNode(node, sf, source, comments, seen);
|
|
280
|
+
typescript_1.default.forEachChild(node, (child) => visitForComments(child, sf, source, comments, seen));
|
|
281
|
+
}
|
|
282
|
+
/** Extract leading and trailing comments from a single node. */
|
|
283
|
+
function addCommentsFromNode(node, sf, source, comments, seen) {
|
|
284
|
+
const leading = typescript_1.default.getLeadingCommentRanges(source, node.getFullStart());
|
|
285
|
+
const trailing = typescript_1.default.getTrailingCommentRanges(source, node.getEnd());
|
|
286
|
+
for (const ranges of [leading, trailing]) {
|
|
287
|
+
if (!ranges)
|
|
288
|
+
continue;
|
|
289
|
+
for (const range of ranges) {
|
|
290
|
+
const key = `${range.pos}:${range.end}`;
|
|
291
|
+
if (seen.has(key))
|
|
292
|
+
continue;
|
|
293
|
+
seen.add(key);
|
|
294
|
+
const text = source.slice(range.pos, range.end);
|
|
295
|
+
const { line, character } = sf.getLineAndCharacterOfPosition(range.pos);
|
|
296
|
+
comments.push({ text, line: line + 1, column: character + 1 });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=typescript-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-parser.js","sourceRoot":"","sources":["../../src/parsers/typescript-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/ci-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AAEjE,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAOjD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reportCi = reportCi;
|
|
4
|
+
/** Output scan results as GitHub Actions annotations. */
|
|
5
|
+
function reportCi(result) {
|
|
6
|
+
for (const file of result.files) {
|
|
7
|
+
for (const finding of file.findings) {
|
|
8
|
+
printAnnotation(finding);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
printCiSummary(result);
|
|
12
|
+
}
|
|
13
|
+
/** Print a single GitHub Actions annotation. */
|
|
14
|
+
function printAnnotation(f) {
|
|
15
|
+
const level = mapSeverityToLevel(f.severity);
|
|
16
|
+
const parts = [
|
|
17
|
+
`file=${f.filePath}`,
|
|
18
|
+
`line=${f.line}`,
|
|
19
|
+
`col=${f.column}`,
|
|
20
|
+
];
|
|
21
|
+
if (f.endLine !== undefined)
|
|
22
|
+
parts.push(`endLine=${f.endLine}`);
|
|
23
|
+
if (f.endColumn !== undefined)
|
|
24
|
+
parts.push(`endColumn=${f.endColumn}`);
|
|
25
|
+
console.log(`::${level} ${parts.join(',')}::${f.message} [${f.ruleId}]`);
|
|
26
|
+
}
|
|
27
|
+
/** Map severity to GitHub Actions annotation level. */
|
|
28
|
+
function mapSeverityToLevel(severity) {
|
|
29
|
+
switch (severity) {
|
|
30
|
+
case 'error': return 'error';
|
|
31
|
+
case 'warning': return 'warning';
|
|
32
|
+
case 'info': return 'notice';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Print a CI summary. */
|
|
36
|
+
function printCiSummary(result) {
|
|
37
|
+
const parts = [];
|
|
38
|
+
if (result.errorCount > 0)
|
|
39
|
+
parts.push(`${result.errorCount} errors`);
|
|
40
|
+
if (result.warningCount > 0)
|
|
41
|
+
parts.push(`${result.warningCount} warnings`);
|
|
42
|
+
if (result.infoCount > 0)
|
|
43
|
+
parts.push(`${result.infoCount} info`);
|
|
44
|
+
const summary = parts.length > 0
|
|
45
|
+
? `Found ${parts.join(', ')}`
|
|
46
|
+
: 'No issues found';
|
|
47
|
+
console.log(`\naireview: Scanned ${result.scannedFiles} files in ${result.duration}ms. ${summary}.`);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ci-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-reporter.js","sourceRoot":"","sources":["../../src/reporters/ci-reporter.ts"],"names":[],"mappings":";;AAGA,4BAOC;AARD,yDAAyD;AACzD,SAAgB,QAAQ,CAAC,MAAkB;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,gDAAgD;AAChD,SAAS,eAAe,CAAC,CAAU;IACjC,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG;QACZ,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACpB,QAAQ,CAAC,CAAC,IAAI,EAAE;QAChB,OAAO,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC;IACF,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,uDAAuD;AACvD,SAAS,kBAAkB,CAAC,QAAkB;IAC5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,0BAA0B;AAC1B,SAAS,cAAc,CAAC,MAAkB;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,SAAS,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,WAAW,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,OAAO,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC7B,CAAC,CAAC,iBAAiB,CAAC;IAEtB,OAAO,CAAC,GAAG,CACT,uBAAuB,MAAM,CAAC,YAAY,aAAa,MAAM,CAAC,QAAQ,OAAO,OAAO,GAAG,CACxF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ScanResult } from '../types.js';
|
|
2
|
+
/** Reporter function type. */
|
|
3
|
+
export type Reporter = (result: ScanResult) => void;
|
|
4
|
+
/** Get the appropriate reporter based on format and CI mode. */
|
|
5
|
+
export declare function getReporter(format?: 'text' | 'json', ci?: boolean): Reporter;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,8BAA8B;AAC9B,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;AAEpD,gEAAgE;AAChE,wBAAgB,WAAW,CACzB,MAAM,GAAE,MAAM,GAAG,MAAe,EAChC,EAAE,GAAE,OAAe,GAClB,QAAQ,CAIV"}
|