@stacksjs/bun-router 0.0.17 → 0.0.19

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 (153) hide show
  1. package/dist/chunk-2mx7fq49.js +4 -0
  2. package/dist/chunk-a8p83068.js +103 -0
  3. package/dist/{chunk-cgptvjdf.js → chunk-y3xq6wq6.js} +1 -1
  4. package/dist/cli.js +4 -3
  5. package/dist/container/index.js +1149 -211
  6. package/dist/container/service-provider.d.ts +3 -3
  7. package/dist/development/performance-profiler.d.ts +3 -3
  8. package/dist/development/route-debugger.d.ts +1 -1
  9. package/dist/development/route-inspector.d.ts +2 -2
  10. package/dist/index.js +369 -2209
  11. package/dist/observability/integration.d.ts +1 -1
  12. package/dist/response/macros.d.ts +1 -1
  13. package/dist/router/index.d.ts +7 -7
  14. package/dist/router/router.d.ts +0 -32
  15. package/dist/testing/performance-testing.d.ts +2 -2
  16. package/dist/testing/test-client.d.ts +1 -1
  17. package/dist/testing/websocket-testing.d.ts +1 -1
  18. package/package.json +7 -7
  19. package/dist/chunk-1ahs68ys.js +0 -18
  20. package/dist/chunk-g3ybefhg.js +0 -1923
  21. package/src/auth.ts +0 -489
  22. package/src/cache/lru-cache.ts +0 -457
  23. package/src/cache/middleware-memoization.ts +0 -531
  24. package/src/cache/route-cache-warmer.ts +0 -486
  25. package/src/cache/sqlite-cache.ts +0 -783
  26. package/src/cache/streaming-cache.ts +0 -572
  27. package/src/cli/colors.ts +0 -29
  28. package/src/cli/index.ts +0 -287
  29. package/src/cli/middleware.ts +0 -291
  30. package/src/cli/openapi.ts +0 -407
  31. package/src/cli/router.ts +0 -188
  32. package/src/cli/routes.ts +0 -265
  33. package/src/cli/utils.ts +0 -531
  34. package/src/cli.ts +0 -5
  35. package/src/config.ts +0 -322
  36. package/src/container/container.ts +0 -786
  37. package/src/container/contextual-binding.ts +0 -606
  38. package/src/container/decorators.ts +0 -368
  39. package/src/container/index.ts +0 -49
  40. package/src/container/service-provider.ts +0 -596
  41. package/src/development/hot-reload.ts +0 -673
  42. package/src/development/index.ts +0 -499
  43. package/src/development/performance-profiler.ts +0 -717
  44. package/src/development/route-debugger.ts +0 -527
  45. package/src/development/route-inspector.ts +0 -749
  46. package/src/development/typescript-utilities.ts +0 -682
  47. package/src/docs.ts +0 -397
  48. package/src/errors/circuit-breaker.ts +0 -733
  49. package/src/errors/error-handler.ts +0 -569
  50. package/src/errors/error-reporting.ts +0 -672
  51. package/src/errors/exceptions.ts +0 -536
  52. package/src/errors/graceful-degradation.ts +0 -623
  53. package/src/errors/index.ts +0 -21
  54. package/src/errors/router-errors.ts +0 -632
  55. package/src/file-serving/static-files.ts +0 -718
  56. package/src/index.ts +0 -66
  57. package/src/middleware/auth.ts +0 -220
  58. package/src/middleware/content_security_policy.ts +0 -215
  59. package/src/middleware/cors.ts +0 -142
  60. package/src/middleware/csrf.ts +0 -166
  61. package/src/middleware/ddos_protection.ts +0 -279
  62. package/src/middleware/file_security.ts +0 -191
  63. package/src/middleware/file_upload.ts +0 -275
  64. package/src/middleware/helmet.ts +0 -268
  65. package/src/middleware/index.ts +0 -117
  66. package/src/middleware/input_validation.ts +0 -453
  67. package/src/middleware/json_body.ts +0 -37
  68. package/src/middleware/performance_alerting.ts +0 -540
  69. package/src/middleware/performance_dashboard.ts +0 -661
  70. package/src/middleware/performance_monitor.ts +0 -945
  71. package/src/middleware/pipeline.ts +0 -489
  72. package/src/middleware/rate_limit.ts +0 -251
  73. package/src/middleware/request_id.ts +0 -36
  74. package/src/middleware/request_signing.ts +0 -638
  75. package/src/middleware/request_tracer.ts +0 -653
  76. package/src/middleware/response_cache.ts +0 -778
  77. package/src/middleware/security.ts +0 -482
  78. package/src/middleware/security_suite.ts +0 -257
  79. package/src/middleware/session.ts +0 -91
  80. package/src/model-binding/index.ts +0 -18
  81. package/src/model-binding/model-middleware.ts +0 -425
  82. package/src/model-binding/model-registry.ts +0 -550
  83. package/src/model-binding.ts +0 -370
  84. package/src/model-resolver-factory.ts +0 -106
  85. package/src/observability/correlation.ts +0 -691
  86. package/src/observability/health-checks.ts +0 -729
  87. package/src/observability/index.ts +0 -184
  88. package/src/observability/integration.ts +0 -548
  89. package/src/observability/metrics.ts +0 -753
  90. package/src/observability/tracing.ts +0 -638
  91. package/src/optimization/bun-utilities.ts +0 -778
  92. package/src/query-builder-integration.ts +0 -137
  93. package/src/request/context.ts +0 -109
  94. package/src/request/enhanced-request.ts +0 -876
  95. package/src/request/macros.ts +0 -822
  96. package/src/response/macros.ts +0 -665
  97. package/src/response/response-factory.ts +0 -596
  98. package/src/router/api-routes.ts +0 -243
  99. package/src/router/file-based-routing.ts +0 -697
  100. package/src/router/file-streaming.ts +0 -383
  101. package/src/router/fluent-routing.ts +0 -866
  102. package/src/router/group-organization.ts +0 -229
  103. package/src/router/handler-resolver.ts +0 -327
  104. package/src/router/http-methods.ts +0 -407
  105. package/src/router/index.ts +0 -193
  106. package/src/router/middleware-groups.ts +0 -222
  107. package/src/router/middleware-integration.ts +0 -399
  108. package/src/router/middleware.ts +0 -234
  109. package/src/router/model-binding.ts +0 -215
  110. package/src/router/optimized-route-matching.ts +0 -302
  111. package/src/router/route-building.ts +0 -221
  112. package/src/router/route-compiler.ts +0 -691
  113. package/src/router/route-matching.ts +0 -368
  114. package/src/router/route-trie.ts +0 -450
  115. package/src/router/router.ts +0 -1616
  116. package/src/router/server.ts +0 -684
  117. package/src/router/validation-integration.ts +0 -449
  118. package/src/router/view-rendering.ts +0 -233
  119. package/src/router/websocket.ts +0 -100
  120. package/src/routing/route-caching.ts +0 -402
  121. package/src/routing/route-throttling.ts +0 -469
  122. package/src/routing/subdomain-routing.ts +0 -492
  123. package/src/session/database-store.ts +0 -109
  124. package/src/session/file-store.ts +0 -148
  125. package/src/session/index.ts +0 -244
  126. package/src/session/memory-store.ts +0 -88
  127. package/src/session/redis-store.ts +0 -93
  128. package/src/streaming/index.ts +0 -17
  129. package/src/streaming/sse-handler.ts +0 -482
  130. package/src/streaming/stream-handler.ts +0 -552
  131. package/src/testing/auth-testing.ts +0 -448
  132. package/src/testing/file-upload-testing.ts +0 -543
  133. package/src/testing/index.ts +0 -10
  134. package/src/testing/middleware-testing.ts +0 -322
  135. package/src/testing/model-binding-testing.ts +0 -645
  136. package/src/testing/performance-testing.ts +0 -738
  137. package/src/testing/test-client.ts +0 -310
  138. package/src/testing/test-request.ts +0 -315
  139. package/src/testing/test-response.ts +0 -332
  140. package/src/testing/types.ts +0 -224
  141. package/src/testing/websocket-testing.ts +0 -590
  142. package/src/types/controller-types.ts +0 -385
  143. package/src/types/core.ts +0 -683
  144. package/src/types/middleware-types.ts +0 -422
  145. package/src/types/request-response-augmentation.ts +0 -489
  146. package/src/types/route-inference.ts +0 -372
  147. package/src/types.ts +0 -2123
  148. package/src/url.ts +0 -131
  149. package/src/utils/index.ts +0 -1
  150. package/src/utils/query-preservation.ts +0 -201
  151. package/src/utils.ts +0 -395
  152. package/src/validation/validator.ts +0 -688
  153. package/src/websocket/clustering.ts +0 -769
