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.
@@ -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,6 @@
1
+ /**
2
+ * Simple table formatter that handles ANSI color codes correctly
3
+ */
4
+ export declare function formatTable(data: Array<Record<string, any>>, options?: {
5
+ title?: string;
6
+ }): void;
@@ -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
+ }