@engjts/nexus 0.1.7 → 0.1.9

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 (259) hide show
  1. package/dist/advanced/playground/generatePlaygroundHTML.d.ts.map +1 -1
  2. package/dist/advanced/playground/generatePlaygroundHTML.js +107 -0
  3. package/dist/advanced/playground/generatePlaygroundHTML.js.map +1 -1
  4. package/dist/advanced/playground/playground.d.ts +19 -0
  5. package/dist/advanced/playground/playground.d.ts.map +1 -1
  6. package/dist/advanced/playground/playground.js +70 -0
  7. package/dist/advanced/playground/playground.js.map +1 -1
  8. package/dist/advanced/playground/types.d.ts +20 -0
  9. package/dist/advanced/playground/types.d.ts.map +1 -1
  10. package/dist/core/application.d.ts +14 -0
  11. package/dist/core/application.d.ts.map +1 -1
  12. package/dist/core/application.js +173 -71
  13. package/dist/core/application.js.map +1 -1
  14. package/dist/core/context-pool.d.ts +2 -13
  15. package/dist/core/context-pool.d.ts.map +1 -1
  16. package/dist/core/context-pool.js +7 -45
  17. package/dist/core/context-pool.js.map +1 -1
  18. package/dist/core/context.d.ts +108 -5
  19. package/dist/core/context.d.ts.map +1 -1
  20. package/dist/core/context.js +449 -53
  21. package/dist/core/context.js.map +1 -1
  22. package/dist/core/index.d.ts +1 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +9 -1
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/middleware.d.ts +6 -0
  27. package/dist/core/middleware.d.ts.map +1 -1
  28. package/dist/core/middleware.js +83 -84
  29. package/dist/core/middleware.js.map +1 -1
  30. package/dist/core/performance/fast-json.d.ts +149 -0
  31. package/dist/core/performance/fast-json.d.ts.map +1 -0
  32. package/dist/core/performance/fast-json.js +473 -0
  33. package/dist/core/performance/fast-json.js.map +1 -0
  34. package/dist/core/router/file-router.d.ts +20 -7
  35. package/dist/core/router/file-router.d.ts.map +1 -1
  36. package/dist/core/router/file-router.js +41 -13
  37. package/dist/core/router/file-router.js.map +1 -1
  38. package/dist/core/router/index.d.ts +6 -0
  39. package/dist/core/router/index.d.ts.map +1 -1
  40. package/dist/core/router/index.js +33 -6
  41. package/dist/core/router/index.js.map +1 -1
  42. package/dist/core/router/radix-tree.d.ts +4 -1
  43. package/dist/core/router/radix-tree.d.ts.map +1 -1
  44. package/dist/core/router/radix-tree.js +7 -3
  45. package/dist/core/router/radix-tree.js.map +1 -1
  46. package/dist/core/serializer.d.ts +251 -0
  47. package/dist/core/serializer.d.ts.map +1 -0
  48. package/dist/core/serializer.js +290 -0
  49. package/dist/core/serializer.js.map +1 -0
  50. package/dist/core/types.d.ts +39 -1
  51. package/dist/core/types.d.ts.map +1 -1
  52. package/dist/core/types.js.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +12 -2
  56. package/dist/index.js.map +1 -1
  57. package/package.json +3 -1
  58. package/documentation/01-getting-started.md +0 -240
  59. package/documentation/02-context.md +0 -335
  60. package/documentation/03-routing.md +0 -397
  61. package/documentation/04-middleware.md +0 -483
  62. package/documentation/05-validation.md +0 -514
  63. package/documentation/06-error-handling.md +0 -465
  64. package/documentation/07-performance.md +0 -364
  65. package/documentation/08-adapters.md +0 -470
  66. package/documentation/09-api-reference.md +0 -548
  67. package/documentation/10-examples.md +0 -582
  68. package/documentation/11-deployment.md +0 -477
  69. package/documentation/12-sentry.md +0 -620
  70. package/documentation/13-sentry-data-storage.md +0 -996
  71. package/documentation/14-sentry-data-reference.md +0 -457
  72. package/documentation/15-sentry-summary.md +0 -409
  73. package/documentation/16-alerts-system.md +0 -745
  74. package/documentation/17-alert-adapters.md +0 -696
  75. package/documentation/18-alerts-implementation-summary.md +0 -385
  76. package/documentation/19-class-based-routing.md +0 -840
  77. package/documentation/20-websocket-realtime.md +0 -813
  78. package/documentation/21-cache-system.md +0 -510
  79. package/documentation/22-job-queue.md +0 -772
  80. package/documentation/23-sentry-plugin.md +0 -551
  81. package/documentation/24-testing-utilities.md +0 -1287
  82. package/documentation/25-api-versioning.md +0 -533
  83. package/documentation/26-context-store.md +0 -607
  84. package/documentation/27-dependency-injection.md +0 -329
  85. package/documentation/28-lifecycle-hooks.md +0 -521
  86. package/documentation/29-package-structure.md +0 -196
  87. package/documentation/30-plugin-system.md +0 -414
  88. package/documentation/31-jwt-authentication.md +0 -597
  89. package/documentation/32-cli.md +0 -268
  90. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  91. package/documentation/ALERTS-INDEX.md +0 -330
  92. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  93. package/documentation/README.md +0 -178
  94. package/documentation/index.html +0 -34
  95. package/modern_framework_paper.md +0 -1870
  96. package/public/css/style.css +0 -87
  97. package/public/index.html +0 -34
  98. package/public/js/app.js +0 -27
  99. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  100. package/src/advanced/cache/MultiTierCache.ts +0 -194
  101. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  102. package/src/advanced/cache/index.ts +0 -5
  103. package/src/advanced/cache/types.ts +0 -40
  104. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  105. package/src/advanced/graphql/index.ts +0 -22
  106. package/src/advanced/graphql/server.ts +0 -252
  107. package/src/advanced/graphql/types.ts +0 -42
  108. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  109. package/src/advanced/jobs/JobQueue.ts +0 -556
  110. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  111. package/src/advanced/jobs/index.ts +0 -5
  112. package/src/advanced/jobs/types.ts +0 -70
  113. package/src/advanced/observability/APMManager.ts +0 -163
  114. package/src/advanced/observability/AlertManager.ts +0 -109
  115. package/src/advanced/observability/MetricRegistry.ts +0 -151
  116. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  117. package/src/advanced/observability/StructuredLogger.ts +0 -154
  118. package/src/advanced/observability/TracingManager.ts +0 -117
  119. package/src/advanced/observability/adapters.ts +0 -304
  120. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  121. package/src/advanced/observability/index.ts +0 -11
  122. package/src/advanced/observability/types.ts +0 -174
  123. package/src/advanced/playground/extractPathParams.ts +0 -6
  124. package/src/advanced/playground/generateFieldExample.ts +0 -31
  125. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1849
  126. package/src/advanced/playground/generateSummary.ts +0 -19
  127. package/src/advanced/playground/getTagFromPath.ts +0 -9
  128. package/src/advanced/playground/index.ts +0 -8
  129. package/src/advanced/playground/playground.ts +0 -170
  130. package/src/advanced/playground/types.ts +0 -20
  131. package/src/advanced/playground/zodToExample.ts +0 -16
  132. package/src/advanced/playground/zodToParams.ts +0 -15
  133. package/src/advanced/postman/buildAuth.ts +0 -31
  134. package/src/advanced/postman/buildBody.ts +0 -15
  135. package/src/advanced/postman/buildQueryParams.ts +0 -27
  136. package/src/advanced/postman/buildRequestItem.ts +0 -36
  137. package/src/advanced/postman/buildResponses.ts +0 -11
  138. package/src/advanced/postman/buildUrl.ts +0 -33
  139. package/src/advanced/postman/capitalize.ts +0 -4
  140. package/src/advanced/postman/generateCollection.ts +0 -59
  141. package/src/advanced/postman/generateEnvironment.ts +0 -34
  142. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  143. package/src/advanced/postman/generateFieldExample.ts +0 -45
  144. package/src/advanced/postman/generateName.ts +0 -20
  145. package/src/advanced/postman/generateUUID.ts +0 -11
  146. package/src/advanced/postman/getTagFromPath.ts +0 -10
  147. package/src/advanced/postman/index.ts +0 -28
  148. package/src/advanced/postman/postman.ts +0 -156
  149. package/src/advanced/postman/slugify.ts +0 -7
  150. package/src/advanced/postman/types.ts +0 -140
  151. package/src/advanced/realtime/index.ts +0 -18
  152. package/src/advanced/realtime/websocket.ts +0 -231
  153. package/src/advanced/sentry/index.ts +0 -1236
  154. package/src/advanced/sentry/types.ts +0 -355
  155. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  156. package/src/advanced/static/generateETag.ts +0 -7
  157. package/src/advanced/static/getMimeType.ts +0 -9
  158. package/src/advanced/static/index.ts +0 -32
  159. package/src/advanced/static/isSafePath.ts +0 -13
  160. package/src/advanced/static/publicDir.ts +0 -21
  161. package/src/advanced/static/serveStatic.ts +0 -225
  162. package/src/advanced/static/spa.ts +0 -24
  163. package/src/advanced/static/types.ts +0 -159
  164. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  165. package/src/advanced/swagger/buildOperation.ts +0 -61
  166. package/src/advanced/swagger/buildParameters.ts +0 -61
  167. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  168. package/src/advanced/swagger/buildResponses.ts +0 -54
  169. package/src/advanced/swagger/capitalize.ts +0 -5
  170. package/src/advanced/swagger/convertPath.ts +0 -9
  171. package/src/advanced/swagger/createSwagger.ts +0 -12
  172. package/src/advanced/swagger/generateOperationId.ts +0 -21
  173. package/src/advanced/swagger/generateSpec.ts +0 -105
  174. package/src/advanced/swagger/generateSummary.ts +0 -24
  175. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  176. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  177. package/src/advanced/swagger/index.ts +0 -25
  178. package/src/advanced/swagger/swagger.ts +0 -237
  179. package/src/advanced/swagger/types.ts +0 -206
  180. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  181. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  182. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  183. package/src/advanced/testing/factory.ts +0 -509
  184. package/src/advanced/testing/harness.ts +0 -612
  185. package/src/advanced/testing/index.ts +0 -430
  186. package/src/advanced/testing/load-test.ts +0 -618
  187. package/src/advanced/testing/mock-server.ts +0 -498
  188. package/src/advanced/testing/mock.ts +0 -670
  189. package/src/cli/bin.ts +0 -9
  190. package/src/cli/cli.ts +0 -158
  191. package/src/cli/commands/add.ts +0 -178
  192. package/src/cli/commands/build.ts +0 -73
  193. package/src/cli/commands/create.ts +0 -166
  194. package/src/cli/commands/dev.ts +0 -85
  195. package/src/cli/commands/generate.ts +0 -99
  196. package/src/cli/commands/help.ts +0 -95
  197. package/src/cli/commands/init.ts +0 -91
  198. package/src/cli/commands/version.ts +0 -38
  199. package/src/cli/index.ts +0 -6
  200. package/src/cli/templates/generators.ts +0 -359
  201. package/src/cli/templates/index.ts +0 -680
  202. package/src/cli/utils/exec.ts +0 -52
  203. package/src/cli/utils/file-system.ts +0 -78
  204. package/src/cli/utils/logger.ts +0 -111
  205. package/src/core/adapter.ts +0 -88
  206. package/src/core/application.ts +0 -1335
  207. package/src/core/context-pool.ts +0 -127
  208. package/src/core/context.ts +0 -412
  209. package/src/core/index.ts +0 -80
  210. package/src/core/middleware.ts +0 -262
  211. package/src/core/performance/buffer-pool.ts +0 -108
  212. package/src/core/performance/middleware-optimizer.ts +0 -162
  213. package/src/core/plugin/PluginManager.ts +0 -435
  214. package/src/core/plugin/builder.ts +0 -358
  215. package/src/core/plugin/index.ts +0 -50
  216. package/src/core/plugin/types.ts +0 -214
  217. package/src/core/router/file-router.ts +0 -594
  218. package/src/core/router/index.ts +0 -227
  219. package/src/core/router/radix-tree.ts +0 -226
  220. package/src/core/store/index.ts +0 -30
  221. package/src/core/store/registry.ts +0 -178
  222. package/src/core/store/request-store.ts +0 -240
  223. package/src/core/store/types.ts +0 -233
  224. package/src/core/types.ts +0 -574
  225. package/src/database/adapter.ts +0 -35
  226. package/src/database/adapters/index.ts +0 -1
  227. package/src/database/adapters/mysql.ts +0 -669
  228. package/src/database/database.ts +0 -70
  229. package/src/database/dialect.ts +0 -388
  230. package/src/database/index.ts +0 -12
  231. package/src/database/migrations.ts +0 -86
  232. package/src/database/optimizer.ts +0 -125
  233. package/src/database/query-builder.ts +0 -404
  234. package/src/database/realtime.ts +0 -53
  235. package/src/database/schema.ts +0 -71
  236. package/src/database/transactions.ts +0 -56
  237. package/src/database/types.ts +0 -87
  238. package/src/deployment/cluster.ts +0 -471
  239. package/src/deployment/config.ts +0 -454
  240. package/src/deployment/docker.ts +0 -599
  241. package/src/deployment/graceful-shutdown.ts +0 -373
  242. package/src/deployment/index.ts +0 -56
  243. package/src/index.ts +0 -264
  244. package/src/security/adapter.ts +0 -318
  245. package/src/security/auth/JWTPlugin.ts +0 -234
  246. package/src/security/auth/JWTProvider.ts +0 -316
  247. package/src/security/auth/adapter.ts +0 -12
  248. package/src/security/auth/jwt.ts +0 -234
  249. package/src/security/auth/middleware.ts +0 -188
  250. package/src/security/csrf.ts +0 -220
  251. package/src/security/headers.ts +0 -108
  252. package/src/security/index.ts +0 -60
  253. package/src/security/rate-limit/adapter.ts +0 -7
  254. package/src/security/rate-limit/memory.ts +0 -108
  255. package/src/security/rate-limit/middleware.ts +0 -181
  256. package/src/security/sanitization.ts +0 -75
  257. package/src/security/types.ts +0 -240
  258. package/src/security/utils.ts +0 -52
  259. package/tsconfig.json +0 -39
