@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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/bin/aireview.js +2 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +79 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +4 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +78 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/fixer/index.d.ts +4 -0
  13. package/dist/fixer/index.d.ts.map +1 -0
  14. package/dist/fixer/index.js +54 -0
  15. package/dist/fixer/index.js.map +1 -0
  16. package/dist/index.d.ts +4 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +7 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/parsers/index.d.ts +8 -0
  21. package/dist/parsers/index.d.ts.map +1 -0
  22. package/dist/parsers/index.js +47 -0
  23. package/dist/parsers/index.js.map +1 -0
  24. package/dist/parsers/python-parser.d.ts +4 -0
  25. package/dist/parsers/python-parser.d.ts.map +1 -0
  26. package/dist/parsers/python-parser.js +235 -0
  27. package/dist/parsers/python-parser.js.map +1 -0
  28. package/dist/parsers/typescript-parser.d.ts +4 -0
  29. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  30. package/dist/parsers/typescript-parser.js +300 -0
  31. package/dist/parsers/typescript-parser.js.map +1 -0
  32. package/dist/reporters/ci-reporter.d.ts +4 -0
  33. package/dist/reporters/ci-reporter.d.ts.map +1 -0
  34. package/dist/reporters/ci-reporter.js +49 -0
  35. package/dist/reporters/ci-reporter.js.map +1 -0
  36. package/dist/reporters/index.d.ts +6 -0
  37. package/dist/reporters/index.d.ts.map +1 -0
  38. package/dist/reporters/index.js +15 -0
  39. package/dist/reporters/index.js.map +1 -0
  40. package/dist/reporters/json-reporter.d.ts +4 -0
  41. package/dist/reporters/json-reporter.d.ts.map +1 -0
  42. package/dist/reporters/json-reporter.js +8 -0
  43. package/dist/reporters/json-reporter.js.map +1 -0
  44. package/dist/reporters/text-reporter.d.ts +4 -0
  45. package/dist/reporters/text-reporter.d.ts.map +1 -0
  46. package/dist/reporters/text-reporter.js +110 -0
  47. package/dist/reporters/text-reporter.js.map +1 -0
  48. package/dist/rules/confidence-patterns.d.ts +4 -0
  49. package/dist/rules/confidence-patterns.d.ts.map +1 -0
  50. package/dist/rules/confidence-patterns.js +186 -0
  51. package/dist/rules/confidence-patterns.js.map +1 -0
  52. package/dist/rules/engine.d.ts +19 -0
  53. package/dist/rules/engine.d.ts.map +1 -0
  54. package/dist/rules/engine.js +58 -0
  55. package/dist/rules/engine.js.map +1 -0
  56. package/dist/rules/error-handling.d.ts +4 -0
  57. package/dist/rules/error-handling.d.ts.map +1 -0
  58. package/dist/rules/error-handling.js +162 -0
  59. package/dist/rules/error-handling.js.map +1 -0
  60. package/dist/rules/hallucinated-apis.d.ts +4 -0
  61. package/dist/rules/hallucinated-apis.d.ts.map +1 -0
  62. package/dist/rules/hallucinated-apis.js +196 -0
  63. package/dist/rules/hallucinated-apis.js.map +1 -0
  64. package/dist/rules/index.d.ts +4 -0
  65. package/dist/rules/index.d.ts.map +1 -0
  66. package/dist/rules/index.js +27 -0
  67. package/dist/rules/index.js.map +1 -0
  68. package/dist/rules/phantom-imports.d.ts +4 -0
  69. package/dist/rules/phantom-imports.d.ts.map +1 -0
  70. package/dist/rules/phantom-imports.js +300 -0
  71. package/dist/rules/phantom-imports.js.map +1 -0
  72. package/dist/rules/placeholder-code.d.ts +4 -0
  73. package/dist/rules/placeholder-code.d.ts.map +1 -0
  74. package/dist/rules/placeholder-code.js +113 -0
  75. package/dist/rules/placeholder-code.js.map +1 -0
  76. package/dist/rules/security-antipatterns.d.ts +4 -0
  77. package/dist/rules/security-antipatterns.d.ts.map +1 -0
  78. package/dist/rules/security-antipatterns.js +174 -0
  79. package/dist/rules/security-antipatterns.js.map +1 -0
  80. package/dist/rules/type-safety.d.ts +4 -0
  81. package/dist/rules/type-safety.d.ts.map +1 -0
  82. package/dist/rules/type-safety.js +148 -0
  83. package/dist/rules/type-safety.js.map +1 -0
  84. package/dist/scanner/discovery.d.ts +3 -0
  85. package/dist/scanner/discovery.d.ts.map +1 -0
  86. package/dist/scanner/discovery.js +76 -0
  87. package/dist/scanner/discovery.js.map +1 -0
  88. package/dist/scanner/git-diff.d.ts +8 -0
  89. package/dist/scanner/git-diff.d.ts.map +1 -0
  90. package/dist/scanner/git-diff.js +58 -0
  91. package/dist/scanner/git-diff.js.map +1 -0
  92. package/dist/scanner/index.d.ts +4 -0
  93. package/dist/scanner/index.d.ts.map +1 -0
  94. package/dist/scanner/index.js +110 -0
  95. package/dist/scanner/index.js.map +1 -0
  96. package/dist/types.d.ts +150 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +3 -0
  99. package/dist/types.js.map +1 -0
  100. 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,4 @@
1
+ import type { ParserResult } from '../types.js';
2
+ /** Parse a TypeScript/JavaScript source file into a structured ParserResult. */
3
+ export declare function parseTypeScript(source: string, filePath: string): ParserResult;
4
+ //# sourceMappingURL=typescript-parser.d.ts.map
@@ -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,4 @@
1
+ import type { ScanResult } from '../types.js';
2
+ /** Output scan results as GitHub Actions annotations. */
3
+ export declare function reportCi(result: ScanResult): void;
4
+ //# sourceMappingURL=ci-reporter.d.ts.map
@@ -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"}