@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
@@ -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
- }
@@ -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
- }