@morojs/moro 1.0.0
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/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/core/config/index.d.ts +19 -0
- package/dist/core/config/index.js +59 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/config/loader.d.ts +6 -0
- package/dist/core/config/loader.js +288 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +335 -0
- package/dist/core/config/schema.js +286 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/config/utils.d.ts +50 -0
- package/dist/core/config/utils.js +185 -0
- package/dist/core/config/utils.js.map +1 -0
- package/dist/core/database/adapters/drizzle.d.ts +29 -0
- package/dist/core/database/adapters/drizzle.js +366 -0
- package/dist/core/database/adapters/drizzle.js.map +1 -0
- package/dist/core/database/adapters/index.d.ts +8 -0
- package/dist/core/database/adapters/index.js +48 -0
- package/dist/core/database/adapters/index.js.map +1 -0
- package/dist/core/database/adapters/mongodb.d.ts +35 -0
- package/dist/core/database/adapters/mongodb.js +215 -0
- package/dist/core/database/adapters/mongodb.js.map +1 -0
- package/dist/core/database/adapters/mysql.d.ts +23 -0
- package/dist/core/database/adapters/mysql.js +149 -0
- package/dist/core/database/adapters/mysql.js.map +1 -0
- package/dist/core/database/adapters/postgresql.d.ts +24 -0
- package/dist/core/database/adapters/postgresql.js +160 -0
- package/dist/core/database/adapters/postgresql.js.map +1 -0
- package/dist/core/database/adapters/redis.d.ts +50 -0
- package/dist/core/database/adapters/redis.js +266 -0
- package/dist/core/database/adapters/redis.js.map +1 -0
- package/dist/core/database/adapters/sqlite.d.ts +23 -0
- package/dist/core/database/adapters/sqlite.js +194 -0
- package/dist/core/database/adapters/sqlite.js.map +1 -0
- package/dist/core/database/index.d.ts +2 -0
- package/dist/core/database/index.js +20 -0
- package/dist/core/database/index.js.map +1 -0
- package/dist/core/docs/index.d.ts +63 -0
- package/dist/core/docs/index.js +170 -0
- package/dist/core/docs/index.js.map +1 -0
- package/dist/core/docs/openapi-generator.d.ts +124 -0
- package/dist/core/docs/openapi-generator.js +413 -0
- package/dist/core/docs/openapi-generator.js.map +1 -0
- package/dist/core/docs/simple-docs.d.ts +21 -0
- package/dist/core/docs/simple-docs.js +268 -0
- package/dist/core/docs/simple-docs.js.map +1 -0
- package/dist/core/docs/swagger-ui.d.ts +28 -0
- package/dist/core/docs/swagger-ui.js +317 -0
- package/dist/core/docs/swagger-ui.js.map +1 -0
- package/dist/core/docs/zod-to-openapi.d.ts +29 -0
- package/dist/core/docs/zod-to-openapi.js +414 -0
- package/dist/core/docs/zod-to-openapi.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +27 -0
- package/dist/core/events/event-bus.js +193 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/events/index.d.ts +2 -0
- package/dist/core/events/index.js +7 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/framework.d.ts +57 -0
- package/dist/core/framework.js +432 -0
- package/dist/core/framework.js.map +1 -0
- package/dist/core/http/http-server.d.ts +114 -0
- package/dist/core/http/http-server.js +1154 -0
- package/dist/core/http/http-server.js.map +1 -0
- package/dist/core/http/index.d.ts +3 -0
- package/dist/core/http/index.js +10 -0
- package/dist/core/http/index.js.map +1 -0
- package/dist/core/http/router.d.ts +14 -0
- package/dist/core/http/router.js +113 -0
- package/dist/core/http/router.js.map +1 -0
- package/dist/core/logger/filters.d.ts +9 -0
- package/dist/core/logger/filters.js +134 -0
- package/dist/core/logger/filters.js.map +1 -0
- package/dist/core/logger/index.d.ts +3 -0
- package/dist/core/logger/index.js +26 -0
- package/dist/core/logger/index.js.map +1 -0
- package/dist/core/logger/logger.d.ts +49 -0
- package/dist/core/logger/logger.js +332 -0
- package/dist/core/logger/logger.js.map +1 -0
- package/dist/core/logger/outputs.d.ts +42 -0
- package/dist/core/logger/outputs.js +110 -0
- package/dist/core/logger/outputs.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +15 -0
- package/dist/core/middleware/built-in/adapters/cache/file.js +128 -0
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +5 -0
- package/dist/core/middleware/built-in/adapters/cache/index.js +28 -0
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +11 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.js +65 -0
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +17 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.js +91 -0
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +21 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +40 -0
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +14 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +77 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +15 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +73 -0
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.js +28 -0
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -0
- package/dist/core/middleware/built-in/adapters/index.js +26 -0
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/auth.d.ts +2 -0
- package/dist/core/middleware/built-in/auth.js +38 -0
- package/dist/core/middleware/built-in/auth.js.map +1 -0
- package/dist/core/middleware/built-in/cache.d.ts +3 -0
- package/dist/core/middleware/built-in/cache.js +188 -0
- package/dist/core/middleware/built-in/cache.js.map +1 -0
- package/dist/core/middleware/built-in/cdn.d.ts +3 -0
- package/dist/core/middleware/built-in/cdn.js +115 -0
- package/dist/core/middleware/built-in/cdn.js.map +1 -0
- package/dist/core/middleware/built-in/cookie.d.ts +14 -0
- package/dist/core/middleware/built-in/cookie.js +68 -0
- package/dist/core/middleware/built-in/cookie.js.map +1 -0
- package/dist/core/middleware/built-in/cors.d.ts +2 -0
- package/dist/core/middleware/built-in/cors.js +29 -0
- package/dist/core/middleware/built-in/cors.js.map +1 -0
- package/dist/core/middleware/built-in/csp.d.ts +22 -0
- package/dist/core/middleware/built-in/csp.js +74 -0
- package/dist/core/middleware/built-in/csp.js.map +1 -0
- package/dist/core/middleware/built-in/csrf.d.ts +9 -0
- package/dist/core/middleware/built-in/csrf.js +66 -0
- package/dist/core/middleware/built-in/csrf.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker.d.ts +1 -0
- package/dist/core/middleware/built-in/error-tracker.js +19 -0
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +70 -0
- package/dist/core/middleware/built-in/index.js +70 -0
- package/dist/core/middleware/built-in/index.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor.d.ts +1 -0
- package/dist/core/middleware/built-in/performance-monitor.js +22 -0
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit.d.ts +6 -0
- package/dist/core/middleware/built-in/rate-limit.js +47 -0
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger.d.ts +1 -0
- package/dist/core/middleware/built-in/request-logger.js +15 -0
- package/dist/core/middleware/built-in/request-logger.js.map +1 -0
- package/dist/core/middleware/built-in/session.d.ts +41 -0
- package/dist/core/middleware/built-in/session.js +209 -0
- package/dist/core/middleware/built-in/session.js.map +1 -0
- package/dist/core/middleware/built-in/sse.d.ts +6 -0
- package/dist/core/middleware/built-in/sse.js +73 -0
- package/dist/core/middleware/built-in/sse.js.map +1 -0
- package/dist/core/middleware/built-in/validation.d.ts +2 -0
- package/dist/core/middleware/built-in/validation.js +31 -0
- package/dist/core/middleware/built-in/validation.js.map +1 -0
- package/dist/core/middleware/index.d.ts +21 -0
- package/dist/core/middleware/index.js +152 -0
- package/dist/core/middleware/index.js.map +1 -0
- package/dist/core/modules/auto-discovery.d.ts +27 -0
- package/dist/core/modules/auto-discovery.js +255 -0
- package/dist/core/modules/auto-discovery.js.map +1 -0
- package/dist/core/modules/index.d.ts +2 -0
- package/dist/core/modules/index.js +11 -0
- package/dist/core/modules/index.js.map +1 -0
- package/dist/core/modules/modules.d.ts +10 -0
- package/dist/core/modules/modules.js +137 -0
- package/dist/core/modules/modules.js.map +1 -0
- package/dist/core/networking/index.d.ts +2 -0
- package/dist/core/networking/index.js +9 -0
- package/dist/core/networking/index.js.map +1 -0
- package/dist/core/networking/service-discovery.d.ts +38 -0
- package/dist/core/networking/service-discovery.js +233 -0
- package/dist/core/networking/service-discovery.js.map +1 -0
- package/dist/core/networking/websocket-manager.d.ts +27 -0
- package/dist/core/networking/websocket-manager.js +211 -0
- package/dist/core/networking/websocket-manager.js.map +1 -0
- package/dist/core/routing/app-integration.d.ts +42 -0
- package/dist/core/routing/app-integration.js +152 -0
- package/dist/core/routing/app-integration.js.map +1 -0
- package/dist/core/routing/index.d.ts +106 -0
- package/dist/core/routing/index.js +343 -0
- package/dist/core/routing/index.js.map +1 -0
- package/dist/core/runtime/aws-lambda-adapter.d.ts +43 -0
- package/dist/core/runtime/aws-lambda-adapter.js +108 -0
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -0
- package/dist/core/runtime/base-adapter.d.ts +16 -0
- package/dist/core/runtime/base-adapter.js +105 -0
- package/dist/core/runtime/base-adapter.js.map +1 -0
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +18 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js +131 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -0
- package/dist/core/runtime/index.d.ts +14 -0
- package/dist/core/runtime/index.js +56 -0
- package/dist/core/runtime/index.js.map +1 -0
- package/dist/core/runtime/node-adapter.d.ts +15 -0
- package/dist/core/runtime/node-adapter.js +204 -0
- package/dist/core/runtime/node-adapter.js.map +1 -0
- package/dist/core/runtime/vercel-edge-adapter.d.ts +10 -0
- package/dist/core/runtime/vercel-edge-adapter.js +106 -0
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -0
- package/dist/core/utilities/circuit-breaker.d.ts +14 -0
- package/dist/core/utilities/circuit-breaker.js +42 -0
- package/dist/core/utilities/circuit-breaker.js.map +1 -0
- package/dist/core/utilities/container.d.ts +116 -0
- package/dist/core/utilities/container.js +529 -0
- package/dist/core/utilities/container.js.map +1 -0
- package/dist/core/utilities/hooks.d.ts +24 -0
- package/dist/core/utilities/hooks.js +131 -0
- package/dist/core/utilities/hooks.js.map +1 -0
- package/dist/core/utilities/index.d.ts +4 -0
- package/dist/core/utilities/index.js +22 -0
- package/dist/core/utilities/index.js.map +1 -0
- package/dist/core/validation/index.d.ts +30 -0
- package/dist/core/validation/index.js +144 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/moro.d.ts +82 -0
- package/dist/moro.js +679 -0
- package/dist/moro.js.map +1 -0
- package/dist/types/cache.d.ts +34 -0
- package/dist/types/cache.js +3 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/cdn.d.ts +19 -0
- package/dist/types/cdn.js +3 -0
- package/dist/types/cdn.js.map +1 -0
- package/dist/types/core.d.ts +13 -0
- package/dist/types/core.js +3 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/database.d.ts +29 -0
- package/dist/types/database.js +3 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/discovery.d.ts +6 -0
- package/dist/types/discovery.js +3 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/events.d.ts +116 -0
- package/dist/types/events.js +3 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +38 -0
- package/dist/types/hooks.js +3 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/http.d.ts +51 -0
- package/dist/types/http.js +3 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/logger.d.ts +77 -0
- package/dist/types/logger.js +3 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/module.d.ts +91 -0
- package/dist/types/module.js +3 -0
- package/dist/types/module.js.map +1 -0
- package/dist/types/runtime.d.ts +48 -0
- package/dist/types/runtime.js +3 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/session.d.ts +66 -0
- package/dist/types/session.js +3 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +176 -0
- package/src/core/config/index.ts +47 -0
- package/src/core/config/loader.ts +366 -0
- package/src/core/config/schema.ts +346 -0
- package/src/core/config/utils.ts +220 -0
- package/src/core/database/README.md +228 -0
- package/src/core/database/adapters/drizzle.ts +425 -0
- package/src/core/database/adapters/index.ts +45 -0
- package/src/core/database/adapters/mongodb.ts +292 -0
- package/src/core/database/adapters/mysql.ts +217 -0
- package/src/core/database/adapters/postgresql.ts +211 -0
- package/src/core/database/adapters/redis.ts +331 -0
- package/src/core/database/adapters/sqlite.ts +255 -0
- package/src/core/database/index.ts +3 -0
- package/src/core/docs/index.ts +245 -0
- package/src/core/docs/openapi-generator.ts +588 -0
- package/src/core/docs/simple-docs.ts +305 -0
- package/src/core/docs/swagger-ui.ts +370 -0
- package/src/core/docs/zod-to-openapi.ts +532 -0
- package/src/core/events/event-bus.ts +249 -0
- package/src/core/events/index.ts +12 -0
- package/src/core/framework.ts +621 -0
- package/src/core/http/http-server.ts +1421 -0
- package/src/core/http/index.ts +11 -0
- package/src/core/http/router.ts +153 -0
- package/src/core/logger/filters.ts +148 -0
- package/src/core/logger/index.ts +20 -0
- package/src/core/logger/logger.ts +434 -0
- package/src/core/logger/outputs.ts +136 -0
- package/src/core/middleware/built-in/adapters/cache/file.ts +106 -0
- package/src/core/middleware/built-in/adapters/cache/index.ts +26 -0
- package/src/core/middleware/built-in/adapters/cache/memory.ts +73 -0
- package/src/core/middleware/built-in/adapters/cache/redis.ts +103 -0
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +68 -0
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +100 -0
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +92 -0
- package/src/core/middleware/built-in/adapters/cdn/index.ts +23 -0
- package/src/core/middleware/built-in/adapters/index.ts +7 -0
- package/src/core/middleware/built-in/auth.ts +39 -0
- package/src/core/middleware/built-in/cache.ts +228 -0
- package/src/core/middleware/built-in/cdn.ts +151 -0
- package/src/core/middleware/built-in/cookie.ts +90 -0
- package/src/core/middleware/built-in/cors.ts +38 -0
- package/src/core/middleware/built-in/csp.ts +107 -0
- package/src/core/middleware/built-in/csrf.ts +87 -0
- package/src/core/middleware/built-in/error-tracker.ts +16 -0
- package/src/core/middleware/built-in/index.ts +57 -0
- package/src/core/middleware/built-in/performance-monitor.ts +25 -0
- package/src/core/middleware/built-in/rate-limit.ts +60 -0
- package/src/core/middleware/built-in/request-logger.ts +14 -0
- package/src/core/middleware/built-in/session.ts +311 -0
- package/src/core/middleware/built-in/sse.ts +91 -0
- package/src/core/middleware/built-in/validation.ts +33 -0
- package/src/core/middleware/index.ts +188 -0
- package/src/core/modules/auto-discovery.ts +265 -0
- package/src/core/modules/index.ts +6 -0
- package/src/core/modules/modules.ts +125 -0
- package/src/core/networking/index.ts +7 -0
- package/src/core/networking/service-discovery.ts +309 -0
- package/src/core/networking/websocket-manager.ts +259 -0
- package/src/core/routing/app-integration.ts +229 -0
- package/src/core/routing/index.ts +519 -0
- package/src/core/runtime/aws-lambda-adapter.ts +157 -0
- package/src/core/runtime/base-adapter.ts +140 -0
- package/src/core/runtime/cloudflare-workers-adapter.ts +166 -0
- package/src/core/runtime/index.ts +74 -0
- package/src/core/runtime/node-adapter.ts +210 -0
- package/src/core/runtime/vercel-edge-adapter.ts +125 -0
- package/src/core/utilities/circuit-breaker.ts +46 -0
- package/src/core/utilities/container.ts +760 -0
- package/src/core/utilities/hooks.ts +148 -0
- package/src/core/utilities/index.ts +16 -0
- package/src/core/validation/index.ts +216 -0
- package/src/index.ts +120 -0
- package/src/moro.ts +842 -0
- package/src/types/cache.ts +38 -0
- package/src/types/cdn.ts +22 -0
- package/src/types/core.ts +17 -0
- package/src/types/database.ts +40 -0
- package/src/types/discovery.ts +7 -0
- package/src/types/events.ts +90 -0
- package/src/types/hooks.ts +47 -0
- package/src/types/http.ts +70 -0
- package/src/types/logger.ts +109 -0
- package/src/types/module.ts +87 -0
- package/src/types/runtime.ts +91 -0
- package/src/types/session.ts +89 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Simple Documentation Generator - Fallback for when Swagger UI has issues
|
|
3
|
+
// Generates clean, readable API documentation from routes
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.SimpleDocsGenerator = void 0;
|
|
6
|
+
exports.createSimpleDocsMiddleware = createSimpleDocsMiddleware;
|
|
7
|
+
const logger_1 = require("../logger");
|
|
8
|
+
const logger = (0, logger_1.createFrameworkLogger)("SimpleDocs");
|
|
9
|
+
class SimpleDocsGenerator {
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
this.routes = [];
|
|
13
|
+
this.options = {
|
|
14
|
+
title: "API Documentation",
|
|
15
|
+
description: "API documentation generated from intelligent routes",
|
|
16
|
+
basePath: "/docs",
|
|
17
|
+
...options,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
addRoutes(routes) {
|
|
21
|
+
this.routes = routes;
|
|
22
|
+
logger.debug(`Added ${routes.length} routes to simple docs`, "RouteAddition");
|
|
23
|
+
}
|
|
24
|
+
generateHTML() {
|
|
25
|
+
const routesByTag = this.groupRoutesByTag();
|
|
26
|
+
return `<!DOCTYPE html>
|
|
27
|
+
<html lang="en">
|
|
28
|
+
<head>
|
|
29
|
+
<meta charset="UTF-8">
|
|
30
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
31
|
+
<title>${this.options.title}</title>
|
|
32
|
+
<style>
|
|
33
|
+
body {
|
|
34
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
35
|
+
line-height: 1.6;
|
|
36
|
+
margin: 0;
|
|
37
|
+
padding: 20px;
|
|
38
|
+
background: #f8f9fa;
|
|
39
|
+
}
|
|
40
|
+
.container {
|
|
41
|
+
max-width: 1200px;
|
|
42
|
+
margin: 0 auto;
|
|
43
|
+
background: white;
|
|
44
|
+
padding: 30px;
|
|
45
|
+
border-radius: 8px;
|
|
46
|
+
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
|
47
|
+
}
|
|
48
|
+
h1 { color: #2563eb; margin-bottom: 10px; }
|
|
49
|
+
h2 { color: #374151; border-bottom: 2px solid #e5e7eb; padding-bottom: 10px; }
|
|
50
|
+
h3 { color: #6b7280; }
|
|
51
|
+
.endpoint {
|
|
52
|
+
background: #f3f4f6;
|
|
53
|
+
border-left: 4px solid #2563eb;
|
|
54
|
+
padding: 15px;
|
|
55
|
+
margin: 15px 0;
|
|
56
|
+
border-radius: 4px;
|
|
57
|
+
}
|
|
58
|
+
.method {
|
|
59
|
+
display: inline-block;
|
|
60
|
+
padding: 4px 8px;
|
|
61
|
+
border-radius: 4px;
|
|
62
|
+
font-weight: bold;
|
|
63
|
+
margin-right: 10px;
|
|
64
|
+
color: white;
|
|
65
|
+
}
|
|
66
|
+
.method.GET { background: #10b981; }
|
|
67
|
+
.method.POST { background: #f59e0b; }
|
|
68
|
+
.method.PUT { background: #3b82f6; }
|
|
69
|
+
.method.DELETE { background: #ef4444; }
|
|
70
|
+
.method.PATCH { background: #8b5cf6; }
|
|
71
|
+
.path { font-family: monospace; font-size: 16px; font-weight: bold; }
|
|
72
|
+
.description { color: #6b7280; margin: 8px 0; }
|
|
73
|
+
.tags { margin: 8px 0; }
|
|
74
|
+
.tag {
|
|
75
|
+
display: inline-block;
|
|
76
|
+
background: #e5e7eb;
|
|
77
|
+
color: #374151;
|
|
78
|
+
padding: 2px 8px;
|
|
79
|
+
border-radius: 12px;
|
|
80
|
+
font-size: 12px;
|
|
81
|
+
margin-right: 5px;
|
|
82
|
+
}
|
|
83
|
+
.validation {
|
|
84
|
+
background: #fef3c7;
|
|
85
|
+
border: 1px solid #f59e0b;
|
|
86
|
+
padding: 10px;
|
|
87
|
+
border-radius: 4px;
|
|
88
|
+
margin: 10px 0;
|
|
89
|
+
}
|
|
90
|
+
.auth {
|
|
91
|
+
background: #fee2e2;
|
|
92
|
+
border: 1px solid #ef4444;
|
|
93
|
+
padding: 10px;
|
|
94
|
+
border-radius: 4px;
|
|
95
|
+
margin: 10px 0;
|
|
96
|
+
}
|
|
97
|
+
.rate-limit {
|
|
98
|
+
background: #e0f2fe;
|
|
99
|
+
border: 1px solid #0284c7;
|
|
100
|
+
padding: 10px;
|
|
101
|
+
border-radius: 4px;
|
|
102
|
+
margin: 10px 0;
|
|
103
|
+
}
|
|
104
|
+
.example {
|
|
105
|
+
background: #f3f4f6;
|
|
106
|
+
border: 1px solid #d1d5db;
|
|
107
|
+
padding: 10px;
|
|
108
|
+
border-radius: 4px;
|
|
109
|
+
margin: 10px 0;
|
|
110
|
+
font-family: monospace;
|
|
111
|
+
font-size: 14px;
|
|
112
|
+
}
|
|
113
|
+
.footer {
|
|
114
|
+
margin-top: 40px;
|
|
115
|
+
padding-top: 20px;
|
|
116
|
+
border-top: 1px solid #e5e7eb;
|
|
117
|
+
text-align: center;
|
|
118
|
+
color: #6b7280;
|
|
119
|
+
}
|
|
120
|
+
</style>
|
|
121
|
+
</head>
|
|
122
|
+
<body>
|
|
123
|
+
<div class="container">
|
|
124
|
+
<h1>${this.options.title}</h1>
|
|
125
|
+
<p>${this.options.description}</p>
|
|
126
|
+
|
|
127
|
+
<div class="example">
|
|
128
|
+
<strong>Interactive Swagger UI:</strong> <a href="${this.options.basePath}" target="_blank">${this.options.basePath}</a><br>
|
|
129
|
+
<strong>OpenAPI JSON:</strong> <a href="${this.options.basePath}/openapi.json" target="_blank">${this.options.basePath}/openapi.json</a>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
${this.generateRouteDocumentation(routesByTag)}
|
|
133
|
+
|
|
134
|
+
<div class="footer">
|
|
135
|
+
<p>Generated automatically from Moro Framework intelligent routes</p>
|
|
136
|
+
<p>Built with Moro Framework - Intelligent Routing + Type-Safe Validation</p>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
</body>
|
|
140
|
+
</html>`;
|
|
141
|
+
}
|
|
142
|
+
groupRoutesByTag() {
|
|
143
|
+
const grouped = new Map();
|
|
144
|
+
for (const route of this.routes) {
|
|
145
|
+
const tags = route.schema.tags || ["default"];
|
|
146
|
+
for (const tag of tags) {
|
|
147
|
+
if (!grouped.has(tag)) {
|
|
148
|
+
grouped.set(tag, []);
|
|
149
|
+
}
|
|
150
|
+
grouped.get(tag).push(route);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return grouped;
|
|
154
|
+
}
|
|
155
|
+
generateRouteDocumentation(routesByTag) {
|
|
156
|
+
let html = "";
|
|
157
|
+
for (const [tag, routes] of routesByTag) {
|
|
158
|
+
html += `<h2>${tag.charAt(0).toUpperCase() + tag.slice(1)}</h2>`;
|
|
159
|
+
for (const route of routes) {
|
|
160
|
+
html += this.generateRouteSection(route.schema);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return html;
|
|
164
|
+
}
|
|
165
|
+
generateRouteSection(route) {
|
|
166
|
+
const methodClass = route.method.toLowerCase();
|
|
167
|
+
const html = `
|
|
168
|
+
<div class="endpoint">
|
|
169
|
+
<div>
|
|
170
|
+
<span class="method ${route.method}">${route.method}</span>
|
|
171
|
+
<span class="path">${route.path}</span>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
${route.description ? `<div class="description">${route.description}</div>` : ""}
|
|
175
|
+
|
|
176
|
+
${route.tags ? `<div class="tags">${route.tags.map((tag) => `<span class="tag">${tag}</span>`).join("")}</div>` : ""}
|
|
177
|
+
|
|
178
|
+
${this.generateValidationInfo(route)}
|
|
179
|
+
${this.generateAuthInfo(route)}
|
|
180
|
+
${this.generateRateLimitInfo(route)}
|
|
181
|
+
${this.generateExamples(route)}
|
|
182
|
+
</div>`;
|
|
183
|
+
return html;
|
|
184
|
+
}
|
|
185
|
+
generateValidationInfo(route) {
|
|
186
|
+
if (!route.validation)
|
|
187
|
+
return "";
|
|
188
|
+
const validationTypes = [];
|
|
189
|
+
if (route.validation.body)
|
|
190
|
+
validationTypes.push("Body");
|
|
191
|
+
if (route.validation.query)
|
|
192
|
+
validationTypes.push("Query Parameters");
|
|
193
|
+
if (route.validation.params)
|
|
194
|
+
validationTypes.push("Path Parameters");
|
|
195
|
+
if (route.validation.headers)
|
|
196
|
+
validationTypes.push("Headers");
|
|
197
|
+
return `
|
|
198
|
+
<div class="validation">
|
|
199
|
+
<strong>Validation:</strong> ${validationTypes.join(", ")}
|
|
200
|
+
<br><small>Request will be validated with Zod schemas for type safety</small>
|
|
201
|
+
</div>`;
|
|
202
|
+
}
|
|
203
|
+
generateAuthInfo(route) {
|
|
204
|
+
if (!route.auth)
|
|
205
|
+
return "";
|
|
206
|
+
const roles = route.auth.roles
|
|
207
|
+
? route.auth.roles.join(", ")
|
|
208
|
+
: "authenticated";
|
|
209
|
+
return `
|
|
210
|
+
<div class="auth">
|
|
211
|
+
<strong>Authentication Required:</strong> ${roles}
|
|
212
|
+
<br><small>Requires valid authentication token</small>
|
|
213
|
+
</div>`;
|
|
214
|
+
}
|
|
215
|
+
generateRateLimitInfo(route) {
|
|
216
|
+
if (!route.rateLimit)
|
|
217
|
+
return "";
|
|
218
|
+
const { requests, window } = route.rateLimit;
|
|
219
|
+
const windowSeconds = Math.round(window / 1000);
|
|
220
|
+
return `
|
|
221
|
+
<div class="rate-limit">
|
|
222
|
+
<strong>Rate Limit:</strong> ${requests} requests per ${windowSeconds} seconds
|
|
223
|
+
<br><small>Automatic protection against abuse</small>
|
|
224
|
+
</div>`;
|
|
225
|
+
}
|
|
226
|
+
generateExamples(route) {
|
|
227
|
+
const baseUrl = "http://localhost:3001";
|
|
228
|
+
const fullPath = `${baseUrl}${route.path}`;
|
|
229
|
+
let example = "";
|
|
230
|
+
if (route.method === "GET") {
|
|
231
|
+
example = `curl "${fullPath}"`;
|
|
232
|
+
// Add query parameter example if validation exists
|
|
233
|
+
if (route.validation?.query) {
|
|
234
|
+
example = `curl "${fullPath}?limit=10&search=example"`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else if (["POST", "PUT", "PATCH"].includes(route.method)) {
|
|
238
|
+
example = `curl -X ${route.method} ${fullPath} \\
|
|
239
|
+
-H "Content-Type: application/json" \\
|
|
240
|
+
-d '{"example": "data"}'`;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
example = `curl -X ${route.method} ${fullPath}`;
|
|
244
|
+
}
|
|
245
|
+
return `
|
|
246
|
+
<div class="example">
|
|
247
|
+
<strong>Example:</strong><br>
|
|
248
|
+
<code>${example}</code>
|
|
249
|
+
</div>`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.SimpleDocsGenerator = SimpleDocsGenerator;
|
|
253
|
+
// Create middleware for simple docs
|
|
254
|
+
function createSimpleDocsMiddleware(routes, options = {}) {
|
|
255
|
+
const generator = new SimpleDocsGenerator(options);
|
|
256
|
+
generator.addRoutes(routes);
|
|
257
|
+
const basePath = options.basePath || "/docs";
|
|
258
|
+
return (req, res, next) => {
|
|
259
|
+
if (req.path === `${basePath}/simple` ||
|
|
260
|
+
req.path === `${basePath}/simple/`) {
|
|
261
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
262
|
+
res.send(generator.generateHTML());
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
next();
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=simple-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-docs.js","sourceRoot":"","sources":["../../../src/core/docs/simple-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { HttpRequest, HttpResponse } from "../http";
|
|
2
|
+
import { OpenAPISpec } from "./openapi-generator";
|
|
3
|
+
export interface SwaggerUIOptions {
|
|
4
|
+
title?: string;
|
|
5
|
+
favicon?: string;
|
|
6
|
+
customCss?: string;
|
|
7
|
+
customJs?: string;
|
|
8
|
+
swaggerOptions?: Record<string, any>;
|
|
9
|
+
enableTryItOut?: boolean;
|
|
10
|
+
enableFilter?: boolean;
|
|
11
|
+
enableDeepLinking?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare class SwaggerUIMiddleware {
|
|
14
|
+
private swaggerUIAssetPath;
|
|
15
|
+
private openAPISpec;
|
|
16
|
+
private options;
|
|
17
|
+
constructor(openAPISpec: OpenAPISpec, options?: SwaggerUIOptions);
|
|
18
|
+
private generateHTML;
|
|
19
|
+
createMiddleware(basePath?: string): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
|
|
20
|
+
private getContentType;
|
|
21
|
+
updateSpec(newSpec: OpenAPISpec): void;
|
|
22
|
+
}
|
|
23
|
+
export declare function createDocsMiddleware(openAPISpec: OpenAPISpec, options?: SwaggerUIOptions): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
|
|
24
|
+
export declare function generateDocsForApp(routes: any[], info: {
|
|
25
|
+
title: string;
|
|
26
|
+
version: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
}, options?: SwaggerUIOptions): (req: HttpRequest, res: HttpResponse, next: () => void) => void;
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Swagger UI Integration for Moro Framework
|
|
3
|
+
// Serves interactive API documentation using Swagger UI
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.SwaggerUIMiddleware = void 0;
|
|
6
|
+
exports.createDocsMiddleware = createDocsMiddleware;
|
|
7
|
+
exports.generateDocsForApp = generateDocsForApp;
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
const logger_1 = require("../logger");
|
|
11
|
+
const logger = (0, logger_1.createFrameworkLogger)("SwaggerUI");
|
|
12
|
+
// Swagger UI middleware
|
|
13
|
+
class SwaggerUIMiddleware {
|
|
14
|
+
constructor(openAPISpec, options = {}) {
|
|
15
|
+
this.openAPISpec = openAPISpec;
|
|
16
|
+
this.options = {
|
|
17
|
+
title: "API Documentation",
|
|
18
|
+
enableTryItOut: true,
|
|
19
|
+
enableFilter: true,
|
|
20
|
+
enableDeepLinking: true,
|
|
21
|
+
swaggerOptions: {
|
|
22
|
+
dom_id: "#swagger-ui",
|
|
23
|
+
presets: [
|
|
24
|
+
"SwaggerUIBundle.presets.apis",
|
|
25
|
+
"SwaggerUIBundle.presets.standalone",
|
|
26
|
+
],
|
|
27
|
+
plugins: ["SwaggerUIBundle.plugins.DownloadUrl"],
|
|
28
|
+
layout: "StandaloneLayout",
|
|
29
|
+
},
|
|
30
|
+
...options,
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
// Find swagger-ui-dist assets
|
|
34
|
+
this.swaggerUIAssetPath = require
|
|
35
|
+
.resolve("swagger-ui-dist/package.json")
|
|
36
|
+
.replace("/package.json", "");
|
|
37
|
+
logger.debug("Swagger UI assets found", "Initialization", {
|
|
38
|
+
assetPath: this.swaggerUIAssetPath,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.error("Failed to locate Swagger UI assets", "Initialization", {
|
|
43
|
+
error: error instanceof Error ? error.message : String(error),
|
|
44
|
+
});
|
|
45
|
+
throw new Error("swagger-ui-dist package not found. Install with: npm install swagger-ui-dist");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Generate HTML page for Swagger UI
|
|
49
|
+
generateHTML(basePath) {
|
|
50
|
+
const swaggerOptions = {
|
|
51
|
+
...this.options.swaggerOptions,
|
|
52
|
+
url: `${basePath}/openapi.json`, // Relative URL to the OpenAPI spec
|
|
53
|
+
tryItOutEnabled: this.options.enableTryItOut,
|
|
54
|
+
filter: this.options.enableFilter,
|
|
55
|
+
deepLinking: this.options.enableDeepLinking,
|
|
56
|
+
};
|
|
57
|
+
return `<!DOCTYPE html>
|
|
58
|
+
<html lang="en">
|
|
59
|
+
<head>
|
|
60
|
+
<meta charset="UTF-8">
|
|
61
|
+
<title>${this.options.title}</title>
|
|
62
|
+
<link rel="stylesheet" type="text/css" href="${basePath}/swagger-ui.css" />
|
|
63
|
+
<style>
|
|
64
|
+
html {
|
|
65
|
+
box-sizing: border-box;
|
|
66
|
+
overflow: -moz-scrollbars-vertical;
|
|
67
|
+
overflow-y: scroll;
|
|
68
|
+
}
|
|
69
|
+
*, *:before, *:after {
|
|
70
|
+
box-sizing: inherit;
|
|
71
|
+
}
|
|
72
|
+
body {
|
|
73
|
+
margin:0;
|
|
74
|
+
background: #fafafa;
|
|
75
|
+
}
|
|
76
|
+
#loading-message {
|
|
77
|
+
padding: 20px;
|
|
78
|
+
text-align: center;
|
|
79
|
+
font-family: Arial, sans-serif;
|
|
80
|
+
color: #666;
|
|
81
|
+
}
|
|
82
|
+
#error-display {
|
|
83
|
+
display: none;
|
|
84
|
+
padding: 20px;
|
|
85
|
+
background: #ffebee;
|
|
86
|
+
border-left: 4px solid #f44336;
|
|
87
|
+
margin: 20px;
|
|
88
|
+
font-family: monospace;
|
|
89
|
+
color: #c62828;
|
|
90
|
+
}
|
|
91
|
+
${this.options.customCss || ""}
|
|
92
|
+
</style>
|
|
93
|
+
${this.options.favicon ? `<link rel="icon" type="image/png" href="${this.options.favicon}" sizes="32x32" />` : ""}
|
|
94
|
+
</head>
|
|
95
|
+
<body>
|
|
96
|
+
<div id="loading-message">
|
|
97
|
+
<h2>Loading Swagger UI...</h2>
|
|
98
|
+
<p>Please wait while the API documentation loads.</p>
|
|
99
|
+
</div>
|
|
100
|
+
<div id="swagger-ui"></div>
|
|
101
|
+
<div id="error-display">
|
|
102
|
+
<h3>Failed to Load Swagger UI</h3>
|
|
103
|
+
<div id="error-details"></div>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<script src="${basePath}/swagger-ui-bundle.js" charset="UTF-8"></script>
|
|
107
|
+
<script src="${basePath}/swagger-ui-standalone-preset.js" charset="UTF-8"></script>
|
|
108
|
+
<script>
|
|
109
|
+
console.log('Starting Swagger UI initialization...');
|
|
110
|
+
|
|
111
|
+
function showError(message, details) {
|
|
112
|
+
console.error('Swagger UI Error:', message, details);
|
|
113
|
+
document.getElementById('loading-message').style.display = 'none';
|
|
114
|
+
document.getElementById('error-display').style.display = 'block';
|
|
115
|
+
document.getElementById('error-details').innerHTML =
|
|
116
|
+
'<p><strong>Error:</strong> ' + message + '</p>' +
|
|
117
|
+
(details ? '<pre>' + JSON.stringify(details, null, 2) + '</pre>' : '');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function initializeSwaggerUI() {
|
|
121
|
+
console.log('Initializing Swagger UI...');
|
|
122
|
+
|
|
123
|
+
if (typeof SwaggerUIBundle === 'undefined') {
|
|
124
|
+
showError('SwaggerUIBundle not loaded', { SwaggerUIBundle: typeof SwaggerUIBundle });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (typeof SwaggerUIStandalonePreset === 'undefined') {
|
|
129
|
+
showError('SwaggerUIStandalonePreset not loaded', { SwaggerUIStandalonePreset: typeof SwaggerUIStandalonePreset });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
console.log('Creating SwaggerUIBundle...');
|
|
135
|
+
|
|
136
|
+
const ui = SwaggerUIBundle({
|
|
137
|
+
url: '${basePath}/openapi.json',
|
|
138
|
+
dom_id: '#swagger-ui',
|
|
139
|
+
deepLinking: ${this.options.enableDeepLinking},
|
|
140
|
+
presets: [
|
|
141
|
+
SwaggerUIBundle.presets.apis,
|
|
142
|
+
SwaggerUIStandalonePreset
|
|
143
|
+
],
|
|
144
|
+
plugins: [
|
|
145
|
+
SwaggerUIBundle.plugins.DownloadUrl
|
|
146
|
+
],
|
|
147
|
+
layout: "StandaloneLayout",
|
|
148
|
+
tryItOutEnabled: ${this.options.enableTryItOut},
|
|
149
|
+
filter: ${this.options.enableFilter},
|
|
150
|
+
onComplete: function() {
|
|
151
|
+
console.log('Swagger UI loaded successfully');
|
|
152
|
+
document.getElementById('loading-message').style.display = 'none';
|
|
153
|
+
},
|
|
154
|
+
onFailure: function(error) {
|
|
155
|
+
console.error('Swagger UI failed to load:', error);
|
|
156
|
+
showError('Swagger UI initialization failed', error);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
window.ui = ui;
|
|
161
|
+
console.log('SwaggerUIBundle created successfully');
|
|
162
|
+
|
|
163
|
+
// Hide loading message after timeout if onComplete doesn't fire
|
|
164
|
+
setTimeout(function() {
|
|
165
|
+
var loadingEl = document.getElementById('loading-message');
|
|
166
|
+
if (loadingEl && loadingEl.style.display !== 'none') {
|
|
167
|
+
console.log('Hiding loading message after timeout');
|
|
168
|
+
loadingEl.style.display = 'none';
|
|
169
|
+
}
|
|
170
|
+
}, 5000);
|
|
171
|
+
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error('Error creating SwaggerUIBundle:', error);
|
|
174
|
+
showError('Failed to create SwaggerUIBundle', {
|
|
175
|
+
name: error.name,
|
|
176
|
+
message: error.message
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Initialize when DOM is ready and scripts are loaded
|
|
182
|
+
if (document.readyState === 'loading') {
|
|
183
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
184
|
+
setTimeout(initializeSwaggerUI, 100);
|
|
185
|
+
});
|
|
186
|
+
} else {
|
|
187
|
+
setTimeout(initializeSwaggerUI, 100);
|
|
188
|
+
}
|
|
189
|
+
</script>
|
|
190
|
+
</body>
|
|
191
|
+
</html>`;
|
|
192
|
+
}
|
|
193
|
+
// Create middleware function that serves Swagger UI
|
|
194
|
+
createMiddleware(basePath = "/docs") {
|
|
195
|
+
return (req, res, next) => {
|
|
196
|
+
const path = req.path;
|
|
197
|
+
logger.debug(`Docs middleware handling: ${path}`, "DocsMiddleware", {
|
|
198
|
+
basePath,
|
|
199
|
+
});
|
|
200
|
+
// Serve the main HTML page
|
|
201
|
+
if (path === basePath || path === `${basePath}/`) {
|
|
202
|
+
logger.debug("Serving Swagger UI HTML", "DocsServing");
|
|
203
|
+
// Set CSP headers to allow Swagger UI to work
|
|
204
|
+
res.setHeader("Content-Security-Policy", "default-src 'self'; " +
|
|
205
|
+
"script-src 'self' 'unsafe-inline' 'unsafe-eval'; " +
|
|
206
|
+
"style-src 'self' 'unsafe-inline'; " +
|
|
207
|
+
"img-src 'self' data: https:; " +
|
|
208
|
+
"font-src 'self' data:; " +
|
|
209
|
+
"connect-src 'self'");
|
|
210
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
211
|
+
res.send(this.generateHTML(basePath));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Serve the OpenAPI JSON spec
|
|
215
|
+
if (path === `${basePath}/openapi.json`) {
|
|
216
|
+
logger.debug("Serving OpenAPI JSON spec", "DocsServing");
|
|
217
|
+
res.setHeader("Content-Type", "application/json");
|
|
218
|
+
res.json(this.openAPISpec);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
// Serve Swagger UI assets
|
|
222
|
+
if (path.startsWith(`${basePath}/`)) {
|
|
223
|
+
const assetName = path.replace(`${basePath}/`, "");
|
|
224
|
+
logger.debug(`Attempting to serve asset: ${assetName}`, "AssetServing", {
|
|
225
|
+
fullPath: path,
|
|
226
|
+
basePath,
|
|
227
|
+
assetPath: this.swaggerUIAssetPath,
|
|
228
|
+
});
|
|
229
|
+
// Security: only allow specific asset files
|
|
230
|
+
const allowedAssets = [
|
|
231
|
+
"swagger-ui-bundle.js",
|
|
232
|
+
"swagger-ui.css",
|
|
233
|
+
"swagger-ui-standalone-preset.js",
|
|
234
|
+
"favicon-16x16.png",
|
|
235
|
+
"favicon-32x32.png",
|
|
236
|
+
];
|
|
237
|
+
if (allowedAssets.includes(assetName)) {
|
|
238
|
+
try {
|
|
239
|
+
const assetPath = (0, path_1.join)(this.swaggerUIAssetPath, assetName);
|
|
240
|
+
logger.debug(`Reading asset from: ${assetPath}`, "AssetServing");
|
|
241
|
+
const content = (0, fs_1.readFileSync)(assetPath);
|
|
242
|
+
// Set appropriate content type
|
|
243
|
+
const contentType = this.getContentType(assetName);
|
|
244
|
+
res.setHeader("Content-Type", contentType);
|
|
245
|
+
res.setHeader("Cache-Control", "public, max-age=86400"); // Cache for 1 day
|
|
246
|
+
logger.debug(`Serving asset: ${assetName} (${content.length} bytes)`, "AssetServing");
|
|
247
|
+
res.send(content);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
logger.error(`Failed to serve Swagger UI asset: ${assetName}`, "AssetServing", {
|
|
252
|
+
error: error instanceof Error ? error.message : String(error),
|
|
253
|
+
assetPath: (0, path_1.join)(this.swaggerUIAssetPath, assetName),
|
|
254
|
+
});
|
|
255
|
+
res.status(404);
|
|
256
|
+
res.send(`Asset not found: ${assetName}`);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
logger.warn(`Asset not allowed: ${assetName}`, "AssetServing", {
|
|
262
|
+
allowedAssets,
|
|
263
|
+
});
|
|
264
|
+
res.status(404);
|
|
265
|
+
res.send(`Asset not allowed: ${assetName}`);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Not a docs request, continue to next middleware
|
|
270
|
+
next();
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// Get content type for asset files
|
|
274
|
+
getContentType(filename) {
|
|
275
|
+
if (filename.endsWith(".js"))
|
|
276
|
+
return "application/javascript";
|
|
277
|
+
if (filename.endsWith(".css"))
|
|
278
|
+
return "text/css";
|
|
279
|
+
if (filename.endsWith(".png"))
|
|
280
|
+
return "image/png";
|
|
281
|
+
if (filename.endsWith(".ico"))
|
|
282
|
+
return "image/x-icon";
|
|
283
|
+
return "text/plain";
|
|
284
|
+
}
|
|
285
|
+
// Update the OpenAPI spec (useful for dynamic updates)
|
|
286
|
+
updateSpec(newSpec) {
|
|
287
|
+
this.openAPISpec = newSpec;
|
|
288
|
+
logger.debug("OpenAPI specification updated", "SpecUpdate", {
|
|
289
|
+
pathCount: Object.keys(newSpec.paths).length,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.SwaggerUIMiddleware = SwaggerUIMiddleware;
|
|
294
|
+
// Convenience function to create documentation middleware
|
|
295
|
+
function createDocsMiddleware(openAPISpec, options = {}) {
|
|
296
|
+
const middleware = new SwaggerUIMiddleware(openAPISpec, options);
|
|
297
|
+
return middleware.createMiddleware();
|
|
298
|
+
}
|
|
299
|
+
// Helper function to generate documentation for an app
|
|
300
|
+
function generateDocsForApp(routes, info, options = {}) {
|
|
301
|
+
const openAPISpec = {
|
|
302
|
+
openapi: "3.0.3",
|
|
303
|
+
info,
|
|
304
|
+
servers: [
|
|
305
|
+
{ url: "http://localhost:3000", description: "Development server" },
|
|
306
|
+
],
|
|
307
|
+
paths: {},
|
|
308
|
+
tags: [],
|
|
309
|
+
};
|
|
310
|
+
// This will be enhanced when integrated with the routing system
|
|
311
|
+
logger.info("Documentation generated for app", "AppDocumentation", {
|
|
312
|
+
routeCount: routes.length,
|
|
313
|
+
title: info.title,
|
|
314
|
+
});
|
|
315
|
+
return createDocsMiddleware(openAPISpec, options);
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=swagger-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swagger-ui.js","sourceRoot":"","sources":["../../../src/core/docs/swagger-ui.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,wDAAwD;;;AAiVxD,oDAMC;AAGD,gDAsBC;AA9WD,2BAAkC;AAClC,+BAA4B;AAG5B,sCAAkD;AAElD,MAAM,MAAM,GAAG,IAAA,8BAAqB,EAAC,WAAW,CAAC,CAAC;AAclD,wBAAwB;AACxB,MAAa,mBAAmB;IAK9B,YAAY,WAAwB,EAAE,UAA4B,EAAE;QAClE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG;YACb,KAAK,EAAE,mBAAmB;YAC1B,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE;gBACd,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,8BAA8B;oBAC9B,oCAAoC;iBACrC;gBACD,OAAO,EAAE,CAAC,qCAAqC,CAAC;gBAChD,MAAM,EAAE,kBAAkB;aAC3B;YACD,GAAG,OAAO;SACX,CAAC;QAEF,IAAI,CAAC;YACH,8BAA8B;YAC9B,IAAI,CAAC,kBAAkB,GAAG,OAAO;iBAC9B,OAAO,CAAC,8BAA8B,CAAC;iBACvC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,gBAAgB,EAAE;gBACxD,SAAS,EAAE,IAAI,CAAC,kBAAkB;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,gBAAgB,EAAE;gBACnE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oCAAoC;IAC5B,YAAY,CAAC,QAAgB;QACnC,MAAM,cAAc,GAAG;YACrB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;YAC9B,GAAG,EAAE,GAAG,QAAQ,eAAe,EAAE,mCAAmC;YACpE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;YAC5C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;YACjC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;SAC5C,CAAC;QAEF,OAAO;;;;WAIA,IAAI,CAAC,OAAO,CAAC,KAAK;iDACoB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6BnD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;;IAE9B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,2CAA2C,IAAI,CAAC,OAAO,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;iBAalG,QAAQ;iBACR,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8BP,QAAQ;;yBAED,IAAI,CAAC,OAAO,CAAC,iBAAiB;;;;;;;;;6BAS1B,IAAI,CAAC,OAAO,CAAC,cAAc;oBACpC,IAAI,CAAC,OAAO,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0CrC,CAAC;IACP,CAAC;IAED,oDAAoD;IACpD,gBAAgB,CAAC,WAAmB,OAAO;QACzC,OAAO,CAAC,GAAgB,EAAE,GAAiB,EAAE,IAAgB,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAEtB,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,EAAE,EAAE,gBAAgB,EAAE;gBAClE,QAAQ;aACT,CAAC,CAAC;YAEH,2BAA2B;YAC3B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC;gBACjD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;gBAEvD,8CAA8C;gBAC9C,GAAG,CAAC,SAAS,CACX,yBAAyB,EACzB,sBAAsB;oBACpB,mDAAmD;oBACnD,oCAAoC;oBACpC,+BAA+B;oBAC/B,yBAAyB;oBACzB,oBAAoB,CACvB,CAAC;gBAEF,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;gBAC1D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,8BAA8B;YAC9B,IAAI,IAAI,KAAK,GAAG,QAAQ,eAAe,EAAE,CAAC;gBACxC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;gBACzD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC;gBAEnD,MAAM,CAAC,KAAK,CACV,8BAA8B,SAAS,EAAE,EACzC,cAAc,EACd;oBACE,QAAQ,EAAE,IAAI;oBACd,QAAQ;oBACR,SAAS,EAAE,IAAI,CAAC,kBAAkB;iBACnC,CACF,CAAC;gBAEF,4CAA4C;gBAC5C,MAAM,aAAa,GAAG;oBACpB,sBAAsB;oBACtB,gBAAgB;oBAChB,iCAAiC;oBACjC,mBAAmB;oBACnB,mBAAmB;iBACpB,CAAC;gBAEF,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC;wBACH,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;wBAC3D,MAAM,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;wBAEjE,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,SAAS,CAAC,CAAC;wBAExC,+BAA+B;wBAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;wBACnD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;wBAC3C,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC,CAAC,kBAAkB;wBAE3E,MAAM,CAAC,KAAK,CACV,kBAAkB,SAAS,KAAK,OAAO,CAAC,MAAM,SAAS,EACvD,cAAc,CACf,CAAC;wBACF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAClB,OAAO;oBACT,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CACV,qCAAqC,SAAS,EAAE,EAChD,cAAc,EACd;4BACE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;4BAC7D,SAAS,EAAE,IAAA,WAAI,EAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC;yBACpD,CACF,CAAC;wBACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAChB,GAAG,CAAC,IAAI,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;wBAC1C,OAAO;oBACT,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,EAAE,EAAE,cAAc,EAAE;wBAC7D,aAAa;qBACd,CAAC,CAAC;oBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChB,GAAG,CAAC,IAAI,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;YACH,CAAC;YAED,kDAAkD;YAClD,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;IACJ,CAAC;IAED,mCAAmC;IAC3B,cAAc,CAAC,QAAgB;QACrC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,wBAAwB,CAAC;QAC9D,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,UAAU,CAAC;QACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,WAAW,CAAC;QAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,cAAc,CAAC;QACrD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,uDAAuD;IACvD,UAAU,CAAC,OAAoB;QAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,YAAY,EAAE;YAC1D,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM;SAC7C,CAAC,CAAC;IACL,CAAC;CACF;AAvTD,kDAuTC;AAED,0DAA0D;AAC1D,SAAgB,oBAAoB,CAClC,WAAwB,EACxB,UAA4B,EAAE;IAE9B,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjE,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC;AACvC,CAAC;AAED,uDAAuD;AACvD,SAAgB,kBAAkB,CAChC,MAAa,EACb,IAA8D,EAC9D,UAA4B,EAAE;IAE9B,MAAM,WAAW,GAAgB;QAC/B,OAAO,EAAE,OAAO;QAChB,IAAI;QACJ,OAAO,EAAE;YACP,EAAE,GAAG,EAAE,uBAAuB,EAAE,WAAW,EAAE,oBAAoB,EAAE;SACpE;QACD,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,EAAE;KACT,CAAC;IAEF,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,kBAAkB,EAAE;QACjE,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ZodSchema } from "zod";
|
|
2
|
+
export interface OpenAPISchema {
|
|
3
|
+
type?: string;
|
|
4
|
+
format?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
example?: any;
|
|
7
|
+
enum?: any[];
|
|
8
|
+
items?: OpenAPISchema;
|
|
9
|
+
properties?: Record<string, OpenAPISchema>;
|
|
10
|
+
required?: string[];
|
|
11
|
+
minimum?: number;
|
|
12
|
+
maximum?: number;
|
|
13
|
+
minLength?: number;
|
|
14
|
+
maxLength?: number;
|
|
15
|
+
pattern?: string;
|
|
16
|
+
default?: any;
|
|
17
|
+
oneOf?: OpenAPISchema[];
|
|
18
|
+
anyOf?: OpenAPISchema[];
|
|
19
|
+
allOf?: OpenAPISchema[];
|
|
20
|
+
nullable?: boolean;
|
|
21
|
+
additionalProperties?: boolean | OpenAPISchema;
|
|
22
|
+
}
|
|
23
|
+
export interface ConversionOptions {
|
|
24
|
+
includeExamples?: boolean;
|
|
25
|
+
includeDescriptions?: boolean;
|
|
26
|
+
strict?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function zodToOpenAPI(schema: ZodSchema, options?: ConversionOptions): OpenAPISchema;
|
|
29
|
+
export declare function generateExampleFromSchema(schema: ZodSchema): any;
|