driftdetect-dashboard 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/client/assets/{GalaxyTab-Bc9PKsMk.js → GalaxyTab-BsAmWarF.js} +4 -4
  2. package/dist/client/assets/{GalaxyTab-Bc9PKsMk.js.map → GalaxyTab-BsAmWarF.js.map} +1 -1
  3. package/dist/client/assets/main-CVl-4C5E.css +2 -0
  4. package/dist/client/assets/main-QuEZvA3i.js +59 -0
  5. package/dist/client/assets/main-QuEZvA3i.js.map +1 -0
  6. package/dist/client/assets/{sfxr-CO3_Kukg.js → sfxr-Cr89uVKo.js} +2 -2
  7. package/dist/client/assets/{sfxr-CO3_Kukg.js.map → sfxr-Cr89uVKo.js.map} +1 -1
  8. package/dist/client/index.html +2 -2
  9. package/dist/server/api-routes.d.ts.map +1 -1
  10. package/dist/server/quality-gates-api.d.ts.map +1 -0
  11. package/package.json +21 -21
  12. package/LICENSE +0 -21
  13. package/dist/client/assets/main-BdVQNGtK.js +0 -59
  14. package/dist/client/assets/main-BdVQNGtK.js.map +0 -1
  15. package/dist/client/assets/main-NejYwKFb.css +0 -2
  16. package/dist/server/api-routes.d.ts +0 -50
  17. package/dist/server/api-routes.js +0 -634
  18. package/dist/server/api-routes.js.map +0 -1
  19. package/dist/server/dashboard-server.d.ts +0 -64
  20. package/dist/server/dashboard-server.js +0 -154
  21. package/dist/server/dashboard-server.js.map +0 -1
  22. package/dist/server/drift-data-reader.d.ts +0 -522
  23. package/dist/server/drift-data-reader.js +0 -1550
  24. package/dist/server/drift-data-reader.js.map +0 -1
  25. package/dist/server/express-app.d.ts +0 -24
  26. package/dist/server/express-app.js +0 -74
  27. package/dist/server/express-app.js.map +0 -1
  28. package/dist/server/galaxy-data-transformer.d.ts +0 -178
  29. package/dist/server/galaxy-data-transformer.js +0 -562
  30. package/dist/server/galaxy-data-transformer.js.map +0 -1
  31. package/dist/server/index.d.ts +0 -20
  32. package/dist/server/index.js +0 -14
  33. package/dist/server/index.js.map +0 -1
  34. package/dist/server/pattern-watcher.d.ts +0 -55
  35. package/dist/server/pattern-watcher.d.ts.map +0 -1
  36. package/dist/server/pattern-watcher.js +0 -157
  37. package/dist/server/pattern-watcher.js.map +0 -1
  38. package/dist/server/websocket-server.d.ts +0 -83
  39. package/dist/server/websocket-server.js +0 -189
  40. package/dist/server/websocket-server.js.map +0 -1
