@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
@@ -1,470 +0,0 @@
1
- # Adapters & Extensibility
2
-
3
- ## Overview
4
-
5
- Nexus uses the **Adapter Pattern** to enable extensibility. All core components can be swapped out or extended without modifying the framework itself.
6
-
7
- ## Why Adapters?
8
-
9
- - ✅ **Pluggable Architecture** - Swap implementations easily
10
- - ✅ **Future-Proof** - Add features without breaking changes
11
- - ✅ **Framework Evolution** - Integrate new tools seamlessly
12
- - ✅ **Custom Implementations** - Build your own adapters
13
-
14
- ## Built-in Adapters
15
-
16
- ### RouterAdapter
17
-
18
- Interface for custom routing implementations:
19
-
20
- ```typescript
21
- interface RouterAdapter {
22
- addRoute(method: string, path: string, handler: Handler): void;
23
- match(method: string, path: string): RouteMatch | null;
24
- getRoutes(): Array<{ method: string; path: string }>;
25
- }
26
- ```
27
-
28
- ### ContextAdapter
29
-
30
- Interface for context creation strategies:
31
-
32
- ```typescript
33
- interface ContextAdapter {
34
- createContext(req: IncomingMessage): Promise<Context>;
35
- resetContext(ctx: Context, req: IncomingMessage): Promise<Context>;
36
- parseBody(req: IncomingMessage): Promise<any>;
37
- }
38
- ```
39
-
40
- ### ValidationAdapter
41
-
42
- Interface for schema validation libraries:
43
-
44
- ```typescript
45
- interface ValidationAdapter {
46
- validate<T>(schema: any, data: unknown): Promise<T>;
47
- isEnabled(): boolean;
48
- }
49
- ```
50
-
51
- ## Using Adapters
52
-
53
- ### Register an Adapter
54
-
55
- ```typescript
56
- import { createApp } from './nexus';
57
-
58
- const app = createApp();
59
-
60
- // Register custom adapter
61
- app.adapter('logger', customLoggerAdapter);
62
- ```
63
-
64
- ### Retrieve an Adapter
65
-
66
- ```typescript
67
- const logger = app.getAdapter<LoggerAdapter>('logger');
68
- logger.info('Application started');
69
- ```
70
-
71
- ## Creating Custom Adapters
72
-
73
- ### Logger Adapter
74
-
75
- ```typescript
76
- import { LoggerAdapter } from './nexus';
77
-
78
- class ConsoleLogger implements LoggerAdapter {
79
- info(message: string, meta?: any) {
80
- console.log(`[INFO] ${message}`, meta || '');
81
- }
82
-
83
- warn(message: string, meta?: any) {
84
- console.warn(`[WARN] ${message}`, meta || '');
85
- }
86
-
87
- error(message: string, error?: Error, meta?: any) {
88
- console.error(`[ERROR] ${message}`, error, meta || '');
89
- }
90
-
91
- debug(message: string, meta?: any) {
92
- if (process.env.DEBUG) {
93
- console.debug(`[DEBUG] ${message}`, meta || '');
94
- }
95
- }
96
- }
97
-
98
- // Register
99
- app.adapter('logger', new ConsoleLogger());
100
- ```
101
-
102
- ### Pino Logger Adapter
103
-
104
- ```typescript
105
- import pino from 'pino';
106
- import { LoggerAdapter } from './nexus';
107
-
108
- class PinoLogger implements LoggerAdapter {
109
- private logger = pino({
110
- level: process.env.LOG_LEVEL || 'info'
111
- });
112
-
113
- info(message: string, meta?: any) {
114
- this.logger.info(meta, message);
115
- }
116
-
117
- warn(message: string, meta?: any) {
118
- this.logger.warn(meta, message);
119
- }
120
-
121
- error(message: string, error?: Error, meta?: any) {
122
- this.logger.error({ err: error, ...meta }, message);
123
- }
124
-
125
- debug(message: string, meta?: any) {
126
- this.logger.debug(meta, message);
127
- }
128
- }
129
-
130
- app.adapter('logger', new PinoLogger());
131
- ```
132
-
133
- ### Cache Adapter (Redis)
134
-
135
- ```typescript
136
- import { createClient } from 'redis';
137
- import { CacheAdapter } from './nexus';
138
-
139
- class RedisCache implements CacheAdapter {
140
- private client = createClient();
141
-
142
- async get<T>(key: string): Promise<T | null> {
143
- const value = await this.client.get(key);
144
- return value ? JSON.parse(value) : null;
145
- }
146
-
147
- async set<T>(key: string, value: T, ttl?: number): Promise<void> {
148
- const serialized = JSON.stringify(value);
149
- if (ttl) {
150
- await this.client.setEx(key, ttl, serialized);
151
- } else {
152
- await this.client.set(key, serialized);
153
- }
154
- }
155
-
156
- async delete(key: string): Promise<void> {
157
- await this.client.del(key);
158
- }
159
-
160
- async clear(): Promise<void> {
161
- await this.client.flushDb();
162
- }
163
- }
164
-
165
- // Usage
166
- const cache = new RedisCache();
167
- app.adapter('cache', cache);
168
- ```
169
-
170
- ### Session Adapter
171
-
172
- ```typescript
173
- import { SessionAdapter } from './nexus';
174
-
175
- interface SessionData {
176
- userId?: string;
177
- createdAt: number;
178
- expiresAt: number;
179
- }
180
-
181
- class MemorySessionAdapter implements SessionAdapter {
182
- private sessions = new Map<string, SessionData>();
183
-
184
- async get(sessionId: string): Promise<SessionData | null> {
185
- const session = this.sessions.get(sessionId);
186
- if (!session) return null;
187
-
188
- // Check expiration
189
- if (Date.now() > session.expiresAt) {
190
- this.sessions.delete(sessionId);
191
- return null;
192
- }
193
-
194
- return session;
195
- }
196
-
197
- async set(sessionId: string, data: SessionData): Promise<void> {
198
- this.sessions.set(sessionId, data);
199
- }
200
-
201
- async destroy(sessionId: string): Promise<void> {
202
- this.sessions.delete(sessionId);
203
- }
204
- }
205
-
206
- app.adapter('session', new MemorySessionAdapter());
207
- ```
208
-
209
- ## Plugin System
210
-
211
- ### Create a Plugin
212
-
213
- ```typescript
214
- import { Plugin, Application } from './nexus';
215
-
216
- const analyticsPlugin: Plugin = {
217
- name: 'analytics',
218
- version: '1.0.0',
219
-
220
- install: (app: Application) => {
221
- // Add middleware
222
- app.use(async (ctx, next) => {
223
- const start = Date.now();
224
- const response = await next(ctx);
225
- const duration = Date.now() - start;
226
-
227
- // Track analytics
228
- track('request', {
229
- path: ctx.path,
230
- method: ctx.method,
231
- duration,
232
- status: response.statusCode
233
- });
234
-
235
- return response;
236
- });
237
-
238
- // Add custom routes
239
- app.get('/_analytics', async (ctx) => {
240
- return { stats: getAnalytics() };
241
- });
242
- }
243
- };
244
-
245
- // Use plugin
246
- app.plugin(analyticsPlugin);
247
- ```
248
-
249
- ### Authentication Plugin
250
-
251
- ```typescript
252
- const authPlugin: Plugin = {
253
- name: 'auth',
254
- version: '1.0.0',
255
-
256
- install: (app: Application) => {
257
- // Register JWT adapter
258
- app.adapter('jwt', new JWTAdapter({
259
- secret: process.env.JWT_SECRET!,
260
- expiresIn: '1h'
261
- }));
262
-
263
- // Add auth routes
264
- app.post('/auth/login', loginHandler);
265
- app.post('/auth/logout', logoutHandler);
266
- app.post('/auth/refresh', refreshHandler);
267
-
268
- // Add auth middleware factory
269
- (app as any).requireAuth = () => authMiddleware;
270
- }
271
- };
272
-
273
- app.plugin(authPlugin);
274
-
275
- // Use the plugin
276
- app.get('/protected', {
277
- middlewares: [(app as any).requireAuth()],
278
- handler: async (ctx) => {
279
- return { user: ctx.user };
280
- }
281
- });
282
- ```
283
-
284
- ## Real-World Examples
285
-
286
- ### Database Adapter
287
-
288
- ```typescript
289
- interface DatabaseAdapter {
290
- connect(): Promise<void>;
291
- disconnect(): Promise<void>;
292
- query<T>(sql: string, params?: any[]): Promise<T[]>;
293
- }
294
-
295
- class PostgreSQLAdapter implements DatabaseAdapter {
296
- private pool: Pool;
297
-
298
- constructor(config: PoolConfig) {
299
- this.pool = new Pool(config);
300
- }
301
-
302
- async connect(): Promise<void> {
303
- await this.pool.connect();
304
- }
305
-
306
- async disconnect(): Promise<void> {
307
- await this.pool.end();
308
- }
309
-
310
- async query<T>(sql: string, params?: any[]): Promise<T[]> {
311
- const result = await this.pool.query(sql, params);
312
- return result.rows;
313
- }
314
- }
315
-
316
- // Register
317
- const db = new PostgreSQLAdapter({
318
- host: process.env.DB_HOST,
319
- database: process.env.DB_NAME,
320
- user: process.env.DB_USER,
321
- password: process.env.DB_PASSWORD
322
- });
323
-
324
- app.adapter('database', db);
325
-
326
- // Use in handlers
327
- app.get('/users', async (ctx) => {
328
- const db = app.getAdapter<DatabaseAdapter>('database')!;
329
- const users = await db.query('SELECT * FROM users');
330
- return { users };
331
- });
332
- ```
333
-
334
- ### Rate Limiter Adapter
335
-
336
- ```typescript
337
- interface RateLimiterAdapter {
338
- check(key: string, limit: number, window: number): Promise<boolean>;
339
- reset(key: string): Promise<void>;
340
- }
341
-
342
- class RedisRateLimiter implements RateLimiterAdapter {
343
- private client: RedisClientType;
344
-
345
- async check(key: string, limit: number, window: number): Promise<boolean> {
346
- const count = await this.client.incr(key);
347
-
348
- if (count === 1) {
349
- await this.client.expire(key, window);
350
- }
351
-
352
- return count <= limit;
353
- }
354
-
355
- async reset(key: string): Promise<void> {
356
- await this.client.del(key);
357
- }
358
- }
359
-
360
- app.adapter('rateLimiter', new RedisRateLimiter());
361
- ```
362
-
363
- ## Adapter Registry
364
-
365
- ### Access the Registry
366
-
367
- ```typescript
368
- import { AdapterRegistry } from './nexus';
369
-
370
- const registry = new AdapterRegistry();
371
-
372
- // Register adapters
373
- registry.register('logger', loggerAdapter);
374
- registry.register('cache', cacheAdapter);
375
- registry.register('session', sessionAdapter);
376
-
377
- // Retrieve adapters
378
- const logger = registry.get<LoggerAdapter>('logger');
379
- const cache = registry.get<CacheAdapter>('cache');
380
-
381
- // Check if exists
382
- if (registry.has('logger')) {
383
- logger?.info('Logger is registered');
384
- }
385
-
386
- // Remove adapter
387
- registry.remove('cache');
388
- ```
389
-
390
- ## Best Practices
391
-
392
- ### ✅ DO: Define clear interfaces
393
-
394
- ```typescript
395
- interface MetricsAdapter {
396
- increment(metric: string, tags?: Record<string, string>): void;
397
- gauge(metric: string, value: number, tags?: Record<string, string>): void;
398
- timing(metric: string, duration: number, tags?: Record<string, string>): void;
399
- }
400
- ```
401
-
402
- ### ✅ DO: Use dependency injection
403
-
404
- ```typescript
405
- class UserService {
406
- constructor(
407
- private db: DatabaseAdapter,
408
- private cache: CacheAdapter
409
- ) {}
410
-
411
- async getUser(id: string) {
412
- // Try cache first
413
- const cached = await this.cache.get(`user:${id}`);
414
- if (cached) return cached;
415
-
416
- // Query database
417
- const user = await this.db.query('SELECT * FROM users WHERE id = $1', [id]);
418
- await this.cache.set(`user:${id}`, user, 300);
419
- return user;
420
- }
421
- }
422
- ```
423
-
424
- ### ✅ DO: Make adapters testable
425
-
426
- ```typescript
427
- class MockCache implements CacheAdapter {
428
- private store = new Map();
429
-
430
- async get<T>(key: string): Promise<T | null> {
431
- return this.store.get(key) || null;
432
- }
433
-
434
- async set<T>(key: string, value: T): Promise<void> {
435
- this.store.set(key, value);
436
- }
437
-
438
- async delete(key: string): Promise<void> {
439
- this.store.delete(key);
440
- }
441
-
442
- async clear(): Promise<void> {
443
- this.store.clear();
444
- }
445
- }
446
-
447
- // Use in tests
448
- const mockCache = new MockCache();
449
- app.adapter('cache', mockCache);
450
- ```
451
-
452
- ## Future Adapters
453
-
454
- The adapter pattern enables future phases:
455
-
456
- - 🔐 **Auth Adapters** - JWT, OAuth, Sessions
457
- - 🗄️ **Database Adapters** - PostgreSQL, MySQL, MongoDB
458
- - 📨 **Queue Adapters** - Redis, RabbitMQ, SQS
459
- - 📧 **Email Adapters** - SendGrid, Mailgun, SES
460
- - 🔍 **Search Adapters** - Elasticsearch, Algolia
461
- - 📊 **Analytics Adapters** - Google Analytics, Mixpanel
462
-
463
- ## Next Steps
464
-
465
- - 📖 [API Reference](./09-api-reference.md) - Complete API documentation
466
- - 💡 [Examples](./10-examples.md) - Real-world use cases
467
-
468
- ---
469
-
470
- [← Performance](./07-performance.md) | [API Reference →](./09-api-reference.md)