@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
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import type { Model, QueryBuilderModelResolver } from './model-binding'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Integration layer for bun-query-builder with model binding
|
|
5
|
-
*/
|
|
6
|
-
export class QueryBuilderIntegration {
|
|
7
|
-
private queryBuilder: any
|
|
8
|
-
private resolvers = new Map<string, QueryBuilderModelResolver>()
|
|
9
|
-
|
|
10
|
-
constructor(queryBuilder: any) {
|
|
11
|
-
this.queryBuilder = queryBuilder
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Register a model resolver and inject the query builder
|
|
16
|
-
*/
|
|
17
|
-
registerResolver<TModel extends Model>(
|
|
18
|
-
name: string,
|
|
19
|
-
resolver: QueryBuilderModelResolver<TModel>,
|
|
20
|
-
): void {
|
|
21
|
-
// Inject the query builder instance
|
|
22
|
-
resolver.queryBuilder = this.queryBuilder
|
|
23
|
-
this.resolvers.set(name, resolver)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Get a registered resolver
|
|
28
|
-
*/
|
|
29
|
-
getResolver<TModel extends Model>(name: string): QueryBuilderModelResolver<TModel> | undefined {
|
|
30
|
-
return this.resolvers.get(name) as QueryBuilderModelResolver<TModel> | undefined
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Resolve a model by name and ID
|
|
35
|
-
*/
|
|
36
|
-
async resolveModel<TModel extends Model>(
|
|
37
|
-
name: string,
|
|
38
|
-
id: string | number,
|
|
39
|
-
keyName?: string,
|
|
40
|
-
context: Record<string, Model> = {},
|
|
41
|
-
): Promise<TModel | null> {
|
|
42
|
-
const resolver = this.getResolver<TModel>(name)
|
|
43
|
-
if (!resolver) {
|
|
44
|
-
throw new Error(`No resolver registered for model: ${name}`)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Apply constraints if available
|
|
48
|
-
if (resolver.applyConstraints) {
|
|
49
|
-
const query = this.queryBuilder
|
|
50
|
-
.select()
|
|
51
|
-
.from(resolver.table)
|
|
52
|
-
.where(keyName || resolver.getRouteKeyName?.() || 'id', '=', id)
|
|
53
|
-
|
|
54
|
-
const constrainedQuery = resolver.applyConstraints(query, context)
|
|
55
|
-
return await constrainedQuery.first() || null
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Use the resolver's find method
|
|
59
|
-
return await resolver.find(id, keyName)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Resolve a model or throw an error
|
|
64
|
-
*/
|
|
65
|
-
async resolveModelOrFail<TModel extends Model>(
|
|
66
|
-
name: string,
|
|
67
|
-
id: string | number,
|
|
68
|
-
keyName?: string,
|
|
69
|
-
context: Record<string, Model> = {},
|
|
70
|
-
): Promise<TModel> {
|
|
71
|
-
const model = await this.resolveModel<TModel>(name, id, keyName, context)
|
|
72
|
-
if (!model) {
|
|
73
|
-
throw new Error(`${name} not found with ${keyName || 'id'}: ${id}`)
|
|
74
|
-
}
|
|
75
|
-
return model
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Create a query builder integration instance
|
|
81
|
-
*/
|
|
82
|
-
export function createQueryBuilderIntegration(queryBuilder: any): QueryBuilderIntegration {
|
|
83
|
-
return new QueryBuilderIntegration(queryBuilder)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Helper to create a basic model resolver using the query builder
|
|
88
|
-
*/
|
|
89
|
-
export function createBasicResolver<TModel extends Model>(
|
|
90
|
-
tableName: string,
|
|
91
|
-
options: {
|
|
92
|
-
keyName?: string
|
|
93
|
-
transform?: (row: any) => TModel
|
|
94
|
-
} = {},
|
|
95
|
-
): QueryBuilderModelResolver<TModel> {
|
|
96
|
-
const { keyName = 'id', transform } = options
|
|
97
|
-
|
|
98
|
-
return {
|
|
99
|
-
table: tableName,
|
|
100
|
-
queryBuilder: undefined, // Will be injected
|
|
101
|
-
|
|
102
|
-
async find(id: string | number, searchKey = keyName): Promise<TModel | null> {
|
|
103
|
-
if (!this.queryBuilder) {
|
|
104
|
-
throw new Error(`Query builder not initialized for table: ${tableName}`)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
const result = await this.queryBuilder
|
|
109
|
-
.select()
|
|
110
|
-
.from(this.table)
|
|
111
|
-
.where(searchKey, '=', id)
|
|
112
|
-
.first()
|
|
113
|
-
|
|
114
|
-
if (!result)
|
|
115
|
-
return null
|
|
116
|
-
|
|
117
|
-
return transform ? transform(result) : result as TModel
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
console.error(`Error finding ${tableName}:`, error)
|
|
121
|
-
return null
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
async findOrFail(id: string | number, searchKey = keyName): Promise<TModel> {
|
|
126
|
-
const model = await this.find(id, searchKey)
|
|
127
|
-
if (!model) {
|
|
128
|
-
throw new Error(`${tableName} not found with ${searchKey}: ${id}`)
|
|
129
|
-
}
|
|
130
|
-
return model
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
getRouteKeyName(): string {
|
|
134
|
-
return keyName
|
|
135
|
-
},
|
|
136
|
-
}
|
|
137
|
-
}
|
package/src/request/context.ts
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Request Context
|
|
3
|
-
*
|
|
4
|
-
* AsyncLocalStorage-backed access to the current request. The Router wires
|
|
5
|
-
* `runWithRequest()` automatically around handler/middleware invocation and
|
|
6
|
-
* calls `setCurrentRequest()` once the request has been enhanced with route
|
|
7
|
-
* params. User code reaches the active request via `request()` or
|
|
8
|
-
* `getCurrentRequest()` without having to thread it through call stacks.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
12
|
-
import type { EnhancedRequest } from '../types'
|
|
13
|
-
|
|
14
|
-
interface RequestContextStore {
|
|
15
|
-
current: EnhancedRequest | null
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const storage: AsyncLocalStorage<RequestContextStore> = new AsyncLocalStorage<RequestContextStore>()
|
|
19
|
-
|
|
20
|
-
// AsyncLocalStorage.run costs roughly a microsecond per request — a large
|
|
21
|
-
// share of total dispatch time — so it only runs once something actually
|
|
22
|
-
// uses the context API. Until then a plain module variable tracks the
|
|
23
|
-
// in-flight request: exact in the synchronous phase of a handler and for
|
|
24
|
-
// non-overlapping requests, which covers the call that flips
|
|
25
|
-
// `contextEnabled`. Every request that starts after the first use gets
|
|
26
|
-
// full ALS isolation. Apps that need guaranteed isolation from the very
|
|
27
|
-
// first request under concurrency can call `enableRequestContext()` at
|
|
28
|
-
// startup.
|
|
29
|
-
let contextEnabled = false
|
|
30
|
-
let syncCurrent: EnhancedRequest | null = null
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Force AsyncLocalStorage-backed request context on for all subsequent
|
|
34
|
-
* requests. Calling `request()`/`getCurrentRequest()` enables it
|
|
35
|
-
* automatically — use this when the very first request must already be
|
|
36
|
-
* fully isolated under concurrent load.
|
|
37
|
-
*/
|
|
38
|
-
export function enableRequestContext(): void {
|
|
39
|
-
contextEnabled = true
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Run `fn` inside a request-context scope where `request()` and
|
|
44
|
-
* `getCurrentRequest()` resolve to `initial`. The Router calls this around
|
|
45
|
-
* each request automatically.
|
|
46
|
-
*/
|
|
47
|
-
export function runWithRequest<T>(initial: EnhancedRequest | Request, fn: () => T | Promise<T>): T | Promise<T> {
|
|
48
|
-
if (!contextEnabled) {
|
|
49
|
-
syncCurrent = initial as EnhancedRequest
|
|
50
|
-
const result = fn()
|
|
51
|
-
if (result instanceof Promise) {
|
|
52
|
-
return result.finally(() => {
|
|
53
|
-
syncCurrent = null
|
|
54
|
-
}) as Promise<T>
|
|
55
|
-
}
|
|
56
|
-
syncCurrent = null
|
|
57
|
-
return result
|
|
58
|
-
}
|
|
59
|
-
return storage.run({ current: initial as EnhancedRequest }, fn)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Update the request stored in the current context. The Router calls this
|
|
64
|
-
* after enhancing the request with matched route params, so subsequent
|
|
65
|
-
* `request()` calls see the enhanced object.
|
|
66
|
-
*/
|
|
67
|
-
export function setCurrentRequest(req: EnhancedRequest): void {
|
|
68
|
-
const store = storage.getStore()
|
|
69
|
-
if (store) {
|
|
70
|
-
store.current = req
|
|
71
|
-
return
|
|
72
|
-
}
|
|
73
|
-
// Pre-enablement fallback: only refresh it while a request is in flight
|
|
74
|
-
if (syncCurrent !== null) {
|
|
75
|
-
syncCurrent = req
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Returns the active request, or `undefined` when called outside a request
|
|
81
|
-
* scope. Prefer `request()` when the request is required.
|
|
82
|
-
*
|
|
83
|
-
* First use switches the router to AsyncLocalStorage-backed context for
|
|
84
|
-
* all subsequent requests; this call itself resolves via a synchronous
|
|
85
|
-
* fallback (see `enableRequestContext` for eager opt-in).
|
|
86
|
-
*/
|
|
87
|
-
export function getCurrentRequest(): EnhancedRequest | undefined {
|
|
88
|
-
if (!contextEnabled) {
|
|
89
|
-
contextEnabled = true
|
|
90
|
-
return syncCurrent ?? undefined
|
|
91
|
-
}
|
|
92
|
-
return storage.getStore()?.current ?? syncCurrent ?? undefined
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Returns the active request. Throws when called outside a request scope —
|
|
97
|
-
* typically that means it was called before the Router established context
|
|
98
|
-
* (e.g. during module initialization) or inside a fire-and-forget callback
|
|
99
|
-
* that escaped the AsyncLocalStorage frame.
|
|
100
|
-
*/
|
|
101
|
-
export function request(): EnhancedRequest {
|
|
102
|
-
const req = getCurrentRequest()
|
|
103
|
-
if (!req) {
|
|
104
|
-
throw new Error(
|
|
105
|
-
'request() called outside a request scope. It can only be invoked from within a route handler or middleware.',
|
|
106
|
-
)
|
|
107
|
-
}
|
|
108
|
-
return req
|
|
109
|
-
}
|