@morojs/moro 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +183 -165
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +104 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// Swagger UI Integration for Moro Framework
|
|
2
2
|
// Serves interactive API documentation using Swagger UI
|
|
3
3
|
|
|
4
|
-
import { readFileSync } from
|
|
5
|
-
import { join } from
|
|
6
|
-
import { HttpRequest, HttpResponse } from
|
|
7
|
-
import { OpenAPISpec } from
|
|
8
|
-
import { createFrameworkLogger } from
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { HttpRequest, HttpResponse } from '../http';
|
|
7
|
+
import { OpenAPISpec } from './openapi-generator';
|
|
8
|
+
import { createFrameworkLogger } from '../logger';
|
|
9
9
|
|
|
10
|
-
const logger = createFrameworkLogger(
|
|
10
|
+
const logger = createFrameworkLogger('SwaggerUI');
|
|
11
11
|
|
|
12
12
|
// Swagger UI configuration options
|
|
13
13
|
export interface SwaggerUIOptions {
|
|
@@ -30,18 +30,15 @@ export class SwaggerUIMiddleware {
|
|
|
30
30
|
constructor(openAPISpec: OpenAPISpec, options: SwaggerUIOptions = {}) {
|
|
31
31
|
this.openAPISpec = openAPISpec;
|
|
32
32
|
this.options = {
|
|
33
|
-
title:
|
|
33
|
+
title: 'API Documentation',
|
|
34
34
|
enableTryItOut: true,
|
|
35
35
|
enableFilter: true,
|
|
36
36
|
enableDeepLinking: true,
|
|
37
37
|
swaggerOptions: {
|
|
38
|
-
dom_id:
|
|
39
|
-
presets: [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
],
|
|
43
|
-
plugins: ["SwaggerUIBundle.plugins.DownloadUrl"],
|
|
44
|
-
layout: "StandaloneLayout",
|
|
38
|
+
dom_id: '#swagger-ui',
|
|
39
|
+
presets: ['SwaggerUIBundle.presets.apis', 'SwaggerUIBundle.presets.standalone'],
|
|
40
|
+
plugins: ['SwaggerUIBundle.plugins.DownloadUrl'],
|
|
41
|
+
layout: 'StandaloneLayout',
|
|
45
42
|
},
|
|
46
43
|
...options,
|
|
47
44
|
};
|
|
@@ -49,17 +46,17 @@ export class SwaggerUIMiddleware {
|
|
|
49
46
|
try {
|
|
50
47
|
// Find swagger-ui-dist assets
|
|
51
48
|
this.swaggerUIAssetPath = require
|
|
52
|
-
.resolve(
|
|
53
|
-
.replace(
|
|
54
|
-
logger.debug(
|
|
49
|
+
.resolve('swagger-ui-dist/package.json')
|
|
50
|
+
.replace('/package.json', '');
|
|
51
|
+
logger.debug('Swagger UI assets found', 'Initialization', {
|
|
55
52
|
assetPath: this.swaggerUIAssetPath,
|
|
56
53
|
});
|
|
57
54
|
} catch (error) {
|
|
58
|
-
logger.error(
|
|
55
|
+
logger.error('Failed to locate Swagger UI assets', 'Initialization', {
|
|
59
56
|
error: error instanceof Error ? error.message : String(error),
|
|
60
57
|
});
|
|
61
58
|
throw new Error(
|
|
62
|
-
|
|
59
|
+
'swagger-ui-dist package not found. Install with: npm install swagger-ui-dist'
|
|
63
60
|
);
|
|
64
61
|
}
|
|
65
62
|
}
|
|
@@ -108,9 +105,9 @@ export class SwaggerUIMiddleware {
|
|
|
108
105
|
font-family: monospace;
|
|
109
106
|
color: #c62828;
|
|
110
107
|
}
|
|
111
|
-
${this.options.customCss ||
|
|
108
|
+
${this.options.customCss || ''}
|
|
112
109
|
</style>
|
|
113
|
-
${this.options.favicon ? `<link rel="icon" type="image/png" href="${this.options.favicon}" sizes="32x32" />` :
|
|
110
|
+
${this.options.favicon ? `<link rel="icon" type="image/png" href="${this.options.favicon}" sizes="32x32" />` : ''}
|
|
114
111
|
</head>
|
|
115
112
|
<body>
|
|
116
113
|
<div id="loading-message">
|
|
@@ -212,98 +209,87 @@ export class SwaggerUIMiddleware {
|
|
|
212
209
|
}
|
|
213
210
|
|
|
214
211
|
// Create middleware function that serves Swagger UI
|
|
215
|
-
createMiddleware(basePath: string =
|
|
212
|
+
createMiddleware(basePath: string = '/docs') {
|
|
216
213
|
return (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
217
214
|
const path = req.path;
|
|
218
215
|
|
|
219
|
-
logger.debug(`Docs middleware handling: ${path}`,
|
|
216
|
+
logger.debug(`Docs middleware handling: ${path}`, 'DocsMiddleware', {
|
|
220
217
|
basePath,
|
|
221
218
|
});
|
|
222
219
|
|
|
223
220
|
// Serve the main HTML page
|
|
224
221
|
if (path === basePath || path === `${basePath}/`) {
|
|
225
|
-
logger.debug(
|
|
222
|
+
logger.debug('Serving Swagger UI HTML', 'DocsServing');
|
|
226
223
|
|
|
227
224
|
// Set CSP headers to allow Swagger UI to work
|
|
228
225
|
res.setHeader(
|
|
229
|
-
|
|
226
|
+
'Content-Security-Policy',
|
|
230
227
|
"default-src 'self'; " +
|
|
231
228
|
"script-src 'self' 'unsafe-inline' 'unsafe-eval'; " +
|
|
232
229
|
"style-src 'self' 'unsafe-inline'; " +
|
|
233
230
|
"img-src 'self' data: https:; " +
|
|
234
231
|
"font-src 'self' data:; " +
|
|
235
|
-
"connect-src 'self'"
|
|
232
|
+
"connect-src 'self'"
|
|
236
233
|
);
|
|
237
234
|
|
|
238
|
-
res.setHeader(
|
|
235
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
239
236
|
res.send(this.generateHTML(basePath));
|
|
240
237
|
return;
|
|
241
238
|
}
|
|
242
239
|
|
|
243
240
|
// Serve the OpenAPI JSON spec
|
|
244
241
|
if (path === `${basePath}/openapi.json`) {
|
|
245
|
-
logger.debug(
|
|
246
|
-
res.setHeader(
|
|
242
|
+
logger.debug('Serving OpenAPI JSON spec', 'DocsServing');
|
|
243
|
+
res.setHeader('Content-Type', 'application/json');
|
|
247
244
|
res.json(this.openAPISpec);
|
|
248
245
|
return;
|
|
249
246
|
}
|
|
250
247
|
|
|
251
248
|
// Serve Swagger UI assets
|
|
252
249
|
if (path.startsWith(`${basePath}/`)) {
|
|
253
|
-
const assetName = path.replace(`${basePath}/`,
|
|
250
|
+
const assetName = path.replace(`${basePath}/`, '');
|
|
254
251
|
|
|
255
|
-
logger.debug(
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
basePath,
|
|
261
|
-
assetPath: this.swaggerUIAssetPath,
|
|
262
|
-
},
|
|
263
|
-
);
|
|
252
|
+
logger.debug(`Attempting to serve asset: ${assetName}`, 'AssetServing', {
|
|
253
|
+
fullPath: path,
|
|
254
|
+
basePath,
|
|
255
|
+
assetPath: this.swaggerUIAssetPath,
|
|
256
|
+
});
|
|
264
257
|
|
|
265
258
|
// Security: only allow specific asset files
|
|
266
259
|
const allowedAssets = [
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
260
|
+
'swagger-ui-bundle.js',
|
|
261
|
+
'swagger-ui.css',
|
|
262
|
+
'swagger-ui-standalone-preset.js',
|
|
263
|
+
'favicon-16x16.png',
|
|
264
|
+
'favicon-32x32.png',
|
|
272
265
|
];
|
|
273
266
|
|
|
274
267
|
if (allowedAssets.includes(assetName)) {
|
|
275
268
|
try {
|
|
276
269
|
const assetPath = join(this.swaggerUIAssetPath, assetName);
|
|
277
|
-
logger.debug(`Reading asset from: ${assetPath}`,
|
|
270
|
+
logger.debug(`Reading asset from: ${assetPath}`, 'AssetServing');
|
|
278
271
|
|
|
279
272
|
const content = readFileSync(assetPath);
|
|
280
273
|
|
|
281
274
|
// Set appropriate content type
|
|
282
275
|
const contentType = this.getContentType(assetName);
|
|
283
|
-
res.setHeader(
|
|
284
|
-
res.setHeader(
|
|
276
|
+
res.setHeader('Content-Type', contentType);
|
|
277
|
+
res.setHeader('Cache-Control', 'public, max-age=86400'); // Cache for 1 day
|
|
285
278
|
|
|
286
|
-
logger.debug(
|
|
287
|
-
`Serving asset: ${assetName} (${content.length} bytes)`,
|
|
288
|
-
"AssetServing",
|
|
289
|
-
);
|
|
279
|
+
logger.debug(`Serving asset: ${assetName} (${content.length} bytes)`, 'AssetServing');
|
|
290
280
|
res.send(content);
|
|
291
281
|
return;
|
|
292
282
|
} catch (error) {
|
|
293
|
-
logger.error(
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
error: error instanceof Error ? error.message : String(error),
|
|
298
|
-
assetPath: join(this.swaggerUIAssetPath, assetName),
|
|
299
|
-
},
|
|
300
|
-
);
|
|
283
|
+
logger.error(`Failed to serve Swagger UI asset: ${assetName}`, 'AssetServing', {
|
|
284
|
+
error: error instanceof Error ? error.message : String(error),
|
|
285
|
+
assetPath: join(this.swaggerUIAssetPath, assetName),
|
|
286
|
+
});
|
|
301
287
|
res.status(404);
|
|
302
288
|
res.send(`Asset not found: ${assetName}`);
|
|
303
289
|
return;
|
|
304
290
|
}
|
|
305
291
|
} else {
|
|
306
|
-
logger.warn(`Asset not allowed: ${assetName}`,
|
|
292
|
+
logger.warn(`Asset not allowed: ${assetName}`, 'AssetServing', {
|
|
307
293
|
allowedAssets,
|
|
308
294
|
});
|
|
309
295
|
res.status(404);
|
|
@@ -319,27 +305,24 @@ export class SwaggerUIMiddleware {
|
|
|
319
305
|
|
|
320
306
|
// Get content type for asset files
|
|
321
307
|
private getContentType(filename: string): string {
|
|
322
|
-
if (filename.endsWith(
|
|
323
|
-
if (filename.endsWith(
|
|
324
|
-
if (filename.endsWith(
|
|
325
|
-
if (filename.endsWith(
|
|
326
|
-
return
|
|
308
|
+
if (filename.endsWith('.js')) return 'application/javascript';
|
|
309
|
+
if (filename.endsWith('.css')) return 'text/css';
|
|
310
|
+
if (filename.endsWith('.png')) return 'image/png';
|
|
311
|
+
if (filename.endsWith('.ico')) return 'image/x-icon';
|
|
312
|
+
return 'text/plain';
|
|
327
313
|
}
|
|
328
314
|
|
|
329
315
|
// Update the OpenAPI spec (useful for dynamic updates)
|
|
330
316
|
updateSpec(newSpec: OpenAPISpec): void {
|
|
331
317
|
this.openAPISpec = newSpec;
|
|
332
|
-
logger.debug(
|
|
318
|
+
logger.debug('OpenAPI specification updated', 'SpecUpdate', {
|
|
333
319
|
pathCount: Object.keys(newSpec.paths).length,
|
|
334
320
|
});
|
|
335
321
|
}
|
|
336
322
|
}
|
|
337
323
|
|
|
338
324
|
// Convenience function to create documentation middleware
|
|
339
|
-
export function createDocsMiddleware(
|
|
340
|
-
openAPISpec: OpenAPISpec,
|
|
341
|
-
options: SwaggerUIOptions = {},
|
|
342
|
-
) {
|
|
325
|
+
export function createDocsMiddleware(openAPISpec: OpenAPISpec, options: SwaggerUIOptions = {}) {
|
|
343
326
|
const middleware = new SwaggerUIMiddleware(openAPISpec, options);
|
|
344
327
|
return middleware.createMiddleware();
|
|
345
328
|
}
|
|
@@ -348,20 +331,18 @@ export function createDocsMiddleware(
|
|
|
348
331
|
export function generateDocsForApp(
|
|
349
332
|
routes: any[],
|
|
350
333
|
info: { title: string; version: string; description?: string },
|
|
351
|
-
options: SwaggerUIOptions = {}
|
|
334
|
+
options: SwaggerUIOptions = {}
|
|
352
335
|
) {
|
|
353
336
|
const openAPISpec: OpenAPISpec = {
|
|
354
|
-
openapi:
|
|
337
|
+
openapi: '3.0.3',
|
|
355
338
|
info,
|
|
356
|
-
servers: [
|
|
357
|
-
{ url: "http://localhost:3000", description: "Development server" },
|
|
358
|
-
],
|
|
339
|
+
servers: [{ url: 'http://localhost:3000', description: 'Development server' }],
|
|
359
340
|
paths: {},
|
|
360
341
|
tags: [],
|
|
361
342
|
};
|
|
362
343
|
|
|
363
344
|
// This will be enhanced when integrated with the routing system
|
|
364
|
-
logger.info(
|
|
345
|
+
logger.info('Documentation generated for app', 'AppDocumentation', {
|
|
365
346
|
routeCount: routes.length,
|
|
366
347
|
title: info.title,
|
|
367
348
|
});
|