package/src/core/types.ts DELETED
@@ -1,574 +0,0 @@
1
- /**
2
- * Core type definitions for the Nexus Framework
3
- * Provides type-safe interfaces for requests, responses, middleware, and routing
4
- */
5
-
6
- import { IncomingMessage, ServerResponse } from 'http';
7
- import { ZodSchema } from 'zod';
8
- import { Application } from './application';
9
- import { ContextStore, StoreConstructor, StoreRegistry, RequestStore, RequestStoreConstructor } from './store';
10
-
11
- /**
12
- * HTTP methods supported by the framework
13
- */
14
- export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
15
-
16
- /**
17
- * HTTP headers type-safe wrapper
18
- */
19
- export interface Headers {
20
- [key: string]: string | string[] | undefined;
21
- }
22
-
23
- /**
24
- * Cookie parser and manager
25
- */
26
- export interface Cookies {
27
- get(name: string): string | undefined;
28
- set(name: string, value: string, options?: CookieOptions): void;
29
- delete(name: string): void;
30
- }
31
-
32
- /**
33
- * Cookie configuration options
34
- */
35
- export interface CookieOptions {
36
- maxAge?: number;
37
- expires?: Date;
38
- path?: string;
39
- domain?: string;
40
- secure?: boolean;
41
- httpOnly?: boolean;
42
- sameSite?: 'strict' | 'lax' | 'none';
43
- }
44
-
45
- /**
46
- * Response builder for fluent API
47
- */
48
- export interface ResponseBuilder {
49
- status(code: number): ResponseBuilder;
50
- header(name: string, value: string): ResponseBuilder;
51
- json<T>(data: T): Response;
52
- html(content: string): Response;
53
- text(content: string): Response;
54
- redirect(url: string, status?: number): Response;
55
- stream(readable: NodeJS.ReadableStream): Response;
56
- }
57
-
58
- /**
59
- * Framework response object
60
- */
61
- export interface Response {
62
- statusCode: number;
63
- headers: Headers;
64
- body: any;
65
- stream?: NodeJS.ReadableStream;
66
- }
67
-
68
- /**
69
- * Unified context object containing request and response data
70
- * This replaces the traditional req/res pattern with an immutable context
71
- */
72
- export interface Context {
73
- // Request metadata
74
- method: HTTPMethod;
75
- path: string;
76
- url: URL;
77
-
78
- // Request data
79
- params: Record<string, string>;
80
- query: Record<string, any>;
81
- body: any;
82
- headers: Headers;
83
- cookies: Cookies;
84
-
85
- // Raw Node.js objects for advanced use cases
86
- raw: {
87
- req: IncomingMessage;
88
- res: ServerResponse;
89
- };
90
-
91
- // Response builder
92
- response: ResponseBuilder;
93
-
94
- // Store access
95
- /** Access a registered global store by its class (singleton, persist across requests) */
96
- store<T extends ContextStore<any>>(StoreClass: StoreConstructor<T>): T;
97
-
98
- /** Access a request-scoped store by its class (per-request, disposed after response) */
99
- requestStore<T extends RequestStore<any>>(StoreClass: RequestStoreConstructor<T>): T;
100
-
101
- // Request-scoped data (simple key-value storage)
102
- /** Set a value in request-scoped storage */
103
- set<T = any>(key: string, value: T): void;
104
-
105
- /** Get a value from request-scoped storage */
106
- get<T = any>(key: string): T | undefined;
107
-
108
- // Utility methods
109
- json<T>(data: T, status?: number): Response;
110
- html(content: string, status?: number): Response;
111
- text(content: string, status?: number): Response;
112
- redirect(url: string, status?: number): Response;
113
- stream(readable: NodeJS.ReadableStream): Response;
114
-
115
- // Custom properties added by middleware
116
- [key: string]: any;
117
- }
118
-
119
- /**
120
- * Next function for middleware chain
121
- */
122
- export type Next<TContext = Context> = (ctx: TContext) => Promise<Response>;
123
-
124
- /**
125
- * Middleware function signature
126
- * Middleware can transform the context and pass it to the next handler
127
- * Now supports optional dependency injection as the third parameter.
128
- *
129
- * @template TIn - Input context type
130
- * @template TOut - Output context type (after transformation)
131
- * @template TDeps - Dependencies type (injected from app.provide())
132
- *
133
- * @example
134
- * ```typescript
135
- * // Simple middleware (no deps)
136
- * const loggerMiddleware: Middleware = async (ctx, next) => {
137
- * console.log(`${ctx.method} ${ctx.path}`);
138
- * return next(ctx);
139
- * };
140
- *
141
- * // Middleware with dependencies
142
- * const authMiddleware: Middleware<Context, Context, { jwt: JWTService; db: Database }> =
143
- * async (ctx, next, { jwt, db }) => {
144
- * const token = ctx.headers.authorization?.replace('Bearer ', '');
145
- * const payload = await jwt.verify(token);
146
- * ctx.user = await db.findUser(payload.userId);
147
- * return next(ctx);
148
- * };
149
- * ```
150
- */
151
- export type Middleware<TIn = Context, TOut = Context, TDeps = any> = (
152
- ctx: TIn,
153
- next: Next<TOut>,
154
- deps: TDeps
155
- ) => Promise<Response>;
156
-
157
- /**
158
- * Route handler function signature
159
- * Handlers can return data directly or a Response object
160
- */
161
- export type Handler<TContext = Context, TDeps = any> = (
162
- ctx: TContext,
163
- deps: TDeps
164
- ) => Promise<Response | any>;
165
-
166
- /**
167
- * Dependency container type
168
- * Maps dependency names to their instances
169
- */
170
- export type DependencyContainer = Record<string, any>;
171
-
172
- /**
173
- * Extract dependency types from container
174
- */
175
- export type ExtractDeps<T extends DependencyContainer, K extends keyof T> = {
176
- [P in K]: T[P];
177
- };
178
-
179
- /**
180
- * Route configuration with dependency injection
181
- */
182
- export interface InjectedRouteConfig<
183
- TContext = Context,
184
- TDeps extends DependencyContainer = DependencyContainer,
185
- TKeys extends keyof TDeps = keyof TDeps
186
- > {
187
- /** Dependencies to inject into handler */
188
- inject?: TKeys[];
189
- /** Route handler with injected dependencies */
190
- handler: (ctx: TContext, deps: Pick<TDeps, TKeys>) => Promise<Response | any>;
191
- /** Middleware chain */
192
- middlewares?: Middleware<any, any>[];
193
- /** Schema validation */
194
- schema?: SchemaConfig;
195
- /** Route metadata */
196
- meta?: RouteMeta;
197
- }
198
-
199
- /**
200
- * Validation error detail from Zod
201
- */
202
- export interface ValidationErrorDetail {
203
- path: (string | number)[];
204
- message: string;
205
- code: string;
206
- }
207
-
208
- /**
209
- * Custom validation error handler
210
- */
211
- export type ValidationErrorHandler = (
212
- errors: ValidationErrorDetail[],
213
- ctx: Context
214
- ) => Response | any;
215
-
216
- /**
217
- * Schema validation configuration
218
- */
219
- export interface SchemaConfig {
220
- params?: ZodSchema;
221
- query?: ZodSchema;
222
- body?: ZodSchema;
223
- headers?: ZodSchema;
224
- onValidationError?: ValidationErrorHandler;
225
- }
226
-
227
- /**
228
- * Route metadata for documentation and API generation
229
- */
230
- export interface RouteMeta {
231
- description?: string;
232
- tags?: string[];
233
- responses?: Record<number, string>;
234
- deprecated?: boolean;
235
- summary?: string;
236
- example?: string;
237
- }
238
-
239
- /**
240
- * Route configuration object
241
- */
242
- export interface RouteConfig<TContext = Context> {
243
- method: HTTPMethod;
244
- path: string;
245
- handler: Handler<TContext>;
246
- middlewares?: Middleware<any, any>[];
247
- schema?: SchemaConfig;
248
- meta?: RouteMeta;
249
- }
250
-
251
- /**
252
- * Route match result from router
253
- */
254
- export interface RouteMatch {
255
- handler: Handler;
256
- params: Record<string, string>;
257
- middlewares: Middleware[];
258
- schema?: SchemaConfig;
259
- }
260
-
261
- /**
262
- * Error handler function signature
263
- */
264
- export type ErrorHandler = (
265
- error: Error,
266
- ctx: Context
267
- ) => Response | Promise<Response>;
268
-
269
- /**
270
- * Application configuration options
271
- */
272
- export interface AppConfig {
273
- // Performance options
274
- contextPoolSize?: number;
275
- enableJIT?: boolean;
276
-
277
- // Error handling
278
- onError?: ErrorHandler;
279
-
280
- // Development options
281
- debug?: boolean;
282
- logRequests?: boolean;
283
- }
284
-
285
- /**
286
- * Plugin interface for extensibility
287
- */
288
- export interface Plugin {
289
- name: string;
290
- version: string;
291
- install: (app: Application) => void | Promise<void>;
292
- }
293
-
294
- /**
295
- * Base interface for class-based route definitions
296
- *
297
- * @example
298
- * ```typescript
299
- * class UserRegister implements RouteBase {
300
- * pathName = '/api/users/register';
301
- *
302
- * schema() {
303
- * return { body: z.object({ email: z.string().email() }) };
304
- * }
305
- *
306
- * meta() {
307
- * return { summary: 'Register user', tags: ['Users'] };
308
- * }
309
- *
310
- * async handler(ctx: Context) {
311
- * return { success: true };
312
- * }
313
- * }
314
- *
315
- * app.post(new UserRegister());
316
- * ```
317
- */
318
- export interface RouteBase<TContext = Context> {
319
- /** The route path (e.g., '/api/users/:id') - Optional for file-based routing */
320
- pathName?: string;
321
-
322
- /**
323
- * HTTP method(s) this route handles - Optional for file-based routing
324
- * When using file-based routing, you can define method handlers (GET, POST, etc.) as methods
325
- */
326
- method?: HTTPMethod | HTTPMethod[];
327
-
328
- /** Optional schema validation */
329
- schema?: () => SchemaConfig;
330
-
331
- /** Optional route metadata for documentation */
332
- meta?: () => RouteMeta;
333
-
334
- /** Optional route-specific middlewares */
335
- middlewares?: () => Middleware<any, any>[];
336
-
337
- /** The route handler (can be omitted if using method-named handlers like GET, POST, etc.) */
338
- handler?: Handler<TContext>;
339
-
340
- /** Method-specific handlers for file-based routing */
341
- GET?: Handler<TContext>;
342
- POST?: Handler<TContext>;
343
- PUT?: Handler<TContext>;
344
- DELETE?: Handler<TContext>;
345
- PATCH?: Handler<TContext>;
346
- HEAD?: Handler<TContext>;
347
- OPTIONS?: Handler<TContext>;
348
- }
349
-
350
- /**
351
- * Abstract base class for class-based routes with REQUIRED handler implementation.
352
- * Use this when you want TypeScript to enforce that the handler method is implemented.
353
- * Also provides lifecycle hooks for request processing and dependency injection.
354
- *
355
- * @example
356
- * ```typescript
357
- * // With dependency injection
358
- * class UserRegister extends Route<Context, { db: Database; cache: Redis }> {
359
- * pathName = '/api/users/register';
360
- *
361
- * // Optional: run before handler (with deps)
362
- * async onBefore(ctx: Context, { db }: { db: Database }) {
363
- * console.log('Before handler, db connected:', db.isConnected);
364
- * }
365
- *
366
- * // Optional: transform response after handler (with deps)
367
- * async onAfter(ctx: Context, result: any, { cache }: { cache: Redis }) {
368
- * await cache.set('last-register', JSON.stringify(result));
369
- * return { ...result, timestamp: Date.now() };
370
- * }
371
- *
372
- * // Optional: custom error handling (with deps)
373
- * async onError(ctx: Context, error: Error, deps) {
374
- * return { error: error.message, code: 'CUSTOM_ERROR' };
375
- * }
376
- *
377
- * // REQUIRED: handler with dependencies
378
- * async handler(ctx: Context, { db, cache }) {
379
- * const user = await db.query('INSERT INTO users...');
380
- * await cache.set(`user:${user.id}`, user);
381
- * return { success: true, user };
382
- * }
383
- * }
384
- *
385
- * app.provide({ db, cache }).post(new UserRegister());
386
- * ```
387
- */
388
- export abstract class Route<TContext = Context, TDeps = any> {
389
- pathName?: string;
390
-
391
- /**
392
- * The main route handler - REQUIRED!
393
- * TypeScript will enforce this is implemented.
394
- * @param ctx - Request context
395
- * @param deps - Injected dependencies from app.provide()
396
- */
397
- abstract handler(ctx: TContext, deps: TDeps): Promise<any> | any;
398
-
399
- // ─────────────────────────────────────────────────────────────────────────
400
- // Helper Methods for cleaner response handling
401
- // ─────────────────────────────────────────────────────────────────────────
402
-
403
- /**
404
- * Return a successful JSON response
405
- * @param data - The response data to send
406
- * @returns Object with success: true merged with data
407
- *
408
- * @example
409
- * ```typescript
410
- * return this.ok({ user: { id: 1, name: 'John' } });
411
- * // Returns: { success: true, user: { id: 1, name: 'John' } }
412
- * ```
413
- */
414
- protected ok<T extends Record<string, any>>(data: T): { success: true } & T {
415
- return { success: true, ...data };
416
- }
417
-
418
- /**
419
- * Return a failed JSON response with status code
420
- * @param ctx - The request context
421
- * @param status - HTTP status code (e.g., 400, 404, 500)
422
- * @param message - Error message
423
- * @param data - Optional additional error data
424
- * @returns Response object with error details
425
- *
426
- * @example
427
- * ```typescript
428
- * return this.fail(ctx, 404, 'User not found');
429
- * // Returns 404 with: { success: false, message: 'User not found' }
430
- *
431
- * return this.fail(ctx, 400, 'Validation failed', { errors: [...] });
432
- * // Returns 400 with: { success: false, message: 'Validation failed', data: { errors: [...] } }
433
- * ```
434
- */
435
- protected fail(ctx: TContext, status: number, message: string, data?: any): Response {
436
- return (ctx as Context).response
437
- .status(status)
438
- .json({ success: false, message, ...(data !== undefined ? { data } : {}) });
439
- }
440
-
441
- /**
442
- * HTTP method(s) this route handles - Optional
443
- * When using file-based routing, you can also define method handlers (GET, POST, etc.)
444
- */
445
- method?: HTTPMethod | HTTPMethod[];
446
-
447
- /**
448
- * Hook: Called BEFORE the handler.
449
- * - Return undefined/void to continue to handler
450
- * - Return a value to skip handler and use that as response
451
- * - Throw an error to trigger onError
452
- * @param ctx - Request context
453
- * @param deps - Injected dependencies from app.provide()
454
- */
455
- onBefore?(ctx: TContext, deps: TDeps): Promise<any | void> | any | void;
456
-
457
- /**
458
- * Hook: Called AFTER the handler completes successfully.
459
- * - Receives the handler result
460
- * - Can transform/modify the response
461
- * - Return the (modified) result
462
- * @param ctx - Request context
463
- * @param result - Handler result
464
- * @param deps - Injected dependencies from app.provide()
465
- */
466
- onAfter?(ctx: TContext, result: any, deps: TDeps): Promise<any> | any;
467
-
468
- /**
469
- * Hook: Called when handler or onBefore throws an error.
470
- * - Can return a custom error response
471
- * - If not defined, error propagates to global error handler
472
- * @param ctx - Request context
473
- * @param error - Error thrown
474
- * @param deps - Injected dependencies from app.provide()
475
- */
476
- onError?(ctx: TContext, error: Error, deps: TDeps): Promise<any> | any;
477
-
478
- /** Optional schema validation */
479
- schema?(): SchemaConfig;
480
-
481
- /** Optional route metadata for documentation */
482
- meta?(): RouteMeta;
483
-
484
- /** Optional route-specific middlewares */
485
- middlewares?(): Middleware<any, any>[];
486
- }
487
-
488
- /**
489
- * Type guard to check if a route is a Route class instance (with hooks support)
490
- */
491
- export function isRouteClass(route: RouteBase | Route): route is Route {
492
- return route instanceof Route ||
493
- (typeof (route as Route).handler === 'function' &&
494
- 'pathName' in route &&
495
- (typeof (route as Route).onBefore === 'function' ||
496
- typeof (route as Route).onAfter === 'function' ||
497
- typeof (route as Route).onError === 'function'));
498
- }
499
-
500
- /**
501
- * Lifecycle hooks for request processing
502
- *
503
- * @example
504
- * ```typescript
505
- * app.hooks({
506
- * onRequest: async (ctx) => {
507
- * ctx.requestId = crypto.randomUUID();
508
- * },
509
- * beforeHandler: async (ctx) => {
510
- * ctx.user = await getUser(ctx.headers.authorization);
511
- * },
512
- * afterHandler: async (ctx, result) => {
513
- * return { ...result, timestamp: Date.now() };
514
- * },
515
- * onError: async (ctx, error) => {
516
- * await logToSentry(error);
517
- * }
518
- * });
519
- * ```
520
- */
521
- export interface LifecycleHooks {
522
- /** Called when request is received, before any processing */
523
- onRequest?: (ctx: Context) => Promise<void | Response> | void | Response;
524
-
525
- /** Called before schema validation */
526
- beforeValidation?: (ctx: Context) => Promise<void | Response> | void | Response;
527
-
528
- /** Called after schema validation succeeds (ctx.body, ctx.query, ctx.params are validated) */
529
- afterValidation?: (ctx: Context) => Promise<void | Response> | void | Response;
530
-
531
- /** Called before route handler executes */
532
- beforeHandler?: (ctx: Context) => Promise<void | Response> | void | Response;
533
-
534
- /** Called after handler, can transform result. Return new result to override */
535
- afterHandler?: (ctx: Context, result: any) => Promise<any> | any;
536
-
537
- /** Called when an error occurs. Can return Response to handle error */
538
- onError?: (ctx: Context, error: Error) => Promise<void | Response> | void | Response;
539
-
540
- /** Called before response is sent (after all processing) */
541
- onResponse?: (ctx: Context, response: Response) => Promise<void | Response> | void | Response;
542
- }
543
-
544
- /**
545
- * Versioning strategy types
546
- */
547
- export type VersioningStrategy = 'path' | 'header' | 'query';
548
-
549
- /**
550
- * Versioning configuration for API versioning
551
- *
552
- * @example
553
- * ```typescript
554
- * app.configVersions({
555
- * strategies: ['header', 'query'],
556
- * header: 'api-version',
557
- * queryParam: 'v',
558
- * defaultVersion: 'v1',
559
- * register: ['v1', 'v2']
560
- * });
561
- * ```
562
- */
563
- export interface VersioningConfig {
564
- /** Versioning strategies to use */
565
- strategies: VersioningStrategy[];
566
- /** Header name for version (default: 'api-version') */
567
- header?: string;
568
- /** Query param name for version (default: 'v') */
569
- queryParam?: string;
570
- /** Default version when not specified */
571
- defaultVersion: string;
572
- /** List of versions to register */
573
- register: string[];
574
- }
@@ -1,35 +0,0 @@
1
- import { QueryContext } from './types';
2
-
3
- export interface QueryResult<T = unknown> {
4
- rows: T[];
5
- rowCount: number;
6
- fields?: string[];
7
- meta?: Record<string, unknown>;
8
- }
9
-
10
- export interface DatabaseAdapter {
11
- name: string;
12
- connect(): Promise<void>;
13
- disconnect(): Promise<void>;
14
- query<T = unknown>(sql: string, params?: unknown[], context?: QueryContext): Promise<QueryResult<T>>;
15
- stream?<T = unknown>(sql: string, params?: unknown[], context?: QueryContext): AsyncGenerator<T, void, unknown>;
16
- beginTransaction?(): Promise<void>;
17
- commitTransaction?(): Promise<void>;
18
- rollbackTransaction?(savepoint?: string): Promise<void>;
19
- createSavepoint?(name: string): Promise<void>;
20
- releaseSavepoint?(name: string): Promise<void>;
21
- listen?(channel: string): Promise<void>;
22
- notify?(channel: string, payload: unknown): Promise<void>;
23
- capabilities?: {
24
- json?: boolean;
25
- streaming?: boolean;
26
- realtime?: boolean;
27
- transactional?: boolean;
28
- };
29
- }
30
-
31
- export interface MigrationAdapter extends DatabaseAdapter {
32
- runMigration(sql: string): Promise<void>;
33
- ensureMigrationsTable(): Promise<void>;
34
- }
35
-
@@ -1 +0,0 @@
1
- export * from './mysql';