driftdetect 0.8.0 → 0.8.2

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,380 @@
1
+ /**
2
+ * PHP Command - drift php
3
+ *
4
+ * Analyze PHP projects: routes, error handling, data access, traits.
5
+ *
6
+ * @requirements PHP Language Support
7
+ */
8
+ import { Command } from 'commander';
9
+ import chalk from 'chalk';
10
+ import { createPhpAnalyzer, } from 'driftdetect-core';
11
+ import { createSpinner } from '../ui/spinner.js';
12
+ export function createPhpCommand() {
13
+ const php = new Command('php')
14
+ .description('PHP language analysis commands');
15
+ // drift php status
16
+ php
17
+ .command('status [path]')
18
+ .description('Show PHP project analysis summary')
19
+ .option('-f, --format <format>', 'Output format: text, json', 'text')
20
+ .option('-v, --verbose', 'Enable verbose output')
21
+ .action(async (targetPath, options) => {
22
+ await statusAction(targetPath, options);
23
+ });
24
+ // drift php routes
25
+ php
26
+ .command('routes [path]')
27
+ .description('List all HTTP routes (Laravel, Symfony, Slim, Lumen)')
28
+ .option('-f, --format <format>', 'Output format: text, json', 'text')
29
+ .option('-v, --verbose', 'Enable verbose output')
30
+ .option('--framework <framework>', 'Filter by framework')
31
+ .action(async (targetPath, options) => {
32
+ await routesAction(targetPath, options);
33
+ });
34
+ // drift php errors
35
+ php
36
+ .command('errors [path]')
37
+ .description('Analyze error handling patterns')
38
+ .option('-f, --format <format>', 'Output format: text, json', 'text')
39
+ .option('-v, --verbose', 'Enable verbose output')
40
+ .action(async (targetPath, options) => {
41
+ await errorsAction(targetPath, options);
42
+ });
43
+ // drift php data-access
44
+ php
45
+ .command('data-access [path]')
46
+ .description('Analyze database access patterns (Eloquent, Doctrine, PDO)')
47
+ .option('-f, --format <format>', 'Output format: text, json', 'text')
48
+ .option('-v, --verbose', 'Enable verbose output')
49
+ .action(async (targetPath, options) => {
50
+ await dataAccessAction(targetPath, options);
51
+ });
52
+ // drift php traits
53
+ php
54
+ .command('traits [path]')
55
+ .description('Analyze trait definitions and usage')
56
+ .option('-f, --format <format>', 'Output format: text, json', 'text')
57
+ .option('-v, --verbose', 'Enable verbose output')
58
+ .action(async (targetPath, options) => {
59
+ await traitsAction(targetPath, options);
60
+ });
61
+ return php;
62
+ }
63
+ async function statusAction(targetPath, options) {
64
+ const rootDir = targetPath ?? process.cwd();
65
+ const format = options.format ?? 'text';
66
+ const isTextFormat = format === 'text';
67
+ const spinner = isTextFormat ? createSpinner('Analyzing PHP project...') : null;
68
+ spinner?.start();
69
+ try {
70
+ const analyzer = createPhpAnalyzer({ rootDir, verbose: options.verbose });
71
+ const result = await analyzer.analyze();
72
+ spinner?.stop();
73
+ if (format === 'json') {
74
+ console.log(JSON.stringify({
75
+ project: result.projectInfo,
76
+ frameworks: result.detectedFrameworks,
77
+ stats: result.stats,
78
+ }, null, 2));
79
+ return;
80
+ }
81
+ console.log();
82
+ console.log(chalk.bold('🐘 PHP Project Status'));
83
+ console.log(chalk.gray('═'.repeat(60)));
84
+ console.log();
85
+ console.log(chalk.bold('Project'));
86
+ console.log(chalk.gray('─'.repeat(40)));
87
+ if (result.projectInfo.name) {
88
+ console.log(` Name: ${chalk.cyan(result.projectInfo.name)}`);
89
+ }
90
+ if (result.projectInfo.version) {
91
+ console.log(` Version: ${chalk.cyan(result.projectInfo.version)}`);
92
+ }
93
+ if (result.projectInfo.framework) {
94
+ console.log(` Framework: ${chalk.cyan(result.projectInfo.framework)}`);
95
+ }
96
+ console.log(` Files: ${chalk.cyan(result.projectInfo.files)}`);
97
+ console.log();
98
+ if (result.detectedFrameworks.length > 0) {
99
+ console.log(chalk.bold('Detected Frameworks'));
100
+ console.log(chalk.gray('─'.repeat(40)));
101
+ for (const fw of result.detectedFrameworks) {
102
+ console.log(` • ${fw}`);
103
+ }
104
+ console.log();
105
+ }
106
+ console.log(chalk.bold('Statistics'));
107
+ console.log(chalk.gray('─'.repeat(40)));
108
+ console.log(` Classes: ${chalk.cyan(result.stats.classCount)}`);
109
+ console.log(` Traits: ${chalk.cyan(result.stats.traitCount)}`);
110
+ console.log(` Interfaces: ${chalk.cyan(result.stats.interfaceCount)}`);
111
+ console.log(` Functions: ${chalk.cyan(result.stats.functionCount)}`);
112
+ console.log(` Methods: ${chalk.cyan(result.stats.methodCount)}`);
113
+ console.log(` Lines of Code: ${chalk.cyan(result.stats.linesOfCode.toLocaleString())}`);
114
+ console.log(` Test Files: ${chalk.cyan(result.stats.testFileCount)}`);
115
+ console.log(` Analysis Time: ${chalk.gray(`${result.stats.analysisTimeMs.toFixed(0)}ms`)}`);
116
+ console.log();
117
+ console.log(chalk.gray('─'.repeat(60)));
118
+ console.log(chalk.bold('šŸ“Œ Next Steps:'));
119
+ console.log(chalk.gray(` • drift php routes ${chalk.white('View HTTP routes')}`));
120
+ console.log(chalk.gray(` • drift php errors ${chalk.white('Analyze error handling')}`));
121
+ console.log(chalk.gray(` • drift php data-access ${chalk.white('View data access patterns')}`));
122
+ console.log(chalk.gray(` • drift php traits ${chalk.white('View trait usage')}`));
123
+ console.log();
124
+ }
125
+ catch (error) {
126
+ spinner?.stop();
127
+ if (format === 'json') {
128
+ console.log(JSON.stringify({ error: String(error) }));
129
+ }
130
+ else {
131
+ console.log(chalk.red(`\nāŒ Error: ${error}`));
132
+ }
133
+ }
134
+ }
135
+ async function routesAction(targetPath, options) {
136
+ const rootDir = targetPath ?? process.cwd();
137
+ const format = options.format ?? 'text';
138
+ const isTextFormat = format === 'text';
139
+ const spinner = isTextFormat ? createSpinner('Analyzing routes...') : null;
140
+ spinner?.start();
141
+ try {
142
+ const analyzer = createPhpAnalyzer({ rootDir, verbose: options.verbose });
143
+ const result = await analyzer.analyzeRoutes();
144
+ spinner?.stop();
145
+ let routes = result.routes;
146
+ if (options.framework) {
147
+ routes = routes.filter((r) => r.framework === options.framework);
148
+ }
149
+ if (format === 'json') {
150
+ console.log(JSON.stringify({ total: routes.length, byFramework: result.byFramework, routes }, null, 2));
151
+ return;
152
+ }
153
+ console.log();
154
+ console.log(chalk.bold('šŸ›£ļø PHP HTTP Routes'));
155
+ console.log(chalk.gray('─'.repeat(60)));
156
+ console.log();
157
+ if (routes.length === 0) {
158
+ console.log(chalk.gray('No routes found'));
159
+ console.log();
160
+ return;
161
+ }
162
+ const byFramework = new Map();
163
+ for (const route of routes) {
164
+ const existing = byFramework.get(route.framework) ?? [];
165
+ existing.push(route);
166
+ byFramework.set(route.framework, existing);
167
+ }
168
+ for (const [framework, frameworkRoutes] of byFramework) {
169
+ console.log(chalk.bold(`${framework} (${frameworkRoutes.length} routes)`));
170
+ for (const route of frameworkRoutes) {
171
+ const methodColor = getMethodColor(route.method);
172
+ console.log(` ${methodColor(route.method.padEnd(7))} ${route.path}`);
173
+ console.log(chalk.gray(` → ${route.handler} (${route.file}:${route.line})`));
174
+ if (route.middleware.length > 0) {
175
+ console.log(chalk.gray(` middleware: ${route.middleware.join(', ')}`));
176
+ }
177
+ }
178
+ console.log();
179
+ }
180
+ console.log(`Total: ${chalk.cyan(routes.length)} routes`);
181
+ console.log();
182
+ }
183
+ catch (error) {
184
+ spinner?.stop();
185
+ if (format === 'json') {
186
+ console.log(JSON.stringify({ error: String(error) }));
187
+ }
188
+ else {
189
+ console.log(chalk.red(`\nāŒ Error: ${error}`));
190
+ }
191
+ }
192
+ }
193
+ async function errorsAction(targetPath, options) {
194
+ const rootDir = targetPath ?? process.cwd();
195
+ const format = options.format ?? 'text';
196
+ const isTextFormat = format === 'text';
197
+ const spinner = isTextFormat ? createSpinner('Analyzing error handling...') : null;
198
+ spinner?.start();
199
+ try {
200
+ const analyzer = createPhpAnalyzer({ rootDir, verbose: options.verbose });
201
+ const result = await analyzer.analyzeErrorHandling();
202
+ spinner?.stop();
203
+ if (format === 'json') {
204
+ console.log(JSON.stringify(result, null, 2));
205
+ return;
206
+ }
207
+ console.log();
208
+ console.log(chalk.bold('āš ļø Error Handling Analysis'));
209
+ console.log(chalk.gray('─'.repeat(60)));
210
+ console.log();
211
+ console.log(`Try-Catch Blocks: ${chalk.cyan(result.stats.tryCatchBlocks)}`);
212
+ console.log(`Throw Statements: ${chalk.cyan(result.stats.throwStatements)}`);
213
+ console.log(`Custom Exceptions: ${chalk.cyan(result.stats.customExceptions)}`);
214
+ console.log(`Error Handlers: ${chalk.cyan(result.stats.errorHandlers)}`);
215
+ console.log();
216
+ const patternCounts = {
217
+ 'try-catch': result.patterns.filter((p) => p.type === 'try-catch').length,
218
+ 'throw': result.patterns.filter((p) => p.type === 'throw').length,
219
+ 'custom-exception': result.patterns.filter((p) => p.type === 'custom-exception').length,
220
+ 'error-handler': result.patterns.filter((p) => p.type === 'error-handler').length,
221
+ };
222
+ console.log(chalk.bold('Pattern Breakdown:'));
223
+ console.log(` Try-Catch: ${chalk.cyan(patternCounts['try-catch'])}`);
224
+ console.log(` Throw: ${chalk.yellow(patternCounts['throw'])}`);
225
+ console.log(` Custom Exception: ${chalk.blue(patternCounts['custom-exception'])}`);
226
+ console.log(` Error Handler: ${chalk.green(patternCounts['error-handler'])}`);
227
+ console.log();
228
+ if (result.issues.length > 0) {
229
+ console.log(chalk.bold('Issues:'));
230
+ for (const issue of result.issues.slice(0, 10)) {
231
+ console.log(` ${chalk.yellow('⚠')} ${issue.file}:${issue.line}`);
232
+ console.log(chalk.gray(` ${issue.message}`));
233
+ if (issue.suggestion) {
234
+ console.log(chalk.gray(` → ${issue.suggestion}`));
235
+ }
236
+ }
237
+ if (result.issues.length > 10) {
238
+ console.log(chalk.gray(` ... and ${result.issues.length - 10} more`));
239
+ }
240
+ console.log();
241
+ }
242
+ }
243
+ catch (error) {
244
+ spinner?.stop();
245
+ if (format === 'json') {
246
+ console.log(JSON.stringify({ error: String(error) }));
247
+ }
248
+ else {
249
+ console.log(chalk.red(`\nāŒ Error: ${error}`));
250
+ }
251
+ }
252
+ }
253
+ async function dataAccessAction(targetPath, options) {
254
+ const rootDir = targetPath ?? process.cwd();
255
+ const format = options.format ?? 'text';
256
+ const isTextFormat = format === 'text';
257
+ const spinner = isTextFormat ? createSpinner('Analyzing data access patterns...') : null;
258
+ spinner?.start();
259
+ try {
260
+ const analyzer = createPhpAnalyzer({ rootDir, verbose: options.verbose });
261
+ const result = await analyzer.analyzeDataAccess();
262
+ spinner?.stop();
263
+ if (format === 'json') {
264
+ console.log(JSON.stringify(result, null, 2));
265
+ return;
266
+ }
267
+ console.log();
268
+ console.log(chalk.bold('šŸ—„ļø Data Access Patterns'));
269
+ console.log(chalk.gray('─'.repeat(60)));
270
+ console.log();
271
+ console.log(`Total Access Points: ${chalk.cyan(result.accessPoints.length)}`);
272
+ console.log(`Models: ${chalk.cyan(result.models.length)}`);
273
+ console.log();
274
+ console.log(chalk.bold('By Framework:'));
275
+ for (const [framework, count] of Object.entries(result.byFramework)) {
276
+ console.log(` ${framework}: ${chalk.cyan(count)}`);
277
+ }
278
+ console.log();
279
+ console.log(chalk.bold('By Operation:'));
280
+ for (const [operation, count] of Object.entries(result.byOperation)) {
281
+ const opColor = operation === 'read' ? chalk.green :
282
+ operation === 'write' ? chalk.blue :
283
+ operation === 'update' ? chalk.yellow :
284
+ operation === 'delete' ? chalk.red : chalk.gray;
285
+ console.log(` ${opColor(operation)}: ${chalk.cyan(count)}`);
286
+ }
287
+ console.log();
288
+ if (result.models.length > 0) {
289
+ console.log(chalk.bold('Models Accessed:'));
290
+ for (const model of result.models) {
291
+ console.log(` • ${model}`);
292
+ }
293
+ console.log();
294
+ }
295
+ }
296
+ catch (error) {
297
+ spinner?.stop();
298
+ if (format === 'json') {
299
+ console.log(JSON.stringify({ error: String(error) }));
300
+ }
301
+ else {
302
+ console.log(chalk.red(`\nāŒ Error: ${error}`));
303
+ }
304
+ }
305
+ }
306
+ async function traitsAction(targetPath, options) {
307
+ const rootDir = targetPath ?? process.cwd();
308
+ const format = options.format ?? 'text';
309
+ const isTextFormat = format === 'text';
310
+ const spinner = isTextFormat ? createSpinner('Analyzing traits...') : null;
311
+ spinner?.start();
312
+ try {
313
+ const analyzer = createPhpAnalyzer({ rootDir, verbose: options.verbose });
314
+ const result = await analyzer.analyzeTraits();
315
+ spinner?.stop();
316
+ if (format === 'json') {
317
+ console.log(JSON.stringify(result, null, 2));
318
+ return;
319
+ }
320
+ console.log();
321
+ console.log(chalk.bold('🧩 Trait Analysis'));
322
+ console.log(chalk.gray('─'.repeat(60)));
323
+ console.log();
324
+ console.log(`Traits Defined: ${chalk.cyan(result.traits.length)}`);
325
+ console.log(`Trait Usages: ${chalk.cyan(result.usages.length)}`);
326
+ console.log();
327
+ if (result.traits.length === 0) {
328
+ console.log(chalk.gray('No traits found'));
329
+ console.log();
330
+ return;
331
+ }
332
+ console.log(chalk.bold('Traits:'));
333
+ for (const trait of result.traits.slice(0, 15)) {
334
+ console.log(` ${chalk.cyan(trait.name)} (${trait.methods.length} methods)`);
335
+ console.log(chalk.gray(` ${trait.file}:${trait.line}`));
336
+ if (trait.methods.length > 0 && options.verbose) {
337
+ console.log(chalk.gray(` methods: ${trait.methods.join(', ')}`));
338
+ }
339
+ }
340
+ if (result.traits.length > 15) {
341
+ console.log(chalk.gray(` ... and ${result.traits.length - 15} more`));
342
+ }
343
+ console.log();
344
+ if (result.usages.length > 0) {
345
+ console.log(chalk.bold('Trait Usages:'));
346
+ for (const usage of result.usages.slice(0, 15)) {
347
+ console.log(` ${chalk.cyan(usage.trait)} → ${usage.usedIn}`);
348
+ console.log(chalk.gray(` ${usage.file}:${usage.line}`));
349
+ }
350
+ if (result.usages.length > 15) {
351
+ console.log(chalk.gray(` ... and ${result.usages.length - 15} more`));
352
+ }
353
+ console.log();
354
+ }
355
+ }
356
+ catch (error) {
357
+ spinner?.stop();
358
+ if (format === 'json') {
359
+ console.log(JSON.stringify({ error: String(error) }));
360
+ }
361
+ else {
362
+ console.log(chalk.red(`\nāŒ Error: ${error}`));
363
+ }
364
+ }
365
+ }
366
+ function getMethodColor(method) {
367
+ const colors = {
368
+ GET: chalk.green,
369
+ POST: chalk.blue,
370
+ PUT: chalk.yellow,
371
+ DELETE: chalk.red,
372
+ PATCH: chalk.magenta,
373
+ HEAD: chalk.cyan,
374
+ OPTIONS: chalk.gray,
375
+ ALL: chalk.white,
376
+ ANY: chalk.white,
377
+ };
378
+ return colors[method] ?? chalk.white;
379
+ }
380
+ //# sourceMappingURL=php.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php.js","sourceRoot":"","sources":["../../src/commands/php.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Python Command - drift py
3
+ *
4
+ * Analyze Python projects: routes, error handling, data access, async patterns.
5
+ *
6
+ * @requirements Python Language Support
7
+ */
8
+ import { Command } from 'commander';
9
+ export interface PyOptions {
10
+ format?: 'text' | 'json';
11
+ verbose?: boolean;
12
+ framework?: string;
13
+ }
14
+ export declare function createPyCommand(): Command;
15
+ //# sourceMappingURL=py.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"py.d.ts","sourceRoot":"","sources":["../../src/commands/py.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,IAAI,OAAO,CAkEzC"}