@stacksjs/bun-router 0.0.17 → 0.0.18

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 (146) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/container/service-provider.d.ts +3 -3
  3. package/dist/development/performance-profiler.d.ts +3 -3
  4. package/dist/development/route-debugger.d.ts +1 -1
  5. package/dist/development/route-inspector.d.ts +2 -2
  6. package/dist/observability/integration.d.ts +1 -1
  7. package/dist/response/macros.d.ts +1 -1
  8. package/dist/router/index.d.ts +7 -7
  9. package/dist/router/router.d.ts +0 -32
  10. package/dist/testing/performance-testing.d.ts +2 -2
  11. package/dist/testing/test-client.d.ts +1 -1
  12. package/dist/testing/websocket-testing.d.ts +1 -1
  13. package/package.json +2 -3
  14. package/src/auth.ts +0 -489
  15. package/src/cache/lru-cache.ts +0 -457
  16. package/src/cache/middleware-memoization.ts +0 -531
  17. package/src/cache/route-cache-warmer.ts +0 -486
  18. package/src/cache/sqlite-cache.ts +0 -783
  19. package/src/cache/streaming-cache.ts +0 -572
  20. package/src/cli/colors.ts +0 -29
  21. package/src/cli/index.ts +0 -287
  22. package/src/cli/middleware.ts +0 -291
  23. package/src/cli/openapi.ts +0 -407
  24. package/src/cli/router.ts +0 -188
  25. package/src/cli/routes.ts +0 -265
  26. package/src/cli/utils.ts +0 -531
  27. package/src/cli.ts +0 -5
  28. package/src/config.ts +0 -322
  29. package/src/container/container.ts +0 -786
  30. package/src/container/contextual-binding.ts +0 -606
  31. package/src/container/decorators.ts +0 -368
  32. package/src/container/index.ts +0 -49
  33. package/src/container/service-provider.ts +0 -596
  34. package/src/development/hot-reload.ts +0 -673
  35. package/src/development/index.ts +0 -499
  36. package/src/development/performance-profiler.ts +0 -717
  37. package/src/development/route-debugger.ts +0 -527
  38. package/src/development/route-inspector.ts +0 -749
  39. package/src/development/typescript-utilities.ts +0 -682
  40. package/src/docs.ts +0 -397
  41. package/src/errors/circuit-breaker.ts +0 -733
  42. package/src/errors/error-handler.ts +0 -569
  43. package/src/errors/error-reporting.ts +0 -672
  44. package/src/errors/exceptions.ts +0 -536
  45. package/src/errors/graceful-degradation.ts +0 -623
  46. package/src/errors/index.ts +0 -21
  47. package/src/errors/router-errors.ts +0 -632
  48. package/src/file-serving/static-files.ts +0 -718
  49. package/src/index.ts +0 -66
  50. package/src/middleware/auth.ts +0 -220
  51. package/src/middleware/content_security_policy.ts +0 -215
  52. package/src/middleware/cors.ts +0 -142
  53. package/src/middleware/csrf.ts +0 -166
  54. package/src/middleware/ddos_protection.ts +0 -279
  55. package/src/middleware/file_security.ts +0 -191
  56. package/src/middleware/file_upload.ts +0 -275
  57. package/src/middleware/helmet.ts +0 -268
  58. package/src/middleware/index.ts +0 -117
  59. package/src/middleware/input_validation.ts +0 -453
  60. package/src/middleware/json_body.ts +0 -37
  61. package/src/middleware/performance_alerting.ts +0 -540
  62. package/src/middleware/performance_dashboard.ts +0 -661
  63. package/src/middleware/performance_monitor.ts +0 -945
  64. package/src/middleware/pipeline.ts +0 -489
  65. package/src/middleware/rate_limit.ts +0 -251
  66. package/src/middleware/request_id.ts +0 -36
  67. package/src/middleware/request_signing.ts +0 -638
  68. package/src/middleware/request_tracer.ts +0 -653
  69. package/src/middleware/response_cache.ts +0 -778
  70. package/src/middleware/security.ts +0 -482
  71. package/src/middleware/security_suite.ts +0 -257
  72. package/src/middleware/session.ts +0 -91
  73. package/src/model-binding/index.ts +0 -18
  74. package/src/model-binding/model-middleware.ts +0 -425
  75. package/src/model-binding/model-registry.ts +0 -550
  76. package/src/model-binding.ts +0 -370
  77. package/src/model-resolver-factory.ts +0 -106
  78. package/src/observability/correlation.ts +0 -691
  79. package/src/observability/health-checks.ts +0 -729
  80. package/src/observability/index.ts +0 -184
  81. package/src/observability/integration.ts +0 -548
  82. package/src/observability/metrics.ts +0 -753
  83. package/src/observability/tracing.ts +0 -638
  84. package/src/optimization/bun-utilities.ts +0 -778
  85. package/src/query-builder-integration.ts +0 -137
  86. package/src/request/context.ts +0 -109
  87. package/src/request/enhanced-request.ts +0 -876
  88. package/src/request/macros.ts +0 -822
  89. package/src/response/macros.ts +0 -665
  90. package/src/response/response-factory.ts +0 -596
  91. package/src/router/api-routes.ts +0 -243
  92. package/src/router/file-based-routing.ts +0 -697
  93. package/src/router/file-streaming.ts +0 -383
  94. package/src/router/fluent-routing.ts +0 -866
  95. package/src/router/group-organization.ts +0 -229
  96. package/src/router/handler-resolver.ts +0 -327
  97. package/src/router/http-methods.ts +0 -407
  98. package/src/router/index.ts +0 -193
  99. package/src/router/middleware-groups.ts +0 -222
  100. package/src/router/middleware-integration.ts +0 -399
  101. package/src/router/middleware.ts +0 -234
  102. package/src/router/model-binding.ts +0 -215
  103. package/src/router/optimized-route-matching.ts +0 -302
  104. package/src/router/route-building.ts +0 -221
  105. package/src/router/route-compiler.ts +0 -691
  106. package/src/router/route-matching.ts +0 -368
  107. package/src/router/route-trie.ts +0 -450
  108. package/src/router/router.ts +0 -1616
  109. package/src/router/server.ts +0 -684
  110. package/src/router/validation-integration.ts +0 -449
  111. package/src/router/view-rendering.ts +0 -233
  112. package/src/router/websocket.ts +0 -100
  113. package/src/routing/route-caching.ts +0 -402
  114. package/src/routing/route-throttling.ts +0 -469
  115. package/src/routing/subdomain-routing.ts +0 -492
  116. package/src/session/database-store.ts +0 -109
  117. package/src/session/file-store.ts +0 -148
  118. package/src/session/index.ts +0 -244
  119. package/src/session/memory-store.ts +0 -88
  120. package/src/session/redis-store.ts +0 -93
  121. package/src/streaming/index.ts +0 -17
  122. package/src/streaming/sse-handler.ts +0 -482
  123. package/src/streaming/stream-handler.ts +0 -552
  124. package/src/testing/auth-testing.ts +0 -448
  125. package/src/testing/file-upload-testing.ts +0 -543
  126. package/src/testing/index.ts +0 -10
  127. package/src/testing/middleware-testing.ts +0 -322
  128. package/src/testing/model-binding-testing.ts +0 -645
  129. package/src/testing/performance-testing.ts +0 -738
  130. package/src/testing/test-client.ts +0 -310
  131. package/src/testing/test-request.ts +0 -315
  132. package/src/testing/test-response.ts +0 -332
  133. package/src/testing/types.ts +0 -224
  134. package/src/testing/websocket-testing.ts +0 -590
  135. package/src/types/controller-types.ts +0 -385
  136. package/src/types/core.ts +0 -683
  137. package/src/types/middleware-types.ts +0 -422
  138. package/src/types/request-response-augmentation.ts +0 -489
  139. package/src/types/route-inference.ts +0 -372
  140. package/src/types.ts +0 -2123
  141. package/src/url.ts +0 -131
  142. package/src/utils/index.ts +0 -1
  143. package/src/utils/query-preservation.ts +0 -201
  144. package/src/utils.ts +0 -395
  145. package/src/validation/validator.ts +0 -688
  146. package/src/websocket/clustering.ts +0 -769