@@ -1,634 +0,0 @@
1
- /**
2
- * API Routes for the Drift Dashboard
3
- *
4
- * Provides REST API endpoints for patterns, violations, files, stats, and config.
5
- *
6
- * @requirements 8.1 - GET `/api/patterns` to list all patterns
7
- * @requirements 8.2 - GET `/api/patterns/:id` to get pattern details with locations
8
- * @requirements 8.3 - POST `/api/patterns/:id/approve` to approve a pattern
9
- * @requirements 8.4 - POST `/api/patterns/:id/ignore` to ignore a pattern
10
- * @requirements 8.5 - DELETE `/api/patterns/:id` to delete a pattern
11
- * @requirements 8.6 - GET `/api/violations` to list all violations
12
- * @requirements 8.7 - GET `/api/files` to get the file tree
13
- * @requirements 8.8 - GET `/api/files/:path` to get patterns and violations for a specific file
14
- * @requirements 8.9 - GET `/api/stats` to get overview statistics
15
- * @requirements 8.10 - GET `/api/config` to get configuration
16
- * @requirements 8.11 - PUT `/api/config` to update configuration
17
- * @requirements 8.12 - Return appropriate HTTP status codes and error messages
18
- */
19
- import { Router } from 'express';
20
- import { DriftDataReader } from './drift-data-reader.js';
21
- import { createGalaxyDataTransformer } from './galaxy-data-transformer.js';
22
- import { getProjectRegistry } from 'driftdetect-core';
23
- // ============================================================================
24
- // Error Classes
25
- // ============================================================================
26
- export class NotFoundError extends Error {
27
- statusCode = 404;
28
- constructor(message) {
29
- super(message);
30
- this.name = 'NotFoundError';
31
- }
32
- }
33
- export class BadRequestError extends Error {
34
- statusCode = 400;
35
- constructor(message) {
36
- super(message);
37
- this.name = 'BadRequestError';
38
- }
39
- }
40
- export class InternalServerError extends Error {
41
- statusCode = 500;
42
- constructor(message) {
43
- super(message);
44
- this.name = 'InternalServerError';
45
- }
46
- }
47
- // ============================================================================
48
- // API Routes Factory
49
- // ============================================================================
50
- /**
51
- * Create API routes for the dashboard
52
- * @param reader - DriftDataReader instance for accessing drift data
53
- */
54
- export function createApiRoutes(reader) {
55
- const router = Router();
56
- // ==========================================================================
57
- // Pattern Routes
58
- // ==========================================================================
59
- /**
60
- * GET /api/patterns - List all patterns with optional filters
61
- * @requirements 8.1
62
- */
63
- router.get('/patterns', async (req, res, next) => {
64
- try {
65
- const query = {};
66
- if (req.query['category']) {
67
- query.category = req.query['category'];
68
- }
69
- if (req.query['status']) {
70
- query.status = req.query['status'];
71
- }
72
- if (req.query['minConfidence']) {
73
- query.minConfidence = parseFloat(req.query['minConfidence']);
74
- }
75
- if (req.query['search']) {
76
- query.search = req.query['search'];
77
- }
78
- const patterns = await reader.getPatterns(query);
79
- res.json(patterns);
80
- }
81
- catch (error) {
82
- next(error);
83
- }
84
- });
85
- /**
86
- * GET /api/patterns/:id - Get pattern with locations
87
- * @requirements 8.2
88
- */
89
- router.get('/patterns/:id', async (req, res, next) => {
90
- try {
91
- const { id } = req.params;
92
- if (!id) {
93
- throw new BadRequestError('Pattern ID is required');
94
- }
95
- const pattern = await reader.getPattern(id);
96
- if (!pattern) {
97
- throw new NotFoundError(`Pattern not found: ${id}`);
98
- }
99
- res.json(pattern);
100
- }
101
- catch (error) {
102
- next(error);
103
- }
104
- });
105
- /**
106
- * POST /api/patterns/:id/approve - Approve a pattern
107
- * @requirements 8.3
108
- */
109
- router.post('/patterns/:id/approve', async (req, res, next) => {
110
- try {
111
- const { id } = req.params;
112
- if (!id) {
113
- throw new BadRequestError('Pattern ID is required');
114
- }
115
- await reader.approvePattern(id);
116
- res.json({ success: true, message: `Pattern ${id} approved` });
117
- }
118
- catch (error) {
119
- if (error instanceof Error && error.message.includes('not found')) {
120
- next(new NotFoundError(error.message));
121
- }
122
- else {
123
- next(error);
124
- }
125
- }
126
- });
127
- /**
128
- * POST /api/patterns/:id/ignore - Ignore a pattern
129
- * @requirements 8.4
130
- */
131
- router.post('/patterns/:id/ignore', async (req, res, next) => {
132
- try {
133
- const { id } = req.params;
134
- if (!id) {
135
- throw new BadRequestError('Pattern ID is required');
136
- }
137
- await reader.ignorePattern(id);
138
- res.json({ success: true, message: `Pattern ${id} ignored` });
139
- }
140
- catch (error) {
141
- if (error instanceof Error && error.message.includes('not found')) {
142
- next(new NotFoundError(error.message));
143
- }
144
- else {
145
- next(error);
146
- }
147
- }
148
- });
149
- /**
150
- * POST /api/patterns/bulk-approve - Bulk approve multiple patterns
151
- * Accepts an array of pattern IDs to approve at once
152
- */
153
- router.post('/patterns/bulk-approve', async (req, res, next) => {
154
- try {
155
- const { ids } = req.body;
156
- if (!ids || !Array.isArray(ids) || ids.length === 0) {
157
- throw new BadRequestError('Array of pattern IDs is required');
158
- }
159
- const results = [];
160
- for (const id of ids) {
161
- try {
162
- await reader.approvePattern(id);
163
- results.push({ id, success: true });
164
- }
165
- catch (error) {
166
- results.push({
167
- id,
168
- success: false,
169
- error: error instanceof Error ? error.message : 'Unknown error'
170
- });
171
- }
172
- }
173
- const successCount = results.filter(r => r.success).length;
174
- res.json({
175
- success: true,
176
- message: `Approved ${successCount} of ${ids.length} patterns`,
177
- results
178
- });
179
- }
180
- catch (error) {
181
- next(error);
182
- }
183
- });
184
- /**
185
- * DELETE /api/patterns/:id - Delete a pattern
186
- * @requirements 8.5
187
- */
188
- router.delete('/patterns/:id', async (req, res, next) => {
189
- try {
190
- const { id } = req.params;
191
- if (!id) {
192
- throw new BadRequestError('Pattern ID is required');
193
- }
194
- await reader.deletePattern(id);
195
- res.json({ success: true, message: `Pattern ${id} deleted` });
196
- }
197
- catch (error) {
198
- if (error instanceof Error && error.message.includes('not found')) {
199
- next(new NotFoundError(error.message));
200
- }
201
- else {
202
- next(error);
203
- }
204
- }
205
- });
206
- // ==========================================================================
207
- // Violation Routes
208
- // ==========================================================================
209
- /**
210
- * GET /api/violations - List all violations with optional filters
211
- * @requirements 8.6
212
- */
213
- router.get('/violations', async (req, res, next) => {
214
- try {
215
- const query = {};
216
- if (req.query['severity']) {
217
- query.severity = req.query['severity'];
218
- }
219
- if (req.query['file']) {
220
- query.file = req.query['file'];
221
- }
222
- if (req.query['patternId']) {
223
- query.patternId = req.query['patternId'];
224
- }
225
- if (req.query['search']) {
226
- query.search = req.query['search'];
227
- }
228
- const violations = await reader.getViolations(query);
229
- res.json(violations);
230
- }
231
- catch (error) {
232
- next(error);
233
- }
234
- });
235
- /**
236
- * GET /api/snippet - Get code snippet for a file location
237
- */
238
- router.get('/snippet', async (req, res, next) => {
239
- try {
240
- const file = req.query['file'];
241
- const line = parseInt(req.query['line'], 10);
242
- const context = parseInt(req.query['context'], 10) || 3;
243
- if (!file) {
244
- throw new BadRequestError('File path is required');
245
- }
246
- if (isNaN(line)) {
247
- throw new BadRequestError('Line number is required');
248
- }
249
- const snippet = await reader.getCodeSnippet(file, line, context);
250
- if (!snippet) {
251
- throw new NotFoundError(`Could not read file: ${file}`);
252
- }
253
- res.json(snippet);
254
- }
255
- catch (error) {
256
- next(error);
257
- }
258
- });
259
- // ==========================================================================
260
- // File Routes
261
- // ==========================================================================
262
- /**
263
- * GET /api/files - Get file tree
264
- * @requirements 8.7
265
- */
266
- router.get('/files', async (_req, res, next) => {
267
- try {
268
- const fileTree = await reader.getFileTree();
269
- res.json(fileTree);
270
- }
271
- catch (error) {
272
- next(error);
273
- }
274
- });
275
- /**
276
- * GET /api/files/* - Get file details (wildcard path)
277
- * @requirements 8.8
278
- */
279
- router.get('/files/*', async (req, res, next) => {
280
- try {
281
- // Extract the file path from the wildcard
282
- const filePath = req.params[0];
283
- if (!filePath) {
284
- throw new BadRequestError('File path is required');
285
- }
286
- const fileDetails = await reader.getFileDetails(filePath);
287
- if (!fileDetails) {
288
- throw new NotFoundError(`File not found or has no patterns/violations: ${filePath}`);
289
- }
290
- res.json(fileDetails);
291
- }
292
- catch (error) {
293
- next(error);
294
- }
295
- });
296
- // ==========================================================================
297
- // Stats Routes
298
- // ==========================================================================
299
- /**
300
- * GET /api/stats - Get dashboard statistics
301
- * @requirements 8.9
302
- */
303
- router.get('/stats', async (_req, res, next) => {
304
- try {
305
- const stats = await reader.getStats();
306
- res.json(stats);
307
- }
308
- catch (error) {
309
- next(error);
310
- }
311
- });
312
- // ==========================================================================
313
- // Config Routes
314
- // ==========================================================================
315
- /**
316
- * GET /api/config - Get configuration
317
- * @requirements 8.10
318
- */
319
- router.get('/config', async (_req, res, next) => {
320
- try {
321
- const config = await reader.getConfig();
322
- res.json(config);
323
- }
324
- catch (error) {
325
- next(error);
326
- }
327
- });
328
- /**
329
- * PUT /api/config - Update configuration
330
- * @requirements 8.11
331
- */
332
- router.put('/config', async (req, res, next) => {
333
- try {
334
- const partialConfig = req.body;
335
- if (!partialConfig || typeof partialConfig !== 'object') {
336
- throw new BadRequestError('Invalid configuration format');
337
- }
338
- await reader.updateConfig(partialConfig);
339
- const updatedConfig = await reader.getConfig();
340
- res.json(updatedConfig);
341
- }
342
- catch (error) {
343
- next(error);
344
- }
345
- });
346
- // ==========================================================================
347
- // Contract Routes (BE↔FE mismatch detection)
348
- // ==========================================================================
349
- /**
350
- * GET /api/contracts - List all contracts with optional filters
351
- */
352
- router.get('/contracts', async (req, res, next) => {
353
- try {
354
- const query = {};
355
- if (req.query['status']) {
356
- query.status = req.query['status'];
357
- }
358
- if (req.query['method']) {
359
- query.method = req.query['method'];
360
- }
361
- if (req.query['hasMismatches'] !== undefined) {
362
- query.hasMismatches = req.query['hasMismatches'] === 'true';
363
- }
364
- if (req.query['search']) {
365
- query.search = req.query['search'];
366
- }
367
- const contracts = await reader.getContracts(query);
368
- res.json(contracts);
369
- }
370
- catch (error) {
371
- next(error);
372
- }
373
- });
374
- /**
375
- * GET /api/contracts/stats - Get contract statistics
376
- */
377
- router.get('/contracts/stats', async (_req, res, next) => {
378
- try {
379
- const stats = await reader.getContractStats();
380
- res.json(stats);
381
- }
382
- catch (error) {
383
- next(error);
384
- }
385
- });
386
- /**
387
- * GET /api/contracts/:id - Get contract details
388
- */
389
- router.get('/contracts/:id', async (req, res, next) => {
390
- try {
391
- const { id } = req.params;
392
- if (!id) {
393
- throw new BadRequestError('Contract ID is required');
394
- }
395
- const contract = await reader.getContract(id);
396
- if (!contract) {
397
- throw new NotFoundError(`Contract not found: ${id}`);
398
- }
399
- res.json(contract);
400
- }
401
- catch (error) {
402
- next(error);
403
- }
404
- });
405
- /**
406
- * POST /api/contracts/:id/verify - Verify a contract
407
- */
408
- router.post('/contracts/:id/verify', async (req, res, next) => {
409
- try {
410
- const { id } = req.params;
411
- if (!id) {
412
- throw new BadRequestError('Contract ID is required');
413
- }
414
- await reader.verifyContract(id);
415
- res.json({ success: true, message: `Contract ${id} verified` });
416
- }
417
- catch (error) {
418
- if (error instanceof Error && error.message.includes('not found')) {
419
- next(new NotFoundError(error.message));
420
- }
421
- else {
422
- next(error);
423
- }
424
- }
425
- });
426
- /**
427
- * POST /api/contracts/:id/ignore - Ignore a contract
428
- */
429
- router.post('/contracts/:id/ignore', async (req, res, next) => {
430
- try {
431
- const { id } = req.params;
432
- if (!id) {
433
- throw new BadRequestError('Contract ID is required');
434
- }
435
- await reader.ignoreContract(id);
436
- res.json({ success: true, message: `Contract ${id} ignored` });
437
- }
438
- catch (error) {
439
- if (error instanceof Error && error.message.includes('not found')) {
440
- next(new NotFoundError(error.message));
441
- }
442
- else {
443
- next(error);
444
- }
445
- }
446
- });
447
- // ==========================================================================
448
- // Trend / History Routes
449
- // ==========================================================================
450
- /**
451
- * GET /api/trends - Get pattern trend summary
452
- * Query params: period (7d, 30d, 90d)
453
- */
454
- router.get('/trends', async (req, res, next) => {
455
- try {
456
- const period = req.query['period'] || '7d';
457
- if (!['7d', '30d', '90d'].includes(period)) {
458
- throw new BadRequestError('Invalid period. Use 7d, 30d, or 90d');
459
- }
460
- const trends = await reader.getTrends(period);
461
- if (!trends) {
462
- res.json({
463
- message: 'Not enough history data. Run more scans to see trends.',
464
- period,
465
- regressions: [],
466
- improvements: [],
467
- stable: 0,
468
- overallTrend: 'stable',
469
- healthDelta: 0,
470
- categoryTrends: {},
471
- });
472
- return;
473
- }
474
- res.json(trends);
475
- }
476
- catch (error) {
477
- next(error);
478
- }
479
- });
480
- /**
481
- * GET /api/trends/snapshots - Get historical snapshots for charting
482
- * Query params: limit (default 30)
483
- */
484
- router.get('/trends/snapshots', async (req, res, next) => {
485
- try {
486
- const limit = parseInt(req.query['limit'], 10) || 30;
487
- const snapshots = await reader.getSnapshots(limit);
488
- res.json(snapshots);
489
- }
490
- catch (error) {
491
- next(error);
492
- }
493
- });
494
- // ==========================================================================
495
- // Galaxy Routes (3D Database Visualization)
496
- // ==========================================================================
497
- /**
498
- * GET /api/galaxy - Get Galaxy visualization data
499
- *
500
- * Transforms boundary scanner and call graph data into the format
501
- * required by the 3D Galaxy visualization.
502
- */
503
- router.get('/galaxy', async (_req, res, next) => {
504
- try {
505
- const transformer = createGalaxyDataTransformer(reader.directory);
506
- const galaxyData = await transformer.transform();
507
- res.json(galaxyData);
508
- }
509
- catch (error) {
510
- next(error);
511
- }
512
- });
513
- // ==========================================================================
514
- // Project Routes (Multi-project management)
515
- // ==========================================================================
516
- /**
517
- * GET /api/projects - List all registered projects
518
- */
519
- router.get('/projects', async (_req, res, next) => {
520
- try {
521
- const registry = await getProjectRegistry();
522
- const projects = registry.getValid();
523
- const activeProject = registry.getActive();
524
- // Sort by last accessed
525
- projects.sort((a, b) => new Date(b.lastAccessedAt).getTime() -
526
- new Date(a.lastAccessedAt).getTime());
527
- res.json({
528
- totalProjects: registry.count,
529
- activeProject: activeProject?.name ?? null,
530
- projects: projects.map((p) => ({
531
- id: p.id,
532
- name: p.name,
533
- path: p.path,
534
- language: p.language,
535
- framework: p.framework,
536
- health: p.health,
537
- healthScore: p.healthScore,
538
- lastAccessedAt: p.lastAccessedAt,
539
- isActive: p.id === activeProject?.id,
540
- isValid: p.isValid !== false,
541
- })),
542
- });
543
- }
544
- catch (error) {
545
- next(error);
546
- }
547
- });
548
- /**
549
- * POST /api/projects/switch - Switch active project
550
- */
551
- router.post('/projects/switch', async (req, res, next) => {
552
- try {
553
- const { projectId } = req.body;
554
- if (!projectId) {
555
- throw new BadRequestError('Project ID is required');
556
- }
557
- const registry = await getProjectRegistry();
558
- const project = registry.get(projectId);
559
- if (!project) {
560
- throw new NotFoundError(`Project not found: ${projectId}`);
561
- }
562
- await registry.setActive(projectId);
563
- res.json({
564
- success: true,
565
- message: `Switched to ${project.name}`,
566
- project: {
567
- id: project.id,
568
- name: project.name,
569
- path: project.path,
570
- },
571
- });
572
- }
573
- catch (error) {
574
- next(error);
575
- }
576
- });
577
- /**
578
- * GET /api/projects/:id - Get project details
579
- */
580
- router.get('/projects/:id', async (req, res, next) => {
581
- try {
582
- const { id } = req.params;
583
- if (!id) {
584
- throw new BadRequestError('Project ID is required');
585
- }
586
- const registry = await getProjectRegistry();
587
- const project = registry.get(id);
588
- if (!project) {
589
- throw new NotFoundError(`Project not found: ${id}`);
590
- }
591
- const activeProject = registry.getActive();
592
- res.json({
593
- ...project,
594
- isActive: project.id === activeProject?.id,
595
- });
596
- }
597
- catch (error) {
598
- next(error);
599
- }
600
- });
601
- return router;
602
- }
603
- // ============================================================================
604
- // Error Handling Middleware
605
- // ============================================================================
606
- /**
607
- * Error handling middleware for API routes
608
- * @requirements 8.12 - Return appropriate HTTP status codes and error messages
609
- */
610
- export function errorHandler(err, _req, res, _next) {
611
- // Determine status code
612
- const statusCode = 'statusCode' in err ? err.statusCode : 500;
613
- // Log server errors
614
- if (statusCode >= 500) {
615
- console.error('Server error:', err);
616
- }
617
- // Send JSON error response
618
- res.status(statusCode).json({
619
- error: err.name || 'Error',
620
- message: err.message || 'An unexpected error occurred',
621
- statusCode,
622
- });
623
- }
624
- /**
625
- * 404 handler for unknown routes
626
- */
627
- export function notFoundHandler(req, res) {
628
- res.status(404).json({
629
- error: 'NotFound',
630
- message: `Route not found: ${req.method} ${req.path}`,
631
- statusCode: 404,
632
- });
633
- }
634
- //# sourceMappingURL=api-routes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-routes.js","sourceRoot":"","sources":["../../src/server/api-routes.ts"],"names":[],"mappings":"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"}