@engjts/nexus 0.1.8 → 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 (205) hide show
  1. package/package.json +1 -1
  2. package/BENCHMARK_REPORT.md +0 -343
  3. package/documentation/01-getting-started.md +0 -240
  4. package/documentation/02-context.md +0 -335
  5. package/documentation/03-routing.md +0 -397
  6. package/documentation/04-middleware.md +0 -483
  7. package/documentation/05-validation.md +0 -514
  8. package/documentation/06-error-handling.md +0 -465
  9. package/documentation/07-performance.md +0 -364
  10. package/documentation/08-adapters.md +0 -470
  11. package/documentation/09-api-reference.md +0 -548
  12. package/documentation/10-examples.md +0 -582
  13. package/documentation/11-deployment.md +0 -477
  14. package/documentation/12-sentry.md +0 -620
  15. package/documentation/13-sentry-data-storage.md +0 -996
  16. package/documentation/14-sentry-data-reference.md +0 -457
  17. package/documentation/15-sentry-summary.md +0 -409
  18. package/documentation/16-alerts-system.md +0 -745
  19. package/documentation/17-alert-adapters.md +0 -696
  20. package/documentation/18-alerts-implementation-summary.md +0 -385
  21. package/documentation/19-class-based-routing.md +0 -840
  22. package/documentation/20-websocket-realtime.md +0 -813
  23. package/documentation/21-cache-system.md +0 -510
  24. package/documentation/22-job-queue.md +0 -772
  25. package/documentation/23-sentry-plugin.md +0 -551
  26. package/documentation/24-testing-utilities.md +0 -1287
  27. package/documentation/25-api-versioning.md +0 -533
  28. package/documentation/26-context-store.md +0 -607
  29. package/documentation/27-dependency-injection.md +0 -329
  30. package/documentation/28-lifecycle-hooks.md +0 -521
  31. package/documentation/29-package-structure.md +0 -196
  32. package/documentation/30-plugin-system.md +0 -414
  33. package/documentation/31-jwt-authentication.md +0 -597
  34. package/documentation/32-cli.md +0 -268
  35. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  36. package/documentation/ALERTS-INDEX.md +0 -330
  37. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  38. package/documentation/README.md +0 -178
  39. package/documentation/index.html +0 -34
  40. package/modern_framework_paper.md +0 -1870
  41. package/public/css/style.css +0 -87
  42. package/public/index.html +0 -34
  43. package/public/js/app.js +0 -27
  44. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  45. package/src/advanced/cache/MultiTierCache.ts +0 -194
  46. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  47. package/src/advanced/cache/index.ts +0 -5
  48. package/src/advanced/cache/types.ts +0 -40
  49. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  50. package/src/advanced/graphql/index.ts +0 -22
  51. package/src/advanced/graphql/server.ts +0 -252
  52. package/src/advanced/graphql/types.ts +0 -42
  53. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  54. package/src/advanced/jobs/JobQueue.ts +0 -556
  55. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  56. package/src/advanced/jobs/index.ts +0 -5
  57. package/src/advanced/jobs/types.ts +0 -70
  58. package/src/advanced/observability/APMManager.ts +0 -163
  59. package/src/advanced/observability/AlertManager.ts +0 -109
  60. package/src/advanced/observability/MetricRegistry.ts +0 -151
  61. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  62. package/src/advanced/observability/StructuredLogger.ts +0 -154
  63. package/src/advanced/observability/TracingManager.ts +0 -117
  64. package/src/advanced/observability/adapters.ts +0 -304
  65. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  66. package/src/advanced/observability/index.ts +0 -11
  67. package/src/advanced/observability/types.ts +0 -174
  68. package/src/advanced/playground/extractPathParams.ts +0 -6
  69. package/src/advanced/playground/generateFieldExample.ts +0 -31
  70. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
  71. package/src/advanced/playground/generateSummary.ts +0 -19
  72. package/src/advanced/playground/getTagFromPath.ts +0 -9
  73. package/src/advanced/playground/index.ts +0 -8
  74. package/src/advanced/playground/playground.ts +0 -250
  75. package/src/advanced/playground/types.ts +0 -49
  76. package/src/advanced/playground/zodToExample.ts +0 -16
  77. package/src/advanced/playground/zodToParams.ts +0 -15
  78. package/src/advanced/postman/buildAuth.ts +0 -31
  79. package/src/advanced/postman/buildBody.ts +0 -15
  80. package/src/advanced/postman/buildQueryParams.ts +0 -27
  81. package/src/advanced/postman/buildRequestItem.ts +0 -36
  82. package/src/advanced/postman/buildResponses.ts +0 -11
  83. package/src/advanced/postman/buildUrl.ts +0 -33
  84. package/src/advanced/postman/capitalize.ts +0 -4
  85. package/src/advanced/postman/generateCollection.ts +0 -59
  86. package/src/advanced/postman/generateEnvironment.ts +0 -34
  87. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  88. package/src/advanced/postman/generateFieldExample.ts +0 -45
  89. package/src/advanced/postman/generateName.ts +0 -20
  90. package/src/advanced/postman/generateUUID.ts +0 -11
  91. package/src/advanced/postman/getTagFromPath.ts +0 -10
  92. package/src/advanced/postman/index.ts +0 -28
  93. package/src/advanced/postman/postman.ts +0 -156
  94. package/src/advanced/postman/slugify.ts +0 -7
  95. package/src/advanced/postman/types.ts +0 -140
  96. package/src/advanced/realtime/index.ts +0 -18
  97. package/src/advanced/realtime/websocket.ts +0 -231
  98. package/src/advanced/sentry/index.ts +0 -1236
  99. package/src/advanced/sentry/types.ts +0 -355
  100. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  101. package/src/advanced/static/generateETag.ts +0 -7
  102. package/src/advanced/static/getMimeType.ts +0 -9
  103. package/src/advanced/static/index.ts +0 -32
  104. package/src/advanced/static/isSafePath.ts +0 -13
  105. package/src/advanced/static/publicDir.ts +0 -21
  106. package/src/advanced/static/serveStatic.ts +0 -225
  107. package/src/advanced/static/spa.ts +0 -24
  108. package/src/advanced/static/types.ts +0 -159
  109. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  110. package/src/advanced/swagger/buildOperation.ts +0 -61
  111. package/src/advanced/swagger/buildParameters.ts +0 -61
  112. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  113. package/src/advanced/swagger/buildResponses.ts +0 -54
  114. package/src/advanced/swagger/capitalize.ts +0 -5
  115. package/src/advanced/swagger/convertPath.ts +0 -9
  116. package/src/advanced/swagger/createSwagger.ts +0 -12
  117. package/src/advanced/swagger/generateOperationId.ts +0 -21
  118. package/src/advanced/swagger/generateSpec.ts +0 -105
  119. package/src/advanced/swagger/generateSummary.ts +0 -24
  120. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  121. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  122. package/src/advanced/swagger/index.ts +0 -25
  123. package/src/advanced/swagger/swagger.ts +0 -237
  124. package/src/advanced/swagger/types.ts +0 -206
  125. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  126. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  127. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  128. package/src/advanced/testing/factory.ts +0 -509
  129. package/src/advanced/testing/harness.ts +0 -612
  130. package/src/advanced/testing/index.ts +0 -430
  131. package/src/advanced/testing/load-test.ts +0 -618
  132. package/src/advanced/testing/mock-server.ts +0 -498
  133. package/src/advanced/testing/mock.ts +0 -670
  134. package/src/cli/bin.ts +0 -9
  135. package/src/cli/cli.ts +0 -158
  136. package/src/cli/commands/add.ts +0 -178
  137. package/src/cli/commands/build.ts +0 -73
  138. package/src/cli/commands/create.ts +0 -166
  139. package/src/cli/commands/dev.ts +0 -85
  140. package/src/cli/commands/generate.ts +0 -99
  141. package/src/cli/commands/help.ts +0 -95
  142. package/src/cli/commands/init.ts +0 -91
  143. package/src/cli/commands/version.ts +0 -38
  144. package/src/cli/index.ts +0 -6
  145. package/src/cli/templates/generators.ts +0 -359
  146. package/src/cli/templates/index.ts +0 -680
  147. package/src/cli/utils/exec.ts +0 -52
  148. package/src/cli/utils/file-system.ts +0 -78
  149. package/src/cli/utils/logger.ts +0 -111
  150. package/src/core/adapter.ts +0 -88
  151. package/src/core/application.ts +0 -1453
  152. package/src/core/context-pool.ts +0 -79
  153. package/src/core/context.ts +0 -856
  154. package/src/core/index.ts +0 -94
  155. package/src/core/middleware.ts +0 -272
  156. package/src/core/performance/buffer-pool.ts +0 -108
  157. package/src/core/performance/middleware-optimizer.ts +0 -162
  158. package/src/core/plugin/PluginManager.ts +0 -435
  159. package/src/core/plugin/builder.ts +0 -358
  160. package/src/core/plugin/index.ts +0 -50
  161. package/src/core/plugin/types.ts +0 -214
  162. package/src/core/router/file-router.ts +0 -623
  163. package/src/core/router/index.ts +0 -260
  164. package/src/core/router/radix-tree.ts +0 -242
  165. package/src/core/serializer.ts +0 -397
  166. package/src/core/store/index.ts +0 -30
  167. package/src/core/store/registry.ts +0 -178
  168. package/src/core/store/request-store.ts +0 -240
  169. package/src/core/store/types.ts +0 -233
  170. package/src/core/types.ts +0 -616
  171. package/src/database/adapter.ts +0 -35
  172. package/src/database/adapters/index.ts +0 -1
  173. package/src/database/adapters/mysql.ts +0 -669
  174. package/src/database/database.ts +0 -70
  175. package/src/database/dialect.ts +0 -388
  176. package/src/database/index.ts +0 -12
  177. package/src/database/migrations.ts +0 -86
  178. package/src/database/optimizer.ts +0 -125
  179. package/src/database/query-builder.ts +0 -404
  180. package/src/database/realtime.ts +0 -53
  181. package/src/database/schema.ts +0 -71
  182. package/src/database/transactions.ts +0 -56
  183. package/src/database/types.ts +0 -87
  184. package/src/deployment/cluster.ts +0 -471
  185. package/src/deployment/config.ts +0 -454
  186. package/src/deployment/docker.ts +0 -599
  187. package/src/deployment/graceful-shutdown.ts +0 -373
  188. package/src/deployment/index.ts +0 -56
  189. package/src/index.ts +0 -281
  190. package/src/security/adapter.ts +0 -318
  191. package/src/security/auth/JWTPlugin.ts +0 -234
  192. package/src/security/auth/JWTProvider.ts +0 -316
  193. package/src/security/auth/adapter.ts +0 -12
  194. package/src/security/auth/jwt.ts +0 -234
  195. package/src/security/auth/middleware.ts +0 -188
  196. package/src/security/csrf.ts +0 -220
  197. package/src/security/headers.ts +0 -108
  198. package/src/security/index.ts +0 -60
  199. package/src/security/rate-limit/adapter.ts +0 -7
  200. package/src/security/rate-limit/memory.ts +0 -108
  201. package/src/security/rate-limit/middleware.ts +0 -181
  202. package/src/security/sanitization.ts +0 -75
  203. package/src/security/types.ts +0 -240
  204. package/src/security/utils.ts +0 -52
  205. package/tsconfig.json +0 -39