@@ -1,234 +0,0 @@
1
- import type { EnhancedRequest, MiddlewareHandler, NextFunction, Route } from '../types'
2
- import type { Router } from './router'
3
- import { resolveHandler as resolveHandlerUtil, wrapResponse } from './handler-resolver'
4
-
5
- /**
6
- * Middleware handling extension for Router class
7
- */
8
- export function registerMiddlewareHandling(RouterClass: typeof Router): void {
9
- Object.defineProperties(RouterClass.prototype, {
10
- /**
11
- * Add middleware to the router
12
- */
13
- use: {
14
- value(...middleware: (string | MiddlewareHandler)[]): Router {
15
- for (const mw of middleware) {
16
- const resolvedMiddleware = this.resolveMiddleware(mw)
17
- if (resolvedMiddleware) {
18
- this.globalMiddleware.push(resolvedMiddleware)
19
- }
20
- }
21
- // Invalidate per-route compiled middleware chains — they bake in
22
- // the global middleware stack as of build time
23
- this._mwEpoch = (this._mwEpoch || 0) + 1
24
- return this
25
- },
26
- writable: true,
27
- configurable: true,
28
- },
29
-
30
- /**
31
- * Resolve a middleware string or function to a middleware handler.
32
- * Returns synchronously — for string-based middleware not found in the
33
- * named registry, a lazy wrapper is returned that imports the module on
34
- * first invocation and caches it for subsequent calls.
35
- */
36
- resolveMiddleware: {
37
- value(middleware: string | MiddlewareHandler): MiddlewareHandler | null {
38
- if (typeof middleware === 'function') {
39
- return middleware
40
- }
41
-
42
- // Class instance with handle() method (e.g. new JsonBody())
43
- if (typeof middleware === 'object' && middleware !== null && 'handle' in middleware && typeof (middleware as any).handle === 'function') {
44
- return (req: EnhancedRequest, next: NextFunction) => {
45
- return (middleware as any).handle(req, next)
46
- }
47
- }
48
-
49
- if (typeof middleware === 'string') {
50
- // Check named middleware registry first (synchronous)
51
- const [name, params] = middleware.split(':')
52
- const factory = (this as any).namedMiddleware?.get(name)
53
- if (factory) {
54
- return factory(params)
55
- }
56
-
57
- // Create a lazy wrapper that imports on first request, then caches
58
- let cached: MiddlewareHandler | null = null
59
- const middlewareName = middleware
60
- return async (req: EnhancedRequest, next: NextFunction) => {
61
- if (!cached) {
62
- try {
63
- const importedMiddleware = await import(`../middleware/${middlewareName}.ts`)
64
- if (importedMiddleware.default && typeof importedMiddleware.default === 'function') {
65
- cached = importedMiddleware.default
66
- }
67
- else if (importedMiddleware.default && typeof importedMiddleware.default.handle === 'function') {
68
- cached = (r: EnhancedRequest, n: NextFunction) => importedMiddleware.default.handle(r, n)
69
- }
70
- }
71
- catch (error) {
72
- console.error(`Failed to load middleware "${middlewareName}":`, error)
73
- }
74
- }
75
- if (cached) {
76
- return cached(req, next)
77
- }
78
- return next()
79
- }
80
- }
81
-
82
- return null
83
- },
84
- writable: true,
85
- configurable: true,
86
- },
87
-
88
- /**
89
- * Build an optimized middleware chain
90
- */
91
- buildMiddlewareChain: {
92
- value(middlewares: MiddlewareHandler[]): (req: EnhancedRequest) => Promise<Response | null> {
93
- if (middlewares.length === 0) {
94
- return async (_req: EnhancedRequest) => null
95
- }
96
-
97
- // Build the chain from the end to start for better performance
98
- let chain = async (_req: EnhancedRequest): Promise<Response | null> => null
99
-
100
- for (let i = middlewares.length - 1; i >= 0; i--) {
101
- const middleware = middlewares[i]
102
- const nextChain = chain
103
- chain = async (req: EnhancedRequest): Promise<Response | null> => {
104
- const next = async (): Promise<Response> => {
105
- const result = await nextChain(req)
106
- return result || new Response(null, { status: 200 })
107
- }
108
- return middleware(req, next)
109
- }
110
- }
111
-
112
- return chain
113
- },
114
- writable: true,
115
- configurable: true,
116
- },
117
-
118
- /**
119
- * Run middleware stack for a request
120
- */
121
- runMiddleware: {
122
- async value(req: EnhancedRequest, middlewareStack: MiddlewareHandler[]): Promise<Response | null> {
123
- if (middlewareStack.length === 0) {
124
- return null // No middleware to run
125
- }
126
-
127
- try {
128
- // Build and execute optimized middleware chain
129
- const chain = this.buildMiddlewareChain(middlewareStack)
130
- return await chain(req)
131
- }
132
- catch (error) {
133
- if (this.errorHandler) {
134
- return this.errorHandler(error as Error)
135
- }
136
- throw error
137
- }
138
- },
139
- writable: true,
140
- configurable: true,
141
- },
142
-
143
- /**
144
- * Add middleware to a route group
145
- */
146
- middleware: {
147
- value(...middleware: (string | MiddlewareHandler)[]): Router {
148
- // Validate string middleware names against the named middleware registry
149
- for (const mw of middleware) {
150
- if (typeof mw === 'string') {
151
- const [name] = mw.split(':')
152
- if (!this.namedMiddleware.has(name)) {
153
- throw new Error(`Unknown middleware: ${name}`)
154
- }
155
- }
156
- }
157
-
158
- if (this.currentGroup) {
159
- if (!this.currentGroup.middleware) {
160
- this.currentGroup.middleware = []
161
- }
162
- this.currentGroup.middleware.push(...middleware)
163
- }
164
- else {
165
- // Apply to the most recently added route
166
- const lastRoute = this.routes[this.routes.length - 1]
167
- if (lastRoute) {
168
- this.applyMiddlewareToRoute(lastRoute, middleware)
169
- }
170
- }
171
-
172
- return this
173
- },
174
- writable: true,
175
- configurable: true,
176
- },
177
-
178
- /**
179
- * Apply middleware to a specific route
180
- */
181
- applyMiddlewareToRoute: {
182
- value(route: Route, middleware: (string | MiddlewareHandler)[]): void {
183
- for (const mw of middleware) {
184
- const resolvedMiddleware = this.resolveMiddleware(mw)
185
- if (resolvedMiddleware) {
186
- route.middleware.push(resolvedMiddleware)
187
- }
188
- }
189
- },
190
- writable: true,
191
- configurable: true,
192
- },
193
-
194
- /**
195
- * Resolve an action handler
196
- *
197
- * Supports:
198
- * - Functions returning Response or any value (auto-wrapped)
199
- * - String file paths like 'UserAction.ts', './actions/UserAction'
200
- * - Controller@method patterns like 'UserController@index'
201
- * - Class constructors with handle() method
202
- * - Class instances with handle() method
203
- */
204
- resolveHandler: {
205
- async value(handler: any, req: EnhancedRequest): Promise<Response> {
206
- return resolveHandlerUtil(handler, req, this.config)
207
- },
208
- writable: true,
209
- configurable: true,
210
- },
211
-
212
- /**
213
- * Wrap a value in a Response object
214
- * Useful for handlers that return non-Response values
215
- */
216
- wrapResponse: {
217
- value: wrapResponse,
218
- writable: true,
219
- configurable: true,
220
- },
221
-
222
- /**
223
- * Register an error handler
224
- */
225
- onError: {
226
- value(handler: (error: Error) => Response | Promise<Response>): Router {
227
- this.errorHandler = handler
228
- return this
229
- },
230
- writable: true,
231
- configurable: true,
232
- },
233
- })
234
- }
@@ -1,215 +0,0 @@
1
- import type {
2
- EnhancedRequest,
3
- MiddlewareHandler,
4
- NextFunction,
5
- } from '../types'
6
- import type { Router } from './router'
7
- import {
8
- modelRegistry,
9
- } from '../model-binding/model-registry'
10
-
11
- /**
12
- * Model binding extension for Router class
13
- */
14
- export function registerModelBinding(RouterClass: typeof Router): void {
15
- Object.defineProperties(RouterClass.prototype, {
16
- /**
17
- * Model binding registry for this router instance
18
- */
19
- modelRegistry: {
20
- value: modelRegistry,
21
- writable: true,
22
- configurable: true,
23
- },
24
-
25
- /**
26
- * Laravel-style Route::model() - Explicit binding
27
- * Explicitly bind a route parameter to a model
28
- */
29
- model: {
30
- value<T>(
31
- this: Router,
32
- key: string,
33
- modelClass: string | ((_value: string) => Promise<T | null>),
34
- callback?: (model: T | null) => Response | null,
35
- ): Router {
36
- if (typeof modelClass === 'string') {
37
- // Register string-based model class
38
- this.modelRegistry.register(key, {
39
- resolver: async (params: Record<string, string>) => {
40
- // For string-based registration, we'll just pass through
41
- // In a real Laravel app, this would resolve the model class
42
- console.warn(`Model class ${modelClass} not implemented`)
43
- // Return a mock model for testing
44
- return { id: params[key], modelClass }
45
- },
46
- errorHandling: callback
47
- ? {
48
- notFound: (_params: Record<string, string>) => callback(null) || new Response('Not Found', { status: 404 }),
49
- }
50
- : undefined,
51
- })
52
- }
53
- else {
54
- // Register function-based resolver
55
- this.modelRegistry.register(key, {
56
- resolver: async (params: Record<string, string>) => {
57
- const value = params[key]
58
- if (!value)
59
- return null
60
- return modelClass(value)
61
- },
62
- errorHandling: callback
63
- ? {
64
- notFound: (_params: Record<string, string>) => callback(null) || new Response('Not Found', { status: 404 }),
65
- }
66
- : undefined,
67
- })
68
- }
69
- return this
70
- },
71
- writable: true,
72
- configurable: true,
73
- },
74
-
75
- /**
76
- * Laravel-style implicit binding middleware
77
- * Automatically resolves models based on route parameters
78
- */
79
- implicitBinding: {
80
- value(this: Router): MiddlewareHandler {
81
- return async (req: EnhancedRequest, next: NextFunction): Promise<Response> => {
82
- if (!req.params) {
83
- const result = await next()
84
- return result || new Response('Not Found', { status: 404 })
85
- }
86
-
87
- // Resolve all parameters that might be models
88
- for (const [paramName, _paramValue] of Object.entries(req.params)) {
89
- // Check if we have a registered model for this parameter
90
- if (this.modelRegistry.has(paramName)) {
91
- try {
92
- const result = await this.modelRegistry.resolve(paramName, req.params, req)
93
-
94
- if (result.model === null) {
95
- if (result.status === 500) {
96
- // Handle resolver errors
97
- return new Response(JSON.stringify({
98
- error: 'Internal Server Error',
99
- message: result.error || 'Model resolution failed',
100
- }), {
101
- status: 500,
102
- headers: { 'Content-Type': 'application/json' },
103
- })
104
- }
105
- else if (result.status === 404) {
106
- return this.modelRegistry.createErrorResponse(paramName, result, req.params)
107
- }
108
- }
109
- else {
110
- // Attach the resolved model to the request
111
- ;(req as any)[paramName] = result.model
112
- }
113
- }
114
- catch (error) {
115
- // Handle unexpected errors in model resolution
116
- return new Response(JSON.stringify({
117
- error: 'Internal Server Error',
118
- message: error instanceof Error ? error.message : 'Model resolution failed',
119
- }), {
120
- status: 500,
121
- headers: { 'Content-Type': 'application/json' },
122
- })
123
- }
124
- }
125
- }
126
-
127
- const result = await next()
128
- return result || new Response('Not Found', { status: 404 })
129
- }
130
- },
131
- writable: true,
132
- configurable: true,
133
- },
134
-
135
- /**
136
- * Laravel-style missing() method for customizing 404 responses
137
- */
138
- missing: {
139
- value(
140
- this: Router,
141
- callback: (req: EnhancedRequest) => Response,
142
- ): MiddlewareHandler {
143
- return async (req: EnhancedRequest, next: NextFunction): Promise<Response> => {
144
- try {
145
- const result = await next()
146
- return result || callback(req)
147
- }
148
- catch (error) {
149
- console.error(error)
150
- // If it's a model not found error, use the custom callback
151
- return callback(req)
152
- }
153
- }
154
- },
155
- writable: true,
156
- configurable: true,
157
- },
158
-
159
- /**
160
- * Laravel-style scoped bindings
161
- * Scope a model binding to its parent
162
- */
163
- scopedBindings: {
164
- value(this: Router, bindings: Record<string, string>): MiddlewareHandler {
165
- return async (req: EnhancedRequest, next: NextFunction): Promise<Response> => {
166
- if (!req.params) {
167
- const result = await next()
168
- return result || new Response('Not Found', { status: 404 })
169
- }
170
-
171
- // Apply scoped bindings
172
- for (const [childParam, parentParam] of Object.entries(bindings)) {
173
- if (req.params[childParam] && req.params[parentParam]) {
174
- // This would validate that the child belongs to the parent
175
- // For now, we just pass through
176
- }
177
- }
178
-
179
- const result = await next()
180
- return result || new Response('Not Found', { status: 404 })
181
- }
182
- },
183
- writable: true,
184
- configurable: true,
185
- },
186
-
187
- /**
188
- * Clear model cache
189
- */
190
- clearModelCache: {
191
- value(modelName?: string): Router {
192
- if (modelName) {
193
- this.modelRegistry.clearCache(modelName)
194
- }
195
- else {
196
- this.modelRegistry.clearAllCache()
197
- }
198
- return this
199
- },
200
- writable: true,
201
- configurable: true,
202
- },
203
-
204
- /**
205
- * Get model registry statistics
206
- */
207
- getModelStats: {
208
- value() {
209
- return this.modelRegistry.getCacheStats()
210
- },
211
- writable: true,
212
- configurable: true,
213
- },
214
- })
215
- }