code-auditor-mcp 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 +362 -0
- package/configs/hhra-compat.json +168 -0
- package/dist/analyzers/analyzerUtils.d.ts +69 -0
- package/dist/analyzers/analyzerUtils.d.ts.map +1 -0
- package/dist/analyzers/analyzerUtils.js +188 -0
- package/dist/analyzers/analyzerUtils.js.map +1 -0
- package/dist/analyzers/dataAccessAnalyzer.d.ts +46 -0
- package/dist/analyzers/dataAccessAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/dataAccessAnalyzer.js +448 -0
- package/dist/analyzers/dataAccessAnalyzer.js.map +1 -0
- package/dist/analyzers/dryAnalyzer.d.ts +30 -0
- package/dist/analyzers/dryAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/dryAnalyzer.js +537 -0
- package/dist/analyzers/dryAnalyzer.js.map +1 -0
- package/dist/analyzers/solidAnalyzer.d.ts +23 -0
- package/dist/analyzers/solidAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/solidAnalyzer.js +355 -0
- package/dist/analyzers/solidAnalyzer.js.map +1 -0
- package/dist/auditRunner.d.ts +20 -0
- package/dist/auditRunner.d.ts.map +1 -0
- package/dist/auditRunner.js +214 -0
- package/dist/auditRunner.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/configLoader.d.ts +19 -0
- package/dist/config/configLoader.d.ts.map +1 -0
- package/dist/config/configLoader.js +124 -0
- package/dist/config/configLoader.js.map +1 -0
- package/dist/config/defaults.d.ts +69 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +142 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-standalone.d.ts +3 -0
- package/dist/mcp-standalone.d.ts.map +1 -0
- package/dist/mcp-standalone.js +171 -0
- package/dist/mcp-standalone.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +340 -0
- package/dist/mcp.js.map +1 -0
- package/dist/reporting/csvReportGenerator.d.ts +29 -0
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -0
- package/dist/reporting/csvReportGenerator.js +182 -0
- package/dist/reporting/csvReportGenerator.js.map +1 -0
- package/dist/reporting/htmlReportGenerator.d.ts +18 -0
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -0
- package/dist/reporting/htmlReportGenerator.js +352 -0
- package/dist/reporting/htmlReportGenerator.js.map +1 -0
- package/dist/reporting/jsonReportGenerator.d.ts +23 -0
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -0
- package/dist/reporting/jsonReportGenerator.js +103 -0
- package/dist/reporting/jsonReportGenerator.js.map +1 -0
- package/dist/reporting/reportGenerator.d.ts +21 -0
- package/dist/reporting/reportGenerator.d.ts.map +1 -0
- package/dist/reporting/reportGenerator.js +53 -0
- package/dist/reporting/reportGenerator.js.map +1 -0
- package/dist/types.d.ts +246 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/astParser.d.ts +71 -0
- package/dist/utils/astParser.d.ts.map +1 -0
- package/dist/utils/astParser.js +244 -0
- package/dist/utils/astParser.js.map +1 -0
- package/dist/utils/astUtils.d.ts +89 -0
- package/dist/utils/astUtils.d.ts.map +1 -0
- package/dist/utils/astUtils.js +289 -0
- package/dist/utils/astUtils.js.map +1 -0
- package/dist/utils/fileDiscovery.d.ts +58 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -0
- package/dist/utils/fileDiscovery.js +203 -0
- package/dist/utils/fileDiscovery.js.map +1 -0
- package/examples/.auditrc.example.json +61 -0
- package/examples/.auditrc.json +201 -0
- package/examples/nextjs.auditrc.json +65 -0
- package/examples/node-api.auditrc.json +82 -0
- package/examples/react.auditrc.json +59 -0
- package/package.json +62 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Parser Utilities
|
|
3
|
+
* Provides TypeScript AST parsing and analysis utilities
|
|
4
|
+
*
|
|
5
|
+
* Core functionality for parsing TypeScript/JavaScript files and
|
|
6
|
+
* extracting information for code analysis
|
|
7
|
+
*/
|
|
8
|
+
import * as ts from 'typescript';
|
|
9
|
+
import { promises as fs } from 'fs';
|
|
10
|
+
/**
|
|
11
|
+
* Parse options for TypeScript compiler
|
|
12
|
+
*/
|
|
13
|
+
const PARSE_OPTIONS = {
|
|
14
|
+
target: ts.ScriptTarget.Latest,
|
|
15
|
+
module: ts.ModuleKind.ESNext,
|
|
16
|
+
jsx: ts.JsxEmit.React,
|
|
17
|
+
allowJs: true,
|
|
18
|
+
esModuleInterop: true,
|
|
19
|
+
skipLibCheck: true,
|
|
20
|
+
strict: false,
|
|
21
|
+
moduleResolution: ts.ModuleResolutionKind.NodeJs,
|
|
22
|
+
noResolve: true,
|
|
23
|
+
isolatedModules: true,
|
|
24
|
+
allowSyntheticDefaultImports: true,
|
|
25
|
+
lib: ['lib.es2022.d.ts']
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Parse a TypeScript file and return AST
|
|
29
|
+
*/
|
|
30
|
+
export async function parseTypeScriptFile(filePath) {
|
|
31
|
+
try {
|
|
32
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
33
|
+
// Determine script kind based on file extension
|
|
34
|
+
let scriptKind = ts.ScriptKind.TS;
|
|
35
|
+
if (filePath.endsWith('.tsx')) {
|
|
36
|
+
scriptKind = ts.ScriptKind.TSX;
|
|
37
|
+
}
|
|
38
|
+
else if (filePath.endsWith('.jsx')) {
|
|
39
|
+
scriptKind = ts.ScriptKind.JSX;
|
|
40
|
+
}
|
|
41
|
+
else if (filePath.endsWith('.js')) {
|
|
42
|
+
scriptKind = ts.ScriptKind.JS;
|
|
43
|
+
}
|
|
44
|
+
// Create source file without type checking
|
|
45
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, // setParentNodes
|
|
46
|
+
scriptKind);
|
|
47
|
+
// No errors for pure AST parsing
|
|
48
|
+
const errors = [];
|
|
49
|
+
return {
|
|
50
|
+
sourceFile,
|
|
51
|
+
program: undefined,
|
|
52
|
+
errors
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// Return error as diagnostic
|
|
57
|
+
const diagnostic = {
|
|
58
|
+
file: undefined,
|
|
59
|
+
start: 0,
|
|
60
|
+
length: 0,
|
|
61
|
+
messageText: `Failed to read file: ${error}`,
|
|
62
|
+
category: ts.DiagnosticCategory.Error,
|
|
63
|
+
code: 9999
|
|
64
|
+
};
|
|
65
|
+
// Create empty source file for consistency
|
|
66
|
+
const sourceFile = ts.createSourceFile(filePath, '', ts.ScriptTarget.Latest, true);
|
|
67
|
+
return {
|
|
68
|
+
sourceFile,
|
|
69
|
+
errors: [diagnostic]
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Extract import statements from AST
|
|
75
|
+
*/
|
|
76
|
+
export function getImports(sourceFile) {
|
|
77
|
+
const imports = [];
|
|
78
|
+
function visit(node) {
|
|
79
|
+
if (ts.isImportDeclaration(node)) {
|
|
80
|
+
const moduleSpecifier = node.moduleSpecifier.text;
|
|
81
|
+
const importClause = node.importClause;
|
|
82
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
83
|
+
const importInfo = {
|
|
84
|
+
moduleSpecifier,
|
|
85
|
+
importedNames: [],
|
|
86
|
+
isDefaultImport: false,
|
|
87
|
+
isNamespaceImport: false,
|
|
88
|
+
line
|
|
89
|
+
};
|
|
90
|
+
if (importClause) {
|
|
91
|
+
// Default import
|
|
92
|
+
if (importClause.name) {
|
|
93
|
+
importInfo.isDefaultImport = true;
|
|
94
|
+
importInfo.importedNames.push(importClause.name.text);
|
|
95
|
+
}
|
|
96
|
+
// Named imports
|
|
97
|
+
if (importClause.namedBindings) {
|
|
98
|
+
if (ts.isNamespaceImport(importClause.namedBindings)) {
|
|
99
|
+
importInfo.isNamespaceImport = true;
|
|
100
|
+
importInfo.importedNames.push(importClause.namedBindings.name.text);
|
|
101
|
+
}
|
|
102
|
+
else if (ts.isNamedImports(importClause.namedBindings)) {
|
|
103
|
+
importClause.namedBindings.elements.forEach(element => {
|
|
104
|
+
importInfo.importedNames.push(element.name.text);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
imports.push(importInfo);
|
|
110
|
+
}
|
|
111
|
+
ts.forEachChild(node, visit);
|
|
112
|
+
}
|
|
113
|
+
visit(sourceFile);
|
|
114
|
+
return imports;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extract export statements from AST
|
|
118
|
+
*/
|
|
119
|
+
export function getExports(sourceFile) {
|
|
120
|
+
const exports = [];
|
|
121
|
+
function visit(node) {
|
|
122
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
123
|
+
// Export declarations
|
|
124
|
+
if (ts.isExportDeclaration(node)) {
|
|
125
|
+
if (node.exportClause && ts.isNamedExports(node.exportClause)) {
|
|
126
|
+
node.exportClause.elements.forEach(element => {
|
|
127
|
+
exports.push({
|
|
128
|
+
name: element.name.text,
|
|
129
|
+
type: 'const', // Generic type for re-exports
|
|
130
|
+
isDefault: false,
|
|
131
|
+
line
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Function/const/class/interface with export keyword
|
|
137
|
+
const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
|
|
138
|
+
if (modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword)) {
|
|
139
|
+
let name = '';
|
|
140
|
+
let type = 'const';
|
|
141
|
+
let isDefault = modifiers.some(m => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
142
|
+
if (ts.isFunctionDeclaration(node)) {
|
|
143
|
+
name = node.name?.text || (isDefault ? 'default' : 'anonymous');
|
|
144
|
+
type = 'function';
|
|
145
|
+
}
|
|
146
|
+
else if (ts.isClassDeclaration(node)) {
|
|
147
|
+
name = node.name?.text || (isDefault ? 'default' : 'anonymous');
|
|
148
|
+
type = 'class';
|
|
149
|
+
}
|
|
150
|
+
else if (ts.isInterfaceDeclaration(node)) {
|
|
151
|
+
name = node.name.text;
|
|
152
|
+
type = 'interface';
|
|
153
|
+
}
|
|
154
|
+
else if (ts.isTypeAliasDeclaration(node)) {
|
|
155
|
+
name = node.name.text;
|
|
156
|
+
type = 'type';
|
|
157
|
+
}
|
|
158
|
+
else if (ts.isEnumDeclaration(node)) {
|
|
159
|
+
name = node.name.text;
|
|
160
|
+
type = 'enum';
|
|
161
|
+
}
|
|
162
|
+
else if (ts.isVariableStatement(node)) {
|
|
163
|
+
const declaration = node.declarationList.declarations[0];
|
|
164
|
+
if (declaration.name && ts.isIdentifier(declaration.name)) {
|
|
165
|
+
name = declaration.name.text;
|
|
166
|
+
type = node.declarationList.flags & ts.NodeFlags.Const ? 'const' :
|
|
167
|
+
node.declarationList.flags & ts.NodeFlags.Let ? 'let' : 'var';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (name) {
|
|
171
|
+
exports.push({ name, type, isDefault, line });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
ts.forEachChild(node, visit);
|
|
175
|
+
}
|
|
176
|
+
visit(sourceFile);
|
|
177
|
+
return exports;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Find nodes by kind in AST
|
|
181
|
+
*/
|
|
182
|
+
export function findNodesByKind(sourceFile, kind) {
|
|
183
|
+
const nodes = [];
|
|
184
|
+
function visit(node) {
|
|
185
|
+
if (node.kind === kind) {
|
|
186
|
+
nodes.push(node);
|
|
187
|
+
}
|
|
188
|
+
ts.forEachChild(node, visit);
|
|
189
|
+
}
|
|
190
|
+
visit(sourceFile);
|
|
191
|
+
return nodes;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get the text content of a node
|
|
195
|
+
*/
|
|
196
|
+
export function getNodeText(node, sourceFile) {
|
|
197
|
+
return node.getText(sourceFile);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get line and column for a position
|
|
201
|
+
*/
|
|
202
|
+
export function getLineAndColumn(sourceFile, position) {
|
|
203
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(position);
|
|
204
|
+
return { line: line + 1, column: character + 1 };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check if a node has a specific modifier
|
|
208
|
+
*/
|
|
209
|
+
export function hasModifier(node, modifier) {
|
|
210
|
+
const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
|
|
211
|
+
return modifiers?.some(m => m.kind === modifier) || false;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get function/method complexity (simplified cyclomatic complexity)
|
|
215
|
+
*/
|
|
216
|
+
export function calculateComplexity(node) {
|
|
217
|
+
let complexity = 1; // Base complexity
|
|
218
|
+
function visit(node) {
|
|
219
|
+
switch (node.kind) {
|
|
220
|
+
case ts.SyntaxKind.IfStatement:
|
|
221
|
+
case ts.SyntaxKind.ConditionalExpression:
|
|
222
|
+
case ts.SyntaxKind.WhileStatement:
|
|
223
|
+
case ts.SyntaxKind.ForStatement:
|
|
224
|
+
case ts.SyntaxKind.ForInStatement:
|
|
225
|
+
case ts.SyntaxKind.ForOfStatement:
|
|
226
|
+
case ts.SyntaxKind.CaseClause:
|
|
227
|
+
complexity++;
|
|
228
|
+
break;
|
|
229
|
+
case ts.SyntaxKind.BinaryExpression:
|
|
230
|
+
const binaryExpr = node;
|
|
231
|
+
if (binaryExpr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken ||
|
|
232
|
+
binaryExpr.operatorToken.kind === ts.SyntaxKind.BarBarToken) {
|
|
233
|
+
complexity++;
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
ts.forEachChild(node, visit);
|
|
238
|
+
}
|
|
239
|
+
if (node.body) {
|
|
240
|
+
visit(node.body);
|
|
241
|
+
}
|
|
242
|
+
return complexity;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=astParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astParser.js","sourceRoot":"","sources":["../../src/utils/astParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Utility Functions
|
|
3
|
+
* Provides helper functions for working with TypeScript AST nodes
|
|
4
|
+
*/
|
|
5
|
+
import * as ts from 'typescript';
|
|
6
|
+
import { ImportInfo, ExportInfo } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Find all nodes of a specific kind in the AST
|
|
9
|
+
*/
|
|
10
|
+
export declare function findNodesByKind<T extends ts.Node>(node: ts.Node, kind: ts.SyntaxKind): T[];
|
|
11
|
+
/**
|
|
12
|
+
* Get the text content of a node
|
|
13
|
+
*/
|
|
14
|
+
export declare function getNodeText(node: ts.Node, sourceFile: ts.SourceFile): string;
|
|
15
|
+
/**
|
|
16
|
+
* Get line and column number for a position
|
|
17
|
+
*/
|
|
18
|
+
export declare function getLineAndColumn(sourceFile: ts.SourceFile, position: number): {
|
|
19
|
+
line: number;
|
|
20
|
+
column: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Extract import statements from a source file
|
|
24
|
+
*/
|
|
25
|
+
export declare function getImports(sourceFile: ts.SourceFile): ImportInfo[];
|
|
26
|
+
/**
|
|
27
|
+
* Extract export statements from a source file
|
|
28
|
+
*/
|
|
29
|
+
export declare function getExports(sourceFile: ts.SourceFile): ExportInfo[];
|
|
30
|
+
/**
|
|
31
|
+
* Check if a node is exported
|
|
32
|
+
*/
|
|
33
|
+
export declare function isExported(node: ts.Node): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Find all function declarations
|
|
36
|
+
*/
|
|
37
|
+
export declare function findFunctions(sourceFile: ts.SourceFile): ts.FunctionDeclaration[];
|
|
38
|
+
/**
|
|
39
|
+
* Find all class declarations
|
|
40
|
+
*/
|
|
41
|
+
export declare function findClasses(sourceFile: ts.SourceFile): ts.ClassDeclaration[];
|
|
42
|
+
/**
|
|
43
|
+
* Get AST node for inspection
|
|
44
|
+
*/
|
|
45
|
+
export declare function getASTNode(node: ts.Node): any;
|
|
46
|
+
/**
|
|
47
|
+
* Calculate cyclomatic complexity of a function/method
|
|
48
|
+
*/
|
|
49
|
+
export declare function calculateComplexity(node: ts.FunctionLikeDeclaration): number;
|
|
50
|
+
/**
|
|
51
|
+
* Check if a node has a specific decorator
|
|
52
|
+
*/
|
|
53
|
+
export declare function hasDecorator(node: ts.Node, decoratorName: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Get method names from a class
|
|
56
|
+
*/
|
|
57
|
+
export declare function getClassMethods(classNode: ts.ClassDeclaration): string[];
|
|
58
|
+
/**
|
|
59
|
+
* Count lines of code (excluding comments and empty lines)
|
|
60
|
+
*/
|
|
61
|
+
export declare function countLinesOfCode(sourceFile: ts.SourceFile): number;
|
|
62
|
+
/**
|
|
63
|
+
* Find all variable declarations
|
|
64
|
+
*/
|
|
65
|
+
export declare function findVariableDeclarations(sourceFile: ts.SourceFile): ts.VariableDeclaration[];
|
|
66
|
+
/**
|
|
67
|
+
* Check if a function is async
|
|
68
|
+
*/
|
|
69
|
+
export declare function isAsyncFunction(node: ts.FunctionLikeDeclaration): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Get parameter count for a function
|
|
72
|
+
*/
|
|
73
|
+
export declare function getParameterCount(node: ts.FunctionLikeDeclaration): number;
|
|
74
|
+
/**
|
|
75
|
+
* Find all type aliases
|
|
76
|
+
*/
|
|
77
|
+
export declare function findTypeAliases(sourceFile: ts.SourceFile): ts.TypeAliasDeclaration[];
|
|
78
|
+
/**
|
|
79
|
+
* Find all interfaces
|
|
80
|
+
*/
|
|
81
|
+
export declare function findInterfaces(sourceFile: ts.SourceFile): ts.InterfaceDeclaration[];
|
|
82
|
+
/**
|
|
83
|
+
* Parse a TypeScript file
|
|
84
|
+
*/
|
|
85
|
+
export declare function parseTypeScriptFile(filePath: string): Promise<{
|
|
86
|
+
sourceFile: ts.SourceFile;
|
|
87
|
+
errors: ts.Diagnostic[];
|
|
88
|
+
}>;
|
|
89
|
+
//# sourceMappingURL=astUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astUtils.d.ts","sourceRoot":"","sources":["../../src/utils/astUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,EAC/C,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,IAAI,EAAE,EAAE,CAAC,UAAU,GAClB,CAAC,EAAE,CAYL;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAGlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,UAAU,EAAE,CAsClE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,UAAU,EAAE,CA8BlE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAIjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAKjF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAK5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAM7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,GAAG,MAAM,CAiC5E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAkB1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,GAAG,MAAM,EAAE,CAUxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAalE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,EAAE,CAAC,mBAAmB,EAAE,CAY1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,GAAG,OAAO,CAIzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,GAAG,MAAM,CAE1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAKpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAKnF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAAC,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,CAAA;CAAE,CAAC,CAgDjE"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Utility Functions
|
|
3
|
+
* Provides helper functions for working with TypeScript AST nodes
|
|
4
|
+
*/
|
|
5
|
+
import * as ts from 'typescript';
|
|
6
|
+
/**
|
|
7
|
+
* Find all nodes of a specific kind in the AST
|
|
8
|
+
*/
|
|
9
|
+
export function findNodesByKind(node, kind) {
|
|
10
|
+
const results = [];
|
|
11
|
+
function visit(node) {
|
|
12
|
+
if (node.kind === kind) {
|
|
13
|
+
results.push(node);
|
|
14
|
+
}
|
|
15
|
+
ts.forEachChild(node, visit);
|
|
16
|
+
}
|
|
17
|
+
visit(node);
|
|
18
|
+
return results;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the text content of a node
|
|
22
|
+
*/
|
|
23
|
+
export function getNodeText(node, sourceFile) {
|
|
24
|
+
return node.getText(sourceFile);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get line and column number for a position
|
|
28
|
+
*/
|
|
29
|
+
export function getLineAndColumn(sourceFile, position) {
|
|
30
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(position);
|
|
31
|
+
return { line: line + 1, column: character + 1 };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extract import statements from a source file
|
|
35
|
+
*/
|
|
36
|
+
export function getImports(sourceFile) {
|
|
37
|
+
const imports = [];
|
|
38
|
+
ts.forEachChild(sourceFile, node => {
|
|
39
|
+
if (ts.isImportDeclaration(node)) {
|
|
40
|
+
const moduleSpecifier = node.moduleSpecifier.text;
|
|
41
|
+
const importedNames = [];
|
|
42
|
+
const isTypeOnly = node.importClause?.isTypeOnly || false;
|
|
43
|
+
if (node.importClause) {
|
|
44
|
+
// Default import
|
|
45
|
+
if (node.importClause.name) {
|
|
46
|
+
importedNames.push(node.importClause.name.text);
|
|
47
|
+
}
|
|
48
|
+
// Named imports
|
|
49
|
+
if (node.importClause.namedBindings) {
|
|
50
|
+
if (ts.isNamespaceImport(node.importClause.namedBindings)) {
|
|
51
|
+
importedNames.push(`* as ${node.importClause.namedBindings.name.text}`);
|
|
52
|
+
}
|
|
53
|
+
else if (ts.isNamedImports(node.importClause.namedBindings)) {
|
|
54
|
+
node.importClause.namedBindings.elements.forEach(element => {
|
|
55
|
+
importedNames.push(element.name.text);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const { line } = getLineAndColumn(sourceFile, node.getStart());
|
|
61
|
+
imports.push({
|
|
62
|
+
moduleSpecifier,
|
|
63
|
+
importedNames,
|
|
64
|
+
isTypeOnly,
|
|
65
|
+
line
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return imports;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract export statements from a source file
|
|
73
|
+
*/
|
|
74
|
+
export function getExports(sourceFile) {
|
|
75
|
+
const exports = [];
|
|
76
|
+
ts.forEachChild(sourceFile, node => {
|
|
77
|
+
if (ts.isExportDeclaration(node)) {
|
|
78
|
+
const isTypeOnly = node.isTypeOnly || false;
|
|
79
|
+
const { line } = getLineAndColumn(sourceFile, node.getStart());
|
|
80
|
+
if (node.exportClause && ts.isNamedExports(node.exportClause)) {
|
|
81
|
+
node.exportClause.elements.forEach(element => {
|
|
82
|
+
exports.push({
|
|
83
|
+
name: element.name.text,
|
|
84
|
+
isDefault: false,
|
|
85
|
+
isTypeOnly,
|
|
86
|
+
line
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (ts.isExportAssignment(node)) {
|
|
92
|
+
const { line } = getLineAndColumn(sourceFile, node.getStart());
|
|
93
|
+
exports.push({
|
|
94
|
+
name: 'default',
|
|
95
|
+
isDefault: true,
|
|
96
|
+
isTypeOnly: false,
|
|
97
|
+
line
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return exports;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if a node is exported
|
|
105
|
+
*/
|
|
106
|
+
export function isExported(node) {
|
|
107
|
+
return ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export) !== 0);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Find all function declarations
|
|
111
|
+
*/
|
|
112
|
+
export function findFunctions(sourceFile) {
|
|
113
|
+
return findNodesByKind(sourceFile, ts.SyntaxKind.FunctionDeclaration);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Find all class declarations
|
|
117
|
+
*/
|
|
118
|
+
export function findClasses(sourceFile) {
|
|
119
|
+
return findNodesByKind(sourceFile, ts.SyntaxKind.ClassDeclaration);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get AST node for inspection
|
|
123
|
+
*/
|
|
124
|
+
export function getASTNode(node) {
|
|
125
|
+
return {
|
|
126
|
+
kind: ts.SyntaxKind[node.kind],
|
|
127
|
+
text: node.getText?.() || '',
|
|
128
|
+
children: node.getChildren?.().map(child => getASTNode(child)) || []
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Calculate cyclomatic complexity of a function/method
|
|
133
|
+
*/
|
|
134
|
+
export function calculateComplexity(node) {
|
|
135
|
+
let complexity = 1; // Base complexity
|
|
136
|
+
function visit(node) {
|
|
137
|
+
switch (node.kind) {
|
|
138
|
+
case ts.SyntaxKind.IfStatement:
|
|
139
|
+
case ts.SyntaxKind.WhileStatement:
|
|
140
|
+
case ts.SyntaxKind.ForStatement:
|
|
141
|
+
case ts.SyntaxKind.ForInStatement:
|
|
142
|
+
case ts.SyntaxKind.ForOfStatement:
|
|
143
|
+
case ts.SyntaxKind.ConditionalExpression:
|
|
144
|
+
case ts.SyntaxKind.CatchClause:
|
|
145
|
+
case ts.SyntaxKind.CaseClause:
|
|
146
|
+
complexity++;
|
|
147
|
+
break;
|
|
148
|
+
case ts.SyntaxKind.BinaryExpression:
|
|
149
|
+
const binary = node;
|
|
150
|
+
if (binary.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken ||
|
|
151
|
+
binary.operatorToken.kind === ts.SyntaxKind.BarBarToken) {
|
|
152
|
+
complexity++;
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
ts.forEachChild(node, visit);
|
|
157
|
+
}
|
|
158
|
+
if (node.body) {
|
|
159
|
+
visit(node.body);
|
|
160
|
+
}
|
|
161
|
+
return complexity;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if a node has a specific decorator
|
|
165
|
+
*/
|
|
166
|
+
export function hasDecorator(node, decoratorName) {
|
|
167
|
+
if (!ts.canHaveDecorators(node)) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const decorators = ts.getDecorators(node);
|
|
171
|
+
if (!decorators) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
return decorators.some(decorator => {
|
|
175
|
+
if (ts.isCallExpression(decorator.expression)) {
|
|
176
|
+
const expression = decorator.expression.expression;
|
|
177
|
+
return ts.isIdentifier(expression) && expression.text === decoratorName;
|
|
178
|
+
}
|
|
179
|
+
return ts.isIdentifier(decorator.expression) &&
|
|
180
|
+
decorator.expression.text === decoratorName;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get method names from a class
|
|
185
|
+
*/
|
|
186
|
+
export function getClassMethods(classNode) {
|
|
187
|
+
const methods = [];
|
|
188
|
+
classNode.members.forEach(member => {
|
|
189
|
+
if (ts.isMethodDeclaration(member) && member.name && ts.isIdentifier(member.name)) {
|
|
190
|
+
methods.push(member.name.text);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
return methods;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Count lines of code (excluding comments and empty lines)
|
|
197
|
+
*/
|
|
198
|
+
export function countLinesOfCode(sourceFile) {
|
|
199
|
+
const text = sourceFile.getFullText();
|
|
200
|
+
const lines = text.split('\n');
|
|
201
|
+
let count = 0;
|
|
202
|
+
for (const line of lines) {
|
|
203
|
+
const trimmed = line.trim();
|
|
204
|
+
if (trimmed && !trimmed.startsWith('//') && !trimmed.startsWith('/*')) {
|
|
205
|
+
count++;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return count;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Find all variable declarations
|
|
212
|
+
*/
|
|
213
|
+
export function findVariableDeclarations(sourceFile) {
|
|
214
|
+
const declarations = [];
|
|
215
|
+
function visit(node) {
|
|
216
|
+
if (ts.isVariableDeclaration(node)) {
|
|
217
|
+
declarations.push(node);
|
|
218
|
+
}
|
|
219
|
+
ts.forEachChild(node, visit);
|
|
220
|
+
}
|
|
221
|
+
visit(sourceFile);
|
|
222
|
+
return declarations;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if a function is async
|
|
226
|
+
*/
|
|
227
|
+
export function isAsyncFunction(node) {
|
|
228
|
+
return !!(node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.AsyncKeyword));
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get parameter count for a function
|
|
232
|
+
*/
|
|
233
|
+
export function getParameterCount(node) {
|
|
234
|
+
return node.parameters.length;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Find all type aliases
|
|
238
|
+
*/
|
|
239
|
+
export function findTypeAliases(sourceFile) {
|
|
240
|
+
return findNodesByKind(sourceFile, ts.SyntaxKind.TypeAliasDeclaration);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Find all interfaces
|
|
244
|
+
*/
|
|
245
|
+
export function findInterfaces(sourceFile) {
|
|
246
|
+
return findNodesByKind(sourceFile, ts.SyntaxKind.InterfaceDeclaration);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Parse a TypeScript file
|
|
250
|
+
*/
|
|
251
|
+
export async function parseTypeScriptFile(filePath) {
|
|
252
|
+
const fs = await import('fs').then(m => m.promises);
|
|
253
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
254
|
+
const compilerOptions = {
|
|
255
|
+
target: ts.ScriptTarget.Latest,
|
|
256
|
+
module: ts.ModuleKind.ESNext,
|
|
257
|
+
jsx: ts.JsxEmit.React,
|
|
258
|
+
lib: ['es2020', 'dom'],
|
|
259
|
+
skipLibCheck: true,
|
|
260
|
+
skipDefaultLibCheck: true,
|
|
261
|
+
allowJs: true,
|
|
262
|
+
checkJs: false,
|
|
263
|
+
strict: false,
|
|
264
|
+
noResolve: true,
|
|
265
|
+
noLib: false,
|
|
266
|
+
moduleResolution: ts.ModuleResolutionKind.NodeJs
|
|
267
|
+
};
|
|
268
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
269
|
+
// For now, just return the source file without full type checking
|
|
270
|
+
// This avoids the need for a full TypeScript compiler host setup
|
|
271
|
+
const errors = [];
|
|
272
|
+
// Check for basic syntax errors by walking the AST
|
|
273
|
+
function checkSyntax(node) {
|
|
274
|
+
if (node.kind === ts.SyntaxKind.Unknown) {
|
|
275
|
+
errors.push({
|
|
276
|
+
file: sourceFile,
|
|
277
|
+
start: node.getStart(),
|
|
278
|
+
length: node.getWidth(),
|
|
279
|
+
messageText: 'Syntax error',
|
|
280
|
+
category: ts.DiagnosticCategory.Error,
|
|
281
|
+
code: 1000
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
ts.forEachChild(node, checkSyntax);
|
|
285
|
+
}
|
|
286
|
+
checkSyntax(sourceFile);
|
|
287
|
+
return { sourceFile, errors };
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=astUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astUtils.js","sourceRoot":"","sources":["../../src/utils/astUtils.ts"],"names":[],"mappings":"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"}
|