@@ -1,355 +0,0 @@
1
- // ============================================
2
- // Types & Interfaces
3
- // ============================================
4
-
5
- import { Context } from "../../core/types";
6
-
7
- export type SeverityLevel = 'fatal' | 'error' | 'warning' | 'info' | 'debug';
8
-
9
-
10
- export interface SentryUser {
11
- id?: string;
12
- email?: string;
13
- username?: string;
14
- ip_address?: string;
15
- [key: string]: any;
16
- }
17
-
18
- export interface SentryBreadcrumb {
19
- type?: 'default' | 'http' | 'navigation' | 'error' | 'debug' | 'query' | 'info';
20
- category?: string;
21
- message?: string;
22
- data?: Record<string, any>;
23
- level?: SeverityLevel;
24
- timestamp?: number;
25
- }
26
-
27
- export interface SentryException {
28
- type: string;
29
- value: string;
30
- stacktrace?: {
31
- frames: SentryStackFrame[];
32
- };
33
- mechanism?: {
34
- type: string;
35
- handled: boolean;
36
- };
37
- }
38
-
39
- export interface SentryStackFrame {
40
- filename?: string;
41
- function?: string;
42
- module?: string;
43
- lineno?: number;
44
- colno?: number;
45
- abs_path?: string;
46
- context_line?: string;
47
- pre_context?: string[];
48
- post_context?: string[];
49
- in_app?: boolean;
50
- }
51
-
52
- export interface SentryEvent {
53
- event_id: string;
54
- timestamp: number;
55
- platform: string;
56
- level: SeverityLevel;
57
- logger?: string;
58
- transaction?: string;
59
- server_name?: string;
60
- release?: string;
61
- environment?: string;
62
- message?: string;
63
- exception?: {
64
- values: SentryException[];
65
- };
66
- user?: SentryUser;
67
- tags?: Record<string, string>;
68
- extra?: Record<string, any>;
69
- contexts?: Record<string, any>;
70
- breadcrumbs?: SentryBreadcrumb[];
71
- request?: {
72
- url?: string;
73
- method?: string;
74
- headers?: Record<string, string>;
75
- query_string?: string;
76
- data?: any;
77
- };
78
- fingerprint?: string[];
79
- }
80
-
81
- export interface SentryTransaction {
82
- trace_id: string;
83
- span_id: string;
84
- parent_span_id?: string;
85
- name: string;
86
- op: string;
87
- status: 'ok' | 'cancelled' | 'unknown' | 'invalid_argument' | 'deadline_exceeded' |
88
- 'not_found' | 'already_exists' | 'permission_denied' | 'resource_exhausted' |
89
- 'failed_precondition' | 'aborted' | 'out_of_range' | 'unimplemented' |
90
- 'internal_error' | 'unavailable' | 'data_loss' | 'unauthenticated';
91
- start_timestamp: number;
92
- timestamp?: number;
93
- tags?: Record<string, string>;
94
- data?: Record<string, any>;
95
- spans?: SentrySpan[];
96
- }
97
-
98
- export interface SentrySpan {
99
- trace_id: string;
100
- span_id: string;
101
- parent_span_id?: string;
102
- op: string;
103
- description?: string;
104
- status?: string;
105
- start_timestamp: number;
106
- timestamp?: number;
107
- tags?: Record<string, string>;
108
- data?: Record<string, any>;
109
- }
110
-
111
- /**
112
- * APM (Application Performance Monitoring) Options
113
- * Integrated into Sentry for unified monitoring
114
- */
115
- export interface APMOptions {
116
- /**
117
- * Enable APM features
118
- * @default true when Sentry is enabled
119
- */
120
- enabled?: boolean;
121
-
122
- /**
123
- * Slow query threshold in milliseconds
124
- * @default 1000
125
- */
126
- slowQueryThreshold?: number;
127
-
128
- /**
129
- * Maximum slow queries to store
130
- * @default 100
131
- */
132
- maxSlowQueries?: number;
133
-
134
- /**
135
- * Memory leak detection options
136
- */
137
- memoryLeakDetection?: {
138
- /**
139
- * Enable memory monitoring
140
- * @default true
141
- */
142
- enabled?: boolean;
143
-
144
- /**
145
- * Check interval in milliseconds
146
- * @default 60000 (1 minute)
147
- */
148
- interval?: number;
149
-
150
- /**
151
- * Growth threshold to trigger warning (0.5 = 50%)
152
- * @default 0.5
153
- */
154
- growthThreshold?: number;
155
-
156
- /**
157
- * Number of snapshots to keep
158
- * @default 60
159
- */
160
- maxSnapshots?: number;
161
- };
162
-
163
- /**
164
- * Callback when memory leak is detected
165
- */
166
- onMemoryLeak?: (stats: MemoryLeakStats) => void;
167
-
168
- /**
169
- * Callback when slow query is detected
170
- */
171
- onSlowQuery?: (query: SlowQueryRecord) => void;
172
- }
173
-
174
- export interface MemoryLeakStats {
175
- growth: number;
176
- growthPercent: string;
177
- fromMB: string;
178
- toMB: string;
179
- snapshots: MemorySnapshot[];
180
- }
181
-
182
- export interface MemorySnapshot {
183
- timestamp: number;
184
- heapUsed: number;
185
- heapTotal: number;
186
- }
187
-
188
- export interface SlowQueryRecord {
189
- query: string;
190
- duration: number;
191
- timestamp: number;
192
- }
193
-
194
- export interface SentryOptions {
195
- /**
196
- * Sentry DSN (Data Source Name)
197
- * Format: https://<key>@<organization>.ingest.sentry.io/<project>
198
- */
199
- dsn: string;
200
-
201
- /**
202
- * Environment name (e.g., 'production', 'staging', 'development')
203
- */
204
- environment?: string;
205
-
206
- /**
207
- * Release version
208
- */
209
- release?: string;
210
-
211
- /**
212
- * Server name for identification
213
- */
214
- serverName?: string;
215
-
216
- /**
217
- * Sample rate for error events (0.0 to 1.0)
218
- * @default 1.0 (100%)
219
- */
220
- sampleRate?: number;
221
-
222
- /**
223
- * Sample rate for performance/transaction events (0.0 to 1.0)
224
- * @default 0.1 (10%)
225
- */
226
- tracesSampleRate?: number;
227
-
228
- /**
229
- * Enable performance monitoring
230
- * @default true
231
- */
232
- enableTracing?: boolean;
233
-
234
- /**
235
- * Maximum breadcrumbs to store
236
- * @default 100
237
- */
238
- maxBreadcrumbs?: number;
239
-
240
- /**
241
- * Debug mode - logs Sentry operations
242
- * @default false
243
- */
244
- debug?: boolean;
245
-
246
- /**
247
- * Attach stack traces to all messages
248
- * @default false
249
- */
250
- attachStacktrace?: boolean;
251
-
252
- /**
253
- * Send default PII (Personally Identifiable Information)
254
- * @default false
255
- */
256
- sendDefaultPii?: boolean;
257
-
258
- /**
259
- * Before send hook - allows modifying or dropping events
260
- */
261
- beforeSend?: (event: SentryEvent, hint?: { originalException?: Error }) => SentryEvent | null;
262
-
263
- /**
264
- * Before send transaction hook
265
- */
266
- beforeSendTransaction?: (transaction: SentryTransaction) => SentryTransaction | null;
267
-
268
- /**
269
- * Tags to add to all events
270
- */
271
- tags?: Record<string, string>;
272
-
273
- /**
274
- * Extra context to add to all events
275
- */
276
- extra?: Record<string, any>;
277
-
278
- /**
279
- * Paths to ignore (no error reporting)
280
- */
281
- ignorePaths?: string[];
282
-
283
- /**
284
- * Error types to ignore
285
- */
286
- ignoreErrors?: (string | RegExp)[];
287
-
288
- /**
289
- * Request timeout in ms
290
- * @default 5000
291
- */
292
- timeout?: number;
293
-
294
- /**
295
- * Integrations to enable
296
- */
297
- integrations?: {
298
- http?: boolean;
299
- console?: boolean;
300
- unhandledRejection?: boolean;
301
- uncaughtException?: boolean;
302
- };
303
-
304
- /**
305
- * APM (Application Performance Monitoring) options
306
- * Includes memory leak detection and slow query tracking
307
- */
308
- apm?: APMOptions;
309
- }
310
-
311
- export interface ParsedDSN {
312
- protocol: string;
313
- publicKey: string;
314
- host: string;
315
- projectId: string;
316
- }
317
-
318
-
319
- // ============================================
320
- // Nexus Middleware Integration
321
- // ============================================
322
-
323
- export interface SentryMiddlewareOptions {
324
- /**
325
- * Include request body in error reports
326
- * @default false
327
- */
328
- includeRequestBody?: boolean;
329
-
330
- /**
331
- * Include request headers
332
- * @default true
333
- */
334
- includeHeaders?: boolean;
335
-
336
- /**
337
- * Headers to exclude (e.g., 'authorization', 'cookie')
338
- */
339
- excludeHeaders?: string[];
340
-
341
- /**
342
- * Paths to ignore
343
- */
344
- ignorePaths?: string[];
345
-
346
- /**
347
- * Extract user from context
348
- */
349
- extractUser?: (ctx: Context) => SentryUser | null;
350
-
351
- /**
352
- * Extract transaction name
353
- */
354
- getTransactionName?: (ctx: Context) => string;
355
- }
@@ -1,47 +0,0 @@
1
- import { readdir } from 'fs/promises';
2
- import { join } from 'path/posix';
3
-
4
- /**
5
- * Generate HTML for directory listing
6
- */
7
-
8
- export async function generateDirectoryListing(
9
- dirPath: string,
10
- urlPath: string
11
- ): Promise<string> {
12
- const entries = await readdir(dirPath, { withFileTypes: true });
13
-
14
- const items = entries
15
- .filter(e => !e.name.startsWith('.'))
16
- .map(entry => {
17
- const isDir = entry.isDirectory();
18
- const name = isDir ? `${entry.name}/` : entry.name;
19
- const href = join(urlPath, entry.name);
20
- const icon = isDir ? '📁' : '📄';
21
- return `<li><a href="${href}">${icon} ${name}</a></li>`;
22
- })
23
- .join('\n');
24
-
25
- return `<!DOCTYPE html>
26
- <html lang="en">
27
- <head>
28
- <meta charset="UTF-8">
29
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
30
- <title>Index of ${urlPath}</title>
31
- <style>
32
- body { font-family: system-ui, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; }
33
- h1 { color: #333; border-bottom: 1px solid #eee; padding-bottom: 10px; }
34
- ul { list-style: none; padding: 0; }
35
- li { padding: 8px 0; border-bottom: 1px solid #f0f0f0; }
36
- a { color: #0066cc; text-decoration: none; }
37
- a:hover { text-decoration: underline; }
38
- .parent { margin-bottom: 20px; }
39
- </style>
40
- </head>
41
- <body>
42
- <h1>Index of ${urlPath}</h1>
43
- ${urlPath !== '/' ? `<div class="parent"><a href="${join(urlPath, '..')}">📁 ..</a></div>` : ''}
44
- <ul>${items}</ul>
45
- </body>
46
- </html>`;
47
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * Generate ETag from file stats
3
- */
4
-
5
- export function generateETag(stats: { size: number; mtimeMs: number; }): string {
6
- return `"${stats.size.toString(16)}-${stats.mtimeMs.toString(16)}"`;
7
- }
@@ -1,9 +0,0 @@
1
- import { MIME_TYPES } from './types';
2
-
3
- /**
4
- * Get MIME type for a file extension
5
- */
6
-
7
- export function getMimeType(ext: string): string {
8
- return MIME_TYPES[ext.toLowerCase()] || MIME_TYPES[''];
9
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Static File Serving Feature
3
- *
4
- * Serve static files from a directory (public folder)
5
- *
6
- * @example
7
- * ```typescript
8
- * import { createApp, serveStatic } from 'nexus';
9
- *
10
- * const app = createApp();
11
- *
12
- * // Basic usage - serve from ./public
13
- * app.plugin(serveStatic());
14
- *
15
- * // Custom directory
16
- * app.plugin(serveStatic({ root: './assets' }));
17
- *
18
- * // With prefix
19
- * app.plugin(serveStatic({
20
- * root: './public',
21
- * prefix: '/static' // /static/image.png → ./public/image.png
22
- * }));
23
- * ```
24
- */
25
-
26
- import { serveStatic } from './serveStatic';
27
-
28
- /**
29
- * Alias for serveStatic
30
- */
31
- export const staticFiles = serveStatic;
32
-
@@ -1,13 +0,0 @@
1
- import { normalize, resolve } from 'path/posix';
2
-
3
- /**
4
- * Check if path is safe (no directory traversal)
5
- */
6
-
7
- export function isSafePath(requestPath: string, root: string): boolean {
8
- const normalizedPath = normalize(requestPath);
9
- const fullPath = resolve(root, normalizedPath);
10
- const normalizedRoot = resolve(root);
11
-
12
- return fullPath.startsWith(normalizedRoot);
13
- }
@@ -1,21 +0,0 @@
1
- import { Plugin } from '../../core/types';
2
- import { serveStatic } from './serveStatic';
3
-
4
- /**
5
- * Create a public directory feature with sensible defaults
6
- *
7
- * @example
8
- * ```typescript
9
- * app.plugin(publicDir()); // ./public
10
- * app.plugin(publicDir('./assets')); // ./assets
11
- * ```
12
- */
13
-
14
- export function publicDir(root = './public'): Plugin {
15
- return serveStatic({
16
- root,
17
- maxAge: 86400,
18
- etag: true,
19
- lastModified: true
20
- });
21
- }