package/src/cli/utils.ts DELETED
@@ -1,531 +0,0 @@
1
- import process from 'node:process'
2
- import { chalk } from './colors'
3
-
4
- /**
5
- * Formats console output with consistent styling
6
- */
7
- export const format = {
8
- success: (message: string): string => chalk.green(`✨ ${message}`),
9
- info: (message: string): string => chalk.blue(message),
10
- warning: (message: string): string => chalk.yellow(message),
11
- error: (message: string): string => chalk.red(message),
12
- dim: (message: string): string => chalk.dim(message),
13
- bold: (message: string): string => chalk.bold(message),
14
- }
15
-
16
- /**
17
- * Logger for CLI commands with consistent styling
18
- */
19
- export const logger = {
20
- success: (message: string): void => console.log(format.success(message)),
21
- info: (message: string): void => console.log(format.info(message)),
22
- warning: (message: string): void => console.log(format.warning(message)),
23
- error: (message: string): void => console.error(format.error(message)),
24
- debug: (message: string): void => console.debug(format.dim(message)),
25
- }
26
-
27
- /**
28
- * Load router instance from the application
29
- */
30
- export async function loadRouter(): Promise<any> {
31
- try {
32
- const routesFile = `${process.cwd()}/routes/index.ts`
33
- const { router } = await import(routesFile)
34
-
35
- if (!router) {
36
- logger.error(`Could not find router instance in ${routesFile}.`)
37
- process.exit(1)
38
- }
39
-
40
- return router
41
- }
42
- catch (error: any) {
43
- if (error.code === 'ERR_MODULE_NOT_FOUND') {
44
- logger.error(`Routes file not found at ${process.cwd()}/routes/index.ts`)
45
- logger.warning('Make sure your routes are defined and exported as "router" in routes/index.ts')
46
- }
47
- else {
48
- logger.error(`Error loading router: ${error.message}`)
49
- }
50
- throw error
51
- }
52
- }
53
-
54
- /**
55
- * Setup a debounced file watcher
56
- */
57
- export function setupDebouncedWatcher(
58
- _callback: () => Promise<void>,
59
- _debounceTime = 500,
60
- ): { timeoutId: NodeJS.Timeout | null } {
61
- const state = { timeoutId: null as NodeJS.Timeout | null }
62
-
63
- return state
64
- }
65
-
66
- /**
67
- * Utility to get method color for console output
68
- */
69
- export function getMethodColor(method: string): string {
70
- switch (method.toUpperCase()) {
71
- case 'GET':
72
- return chalk.cyan.toString()
73
- case 'POST':
74
- return chalk.green.toString()
75
- case 'PUT':
76
- return chalk.yellow.toString()
77
- case 'PATCH':
78
- return chalk.yellow.toString()
79
- case 'DELETE':
80
- return chalk.red.toString()
81
- case 'OPTIONS':
82
- return chalk.gray.toString()
83
- default:
84
- return chalk.white.toString()
85
- }
86
- }
87
-
88
- /**
89
- * Pad a string to a specified length
90
- */
91
- export function padString(str: string, length: number): string {
92
- return (str + ' '.repeat(length)).substring(0, length)
93
- }
94
-
95
- /**
96
- * Check router health and configuration
97
- */
98
- export async function checkRouterHealth(options: { verbose?: boolean }): Promise<void> {
99
- logger.info('🔍 Checking router health...')
100
-
101
- try {
102
- const router = await loadRouter()
103
- const routes = router.routes || []
104
- const globalMiddleware = router.globalMiddleware || []
105
- const namedRoutes = router.namedRoutes || new Map()
106
-
107
- // Basic health metrics
108
- const health = {
109
- totalRoutes: routes.length,
110
- namedRoutes: namedRoutes.size,
111
- globalMiddleware: globalMiddleware.length,
112
- routesByMethod: {} as Record<string, number>,
113
- duplicateRoutes: [] as Array<{ path: string, method: string }>,
114
- routesWithMiddleware: 0,
115
- staticRoutes: 0,
116
- dynamicRoutes: 0,
117
- }
118
-
119
- // Analyze routes
120
- const routeMap = new Map<string, string[]>()
121
- for (const route of routes) {
122
- const key = `${route.method}:${route.path}`
123
-
124
- // Count by method
125
- health.routesByMethod[route.method] = (health.routesByMethod[route.method] || 0) + 1
126
-
127
- // Check for duplicates
128
- if (!routeMap.has(key)) {
129
- routeMap.set(key, [])
130
- }
131
- routeMap.get(key)!.push(route.path)
132
-
133
- if (routeMap.get(key)!.length > 1) {
134
- health.duplicateRoutes.push({ path: route.path, method: route.method })
135
- }
136
-
137
- // Count middleware usage
138
- if (route.middleware && route.middleware.length > 0) {
139
- health.routesWithMiddleware++
140
- }
141
-
142
- // Count static vs dynamic routes
143
- if (route.path.includes('{') || route.path.includes('*')) {
144
- health.dynamicRoutes++
145
- }
146
- else {
147
- health.staticRoutes++
148
- }
149
- }
150
-
151
- // Display results
152
- logger.success(`Router health check completed`)
153
- console.log(`📊 Routes: ${health.totalRoutes} total (${health.staticRoutes} static, ${health.dynamicRoutes} dynamic)`)
154
- console.log(`📛 Named routes: ${health.namedRoutes}`)
155
- console.log(`🛡️ Global middleware: ${health.globalMiddleware}`)
156
- console.log(`🔧 Routes with middleware: ${health.routesWithMiddleware}`)
157
-
158
- if (options.verbose) {
159
- console.log('\n📈 Routes by method:')
160
- for (const [method, count] of Object.entries(health.routesByMethod)) {
161
- const color = getMethodColor(method)
162
- console.log(` ${chalk.hex(color)(method.padEnd(8))}: ${count}`)
163
- }
164
-
165
- if (health.duplicateRoutes.length > 0) {
166
- logger.warning(`\n⚠️ Found ${health.duplicateRoutes.length} duplicate route(s):`)
167
- for (const duplicate of health.duplicateRoutes) {
168
- console.log(` ${duplicate.method} ${duplicate.path}`)
169
- }
170
- }
171
-
172
- // Check for potential issues
173
- const issues = []
174
- if (health.totalRoutes === 0) {
175
- issues.push('No routes defined')
176
- }
177
- if (health.duplicateRoutes.length > 0) {
178
- issues.push(`${health.duplicateRoutes.length} duplicate routes`)
179
- }
180
- if (health.routesWithMiddleware === 0 && health.globalMiddleware === 0) {
181
- issues.push('No middleware configured')
182
- }
183
-
184
- if (issues.length > 0) {
185
- logger.warning('\n⚠️ Potential issues:')
186
- for (const issue of issues) {
187
- console.log(` • ${issue}`)
188
- }
189
- }
190
- else {
191
- logger.success('\n✅ No issues detected')
192
- }
193
- }
194
- }
195
- catch (error: any) {
196
- logger.error(`Health check failed: ${error.message}`)
197
- throw error
198
- }
199
- }
200
-
201
- /**
202
- * Test routes by making HTTP requests
203
- */
204
- export async function testRoutes(options: {
205
- baseUrl?: string
206
- filter?: string
207
- method?: string
208
- timeout?: number
209
- }): Promise<void> {
210
- const baseUrl = options.baseUrl || 'http://localhost:3000'
211
- const timeout = options.timeout || 5000
212
- const allowedMethods = options.method ? options.method.split(',').map(m => m.trim().toUpperCase()) : null
213
-
214
- logger.info(`🧪 Testing routes at ${baseUrl}...`)
215
-
216
- try {
217
- const router = await loadRouter()
218
- const routes = router.routes || []
219
-
220
- let filteredRoutes = routes
221
-
222
- // Filter by path pattern
223
- if (options.filter) {
224
- const pattern = new RegExp(options.filter.replace(/\*/g, '.*'))
225
- filteredRoutes = routes.filter((route: any) => pattern.test(route.path))
226
- }
227
-
228
- // Filter by method
229
- if (allowedMethods) {
230
- filteredRoutes = filteredRoutes.filter((route: any) => allowedMethods.includes(route.method))
231
- }
232
-
233
- if (filteredRoutes.length === 0) {
234
- logger.warning('No routes match the specified filters')
235
- return
236
- }
237
-
238
- logger.info(`Testing ${filteredRoutes.length} routes...`)
239
-
240
- const results = {
241
- total: 0,
242
- passed: 0,
243
- failed: 0,
244
- errors: [] as Array<{ route: string, error: string }>,
245
- }
246
-
247
- for (const route of filteredRoutes) {
248
- results.total++
249
-
250
- // Skip routes with parameters for now (would need parameter generation)
251
- if (route.path.includes('{')) {
252
- logger.debug(`Skipping parameterized route: ${route.method} ${route.path}`)
253
- continue
254
- }
255
-
256
- try {
257
- const url = `${baseUrl}${route.path}`
258
- const response = await fetch(url, {
259
- method: route.method,
260
- signal: AbortSignal.timeout(timeout),
261
- })
262
-
263
- if (response.status < 500) {
264
- results.passed++
265
- logger.debug(`✅ ${route.method} ${route.path} → ${response.status}`)
266
- }
267
- else {
268
- results.failed++
269
- results.errors.push({
270
- route: `${route.method} ${route.path}`,
271
- error: `HTTP ${response.status}`,
272
- })
273
- }
274
- }
275
- catch (error: any) {
276
- results.failed++
277
- results.errors.push({
278
- route: `${route.method} ${route.path}`,
279
- error: error.message,
280
- })
281
- }
282
- }
283
-
284
- // Display results
285
- console.log(`\n📊 Test Results:`)
286
- console.log(` Total: ${results.total}`)
287
- console.log(` Passed: ${chalk.green(String(results.passed))}`)
288
- console.log(` Failed: ${chalk.red(String(results.failed))}`)
289
-
290
- if (results.errors.length > 0) {
291
- console.log(`\n❌ Failures:`)
292
- for (const error of results.errors) {
293
- console.log(` ${error.route}: ${error.error}`)
294
- }
295
- }
296
-
297
- if (results.failed > 0) {
298
- process.exit(1)
299
- }
300
- else {
301
- logger.success('All tests passed!')
302
- }
303
- }
304
- catch (error: any) {
305
- logger.error(`Route testing failed: ${error.message}`)
306
- throw error
307
- }
308
- }
309
-
310
- /**
311
- * Debug route matching for a specific path
312
- */
313
- export async function debugRoute(path: string, options: {
314
- method?: string
315
- verbose?: boolean
316
- }): Promise<void> {
317
- const method = options.method?.toUpperCase() || 'GET'
318
-
319
- logger.info(`🔍 Debugging route matching for: ${method} ${path}`)
320
-
321
- try {
322
- const router = await loadRouter()
323
-
324
- // Try to match the route
325
- const match = router.matchRoute ? router.matchRoute(path, method) : null
326
-
327
- if (match) {
328
- logger.success(`✅ Route matched!`)
329
- console.log(` Route: ${match.route.method} ${match.route.path}`)
330
- console.log(` Handler: ${typeof match.route.handler}`)
331
-
332
- if (Object.keys(match.params || {}).length > 0) {
333
- console.log(` Parameters:`)
334
- for (const [key, value] of Object.entries(match.params)) {
335
- console.log(` ${key}: ${value}`)
336
- }
337
- }
338
-
339
- if (match.route.middleware && match.route.middleware.length > 0) {
340
- console.log(` Middleware: ${match.route.middleware.length} handler(s)`)
341
- }
342
-
343
- if (match.route.name) {
344
- console.log(` Named route: ${match.route.name}`)
345
- }
346
- }
347
- else {
348
- logger.error(`❌ No route matched for ${method} ${path}`)
349
-
350
- if (options.verbose) {
351
- console.log('\n📋 Available routes:')
352
- const routes = router.routes || []
353
- const methodRoutes = routes.filter((r: any) => r.method === method)
354
-
355
- if (methodRoutes.length === 0) {
356
- console.log(` No routes defined for ${method} method`)
357
- }
358
- else {
359
- for (const route of methodRoutes) {
360
- console.log(` ${route.method} ${route.path}`)
361
- }
362
- }
363
- }
364
- }
365
- }
366
- catch (error: any) {
367
- logger.error(`Route debugging failed: ${error.message}`)
368
- throw error
369
- }
370
- }
371
-
372
- /**
373
- * Clear route caches
374
- */
375
- export async function clearCaches(options: { stats?: boolean }): Promise<void> {
376
- logger.info('🗑️ Clearing route caches...')
377
-
378
- try {
379
- const router = await loadRouter()
380
-
381
- if (options.stats) {
382
- // Show cache statistics before clearing
383
- if (router.getCacheStats) {
384
- const stats = router.getCacheStats()
385
- console.log('📊 Cache statistics before clearing:')
386
- console.log(` Hit rate: ${stats.hitRate}%`)
387
- console.log(` Total hits: ${stats.hits}`)
388
- console.log(` Total misses: ${stats.misses}`)
389
- console.log(` Cache size: ${stats.size}`)
390
- }
391
-
392
- if (router.routeCache) {
393
- console.log(` Route cache entries: ${router.routeCache.size}`)
394
- }
395
-
396
- if (router.templateCache) {
397
- console.log(` Template cache entries: ${router.templateCache.size}`)
398
- }
399
- }
400
-
401
- // Clear various caches
402
- if (router.clearRouteCache) {
403
- router.clearRouteCache()
404
- }
405
-
406
- if (router.routeCache && router.routeCache.clear) {
407
- router.routeCache.clear()
408
- }
409
-
410
- if (router.templateCache && router.templateCache.clear) {
411
- router.templateCache.clear()
412
- }
413
-
414
- if (router.clearModelCache) {
415
- router.clearModelCache()
416
- }
417
-
418
- logger.success('✅ Caches cleared successfully')
419
- }
420
- catch (error: any) {
421
- logger.error(`Cache clearing failed: ${error.message}`)
422
- throw error
423
- }
424
- }
425
-
426
- /**
427
- * Validate route definitions and configuration
428
- */
429
- export async function validateRoutes(options: {
430
- strict?: boolean
431
- fix?: boolean
432
- }): Promise<void> {
433
- logger.info('🔍 Validating route definitions...')
434
-
435
- try {
436
- const router = await loadRouter()
437
- const routes = router.routes || []
438
-
439
- const issues = []
440
- const warnings = []
441
-
442
- // Check each route
443
- for (const route of routes) {
444
- // Check for required properties
445
- if (!route.method) {
446
- issues.push(`Route missing method: ${route.path}`)
447
- }
448
-
449
- if (!route.path) {
450
- issues.push(`Route missing path: ${route.method || 'UNKNOWN'}`)
451
- }
452
-
453
- if (!route.handler) {
454
- issues.push(`Route missing handler: ${route.method} ${route.path}`)
455
- }
456
-
457
- // Validate path format
458
- if (route.path && !route.path.startsWith('/')) {
459
- issues.push(`Route path should start with '/': ${route.method} ${route.path}`)
460
- }
461
-
462
- // Check for parameter syntax issues
463
- if (route.path && route.path.includes('{')) {
464
- const params = route.path.match(/\{[^}]+\}/g) || []
465
- for (const param of params) {
466
- if (!param.match(/^\{[a-z_]\w*(\?|:[^}]+)?\}$/i)) {
467
- issues.push(`Invalid parameter syntax in ${route.method} ${route.path}: ${param}`)
468
- }
469
- }
470
- }
471
-
472
- // Strict mode validations
473
- if (options.strict) {
474
- // Check for missing route names on important routes
475
- if (!route.name && !route.path.includes('{') && route.path !== '/') {
476
- warnings.push(`Consider adding a name to route: ${route.method} ${route.path}`)
477
- }
478
-
479
- // Check for missing middleware on sensitive routes
480
- if (route.path.includes('/admin') && (!route.middleware || route.middleware.length === 0)) {
481
- warnings.push(`Admin route missing middleware: ${route.method} ${route.path}`)
482
- }
483
- }
484
- }
485
-
486
- // Check for duplicate routes
487
- const routeMap = new Map<string, number>()
488
- for (const route of routes) {
489
- const key = `${route.method}:${route.path}`
490
- routeMap.set(key, (routeMap.get(key) || 0) + 1)
491
- }
492
-
493
- for (const [key, count] of routeMap.entries()) {
494
- if (count > 1) {
495
- issues.push(`Duplicate route detected: ${key} (${count} times)`)
496
- }
497
- }
498
-
499
- // Display results
500
- if (issues.length === 0 && warnings.length === 0) {
501
- logger.success('✅ All route definitions are valid')
502
- return
503
- }
504
-
505
- if (issues.length > 0) {
506
- logger.error(`❌ Found ${issues.length} validation error(s):`)
507
- for (const issue of issues) {
508
- console.log(` • ${issue}`)
509
- }
510
- }
511
-
512
- if (warnings.length > 0) {
513
- logger.warning(`⚠️ Found ${warnings.length} warning(s):`)
514
- for (const warning of warnings) {
515
- console.log(` • ${warning}`)
516
- }
517
- }
518
-
519
- if (options.fix) {
520
- logger.info('🔧 Auto-fixing is not yet implemented')
521
- }
522
-
523
- if (issues.length > 0) {
524
- process.exit(1)
525
- }
526
- }
527
- catch (error: any) {
528
- logger.error(`Route validation failed: ${error.message}`)
529
- throw error
530
- }
531
- }
package/src/cli.ts DELETED
@@ -1,5 +0,0 @@
1
- import { createCLI } from './cli/index'
2
-
3
- // Create and run the CLI
4
- const cli = createCLI()
5
- cli.parse()