@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.
- package/dist/cli.js +1 -1
- package/dist/container/service-provider.d.ts +3 -3
- package/dist/development/performance-profiler.d.ts +3 -3
- package/dist/development/route-debugger.d.ts +1 -1
- package/dist/development/route-inspector.d.ts +2 -2
- package/dist/observability/integration.d.ts +1 -1
- package/dist/response/macros.d.ts +1 -1
- package/dist/router/index.d.ts +7 -7
- package/dist/router/router.d.ts +0 -32
- package/dist/testing/performance-testing.d.ts +2 -2
- package/dist/testing/test-client.d.ts +1 -1
- package/dist/testing/websocket-testing.d.ts +1 -1
- package/package.json +2 -3
- package/src/auth.ts +0 -489
- package/src/cache/lru-cache.ts +0 -457
- package/src/cache/middleware-memoization.ts +0 -531
- package/src/cache/route-cache-warmer.ts +0 -486
- package/src/cache/sqlite-cache.ts +0 -783
- package/src/cache/streaming-cache.ts +0 -572
- package/src/cli/colors.ts +0 -29
- package/src/cli/index.ts +0 -287
- package/src/cli/middleware.ts +0 -291
- package/src/cli/openapi.ts +0 -407
- package/src/cli/router.ts +0 -188
- package/src/cli/routes.ts +0 -265
- package/src/cli/utils.ts +0 -531
- package/src/cli.ts +0 -5
- package/src/config.ts +0 -322
- package/src/container/container.ts +0 -786
- package/src/container/contextual-binding.ts +0 -606
- package/src/container/decorators.ts +0 -368
- package/src/container/index.ts +0 -49
- package/src/container/service-provider.ts +0 -596
- package/src/development/hot-reload.ts +0 -673
- package/src/development/index.ts +0 -499
- package/src/development/performance-profiler.ts +0 -717
- package/src/development/route-debugger.ts +0 -527
- package/src/development/route-inspector.ts +0 -749
- package/src/development/typescript-utilities.ts +0 -682
- package/src/docs.ts +0 -397
- package/src/errors/circuit-breaker.ts +0 -733
- package/src/errors/error-handler.ts +0 -569
- package/src/errors/error-reporting.ts +0 -672
- package/src/errors/exceptions.ts +0 -536
- package/src/errors/graceful-degradation.ts +0 -623
- package/src/errors/index.ts +0 -21
- package/src/errors/router-errors.ts +0 -632
- package/src/file-serving/static-files.ts +0 -718
- package/src/index.ts +0 -66
- package/src/middleware/auth.ts +0 -220
- package/src/middleware/content_security_policy.ts +0 -215
- package/src/middleware/cors.ts +0 -142
- package/src/middleware/csrf.ts +0 -166
- package/src/middleware/ddos_protection.ts +0 -279
- package/src/middleware/file_security.ts +0 -191
- package/src/middleware/file_upload.ts +0 -275
- package/src/middleware/helmet.ts +0 -268
- package/src/middleware/index.ts +0 -117
- package/src/middleware/input_validation.ts +0 -453
- package/src/middleware/json_body.ts +0 -37
- package/src/middleware/performance_alerting.ts +0 -540
- package/src/middleware/performance_dashboard.ts +0 -661
- package/src/middleware/performance_monitor.ts +0 -945
- package/src/middleware/pipeline.ts +0 -489
- package/src/middleware/rate_limit.ts +0 -251
- package/src/middleware/request_id.ts +0 -36
- package/src/middleware/request_signing.ts +0 -638
- package/src/middleware/request_tracer.ts +0 -653
- package/src/middleware/response_cache.ts +0 -778
- package/src/middleware/security.ts +0 -482
- package/src/middleware/security_suite.ts +0 -257
- package/src/middleware/session.ts +0 -91
- package/src/model-binding/index.ts +0 -18
- package/src/model-binding/model-middleware.ts +0 -425
- package/src/model-binding/model-registry.ts +0 -550
- package/src/model-binding.ts +0 -370
- package/src/model-resolver-factory.ts +0 -106
- package/src/observability/correlation.ts +0 -691
- package/src/observability/health-checks.ts +0 -729
- package/src/observability/index.ts +0 -184
- package/src/observability/integration.ts +0 -548
- package/src/observability/metrics.ts +0 -753
- package/src/observability/tracing.ts +0 -638
- package/src/optimization/bun-utilities.ts +0 -778
- package/src/query-builder-integration.ts +0 -137
- package/src/request/context.ts +0 -109
- package/src/request/enhanced-request.ts +0 -876
- package/src/request/macros.ts +0 -822
- package/src/response/macros.ts +0 -665
- package/src/response/response-factory.ts +0 -596
- package/src/router/api-routes.ts +0 -243
- package/src/router/file-based-routing.ts +0 -697
- package/src/router/file-streaming.ts +0 -383
- package/src/router/fluent-routing.ts +0 -866
- package/src/router/group-organization.ts +0 -229
- package/src/router/handler-resolver.ts +0 -327
- package/src/router/http-methods.ts +0 -407
- package/src/router/index.ts +0 -193
- package/src/router/middleware-groups.ts +0 -222
- package/src/router/middleware-integration.ts +0 -399
- package/src/router/middleware.ts +0 -234
- package/src/router/model-binding.ts +0 -215
- package/src/router/optimized-route-matching.ts +0 -302
- package/src/router/route-building.ts +0 -221
- package/src/router/route-compiler.ts +0 -691
- package/src/router/route-matching.ts +0 -368
- package/src/router/route-trie.ts +0 -450
- package/src/router/router.ts +0 -1616
- package/src/router/server.ts +0 -684
- package/src/router/validation-integration.ts +0 -449
- package/src/router/view-rendering.ts +0 -233
- package/src/router/websocket.ts +0 -100
- package/src/routing/route-caching.ts +0 -402
- package/src/routing/route-throttling.ts +0 -469
- package/src/routing/subdomain-routing.ts +0 -492
- package/src/session/database-store.ts +0 -109
- package/src/session/file-store.ts +0 -148
- package/src/session/index.ts +0 -244
- package/src/session/memory-store.ts +0 -88
- package/src/session/redis-store.ts +0 -93
- package/src/streaming/index.ts +0 -17
- package/src/streaming/sse-handler.ts +0 -482
- package/src/streaming/stream-handler.ts +0 -552
- package/src/testing/auth-testing.ts +0 -448
- package/src/testing/file-upload-testing.ts +0 -543
- package/src/testing/index.ts +0 -10
- package/src/testing/middleware-testing.ts +0 -322
- package/src/testing/model-binding-testing.ts +0 -645
- package/src/testing/performance-testing.ts +0 -738
- package/src/testing/test-client.ts +0 -310
- package/src/testing/test-request.ts +0 -315
- package/src/testing/test-response.ts +0 -332
- package/src/testing/types.ts +0 -224
- package/src/testing/websocket-testing.ts +0 -590
- package/src/types/controller-types.ts +0 -385
- package/src/types/core.ts +0 -683
- package/src/types/middleware-types.ts +0 -422
- package/src/types/request-response-augmentation.ts +0 -489
- package/src/types/route-inference.ts +0 -372
- package/src/types.ts +0 -2123
- package/src/url.ts +0 -131
- package/src/utils/index.ts +0 -1
- package/src/utils/query-preservation.ts +0 -201
- package/src/utils.ts +0 -395
- package/src/validation/validator.ts +0 -688
- package/src/websocket/clustering.ts +0 -769
package/src/router/api-routes.ts
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync, statSync } from 'node:fs'
|
|
2
|
-
import { basename, extname, join, resolve } from 'node:path'
|
|
3
|
-
import type { Router } from './router'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Auto-discover API route files from routes/ directory.
|
|
7
|
-
*
|
|
8
|
-
* Convention:
|
|
9
|
-
* routes/api.ts → prefix /api (inferred from filename)
|
|
10
|
-
* routes/webhook.ts → prefix /webhook
|
|
11
|
-
* routes/index.ts → no prefix (root routes)
|
|
12
|
-
* routes/v2/api.ts → prefix /v2/api
|
|
13
|
-
*
|
|
14
|
-
* Each route file should export a default function that receives the router:
|
|
15
|
-
*
|
|
16
|
-
* export default function(router: Router) {
|
|
17
|
-
* router.get('/users', handler)
|
|
18
|
-
* router.post('/users', handler)
|
|
19
|
-
* }
|
|
20
|
-
*
|
|
21
|
-
* Or export named route definitions:
|
|
22
|
-
*
|
|
23
|
-
* export const routes = [
|
|
24
|
-
* { method: 'GET', path: '/users', handler },
|
|
25
|
-
* { method: 'POST', path: '/users', handler },
|
|
26
|
-
* ]
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
const ROUTE_EXTENSIONS = ['.ts', '.js']
|
|
30
|
-
const ROUTES_DIRS = ['routes', 'src/routes']
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Files that get no prefix (Laravel convention).
|
|
34
|
-
* routes/web.ts → /about, /contact (root)
|
|
35
|
-
* routes/api.ts → /api/users, /api/posts
|
|
36
|
-
*/
|
|
37
|
-
const ROOT_ROUTE_FILES = ['web', 'index']
|
|
38
|
-
|
|
39
|
-
interface RouteFileConfig {
|
|
40
|
-
/** Base directory to scan for route files */
|
|
41
|
-
routesDir?: string
|
|
42
|
-
/** Whether to log discovered routes */
|
|
43
|
-
verbose?: boolean
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Detect the routes directory
|
|
48
|
-
*/
|
|
49
|
-
function detectRoutesDirectory(): string | null {
|
|
50
|
-
const cwd = process.cwd()
|
|
51
|
-
for (const dir of ROUTES_DIRS) {
|
|
52
|
-
const fullPath = resolve(cwd, dir)
|
|
53
|
-
if (existsSync(fullPath) && statSync(fullPath).isDirectory()) {
|
|
54
|
-
return fullPath
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return null
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Discover route files recursively from a directory.
|
|
62
|
-
* Returns array of { filePath, prefix } where prefix is inferred from the path.
|
|
63
|
-
*/
|
|
64
|
-
function discoverRouteFiles(dir: string, baseDir: string): Array<{ filePath: string, prefix: string }> {
|
|
65
|
-
const results: Array<{ filePath: string, prefix: string }> = []
|
|
66
|
-
|
|
67
|
-
if (!existsSync(dir)) return results
|
|
68
|
-
|
|
69
|
-
const entries = readdirSync(dir, { withFileTypes: true })
|
|
70
|
-
|
|
71
|
-
for (const entry of entries) {
|
|
72
|
-
// Skip hidden files, underscored files
|
|
73
|
-
if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue
|
|
74
|
-
|
|
75
|
-
const fullPath = join(dir, entry.name)
|
|
76
|
-
|
|
77
|
-
if (entry.isDirectory()) {
|
|
78
|
-
// Recurse into subdirectories
|
|
79
|
-
results.push(...discoverRouteFiles(fullPath, baseDir))
|
|
80
|
-
}
|
|
81
|
-
else if (ROUTE_EXTENSIONS.includes(extname(entry.name))) {
|
|
82
|
-
// Compute prefix from file path relative to base dir
|
|
83
|
-
const relDir = dir === baseDir ? '' : dir.slice(baseDir.length)
|
|
84
|
-
const name = basename(entry.name, extname(entry.name))
|
|
85
|
-
|
|
86
|
-
// web.ts, index.ts → no filename prefix (root routes, Laravel convention)
|
|
87
|
-
// api.ts → /api
|
|
88
|
-
// admin.ts → /admin
|
|
89
|
-
const prefix = ROOT_ROUTE_FILES.includes(name)
|
|
90
|
-
? relDir || ''
|
|
91
|
-
: `${relDir}/${name}`
|
|
92
|
-
|
|
93
|
-
results.push({ filePath: fullPath, prefix })
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return results
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Load a route file and register its routes with the given prefix.
|
|
102
|
-
*/
|
|
103
|
-
async function loadRouteFile(router: Router, filePath: string, prefix: string, verbose: boolean): Promise<number> {
|
|
104
|
-
try {
|
|
105
|
-
const mod = await import(filePath)
|
|
106
|
-
let count = 0
|
|
107
|
-
const routesBefore = (router as any).routes?.length || 0
|
|
108
|
-
|
|
109
|
-
// Pattern 1: default export is a function → call it with a prefixed router proxy
|
|
110
|
-
if (typeof mod.default === 'function') {
|
|
111
|
-
// Create a proxy that prepends the prefix to all route registrations
|
|
112
|
-
const prefixedRouter = createPrefixedProxy(router, prefix)
|
|
113
|
-
await mod.default(prefixedRouter)
|
|
114
|
-
count = ((router as any).routes?.length || 0) - routesBefore
|
|
115
|
-
}
|
|
116
|
-
// Pattern 2: named 'routes' export is an array of { method, path, handler }
|
|
117
|
-
else if (Array.isArray(mod.routes)) {
|
|
118
|
-
for (const route of mod.routes) {
|
|
119
|
-
const method = (route.method || 'GET').toLowerCase()
|
|
120
|
-
const path = `${prefix}${route.path}`
|
|
121
|
-
if (typeof (router as any)[method] === 'function') {
|
|
122
|
-
await (router as any)[method](path, route.handler)
|
|
123
|
-
count++
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (verbose && count > 0) {
|
|
129
|
-
console.log(` ${prefix || '/'} → ${basename(filePath)} (${count} routes)`)
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return count
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
console.error(`[bun-router] Failed to load route file ${filePath}:`, error)
|
|
136
|
-
return 0
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Create a proxy around the router that auto-prepends a prefix to all route paths.
|
|
142
|
-
*/
|
|
143
|
-
function createPrefixedProxy(router: Router, prefix: string): Router {
|
|
144
|
-
if (!prefix) return router
|
|
145
|
-
|
|
146
|
-
const methods = ['get', 'post', 'put', 'patch', 'delete', 'options', 'any']
|
|
147
|
-
|
|
148
|
-
return new Proxy(router, {
|
|
149
|
-
get(target: any, prop: string) {
|
|
150
|
-
if (methods.includes(prop)) {
|
|
151
|
-
return async (path: string, ...args: any[]) => {
|
|
152
|
-
return target[prop](`${prefix}${path}`, ...args)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
// group() with nested prefix
|
|
156
|
-
if (prop === 'group') {
|
|
157
|
-
return async (options: any, callback: any) => {
|
|
158
|
-
const nestedPrefix = options.prefix ? `${prefix}${options.prefix}` : prefix
|
|
159
|
-
return target.group({ ...options, prefix: nestedPrefix }, callback)
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return target[prop]
|
|
163
|
-
},
|
|
164
|
-
})
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Register the API route auto-discovery feature on the Router class.
|
|
169
|
-
*/
|
|
170
|
-
export function registerApiRoutes(RouterClass: typeof Router): void {
|
|
171
|
-
Object.defineProperties(RouterClass.prototype, {
|
|
172
|
-
/**
|
|
173
|
-
* Internal: routes directory path
|
|
174
|
-
*/
|
|
175
|
-
_routesDir: {
|
|
176
|
-
value: null as string | null,
|
|
177
|
-
writable: true,
|
|
178
|
-
configurable: true,
|
|
179
|
-
},
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Internal: whether API routes have been initialized
|
|
183
|
-
*/
|
|
184
|
-
_apiRoutesInitialized: {
|
|
185
|
-
value: false,
|
|
186
|
-
writable: true,
|
|
187
|
-
configurable: true,
|
|
188
|
-
},
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Initialize automatic API route discovery.
|
|
192
|
-
* Called automatically when serve() is invoked, alongside _initFileRoutes.
|
|
193
|
-
*/
|
|
194
|
-
_initApiRoutes: {
|
|
195
|
-
async value(): Promise<void> {
|
|
196
|
-
if (this._apiRoutesInitialized) return
|
|
197
|
-
|
|
198
|
-
const routesDir = this._routesDir || detectRoutesDirectory()
|
|
199
|
-
if (!routesDir) {
|
|
200
|
-
this._apiRoutesInitialized = true
|
|
201
|
-
return
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const verbose = this.config?.verbose || false
|
|
205
|
-
const files = discoverRouteFiles(routesDir, routesDir)
|
|
206
|
-
|
|
207
|
-
if (files.length === 0) {
|
|
208
|
-
this._apiRoutesInitialized = true
|
|
209
|
-
return
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
if (verbose) {
|
|
213
|
-
console.log(`[bun-router] Auto-discovering API routes from ${routesDir}:`)
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
let totalRoutes = 0
|
|
217
|
-
for (const { filePath, prefix } of files) {
|
|
218
|
-
totalRoutes += await loadRouteFile(this, filePath, prefix, verbose)
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (totalRoutes > 0 && verbose) {
|
|
222
|
-
console.log(`[bun-router] Registered ${totalRoutes} API routes`)
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
this._apiRoutesInitialized = true
|
|
226
|
-
},
|
|
227
|
-
writable: true,
|
|
228
|
-
configurable: true,
|
|
229
|
-
},
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Configure the routes directory for API route auto-discovery.
|
|
233
|
-
*/
|
|
234
|
-
routesFrom: {
|
|
235
|
-
value(dir: string): Router {
|
|
236
|
-
this._routesDir = resolve(dir)
|
|
237
|
-
return this
|
|
238
|
-
},
|
|
239
|
-
writable: true,
|
|
240
|
-
configurable: true,
|
|
241
|
-
},
|
|
242
|
-
})
|
|
243
|
-
}
|