driftdetect-dashboard 0.8.1 → 0.8.3

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,588 @@
1
+ /**
2
+ * Galaxy Data Transformer
3
+ *
4
+ * Transforms Drift's boundary scanner and call graph data into the
5
+ * Galaxy visualization format. This is the bridge between Drift's
6
+ * semantic analysis and the 3D visualization.
7
+ *
8
+ * Data Sources:
9
+ * - BoundaryScanner: Tables, fields, sensitive fields, access points
10
+ * - CallGraph: Entry points, functions, call paths
11
+ * - SecurityPrioritizer: Security tiers, risk scores
12
+ */
13
+ import * as fs from 'node:fs/promises';
14
+ import * as path from 'node:path';
15
+ // ============================================================================
16
+ // Sensitivity Mapping
17
+ // ============================================================================
18
+ /**
19
+ * Map Drift sensitivity types to Galaxy sensitivity levels
20
+ */
21
+ function mapSensitivityType(type) {
22
+ switch (type?.toLowerCase()) {
23
+ case 'credentials':
24
+ return 'critical';
25
+ case 'financial':
26
+ case 'health':
27
+ return 'high';
28
+ case 'pii':
29
+ return 'medium';
30
+ case 'unknown':
31
+ default:
32
+ return 'low';
33
+ }
34
+ }
35
+ /**
36
+ * Calculate table sensitivity from its fields
37
+ */
38
+ function calculateTableSensitivity(fields) {
39
+ const priorities = ['critical', 'high', 'medium', 'low', 'public'];
40
+ for (const priority of priorities) {
41
+ if (fields.some(f => f.sensitivity === priority)) {
42
+ return priority;
43
+ }
44
+ }
45
+ return 'public';
46
+ }
47
+ /**
48
+ * Calculate security tier from sensitivity and access patterns
49
+ */
50
+ function calculateSecurityTier(sensitivity, hasWriteAccess, isPubliclyAccessible) {
51
+ if (sensitivity === 'critical') {
52
+ return hasWriteAccess ? 'P0' : 'P1';
53
+ }
54
+ if (sensitivity === 'high') {
55
+ return hasWriteAccess ? 'P1' : 'P2';
56
+ }
57
+ if (sensitivity === 'medium') {
58
+ return isPubliclyAccessible ? 'P2' : 'P3';
59
+ }
60
+ return 'P4';
61
+ }
62
+ // ============================================================================
63
+ // Cluster Detection
64
+ // ============================================================================
65
+ /**
66
+ * Detect domain cluster from table name
67
+ */
68
+ function detectCluster(tableName) {
69
+ const name = tableName.toLowerCase();
70
+ // Auth cluster
71
+ if (/^(user|account|session|token|auth|login|password|credential|role|permission)/.test(name)) {
72
+ return 'auth';
73
+ }
74
+ // Commerce cluster
75
+ if (/^(order|product|cart|payment|invoice|transaction|subscription|price|discount)/.test(name)) {
76
+ return 'commerce';
77
+ }
78
+ // Content cluster
79
+ if (/^(post|article|comment|media|file|document|image|video|content)/.test(name)) {
80
+ return 'content';
81
+ }
82
+ // Analytics cluster
83
+ if (/^(event|log|audit|metric|analytics|tracking|stat)/.test(name)) {
84
+ return 'analytics';
85
+ }
86
+ // Communication cluster
87
+ if (/^(message|notification|email|chat|conversation)/.test(name)) {
88
+ return 'communication';
89
+ }
90
+ // Organization cluster
91
+ if (/^(team|organization|company|member|department|group)/.test(name)) {
92
+ return 'organization';
93
+ }
94
+ return 'general';
95
+ }
96
+ // ============================================================================
97
+ // Entry Point Detection
98
+ // ============================================================================
99
+ /**
100
+ * Detect HTTP method from decorators/function name
101
+ */
102
+ function detectHttpMethod(decorators, name) {
103
+ const decoratorStr = decorators.join(' ').toLowerCase();
104
+ const nameLower = name.toLowerCase();
105
+ if (decoratorStr.includes('post') || nameLower.includes('create') || nameLower.includes('add')) {
106
+ return 'POST';
107
+ }
108
+ if (decoratorStr.includes('put') || nameLower.includes('update')) {
109
+ return 'PUT';
110
+ }
111
+ if (decoratorStr.includes('patch')) {
112
+ return 'PATCH';
113
+ }
114
+ if (decoratorStr.includes('delete') || nameLower.includes('delete') || nameLower.includes('remove')) {
115
+ return 'DELETE';
116
+ }
117
+ return 'GET';
118
+ }
119
+ /**
120
+ * Extract route path from decorators
121
+ */
122
+ function extractRoutePath(decorators) {
123
+ for (const dec of decorators) {
124
+ // Express/Flask style: @app.route('/path')
125
+ const routeMatch = dec.match(/route\s*\(\s*['"]([^'"]+)['"]/i);
126
+ if (routeMatch?.[1])
127
+ return routeMatch[1];
128
+ // FastAPI style: @router.get('/path')
129
+ const fastApiMatch = dec.match(/(?:get|post|put|patch|delete)\s*\(\s*['"]([^'"]+)['"]/i);
130
+ if (fastApiMatch?.[1])
131
+ return fastApiMatch[1];
132
+ // Spring style: @GetMapping("/path")
133
+ const springMatch = dec.match(/(?:Get|Post|Put|Patch|Delete)?Mapping\s*\(\s*(?:value\s*=\s*)?['"]([^'"]+)['"]/i);
134
+ if (springMatch?.[1])
135
+ return springMatch[1];
136
+ // ASP.NET style: [HttpGet("path")]
137
+ const aspMatch = dec.match(/Http(?:Get|Post|Put|Patch|Delete)\s*\(\s*['"]([^'"]+)['"]/i);
138
+ if (aspMatch?.[1])
139
+ return aspMatch[1];
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Detect framework from decorators
145
+ */
146
+ function detectFramework(decorators) {
147
+ const decoratorStr = decorators.join(' ').toLowerCase();
148
+ if (decoratorStr.includes('@app.') || decoratorStr.includes('@router.')) {
149
+ return decoratorStr.includes('fastapi') ? 'FastAPI' : 'Flask';
150
+ }
151
+ if (decoratorStr.includes('mapping') || decoratorStr.includes('@rest')) {
152
+ return 'Spring';
153
+ }
154
+ if (decoratorStr.includes('http') && decoratorStr.includes('[')) {
155
+ return 'ASP.NET';
156
+ }
157
+ if (decoratorStr.includes('route') || decoratorStr.includes('controller')) {
158
+ return 'Express';
159
+ }
160
+ return 'unknown';
161
+ }
162
+ /**
163
+ * Detect auth level from decorators and function context
164
+ */
165
+ function detectAuthLevel(decorators, name) {
166
+ const decoratorStr = decorators.join(' ').toLowerCase();
167
+ const nameLower = name.toLowerCase();
168
+ if (decoratorStr.includes('admin') || nameLower.includes('admin')) {
169
+ return 'admin';
170
+ }
171
+ if (decoratorStr.includes('internal') || nameLower.includes('internal')) {
172
+ return 'internal';
173
+ }
174
+ if (decoratorStr.includes('public') || decoratorStr.includes('allowanonymous')) {
175
+ return 'public';
176
+ }
177
+ if (decoratorStr.includes('auth') || decoratorStr.includes('login') ||
178
+ decoratorStr.includes('protected') || decoratorStr.includes('authorize')) {
179
+ return 'authenticated';
180
+ }
181
+ // Default to authenticated for safety
182
+ return 'authenticated';
183
+ }
184
+ // ============================================================================
185
+ // Galaxy Data Transformer
186
+ // ============================================================================
187
+ export class GalaxyDataTransformer {
188
+ driftDir;
189
+ constructor(driftDir) {
190
+ this.driftDir = driftDir;
191
+ }
192
+ /**
193
+ * Transform Drift data into Galaxy format
194
+ */
195
+ async transform() {
196
+ // Load data sources
197
+ const accessMap = await this.loadAccessMap();
198
+ const callGraph = await this.loadCallGraph();
199
+ // Transform tables
200
+ const tables = this.transformTables(accessMap);
201
+ // Transform entry points from call graph
202
+ const entryPoints = this.transformEntryPoints(callGraph, accessMap);
203
+ // Transform data paths
204
+ const dataPaths = this.transformDataPaths(accessMap, callGraph, entryPoints);
205
+ // Extract relationships from foreign keys
206
+ const relationships = this.extractRelationships(tables);
207
+ // Calculate stats
208
+ const stats = this.calculateStats(tables, entryPoints, dataPaths);
209
+ return {
210
+ tables,
211
+ entryPoints,
212
+ dataPaths,
213
+ relationships,
214
+ stats,
215
+ lastUpdated: new Date().toISOString(),
216
+ };
217
+ }
218
+ /**
219
+ * Load access map from .drift/boundaries
220
+ */
221
+ async loadAccessMap() {
222
+ const accessMapPath = path.join(this.driftDir, 'boundaries', 'access-map.json');
223
+ try {
224
+ const content = await fs.readFile(accessMapPath, 'utf-8');
225
+ return JSON.parse(content);
226
+ }
227
+ catch {
228
+ // Return empty access map if not found
229
+ return {
230
+ version: '1.0',
231
+ generatedAt: new Date().toISOString(),
232
+ projectRoot: '',
233
+ models: [],
234
+ tables: {},
235
+ accessPoints: {},
236
+ sensitiveFields: [],
237
+ stats: {
238
+ totalTables: 0,
239
+ totalAccessPoints: 0,
240
+ totalSensitiveFields: 0,
241
+ totalModels: 0,
242
+ },
243
+ };
244
+ }
245
+ }
246
+ /**
247
+ * Load call graph from .drift/lake/callgraph (primary) or legacy paths
248
+ */
249
+ async loadCallGraph() {
250
+ // Primary: Load from lake storage (sharded format)
251
+ const lakeIndexPath = path.join(this.driftDir, 'lake', 'callgraph', 'index.json');
252
+ try {
253
+ const content = await fs.readFile(lakeIndexPath, 'utf-8');
254
+ const index = JSON.parse(content);
255
+ // Convert lake index format to StoredCallGraph format
256
+ return {
257
+ version: index.version || '1.0.0',
258
+ generatedAt: index.generatedAt,
259
+ projectRoot: this.driftDir.replace('/.drift', ''),
260
+ stats: {
261
+ totalFunctions: index.summary?.totalFunctions || 0,
262
+ totalCallSites: index.summary?.totalCalls || 0,
263
+ resolvedCallSites: index.summary?.totalCalls || 0,
264
+ unresolvedCallSites: 0,
265
+ totalDataAccessors: index.summary?.dataAccessors || 0,
266
+ },
267
+ functions: {}, // Empty - would need to load shards for full data
268
+ entryPoints: index.topEntryPoints?.map((ep) => ep.id) || [],
269
+ dataAccessors: index.topDataAccessors?.map((da) => da.id) || [],
270
+ };
271
+ }
272
+ catch {
273
+ // Fall through to legacy paths
274
+ }
275
+ // Legacy: Try old paths for backwards compatibility
276
+ const legacyPaths = [
277
+ path.join(this.driftDir, 'call-graph', 'graph.json'),
278
+ path.join(this.driftDir, 'callgraph', 'graph.json'),
279
+ ];
280
+ for (const graphPath of legacyPaths) {
281
+ try {
282
+ const content = await fs.readFile(graphPath, 'utf-8');
283
+ return JSON.parse(content);
284
+ }
285
+ catch {
286
+ // Try next path
287
+ }
288
+ }
289
+ return null;
290
+ }
291
+ /**
292
+ * Transform tables from access map
293
+ */
294
+ transformTables(accessMap) {
295
+ const tables = [];
296
+ for (const [tableName, tableInfo] of Object.entries(accessMap.tables)) {
297
+ const fields = this.transformFields(tableName, tableInfo, accessMap.sensitiveFields);
298
+ const sensitivity = calculateTableSensitivity(fields);
299
+ const hasWriteAccess = tableInfo.accessedBy.some(a => a.operation === 'write' || a.operation === 'delete');
300
+ tables.push({
301
+ id: tableName,
302
+ name: tableName,
303
+ rowCount: 0, // Not available from boundary scanner
304
+ accessCount: tableInfo.accessedBy.length,
305
+ sensitivity,
306
+ securityTier: calculateSecurityTier(sensitivity, hasWriteAccess, false),
307
+ cluster: detectCluster(tableName),
308
+ fields,
309
+ });
310
+ }
311
+ return tables;
312
+ }
313
+ /**
314
+ * Transform fields for a table
315
+ */
316
+ transformFields(tableName, tableInfo, sensitiveFields) {
317
+ const fields = [];
318
+ const fieldSet = new Set();
319
+ // Add known fields from table info
320
+ for (const fieldName of tableInfo.fields) {
321
+ if (fieldSet.has(fieldName))
322
+ continue;
323
+ fieldSet.add(fieldName);
324
+ const sensitiveField = sensitiveFields.find(sf => sf.field === fieldName && (sf.table === tableName || sf.table === null));
325
+ const foreignKeyTarget = this.inferForeignKeyTarget(fieldName);
326
+ const fieldData = {
327
+ id: `${tableName}.${fieldName}`,
328
+ name: fieldName,
329
+ dataType: 'unknown',
330
+ sensitivity: sensitiveField ? mapSensitivityType(sensitiveField.sensitivityType) : 'low',
331
+ isPrimaryKey: fieldName === 'id' || fieldName.endsWith('_id'),
332
+ isForeignKey: fieldName.endsWith('_id') && fieldName !== 'id',
333
+ accessCount: tableInfo.accessedBy.filter(a => a.fields.includes(fieldName)).length,
334
+ isTested: true, // Would need test coverage data
335
+ };
336
+ if (foreignKeyTarget) {
337
+ fieldData.foreignKeyTarget = foreignKeyTarget;
338
+ }
339
+ fields.push(fieldData);
340
+ }
341
+ // Add sensitive fields not in known fields
342
+ for (const sf of sensitiveFields) {
343
+ if (sf.table === tableName && !fieldSet.has(sf.field)) {
344
+ fieldSet.add(sf.field);
345
+ fields.push({
346
+ id: `${tableName}.${sf.field}`,
347
+ name: sf.field,
348
+ dataType: 'unknown',
349
+ sensitivity: mapSensitivityType(sf.sensitivityType),
350
+ isPrimaryKey: false,
351
+ isForeignKey: false,
352
+ accessCount: 0,
353
+ isTested: true,
354
+ });
355
+ }
356
+ }
357
+ return fields;
358
+ }
359
+ /**
360
+ * Infer foreign key target from field name
361
+ */
362
+ inferForeignKeyTarget(fieldName) {
363
+ if (!fieldName.endsWith('_id') || fieldName === 'id') {
364
+ return undefined;
365
+ }
366
+ // user_id -> users.id
367
+ const baseName = fieldName.replace(/_id$/, '');
368
+ return `${baseName}s.id`;
369
+ }
370
+ /**
371
+ * Transform entry points from call graph
372
+ */
373
+ transformEntryPoints(callGraph, accessMap) {
374
+ const entryPoints = [];
375
+ if (!callGraph) {
376
+ return entryPoints;
377
+ }
378
+ for (const entryPointId of callGraph.entryPoints) {
379
+ const func = callGraph.functions[entryPointId];
380
+ if (!func)
381
+ continue;
382
+ const routePath = extractRoutePath(func.decorators);
383
+ if (!routePath)
384
+ continue; // Skip non-HTTP entry points
385
+ const method = detectHttpMethod(func.decorators, func.name);
386
+ const authLevel = detectAuthLevel(func.decorators, func.name);
387
+ const framework = detectFramework(func.decorators);
388
+ // Find reachable tables through data access
389
+ const reachableTables = this.findReachableTables(func, callGraph);
390
+ // Calculate security tier based on reachable data
391
+ const maxSensitivity = this.getMaxSensitivityForTables(reachableTables, accessMap);
392
+ const securityTier = calculateSecurityTier(maxSensitivity, method !== 'GET', authLevel === 'public');
393
+ entryPoints.push({
394
+ id: `ep-${func.id}`,
395
+ path: routePath,
396
+ method,
397
+ authLevel,
398
+ securityTier,
399
+ file: func.file,
400
+ line: func.startLine,
401
+ framework,
402
+ reachableTables,
403
+ });
404
+ }
405
+ return entryPoints;
406
+ }
407
+ /**
408
+ * Find tables reachable from a function through call graph
409
+ */
410
+ findReachableTables(func, callGraph) {
411
+ const tables = new Set();
412
+ const visited = new Set();
413
+ const traverse = (funcId, depth) => {
414
+ if (depth > 10 || visited.has(funcId))
415
+ return;
416
+ visited.add(funcId);
417
+ const f = callGraph.functions[funcId];
418
+ if (!f)
419
+ return;
420
+ // Add directly accessed tables
421
+ for (const access of f.dataAccess) {
422
+ if (access.table !== 'unknown') {
423
+ tables.add(access.table);
424
+ }
425
+ }
426
+ // Traverse called functions
427
+ for (const call of f.calls) {
428
+ if (call.calleeId) {
429
+ traverse(call.calleeId, depth + 1);
430
+ }
431
+ }
432
+ };
433
+ traverse(func.id, 0);
434
+ return Array.from(tables);
435
+ }
436
+ /**
437
+ * Get maximum sensitivity level for a set of tables
438
+ */
439
+ getMaxSensitivityForTables(tableNames, accessMap) {
440
+ let maxSensitivity = 'public';
441
+ const priorities = ['critical', 'high', 'medium', 'low', 'public'];
442
+ for (const tableName of tableNames) {
443
+ const tableInfo = accessMap.tables[tableName];
444
+ if (!tableInfo)
445
+ continue;
446
+ for (const sf of tableInfo.sensitiveFields) {
447
+ const sensitivity = mapSensitivityType(sf.sensitivityType);
448
+ if (priorities.indexOf(sensitivity) < priorities.indexOf(maxSensitivity)) {
449
+ maxSensitivity = sensitivity;
450
+ }
451
+ }
452
+ }
453
+ return maxSensitivity;
454
+ }
455
+ /**
456
+ * Transform data paths from access points
457
+ */
458
+ transformDataPaths(accessMap, callGraph, entryPoints) {
459
+ const paths = [];
460
+ let pathId = 0;
461
+ // Create paths from entry points to their reachable tables
462
+ for (const ep of entryPoints) {
463
+ for (const tableName of ep.reachableTables) {
464
+ const tableInfo = accessMap.tables[tableName];
465
+ const sensitivity = tableInfo
466
+ ? calculateTableSensitivity(this.transformFields(tableName, tableInfo, accessMap.sensitiveFields))
467
+ : 'low';
468
+ // Determine operation from HTTP method
469
+ let operation = 'read';
470
+ if (ep.method === 'POST')
471
+ operation = 'write';
472
+ else if (ep.method === 'PUT' || ep.method === 'PATCH')
473
+ operation = 'write';
474
+ else if (ep.method === 'DELETE')
475
+ operation = 'delete';
476
+ paths.push({
477
+ id: `path-${++pathId}`,
478
+ sourceId: ep.id,
479
+ sourceType: 'entryPoint',
480
+ targetTableId: tableName,
481
+ operation,
482
+ frequency: tableInfo?.accessedBy.length ?? 1,
483
+ depth: 1, // Would need call graph traversal for accurate depth
484
+ isTested: true, // Would need test coverage data
485
+ callChain: [],
486
+ sensitivity,
487
+ });
488
+ }
489
+ }
490
+ // Also create paths from direct access points if no call graph
491
+ if (!callGraph) {
492
+ for (const accessPoint of Object.values(accessMap.accessPoints)) {
493
+ if (accessPoint.table === 'unknown')
494
+ continue;
495
+ const tableInfo = accessMap.tables[accessPoint.table];
496
+ const sensitivity = tableInfo
497
+ ? calculateTableSensitivity(this.transformFields(accessPoint.table, tableInfo, accessMap.sensitiveFields))
498
+ : 'low';
499
+ paths.push({
500
+ id: `path-${++pathId}`,
501
+ sourceId: `func-${accessPoint.file}:${accessPoint.line}`,
502
+ sourceType: 'function',
503
+ targetTableId: accessPoint.table,
504
+ operation: accessPoint.operation,
505
+ frequency: 1,
506
+ depth: 1,
507
+ isTested: true,
508
+ callChain: [],
509
+ sensitivity,
510
+ });
511
+ }
512
+ }
513
+ return paths;
514
+ }
515
+ /**
516
+ * Extract relationships from foreign keys
517
+ */
518
+ extractRelationships(tables) {
519
+ const relationships = [];
520
+ let relId = 0;
521
+ for (const table of tables) {
522
+ for (const field of table.fields) {
523
+ if (field.isForeignKey && field.foreignKeyTarget) {
524
+ const [targetTable, targetField] = field.foreignKeyTarget.split('.');
525
+ if (targetTable && tables.some(t => t.id === targetTable)) {
526
+ relationships.push({
527
+ id: `rel-${++relId}`,
528
+ sourceTableId: table.id,
529
+ sourceFieldId: field.id,
530
+ targetTableId: targetTable,
531
+ targetFieldId: `${targetTable}.${targetField || 'id'}`,
532
+ type: 'one-to-many',
533
+ });
534
+ }
535
+ }
536
+ }
537
+ }
538
+ return relationships;
539
+ }
540
+ /**
541
+ * Calculate Galaxy statistics
542
+ */
543
+ calculateStats(tables, entryPoints, paths) {
544
+ const sensitiveFields = {
545
+ critical: 0,
546
+ high: 0,
547
+ medium: 0,
548
+ low: 0,
549
+ public: 0,
550
+ };
551
+ let fieldCount = 0;
552
+ for (const table of tables) {
553
+ for (const field of table.fields) {
554
+ fieldCount++;
555
+ sensitiveFields[field.sensitivity]++;
556
+ }
557
+ }
558
+ const untestedPaths = paths.filter(p => !p.isTested).length;
559
+ // Calculate health score
560
+ let healthScore = 100;
561
+ healthScore -= Math.min(30, untestedPaths * 2);
562
+ // Penalize public endpoints accessing sensitive data
563
+ const publicEndpoints = entryPoints.filter(e => e.authLevel === 'public').length;
564
+ healthScore -= Math.min(30, publicEndpoints * 5);
565
+ healthScore -= Math.min(20, (sensitiveFields.critical + sensitiveFields.high) * 0.5);
566
+ healthScore = Math.max(0, Math.round(healthScore));
567
+ return {
568
+ tableCount: tables.length,
569
+ fieldCount,
570
+ entryPointCount: entryPoints.length,
571
+ pathCount: paths.length,
572
+ sensitiveFields,
573
+ untestedPaths,
574
+ deadCodeCount: 0,
575
+ healthScore,
576
+ };
577
+ }
578
+ }
579
+ // ============================================================================
580
+ // Factory
581
+ // ============================================================================
582
+ /**
583
+ * Create a new Galaxy data transformer
584
+ */
585
+ export function createGalaxyDataTransformer(driftDir) {
586
+ return new GalaxyDataTransformer(driftDir);
587
+ }
588
+ //# sourceMappingURL=galaxy-data-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"galaxy-data-transformer.js","sourceRoot":"","sources":["../../src/server/galaxy-data-transformer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Drift Dashboard Server
3
+ *
4
+ * Main entry point for the dashboard server package.
5
+ * Exports the DashboardServer class and related types.
6
+ */
7
+ export { DashboardServer } from './dashboard-server.js';
8
+ export type { DashboardServerOptions } from './dashboard-server.js';
9
+ export { DriftDataReader } from './drift-data-reader.js';
10
+ export type { PatternQuery, ViolationQuery, DashboardPattern, DashboardPatternWithLocations, DashboardViolation, DashboardStats, FileTreeNode, FileDetails, DriftConfig, DetectorConfigEntry, SemanticLocation, OutlierWithDetails, } from './drift-data-reader.js';
11
+ export { createApiRoutes, errorHandler, notFoundHandler } from './api-routes.js';
12
+ export type { ApiError } from './api-routes.js';
13
+ export { NotFoundError, BadRequestError, InternalServerError } from './api-routes.js';
14
+ export { createExpressApp } from './express-app.js';
15
+ export type { ExpressAppOptions } from './express-app.js';
16
+ export { WebSocketManager } from './websocket-server.js';
17
+ export type { WebSocketMessage, WebSocketMessageType, PatternUpdatePayload, PatternsChangedPayload } from './websocket-server.js';
18
+ export { PatternWatcher } from './pattern-watcher.js';
19
+ export type { PatternChangeEvent, PatternWatcherOptions } from './pattern-watcher.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Drift Dashboard Server
3
+ *
4
+ * Main entry point for the dashboard server package.
5
+ * Exports the DashboardServer class and related types.
6
+ */
7
+ export { DashboardServer } from './dashboard-server.js';
8
+ export { DriftDataReader } from './drift-data-reader.js';
9
+ export { createApiRoutes, errorHandler, notFoundHandler } from './api-routes.js';
10
+ export { NotFoundError, BadRequestError, InternalServerError } from './api-routes.js';
11
+ export { createExpressApp } from './express-app.js';
12
+ export { WebSocketManager } from './websocket-server.js';
13
+ export { PatternWatcher } from './pattern-watcher.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgBzD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}