ts-analyzer 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/README.md +356 -0
- package/bin/cli.js +4 -0
- package/bin/cli.ts +241 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +215 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/code-complexity.d.ts +24 -0
- package/dist/src/code-complexity.js +338 -0
- package/dist/src/code-complexity.js.map +1 -0
- package/dist/src/index.d.ts +47 -0
- package/dist/src/index.js +115 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/table-formatter.d.ts +6 -0
- package/dist/src/table-formatter.js +82 -0
- package/dist/src/table-formatter.js.map +1 -0
- package/dist/src/typescript-safety.d.ts +27 -0
- package/dist/src/typescript-safety.js +287 -0
- package/dist/src/typescript-safety.js.map +1 -0
- package/package.json +51 -0
- package/src/code-complexity.ts +431 -0
- package/src/index.ts +180 -0
- package/src/table-formatter.ts +94 -0
- package/src/typescript-safety.ts +346 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { TypeScriptSafetyMetrics } from './typescript-safety.js';
|
|
2
|
+
import { CodeComplexityMetrics } from './code-complexity.js';
|
|
3
|
+
export declare const REACT_EXTENSIONS: string[];
|
|
4
|
+
export declare const DEFAULT_IGNORE: string[];
|
|
5
|
+
export interface LineCount {
|
|
6
|
+
total: number;
|
|
7
|
+
nonEmpty: number;
|
|
8
|
+
code: number;
|
|
9
|
+
comments: number;
|
|
10
|
+
empty: number;
|
|
11
|
+
}
|
|
12
|
+
export interface FileTypeData {
|
|
13
|
+
files: number;
|
|
14
|
+
totalLines: number;
|
|
15
|
+
codeLines: number;
|
|
16
|
+
commentLines: number;
|
|
17
|
+
emptyLines: number;
|
|
18
|
+
}
|
|
19
|
+
export interface FileTypeFormatted {
|
|
20
|
+
'Extension': string;
|
|
21
|
+
'Files': string;
|
|
22
|
+
'Total Lines': string;
|
|
23
|
+
'Code Lines': string;
|
|
24
|
+
'Comment Lines': string;
|
|
25
|
+
'Empty Lines': string;
|
|
26
|
+
'% of Codebase': string;
|
|
27
|
+
}
|
|
28
|
+
export interface ProjectOptions {
|
|
29
|
+
excludePatterns?: string[];
|
|
30
|
+
additionalExtensions?: string[];
|
|
31
|
+
analyzeSafety?: boolean;
|
|
32
|
+
analyzeComplexity?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ProjectStats {
|
|
35
|
+
files: number;
|
|
36
|
+
totalLines: number;
|
|
37
|
+
codeLines: number;
|
|
38
|
+
commentLines: number;
|
|
39
|
+
emptyLines: number;
|
|
40
|
+
fileTypes: Record<string, FileTypeData>;
|
|
41
|
+
formattedFileTypes?: FileTypeFormatted[];
|
|
42
|
+
typescriptSafety: TypeScriptSafetyMetrics | null;
|
|
43
|
+
codeComplexity: CodeComplexityMetrics | null;
|
|
44
|
+
formatNumber: (num: number) => string;
|
|
45
|
+
}
|
|
46
|
+
export declare function countLines(filePath: string): Promise<LineCount>;
|
|
47
|
+
export declare function analyzeProject(projectPath?: string, options?: ProjectOptions): Promise<ProjectStats>;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { calculateProjectTypeSafety } from './typescript-safety.js';
|
|
4
|
+
import { calculateProjectComplexity } from './code-complexity.js';
|
|
5
|
+
export const REACT_EXTENSIONS = [
|
|
6
|
+
'.js', '.jsx', '.ts', '.tsx',
|
|
7
|
+
'.css', '.scss', '.sass',
|
|
8
|
+
'.html', '.json'
|
|
9
|
+
];
|
|
10
|
+
export const DEFAULT_IGNORE = [
|
|
11
|
+
'node_modules',
|
|
12
|
+
'build',
|
|
13
|
+
'dist',
|
|
14
|
+
'.git',
|
|
15
|
+
'coverage',
|
|
16
|
+
'.next',
|
|
17
|
+
'out'
|
|
18
|
+
];
|
|
19
|
+
export async function countLines(filePath) {
|
|
20
|
+
try {
|
|
21
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
22
|
+
const lines = content.split('\n');
|
|
23
|
+
const nonEmptyLines = lines.filter(line => line.trim().length > 0);
|
|
24
|
+
const nonCommentLines = nonEmptyLines.filter(line => {
|
|
25
|
+
const trimmed = line.trim();
|
|
26
|
+
return !trimmed.startsWith('//') && !trimmed.startsWith('/*') && !trimmed.startsWith('*');
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
total: lines.length,
|
|
30
|
+
nonEmpty: nonEmptyLines.length,
|
|
31
|
+
code: nonCommentLines.length,
|
|
32
|
+
comments: nonEmptyLines.length - nonCommentLines.length,
|
|
33
|
+
empty: lines.length - nonEmptyLines.length
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error(`Error reading file ${filePath}:`, error);
|
|
38
|
+
return { total: 0, nonEmpty: 0, code: 0, comments: 0, empty: 0 };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function analyzeProject(projectPath = '.', options = {}) {
|
|
42
|
+
const stats = {
|
|
43
|
+
files: 0,
|
|
44
|
+
totalLines: 0,
|
|
45
|
+
codeLines: 0,
|
|
46
|
+
commentLines: 0,
|
|
47
|
+
emptyLines: 0,
|
|
48
|
+
fileTypes: {},
|
|
49
|
+
typescriptSafety: null,
|
|
50
|
+
codeComplexity: null,
|
|
51
|
+
formatNumber: (num) => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
|
|
52
|
+
};
|
|
53
|
+
const extensions = [...REACT_EXTENSIONS, ...(options.additionalExtensions || [])];
|
|
54
|
+
const ignorePatterns = [...DEFAULT_IGNORE, ...(options.excludePatterns || [])];
|
|
55
|
+
const allFilePaths = [];
|
|
56
|
+
async function traverse(currentPath) {
|
|
57
|
+
const files = await fs.readdir(currentPath);
|
|
58
|
+
for (const file of files) {
|
|
59
|
+
const fullPath = path.join(currentPath, file);
|
|
60
|
+
const stat = await fs.stat(fullPath);
|
|
61
|
+
if (stat.isDirectory()) {
|
|
62
|
+
if (!ignorePatterns.includes(file)) {
|
|
63
|
+
await traverse(fullPath);
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const ext = path.extname(file);
|
|
68
|
+
if (!extensions.includes(ext))
|
|
69
|
+
continue;
|
|
70
|
+
stats.files++;
|
|
71
|
+
const relativePath = path.relative(projectPath, fullPath);
|
|
72
|
+
allFilePaths.push(relativePath);
|
|
73
|
+
if (!stats.fileTypes[ext]) {
|
|
74
|
+
stats.fileTypes[ext] = {
|
|
75
|
+
files: 0,
|
|
76
|
+
totalLines: 0,
|
|
77
|
+
codeLines: 0,
|
|
78
|
+
commentLines: 0,
|
|
79
|
+
emptyLines: 0
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const { total, code, comments, empty } = await countLines(fullPath);
|
|
83
|
+
stats.totalLines += total;
|
|
84
|
+
stats.codeLines += code;
|
|
85
|
+
stats.commentLines += comments;
|
|
86
|
+
stats.emptyLines += empty;
|
|
87
|
+
stats.fileTypes[ext].files++;
|
|
88
|
+
stats.fileTypes[ext].totalLines += total;
|
|
89
|
+
stats.fileTypes[ext].codeLines += code;
|
|
90
|
+
stats.fileTypes[ext].commentLines += comments;
|
|
91
|
+
stats.fileTypes[ext].emptyLines += empty;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
await traverse(projectPath);
|
|
95
|
+
stats.formattedFileTypes = Object.entries(stats.fileTypes)
|
|
96
|
+
.sort(([, a], [, b]) => b.files - a.files)
|
|
97
|
+
.map(([ext, data]) => ({
|
|
98
|
+
'Extension': ext,
|
|
99
|
+
'Files': stats.formatNumber(data.files),
|
|
100
|
+
'Total Lines': stats.formatNumber(data.totalLines),
|
|
101
|
+
'Code Lines': stats.formatNumber(data.codeLines),
|
|
102
|
+
'Comment Lines': stats.formatNumber(data.commentLines),
|
|
103
|
+
'Empty Lines': stats.formatNumber(data.emptyLines),
|
|
104
|
+
'% of Codebase': `${((data.codeLines / stats.codeLines) * 100).toFixed(1)}%`
|
|
105
|
+
}));
|
|
106
|
+
// Now analyze TypeScript safety and code complexity if requested
|
|
107
|
+
if (options.analyzeSafety !== false) {
|
|
108
|
+
stats.typescriptSafety = await calculateProjectTypeSafety(projectPath, allFilePaths);
|
|
109
|
+
}
|
|
110
|
+
if (options.analyzeComplexity !== false) {
|
|
111
|
+
stats.codeComplexity = await calculateProjectComplexity(projectPath, allFilePaths);
|
|
112
|
+
}
|
|
113
|
+
return stats;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// src/table-formatter.ts
|
|
2
|
+
/**
|
|
3
|
+
* Simple table formatter that handles ANSI color codes correctly
|
|
4
|
+
*/
|
|
5
|
+
export function formatTable(data, options) {
|
|
6
|
+
if (!data || data.length === 0) {
|
|
7
|
+
console.log('No data to display');
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Print the title if provided
|
|
11
|
+
if (options?.title) {
|
|
12
|
+
console.log(`\n${options.title}`);
|
|
13
|
+
}
|
|
14
|
+
// Extract all unique keys from the data
|
|
15
|
+
const allKeys = new Set();
|
|
16
|
+
data.forEach(item => {
|
|
17
|
+
Object.keys(item).forEach(key => allKeys.add(key));
|
|
18
|
+
});
|
|
19
|
+
const headers = Array.from(allKeys);
|
|
20
|
+
// Function to get visible string length (excluding ANSI color codes)
|
|
21
|
+
const getVisibleLength = (str) => {
|
|
22
|
+
// Remove ANSI color codes for width calculation
|
|
23
|
+
return str.replace(/\x1B\[\d+m/g, '').length;
|
|
24
|
+
};
|
|
25
|
+
// Calculate the width of each column
|
|
26
|
+
const colWidths = {};
|
|
27
|
+
headers.forEach(header => {
|
|
28
|
+
// Start with the header width
|
|
29
|
+
colWidths[header] = header.length;
|
|
30
|
+
// Check each row for this column's value and update width if needed
|
|
31
|
+
data.forEach(row => {
|
|
32
|
+
const value = row[header] !== undefined ? String(row[header]) : '';
|
|
33
|
+
colWidths[header] = Math.max(colWidths[header], getVisibleLength(value));
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
// Function to pad a string to desired visible length, accounting for ANSI codes
|
|
37
|
+
const padString = (str, length, padChar = ' ') => {
|
|
38
|
+
const visibleLength = getVisibleLength(str);
|
|
39
|
+
const paddingNeeded = Math.max(0, length - visibleLength);
|
|
40
|
+
return str + padChar.repeat(paddingNeeded);
|
|
41
|
+
};
|
|
42
|
+
// Create the header row
|
|
43
|
+
let headerRow = '│ ';
|
|
44
|
+
headers.forEach((header, index) => {
|
|
45
|
+
const isLast = index === headers.length - 1;
|
|
46
|
+
headerRow += padString(header, colWidths[header]) + (isLast ? ' │' : ' │ ');
|
|
47
|
+
});
|
|
48
|
+
// Create a separator row
|
|
49
|
+
let separator = '├─';
|
|
50
|
+
headers.forEach((header, index) => {
|
|
51
|
+
const isLast = index === headers.length - 1;
|
|
52
|
+
separator += '─'.repeat(colWidths[header]) + (isLast ? '─┤' : '─┼─');
|
|
53
|
+
});
|
|
54
|
+
// Create the top border
|
|
55
|
+
let topBorder = '┌─';
|
|
56
|
+
headers.forEach((header, index) => {
|
|
57
|
+
const isLast = index === headers.length - 1;
|
|
58
|
+
topBorder += '─'.repeat(colWidths[header]) + (isLast ? '─┐' : '─┬─');
|
|
59
|
+
});
|
|
60
|
+
// Create the bottom border
|
|
61
|
+
let bottomBorder = '└─';
|
|
62
|
+
headers.forEach((header, index) => {
|
|
63
|
+
const isLast = index === headers.length - 1;
|
|
64
|
+
bottomBorder += '─'.repeat(colWidths[header]) + (isLast ? '─┘' : '─┴─');
|
|
65
|
+
});
|
|
66
|
+
// Print the table
|
|
67
|
+
console.log(topBorder);
|
|
68
|
+
console.log(headerRow);
|
|
69
|
+
console.log(separator);
|
|
70
|
+
// Print each data row
|
|
71
|
+
data.forEach(row => {
|
|
72
|
+
let dataRow = '│ ';
|
|
73
|
+
headers.forEach((header, index) => {
|
|
74
|
+
const isLast = index === headers.length - 1;
|
|
75
|
+
const value = row[header] !== undefined ? String(row[header]) : '';
|
|
76
|
+
dataRow += padString(value, colWidths[header]) + (isLast ? ' │' : ' │ ');
|
|
77
|
+
});
|
|
78
|
+
console.log(dataRow);
|
|
79
|
+
});
|
|
80
|
+
console.log(bottomBorder);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=table-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-formatter.js","sourceRoot":"","sources":["../../src/table-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface TypeScriptMetrics {
|
|
2
|
+
totalTypeableNodes: number;
|
|
3
|
+
typedNodes: number;
|
|
4
|
+
typeCoverage: string;
|
|
5
|
+
anyTypeCount: number;
|
|
6
|
+
typeAssertions: number;
|
|
7
|
+
nonNullAssertions: number;
|
|
8
|
+
optionalProperties: number;
|
|
9
|
+
genericsCount: number;
|
|
10
|
+
typeSafetyScore: number;
|
|
11
|
+
typeComplexity: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TypeScriptSafetyMetrics {
|
|
14
|
+
tsFileCount: number;
|
|
15
|
+
tsPercentage: string;
|
|
16
|
+
avgTypeCoverage: string;
|
|
17
|
+
totalAnyCount: number;
|
|
18
|
+
totalAssertions: number;
|
|
19
|
+
totalNonNullAssertions: number;
|
|
20
|
+
avgTypeSafetyScore: number;
|
|
21
|
+
overallComplexity: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Realistic TypeScript safety analyzer that provides results comparable to real-world analysis tools
|
|
25
|
+
*/
|
|
26
|
+
export declare function analyzeTypeScriptSafety(filePath: string): Promise<TypeScriptMetrics>;
|
|
27
|
+
export declare function calculateProjectTypeSafety(projectPath: string, fileList: string[]): Promise<TypeScriptSafetyMetrics>;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
// src/typescript-safety.ts
|
|
2
|
+
import * as ts from 'typescript';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
/**
|
|
6
|
+
* Realistic TypeScript safety analyzer that provides results comparable to real-world analysis tools
|
|
7
|
+
*/
|
|
8
|
+
export async function analyzeTypeScriptSafety(filePath) {
|
|
9
|
+
try {
|
|
10
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
11
|
+
// Create a source file
|
|
12
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
13
|
+
// Initialize metrics
|
|
14
|
+
const metrics = {
|
|
15
|
+
totalTypeableNodes: 0,
|
|
16
|
+
typedNodes: 0,
|
|
17
|
+
anyTypeCount: 0,
|
|
18
|
+
typeAssertions: 0,
|
|
19
|
+
nonNullAssertions: 0,
|
|
20
|
+
optionalProperties: 0,
|
|
21
|
+
genericsCount: 0,
|
|
22
|
+
explicitlyTypedNodes: 0, // Track explicitly typed nodes separately
|
|
23
|
+
implicitlyTypedNodes: 0 // Track implicitly typed nodes separately
|
|
24
|
+
};
|
|
25
|
+
// Function to visit each node and analyze types
|
|
26
|
+
function visit(node, parent) {
|
|
27
|
+
// Check for declarations that should have types
|
|
28
|
+
if (ts.isVariableDeclaration(node) ||
|
|
29
|
+
ts.isParameter(node) ||
|
|
30
|
+
ts.isPropertySignature(node) ||
|
|
31
|
+
ts.isPropertyDeclaration(node) ||
|
|
32
|
+
ts.isMethodDeclaration(node) ||
|
|
33
|
+
ts.isFunctionDeclaration(node)) {
|
|
34
|
+
metrics.totalTypeableNodes++;
|
|
35
|
+
// Check for explicitly typed nodes
|
|
36
|
+
if (node.type) {
|
|
37
|
+
metrics.typedNodes++;
|
|
38
|
+
metrics.explicitlyTypedNodes++;
|
|
39
|
+
// Check for 'any' type
|
|
40
|
+
if (node.type.kind === ts.SyntaxKind.AnyKeyword) {
|
|
41
|
+
metrics.anyTypeCount++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// For variables without explicit type but with initializers, count as inferred type
|
|
46
|
+
if (ts.isVariableDeclaration(node) && node.initializer) {
|
|
47
|
+
// Almost all initializers in TypeScript are type-inferred
|
|
48
|
+
metrics.typedNodes++;
|
|
49
|
+
metrics.implicitlyTypedNodes++;
|
|
50
|
+
}
|
|
51
|
+
// For parameters in TypeScript functions, count as inferred if parent has type annotations
|
|
52
|
+
if (ts.isParameter(node) && parent) {
|
|
53
|
+
if (ts.isFunctionDeclaration(parent) || ts.isMethodDeclaration(parent) || ts.isConstructorDeclaration(parent)) {
|
|
54
|
+
if (parent.type || (parent.parameters && parent.parameters.some(p => p.type))) {
|
|
55
|
+
// If function has any type annotations, TypeScript will infer parameter types where possible
|
|
56
|
+
metrics.typedNodes++;
|
|
57
|
+
metrics.implicitlyTypedNodes++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// For function declarations with no return type
|
|
62
|
+
if ((ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) && !node.type) {
|
|
63
|
+
// In TypeScript, return types are almost always inferred correctly
|
|
64
|
+
metrics.typedNodes++;
|
|
65
|
+
metrics.implicitlyTypedNodes++;
|
|
66
|
+
}
|
|
67
|
+
// For property declarations in classes without type annotations
|
|
68
|
+
if (ts.isPropertyDeclaration(node) && !node.type && node.initializer) {
|
|
69
|
+
// Properties with initializers get inferred types
|
|
70
|
+
metrics.typedNodes++;
|
|
71
|
+
metrics.implicitlyTypedNodes++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Count arrow functions
|
|
76
|
+
if (ts.isArrowFunction(node)) {
|
|
77
|
+
metrics.totalTypeableNodes++;
|
|
78
|
+
// Arrow functions with explicit parameter types or return type
|
|
79
|
+
if (node.type || (node.parameters && node.parameters.some(p => p.type))) {
|
|
80
|
+
metrics.typedNodes++;
|
|
81
|
+
metrics.explicitlyTypedNodes++;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Arrow functions with simple body or object literals are usually well-inferred
|
|
85
|
+
metrics.typedNodes++;
|
|
86
|
+
metrics.implicitlyTypedNodes++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Check for interface and type declarations - these contribute to type safety
|
|
90
|
+
if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) {
|
|
91
|
+
metrics.typedNodes++;
|
|
92
|
+
metrics.totalTypeableNodes++;
|
|
93
|
+
metrics.explicitlyTypedNodes++;
|
|
94
|
+
}
|
|
95
|
+
// Check for all imports (imported modules are well-typed)
|
|
96
|
+
if (ts.isImportDeclaration(node)) {
|
|
97
|
+
metrics.typedNodes++;
|
|
98
|
+
metrics.totalTypeableNodes++;
|
|
99
|
+
metrics.implicitlyTypedNodes++;
|
|
100
|
+
}
|
|
101
|
+
// Check for type assertions
|
|
102
|
+
if (ts.isAsExpression(node) || ts.isTypeAssertion?.(node)) {
|
|
103
|
+
metrics.typeAssertions++;
|
|
104
|
+
}
|
|
105
|
+
// Check for non-null assertions
|
|
106
|
+
if (ts.isNonNullExpression(node)) {
|
|
107
|
+
metrics.nonNullAssertions++;
|
|
108
|
+
}
|
|
109
|
+
// Check for optional properties
|
|
110
|
+
if ((ts.isPropertySignature(node) || ts.isPropertyDeclaration(node)) &&
|
|
111
|
+
node.questionToken) {
|
|
112
|
+
metrics.optionalProperties++;
|
|
113
|
+
}
|
|
114
|
+
// Check for generics usage
|
|
115
|
+
if (ts.isTypeReferenceNode(node) && node.typeArguments) {
|
|
116
|
+
metrics.genericsCount += node.typeArguments.length;
|
|
117
|
+
}
|
|
118
|
+
ts.forEachChild(node, n => visit(n, node));
|
|
119
|
+
}
|
|
120
|
+
visit(sourceFile);
|
|
121
|
+
// Calculate type coverage percentage
|
|
122
|
+
// Look for tsconfig
|
|
123
|
+
let tsconfigPath = path.join(path.dirname(filePath), '..', 'tsconfig.json');
|
|
124
|
+
let tsconfigScore = 0;
|
|
125
|
+
let tsconfigFeatures = [];
|
|
126
|
+
try {
|
|
127
|
+
const tsconfigContent = await fs.readFile(tsconfigPath, 'utf8');
|
|
128
|
+
const tsconfig = JSON.parse(tsconfigContent);
|
|
129
|
+
// Check for strict mode and other type safety features
|
|
130
|
+
if (tsconfig.compilerOptions) {
|
|
131
|
+
if (tsconfig.compilerOptions.strict === true) {
|
|
132
|
+
tsconfigScore += 5;
|
|
133
|
+
tsconfigFeatures.push('strict');
|
|
134
|
+
}
|
|
135
|
+
if (tsconfig.compilerOptions.noImplicitAny === true) {
|
|
136
|
+
tsconfigScore += 3;
|
|
137
|
+
tsconfigFeatures.push('noImplicitAny');
|
|
138
|
+
}
|
|
139
|
+
if (tsconfig.compilerOptions.strictNullChecks === true) {
|
|
140
|
+
tsconfigScore += 3;
|
|
141
|
+
tsconfigFeatures.push('strictNullChecks');
|
|
142
|
+
}
|
|
143
|
+
if (tsconfig.compilerOptions.noImplicitReturns === true) {
|
|
144
|
+
tsconfigScore += 2;
|
|
145
|
+
tsconfigFeatures.push('noImplicitReturns');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
// Try the current directory
|
|
151
|
+
tsconfigPath = path.join(path.dirname(filePath), 'tsconfig.json');
|
|
152
|
+
try {
|
|
153
|
+
const tsconfigContent = await fs.readFile(tsconfigPath, 'utf8');
|
|
154
|
+
const tsconfig = JSON.parse(tsconfigContent);
|
|
155
|
+
// Check for strict mode and other type safety features
|
|
156
|
+
if (tsconfig.compilerOptions) {
|
|
157
|
+
if (tsconfig.compilerOptions.strict === true) {
|
|
158
|
+
tsconfigScore += 5;
|
|
159
|
+
tsconfigFeatures.push('strict');
|
|
160
|
+
}
|
|
161
|
+
if (tsconfig.compilerOptions.noImplicitAny === true) {
|
|
162
|
+
tsconfigScore += 3;
|
|
163
|
+
tsconfigFeatures.push('noImplicitAny');
|
|
164
|
+
}
|
|
165
|
+
if (tsconfig.compilerOptions.strictNullChecks === true) {
|
|
166
|
+
tsconfigScore += 3;
|
|
167
|
+
tsconfigFeatures.push('strictNullChecks');
|
|
168
|
+
}
|
|
169
|
+
if (tsconfig.compilerOptions.noImplicitReturns === true) {
|
|
170
|
+
tsconfigScore += 2;
|
|
171
|
+
tsconfigFeatures.push('noImplicitReturns');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
// tsconfig.json not found or invalid, assume default typings
|
|
177
|
+
tsconfigScore += 5; // Default TypeScript is still quite safe
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// If no typeable nodes found, ensure we have at least one to avoid division by zero
|
|
181
|
+
if (metrics.totalTypeableNodes === 0) {
|
|
182
|
+
metrics.totalTypeableNodes = 1;
|
|
183
|
+
metrics.typedNodes = 1; // Default TypeScript file is actually well-typed
|
|
184
|
+
}
|
|
185
|
+
// Calculate type coverage percentage based on meaningful nodes
|
|
186
|
+
const rawTypeCoverage = (metrics.typedNodes / metrics.totalTypeableNodes) * 100;
|
|
187
|
+
// Calculate explicit vs implicit ratio - this is important for real-world metrics
|
|
188
|
+
const explicitRatio = metrics.explicitlyTypedNodes / Math.max(metrics.typedNodes, 1);
|
|
189
|
+
// Realistically, type-coverage will often show ~95% coverage for well-typed code
|
|
190
|
+
// But we want to give a slightly lower score to encourage explicit type annotations
|
|
191
|
+
// This provides a more realistic metric based on real-world TypeScript projects
|
|
192
|
+
let adjustedTypeCoverage = rawTypeCoverage * (0.75 + (explicitRatio * 0.25));
|
|
193
|
+
// Add tsconfig bonus, but cap it
|
|
194
|
+
const typeCoverage = Math.min(adjustedTypeCoverage + tsconfigScore, 98); // Cap at 98% to be realistic
|
|
195
|
+
// Calculate type safety score (higher is better, scale 0-100)
|
|
196
|
+
const coverageScore = Math.min(typeCoverage, 100) * 0.6; // 60% weight
|
|
197
|
+
const anyPenalty = Math.min((metrics.anyTypeCount / Math.max(metrics.totalTypeableNodes, 1)) * 100, 30) * 0.2; // 20% weight
|
|
198
|
+
const assertionPenalty = Math.min((metrics.typeAssertions / Math.max(metrics.totalTypeableNodes, 1)) * 100, 20) * 0.2; // 20% weight
|
|
199
|
+
const typeSafetyScore = Math.max(0, Math.min(coverageScore - anyPenalty - assertionPenalty, 100));
|
|
200
|
+
// Determine complexity level based on score
|
|
201
|
+
let complexityLevel;
|
|
202
|
+
if (typeSafetyScore >= 80)
|
|
203
|
+
complexityLevel = 'Low';
|
|
204
|
+
else if (typeSafetyScore >= 50)
|
|
205
|
+
complexityLevel = 'Medium';
|
|
206
|
+
else
|
|
207
|
+
complexityLevel = 'High';
|
|
208
|
+
return {
|
|
209
|
+
totalTypeableNodes: metrics.totalTypeableNodes,
|
|
210
|
+
typedNodes: metrics.typedNodes,
|
|
211
|
+
typeCoverage: typeCoverage.toFixed(1),
|
|
212
|
+
anyTypeCount: metrics.anyTypeCount,
|
|
213
|
+
typeAssertions: metrics.typeAssertions,
|
|
214
|
+
nonNullAssertions: metrics.nonNullAssertions,
|
|
215
|
+
optionalProperties: metrics.optionalProperties,
|
|
216
|
+
genericsCount: metrics.genericsCount,
|
|
217
|
+
typeSafetyScore: Math.round(typeSafetyScore),
|
|
218
|
+
typeComplexity: complexityLevel
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
console.error(`Error analyzing TypeScript safety for ${filePath}:`, error);
|
|
223
|
+
return {
|
|
224
|
+
totalTypeableNodes: 0,
|
|
225
|
+
typedNodes: 0,
|
|
226
|
+
typeCoverage: '0.0',
|
|
227
|
+
anyTypeCount: 0,
|
|
228
|
+
typeAssertions: 0,
|
|
229
|
+
nonNullAssertions: 0,
|
|
230
|
+
optionalProperties: 0,
|
|
231
|
+
genericsCount: 0,
|
|
232
|
+
typeSafetyScore: 0,
|
|
233
|
+
typeComplexity: 'N/A'
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export async function calculateProjectTypeSafety(projectPath, fileList) {
|
|
238
|
+
const tsExtensions = ['.ts', '.tsx'];
|
|
239
|
+
const typescriptFiles = fileList.filter(file => tsExtensions.includes(path.extname(file)));
|
|
240
|
+
if (typescriptFiles.length === 0) {
|
|
241
|
+
return {
|
|
242
|
+
tsFileCount: 0,
|
|
243
|
+
tsPercentage: '0.0',
|
|
244
|
+
avgTypeCoverage: '0.0',
|
|
245
|
+
totalAnyCount: 0,
|
|
246
|
+
totalAssertions: 0,
|
|
247
|
+
totalNonNullAssertions: 0,
|
|
248
|
+
avgTypeSafetyScore: 0,
|
|
249
|
+
overallComplexity: 'N/A'
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
let totalTypeCoverage = 0;
|
|
253
|
+
let totalTypeSafetyScore = 0;
|
|
254
|
+
let totalAnyCount = 0;
|
|
255
|
+
let totalAssertions = 0;
|
|
256
|
+
let totalNonNullAssertions = 0;
|
|
257
|
+
for (const file of typescriptFiles) {
|
|
258
|
+
const filePath = path.join(projectPath, file);
|
|
259
|
+
const metrics = await analyzeTypeScriptSafety(filePath);
|
|
260
|
+
totalTypeCoverage += parseFloat(metrics.typeCoverage);
|
|
261
|
+
totalTypeSafetyScore += metrics.typeSafetyScore;
|
|
262
|
+
totalAnyCount += metrics.anyTypeCount;
|
|
263
|
+
totalAssertions += metrics.typeAssertions;
|
|
264
|
+
totalNonNullAssertions += metrics.nonNullAssertions;
|
|
265
|
+
}
|
|
266
|
+
const avgTypeCoverage = (totalTypeCoverage / typescriptFiles.length).toFixed(1);
|
|
267
|
+
const avgTypeSafetyScore = Math.round(totalTypeSafetyScore / typescriptFiles.length);
|
|
268
|
+
// Determine overall complexity
|
|
269
|
+
let overallComplexity;
|
|
270
|
+
if (avgTypeSafetyScore >= 80)
|
|
271
|
+
overallComplexity = 'Low';
|
|
272
|
+
else if (avgTypeSafetyScore >= 50)
|
|
273
|
+
overallComplexity = 'Medium';
|
|
274
|
+
else
|
|
275
|
+
overallComplexity = 'High';
|
|
276
|
+
return {
|
|
277
|
+
tsFileCount: typescriptFiles.length,
|
|
278
|
+
tsPercentage: ((typescriptFiles.length / fileList.length) * 100).toFixed(1),
|
|
279
|
+
avgTypeCoverage,
|
|
280
|
+
totalAnyCount,
|
|
281
|
+
totalAssertions,
|
|
282
|
+
totalNonNullAssertions,
|
|
283
|
+
avgTypeSafetyScore,
|
|
284
|
+
overallComplexity
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=typescript-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-safety.js","sourceRoot":"","sources":["../../src/typescript-safety.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ts-analyzer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"repository": "github:amir-valizadeh/ts-analyzer",
|
|
5
|
+
"description": "Comprehensive TypeScript code analyzer with type safety and complexity metrics",
|
|
6
|
+
"main": "dist/src/index.js",
|
|
7
|
+
"types": "dist/src/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"bin": {
|
|
10
|
+
"ts-analyzer": "dist/bin/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"prepare": "npm run build",
|
|
15
|
+
"start": "node dist/bin/cli.js",
|
|
16
|
+
"dev": "ts-node --esm bin/cli.ts"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"typescript",
|
|
20
|
+
"ts",
|
|
21
|
+
"analyzer",
|
|
22
|
+
"type-safety",
|
|
23
|
+
"code-quality",
|
|
24
|
+
"static-analysis",
|
|
25
|
+
"complexity",
|
|
26
|
+
"react",
|
|
27
|
+
"angular",
|
|
28
|
+
"vue",
|
|
29
|
+
"node"
|
|
30
|
+
],
|
|
31
|
+
"author": "Amir Valizadeh",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"chalk": "^5.3.0",
|
|
35
|
+
"commander": "^11.0.0",
|
|
36
|
+
"espree": "^9.6.1",
|
|
37
|
+
"estraverse": "^5.3.0",
|
|
38
|
+
"ora": "^7.0.1",
|
|
39
|
+
"typescript": "^5.8.3"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/espree": "^10.1.0",
|
|
43
|
+
"@types/estraverse": "^5.1.7",
|
|
44
|
+
"@types/estree": "^1.0.7",
|
|
45
|
+
"@types/node": "^20.17.47",
|
|
46
|
+
"ts-node": "^10.9.2"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=14.16"
|
|
50
|
+
}
|
|
51
|
+
}
|