@morojs/moro 1.0.0 → 1.0.1
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 +31 -30
- package/dist/index.js +28 -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 +180 -164
- 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 +58 -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
|
@@ -8,11 +8,11 @@ import {
|
|
|
8
8
|
createRoute,
|
|
9
9
|
defineRoute,
|
|
10
10
|
HttpMethod,
|
|
11
|
-
} from
|
|
12
|
-
import { HttpRequest, HttpResponse } from
|
|
13
|
-
import { createFrameworkLogger } from
|
|
11
|
+
} from './index';
|
|
12
|
+
import { HttpRequest, HttpResponse } from '../http';
|
|
13
|
+
import { createFrameworkLogger } from '../logger';
|
|
14
14
|
|
|
15
|
-
const logger = createFrameworkLogger(
|
|
15
|
+
const logger = createFrameworkLogger('AppIntegration');
|
|
16
16
|
|
|
17
17
|
// Extended app interface with intelligent routing
|
|
18
18
|
export interface IntelligentApp {
|
|
@@ -32,12 +32,7 @@ export interface IntelligentApp {
|
|
|
32
32
|
register(route: CompiledRoute): void;
|
|
33
33
|
|
|
34
34
|
// Direct route method (deprecated)
|
|
35
|
-
directRoute(
|
|
36
|
-
method: string,
|
|
37
|
-
path: string,
|
|
38
|
-
handler: Function,
|
|
39
|
-
options?: any,
|
|
40
|
-
): void;
|
|
35
|
+
directRoute(method: string, path: string, handler: Function, options?: any): void;
|
|
41
36
|
}
|
|
42
37
|
|
|
43
38
|
// Route registry for managing compiled routes
|
|
@@ -63,7 +58,7 @@ export class RouteRegistry {
|
|
|
63
58
|
paramNames,
|
|
64
59
|
});
|
|
65
60
|
|
|
66
|
-
logger.debug(`Registered route: ${key}`,
|
|
61
|
+
logger.debug(`Registered route: ${key}`, 'RouteRegistry', {
|
|
67
62
|
path: route.schema.path,
|
|
68
63
|
hasValidation: !!route.schema.validation,
|
|
69
64
|
hasAuth: !!route.schema.auth,
|
|
@@ -105,10 +100,10 @@ export class RouteRegistry {
|
|
|
105
100
|
|
|
106
101
|
// Convert path parameters like :id to regex groups
|
|
107
102
|
const regexPath = path
|
|
108
|
-
.replace(/\//g,
|
|
103
|
+
.replace(/\//g, '\\/') // Escape forward slashes
|
|
109
104
|
.replace(/:([^/]+)/g, (match, paramName) => {
|
|
110
105
|
paramNames.push(paramName);
|
|
111
|
-
return
|
|
106
|
+
return '([^/]+)'; // Match parameter value
|
|
112
107
|
});
|
|
113
108
|
|
|
114
109
|
return {
|
|
@@ -124,31 +119,31 @@ export class IntelligentRoutingManager implements IntelligentApp {
|
|
|
124
119
|
|
|
125
120
|
// Chainable route methods
|
|
126
121
|
get(path: string): RouteBuilder {
|
|
127
|
-
return this.createChainableRoute(
|
|
122
|
+
return this.createChainableRoute('GET', path);
|
|
128
123
|
}
|
|
129
124
|
|
|
130
125
|
post(path: string): RouteBuilder {
|
|
131
|
-
return this.createChainableRoute(
|
|
126
|
+
return this.createChainableRoute('POST', path);
|
|
132
127
|
}
|
|
133
128
|
|
|
134
129
|
put(path: string): RouteBuilder {
|
|
135
|
-
return this.createChainableRoute(
|
|
130
|
+
return this.createChainableRoute('PUT', path);
|
|
136
131
|
}
|
|
137
132
|
|
|
138
133
|
delete(path: string): RouteBuilder {
|
|
139
|
-
return this.createChainableRoute(
|
|
134
|
+
return this.createChainableRoute('DELETE', path);
|
|
140
135
|
}
|
|
141
136
|
|
|
142
137
|
patch(path: string): RouteBuilder {
|
|
143
|
-
return this.createChainableRoute(
|
|
138
|
+
return this.createChainableRoute('PATCH', path);
|
|
144
139
|
}
|
|
145
140
|
|
|
146
141
|
head(path: string): RouteBuilder {
|
|
147
|
-
return this.createChainableRoute(
|
|
142
|
+
return this.createChainableRoute('HEAD', path);
|
|
148
143
|
}
|
|
149
144
|
|
|
150
145
|
options(path: string): RouteBuilder {
|
|
151
|
-
return this.createChainableRoute(
|
|
146
|
+
return this.createChainableRoute('OPTIONS', path);
|
|
152
147
|
}
|
|
153
148
|
|
|
154
149
|
// Schema-first route method
|
|
@@ -164,10 +159,7 @@ export class IntelligentRoutingManager implements IntelligentApp {
|
|
|
164
159
|
}
|
|
165
160
|
|
|
166
161
|
// Handle incoming requests with intelligent routing
|
|
167
|
-
async handleIntelligentRoute(
|
|
168
|
-
req: HttpRequest,
|
|
169
|
-
res: HttpResponse,
|
|
170
|
-
): Promise<boolean> {
|
|
162
|
+
async handleIntelligentRoute(req: HttpRequest, res: HttpResponse): Promise<boolean> {
|
|
171
163
|
return await this.routeRegistry.handleRequest(req, res);
|
|
172
164
|
}
|
|
173
165
|
|
|
@@ -177,16 +169,11 @@ export class IntelligentRoutingManager implements IntelligentApp {
|
|
|
177
169
|
}
|
|
178
170
|
|
|
179
171
|
// Direct route method (deprecated)
|
|
180
|
-
directRoute(
|
|
181
|
-
method
|
|
182
|
-
path: string,
|
|
183
|
-
handler: Function,
|
|
184
|
-
options?: any,
|
|
185
|
-
): void {
|
|
186
|
-
logger.warn("Using deprecated direct route method", "DirectRoute", {
|
|
172
|
+
directRoute(method: string, path: string, handler: Function, options?: any): void {
|
|
173
|
+
logger.warn('Using deprecated direct route method', 'DirectRoute', {
|
|
187
174
|
method,
|
|
188
175
|
path,
|
|
189
|
-
suggestion:
|
|
176
|
+
suggestion: 'Use chainable or schema-first API instead',
|
|
190
177
|
});
|
|
191
178
|
|
|
192
179
|
// Convert direct options to new schema format
|
|
@@ -1,29 +1,19 @@
|
|
|
1
1
|
// Intelligent Routing System for Moro Framework
|
|
2
2
|
// Schema-first with automatic middleware ordering and chainable API
|
|
3
3
|
|
|
4
|
-
import { z, ZodSchema } from
|
|
5
|
-
import { HttpRequest, HttpResponse } from
|
|
6
|
-
import { createFrameworkLogger } from
|
|
4
|
+
import { z, ZodSchema } from 'zod';
|
|
5
|
+
import { HttpRequest, HttpResponse } from '../http';
|
|
6
|
+
import { createFrameworkLogger } from '../logger';
|
|
7
7
|
|
|
8
|
-
const logger = createFrameworkLogger(
|
|
8
|
+
const logger = createFrameworkLogger('IntelligentRouting');
|
|
9
9
|
|
|
10
10
|
// Core types
|
|
11
|
-
export type HttpMethod =
|
|
12
|
-
|
|
13
|
-
| "POST"
|
|
14
|
-
| "PUT"
|
|
15
|
-
| "DELETE"
|
|
16
|
-
| "PATCH"
|
|
17
|
-
| "HEAD"
|
|
18
|
-
| "OPTIONS";
|
|
19
|
-
export type RouteHandler<T = any> = (
|
|
20
|
-
req: HttpRequest,
|
|
21
|
-
res: HttpResponse,
|
|
22
|
-
) => T | Promise<T>;
|
|
11
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
|
|
12
|
+
export type RouteHandler<T = any> = (req: HttpRequest, res: HttpResponse) => T | Promise<T>;
|
|
23
13
|
export type Middleware = (
|
|
24
14
|
req: HttpRequest,
|
|
25
15
|
res: HttpResponse,
|
|
26
|
-
next: () => void
|
|
16
|
+
next: () => void
|
|
27
17
|
) => void | Promise<void>;
|
|
28
18
|
|
|
29
19
|
// Configuration interfaces
|
|
@@ -81,16 +71,16 @@ export interface RouteSchema {
|
|
|
81
71
|
|
|
82
72
|
// Execution phases in optimal order
|
|
83
73
|
export const EXECUTION_PHASES = [
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
74
|
+
'security', // CORS, Helmet (framework-managed)
|
|
75
|
+
'parsing', // Body/query parsing (framework-managed)
|
|
76
|
+
'rateLimit', // Rate limiting (early protection)
|
|
77
|
+
'before', // Custom pre-processing middleware
|
|
78
|
+
'auth', // Authentication/authorization
|
|
79
|
+
'validation', // Request validation
|
|
80
|
+
'transform', // Data transformation middleware
|
|
81
|
+
'cache', // Caching logic
|
|
82
|
+
'after', // Custom post-processing middleware
|
|
83
|
+
'handler', // Route handler (always last)
|
|
94
84
|
] as const;
|
|
95
85
|
|
|
96
86
|
export type ExecutionPhase = (typeof EXECUTION_PHASES)[number];
|
|
@@ -202,28 +192,19 @@ export class IntelligentRouteBuilder implements RouteBuilder {
|
|
|
202
192
|
// Custom middleware
|
|
203
193
|
before(...middleware: Middleware[]): RouteBuilder {
|
|
204
194
|
if (!this.schema.middleware) this.schema.middleware = {};
|
|
205
|
-
this.schema.middleware.before = [
|
|
206
|
-
...(this.schema.middleware.before || []),
|
|
207
|
-
...middleware,
|
|
208
|
-
];
|
|
195
|
+
this.schema.middleware.before = [...(this.schema.middleware.before || []), ...middleware];
|
|
209
196
|
return this;
|
|
210
197
|
}
|
|
211
198
|
|
|
212
199
|
after(...middleware: Middleware[]): RouteBuilder {
|
|
213
200
|
if (!this.schema.middleware) this.schema.middleware = {};
|
|
214
|
-
this.schema.middleware.after = [
|
|
215
|
-
...(this.schema.middleware.after || []),
|
|
216
|
-
...middleware,
|
|
217
|
-
];
|
|
201
|
+
this.schema.middleware.after = [...(this.schema.middleware.after || []), ...middleware];
|
|
218
202
|
return this;
|
|
219
203
|
}
|
|
220
204
|
|
|
221
205
|
transform(...middleware: Middleware[]): RouteBuilder {
|
|
222
206
|
if (!this.schema.middleware) this.schema.middleware = {};
|
|
223
|
-
this.schema.middleware.transform = [
|
|
224
|
-
...(this.schema.middleware.transform || []),
|
|
225
|
-
...middleware,
|
|
226
|
-
];
|
|
207
|
+
this.schema.middleware.transform = [...(this.schema.middleware.transform || []), ...middleware];
|
|
227
208
|
return this;
|
|
228
209
|
}
|
|
229
210
|
|
|
@@ -245,7 +226,7 @@ export class IntelligentRouteBuilder implements RouteBuilder {
|
|
|
245
226
|
// Terminal method - compiles the route
|
|
246
227
|
handler<T>(handler: RouteHandler<T>): CompiledRoute {
|
|
247
228
|
if (!handler) {
|
|
248
|
-
throw new Error(
|
|
229
|
+
throw new Error('Handler is required');
|
|
249
230
|
}
|
|
250
231
|
|
|
251
232
|
const completeSchema: RouteSchema = {
|
|
@@ -255,7 +236,7 @@ export class IntelligentRouteBuilder implements RouteBuilder {
|
|
|
255
236
|
|
|
256
237
|
logger.debug(
|
|
257
238
|
`Compiled route: ${completeSchema.method} ${completeSchema.path}`,
|
|
258
|
-
|
|
239
|
+
'RouteCompilation',
|
|
259
240
|
{
|
|
260
241
|
hasValidation: !!completeSchema.validation,
|
|
261
242
|
hasAuth: !!completeSchema.auth,
|
|
@@ -266,7 +247,7 @@ export class IntelligentRouteBuilder implements RouteBuilder {
|
|
|
266
247
|
after: completeSchema.middleware?.after?.length || 0,
|
|
267
248
|
transform: completeSchema.middleware?.transform?.length || 0,
|
|
268
249
|
},
|
|
269
|
-
}
|
|
250
|
+
}
|
|
270
251
|
);
|
|
271
252
|
|
|
272
253
|
return new ExecutableRoute(completeSchema);
|
|
@@ -282,20 +263,20 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
282
263
|
|
|
283
264
|
try {
|
|
284
265
|
// Execute middleware in intelligent order
|
|
285
|
-
await this.executePhase(
|
|
286
|
-
await this.executePhase(
|
|
287
|
-
await this.executePhase(
|
|
288
|
-
await this.executePhase(
|
|
289
|
-
await this.executePhase(
|
|
290
|
-
await this.executePhase(
|
|
291
|
-
await this.executePhase(
|
|
266
|
+
await this.executePhase('before', validatedReq, res);
|
|
267
|
+
await this.executePhase('rateLimit', validatedReq, res);
|
|
268
|
+
await this.executePhase('auth', validatedReq, res);
|
|
269
|
+
await this.executePhase('validation', validatedReq, res);
|
|
270
|
+
await this.executePhase('transform', validatedReq, res);
|
|
271
|
+
await this.executePhase('cache', validatedReq, res);
|
|
272
|
+
await this.executePhase('after', validatedReq, res);
|
|
292
273
|
|
|
293
274
|
// Execute handler last
|
|
294
275
|
if (!res.headersSent) {
|
|
295
|
-
await this.executePhase(
|
|
276
|
+
await this.executePhase('handler', validatedReq, res);
|
|
296
277
|
}
|
|
297
278
|
} catch (error) {
|
|
298
|
-
logger.error(
|
|
279
|
+
logger.error('Route execution error', 'RouteExecution', {
|
|
299
280
|
error: error instanceof Error ? error.message : String(error),
|
|
300
281
|
route: `${this.schema.method} ${this.schema.path}`,
|
|
301
282
|
requestId: req.requestId,
|
|
@@ -304,7 +285,7 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
304
285
|
if (!res.headersSent) {
|
|
305
286
|
res.status(500).json({
|
|
306
287
|
success: false,
|
|
307
|
-
error:
|
|
288
|
+
error: 'Internal server error',
|
|
308
289
|
requestId: req.requestId,
|
|
309
290
|
});
|
|
310
291
|
}
|
|
@@ -314,10 +295,10 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
314
295
|
private async executePhase(
|
|
315
296
|
phase: ExecutionPhase,
|
|
316
297
|
req: ValidatedRequest,
|
|
317
|
-
res: HttpResponse
|
|
298
|
+
res: HttpResponse
|
|
318
299
|
): Promise<void> {
|
|
319
300
|
switch (phase) {
|
|
320
|
-
case
|
|
301
|
+
case 'before':
|
|
321
302
|
if (this.schema.middleware?.before) {
|
|
322
303
|
for (const middleware of this.schema.middleware.before) {
|
|
323
304
|
await this.executeMiddleware(middleware, req, res);
|
|
@@ -325,25 +306,25 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
325
306
|
}
|
|
326
307
|
break;
|
|
327
308
|
|
|
328
|
-
case
|
|
309
|
+
case 'rateLimit':
|
|
329
310
|
if (this.schema.rateLimit) {
|
|
330
311
|
await this.executeRateLimit(req, res);
|
|
331
312
|
}
|
|
332
313
|
break;
|
|
333
314
|
|
|
334
|
-
case
|
|
315
|
+
case 'auth':
|
|
335
316
|
if (this.schema.auth) {
|
|
336
317
|
await this.executeAuth(req, res);
|
|
337
318
|
}
|
|
338
319
|
break;
|
|
339
320
|
|
|
340
|
-
case
|
|
321
|
+
case 'validation':
|
|
341
322
|
if (this.schema.validation) {
|
|
342
323
|
await this.executeValidation(req, res);
|
|
343
324
|
}
|
|
344
325
|
break;
|
|
345
326
|
|
|
346
|
-
case
|
|
327
|
+
case 'transform':
|
|
347
328
|
if (this.schema.middleware?.transform) {
|
|
348
329
|
for (const middleware of this.schema.middleware.transform) {
|
|
349
330
|
await this.executeMiddleware(middleware, req, res);
|
|
@@ -351,13 +332,13 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
351
332
|
}
|
|
352
333
|
break;
|
|
353
334
|
|
|
354
|
-
case
|
|
335
|
+
case 'cache':
|
|
355
336
|
if (this.schema.cache) {
|
|
356
337
|
await this.executeCache(req, res);
|
|
357
338
|
}
|
|
358
339
|
break;
|
|
359
340
|
|
|
360
|
-
case
|
|
341
|
+
case 'after':
|
|
361
342
|
if (this.schema.middleware?.after) {
|
|
362
343
|
for (const middleware of this.schema.middleware.after) {
|
|
363
344
|
await this.executeMiddleware(middleware, req, res);
|
|
@@ -365,7 +346,7 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
365
346
|
}
|
|
366
347
|
break;
|
|
367
348
|
|
|
368
|
-
case
|
|
349
|
+
case 'handler': {
|
|
369
350
|
const result = await this.schema.handler(req, res);
|
|
370
351
|
if (result !== undefined && !res.headersSent) {
|
|
371
352
|
res.json(result);
|
|
@@ -378,7 +359,7 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
378
359
|
private async executeMiddleware(
|
|
379
360
|
middleware: Middleware,
|
|
380
361
|
req: HttpRequest,
|
|
381
|
-
res: HttpResponse
|
|
362
|
+
res: HttpResponse
|
|
382
363
|
): Promise<void> {
|
|
383
364
|
return new Promise((resolve, reject) => {
|
|
384
365
|
try {
|
|
@@ -393,31 +374,22 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
393
374
|
});
|
|
394
375
|
}
|
|
395
376
|
|
|
396
|
-
private async executeRateLimit(
|
|
397
|
-
req: HttpRequest,
|
|
398
|
-
res: HttpResponse,
|
|
399
|
-
): Promise<void> {
|
|
377
|
+
private async executeRateLimit(req: HttpRequest, res: HttpResponse): Promise<void> {
|
|
400
378
|
// Rate limiting implementation will be added
|
|
401
|
-
logger.debug(
|
|
379
|
+
logger.debug('Rate limit check', 'RateLimit', {
|
|
402
380
|
config: this.schema.rateLimit,
|
|
403
381
|
ip: req.ip,
|
|
404
382
|
});
|
|
405
383
|
}
|
|
406
384
|
|
|
407
|
-
private async executeAuth(
|
|
408
|
-
req: ValidatedRequest,
|
|
409
|
-
res: HttpResponse,
|
|
410
|
-
): Promise<void> {
|
|
385
|
+
private async executeAuth(req: ValidatedRequest, res: HttpResponse): Promise<void> {
|
|
411
386
|
// Authentication implementation will be added
|
|
412
|
-
logger.debug(
|
|
387
|
+
logger.debug('Auth check', 'Auth', {
|
|
413
388
|
config: this.schema.auth,
|
|
414
389
|
});
|
|
415
390
|
}
|
|
416
391
|
|
|
417
|
-
private async executeValidation(
|
|
418
|
-
req: ValidatedRequest,
|
|
419
|
-
res: HttpResponse,
|
|
420
|
-
): Promise<void> {
|
|
392
|
+
private async executeValidation(req: ValidatedRequest, res: HttpResponse): Promise<void> {
|
|
421
393
|
if (!this.schema.validation) return;
|
|
422
394
|
|
|
423
395
|
const { body, query, params, headers } = this.schema.validation;
|
|
@@ -428,7 +400,7 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
428
400
|
req.validatedBody = await body.parseAsync(req.body);
|
|
429
401
|
req.body = req.validatedBody; // Update original for compatibility
|
|
430
402
|
} catch (error: any) {
|
|
431
|
-
this.sendValidationError(res, error,
|
|
403
|
+
this.sendValidationError(res, error, 'body', req.requestId);
|
|
432
404
|
return;
|
|
433
405
|
}
|
|
434
406
|
}
|
|
@@ -439,7 +411,7 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
439
411
|
req.validatedQuery = await query.parseAsync(req.query);
|
|
440
412
|
req.query = req.validatedQuery; // Update original for compatibility
|
|
441
413
|
} catch (error: any) {
|
|
442
|
-
this.sendValidationError(res, error,
|
|
414
|
+
this.sendValidationError(res, error, 'query', req.requestId);
|
|
443
415
|
return;
|
|
444
416
|
}
|
|
445
417
|
}
|
|
@@ -450,7 +422,7 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
450
422
|
req.validatedParams = await params.parseAsync(req.params);
|
|
451
423
|
req.params = req.validatedParams; // Update original for compatibility
|
|
452
424
|
} catch (error: any) {
|
|
453
|
-
this.sendValidationError(res, error,
|
|
425
|
+
this.sendValidationError(res, error, 'params', req.requestId);
|
|
454
426
|
return;
|
|
455
427
|
}
|
|
456
428
|
}
|
|
@@ -460,12 +432,12 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
460
432
|
try {
|
|
461
433
|
req.validatedHeaders = await headers.parseAsync(req.headers);
|
|
462
434
|
} catch (error: any) {
|
|
463
|
-
this.sendValidationError(res, error,
|
|
435
|
+
this.sendValidationError(res, error, 'headers', req.requestId);
|
|
464
436
|
return;
|
|
465
437
|
}
|
|
466
438
|
}
|
|
467
439
|
|
|
468
|
-
logger.debug(
|
|
440
|
+
logger.debug('Validation passed', 'Validation', {
|
|
469
441
|
route: `${this.schema.method} ${this.schema.path}`,
|
|
470
442
|
validatedFields: Object.keys(this.schema.validation),
|
|
471
443
|
});
|
|
@@ -475,14 +447,14 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
475
447
|
res: HttpResponse,
|
|
476
448
|
error: any,
|
|
477
449
|
field: string,
|
|
478
|
-
requestId?: string
|
|
450
|
+
requestId?: string
|
|
479
451
|
): void {
|
|
480
452
|
if (error.issues) {
|
|
481
453
|
res.status(400).json({
|
|
482
454
|
success: false,
|
|
483
455
|
error: `Validation failed for ${field}`,
|
|
484
456
|
details: error.issues.map((issue: any) => ({
|
|
485
|
-
field: issue.path.length > 0 ? issue.path.join(
|
|
457
|
+
field: issue.path.length > 0 ? issue.path.join('.') : field,
|
|
486
458
|
message: issue.message,
|
|
487
459
|
code: issue.code,
|
|
488
460
|
})),
|
|
@@ -497,12 +469,9 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
497
469
|
}
|
|
498
470
|
}
|
|
499
471
|
|
|
500
|
-
private async executeCache(
|
|
501
|
-
req: HttpRequest,
|
|
502
|
-
res: HttpResponse,
|
|
503
|
-
): Promise<void> {
|
|
472
|
+
private async executeCache(req: HttpRequest, res: HttpResponse): Promise<void> {
|
|
504
473
|
// Caching implementation will be added
|
|
505
|
-
logger.debug(
|
|
474
|
+
logger.debug('Cache check', 'Cache', {
|
|
506
475
|
config: this.schema.cache,
|
|
507
476
|
});
|
|
508
477
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// AWS Lambda runtime adapter
|
|
2
|
-
import { BaseRuntimeAdapter } from
|
|
3
|
-
import { HttpRequest, HttpResponse } from
|
|
4
|
-
import { RuntimeHttpResponse } from
|
|
2
|
+
import { BaseRuntimeAdapter } from './base-adapter';
|
|
3
|
+
import { HttpRequest, HttpResponse } from '../../types/http';
|
|
4
|
+
import { RuntimeHttpResponse } from '../../types/runtime';
|
|
5
5
|
|
|
6
6
|
export interface LambdaEvent {
|
|
7
7
|
httpMethod: string;
|
|
@@ -40,12 +40,9 @@ export interface LambdaResponse {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
43
|
-
readonly type =
|
|
43
|
+
readonly type = 'aws-lambda' as const;
|
|
44
44
|
|
|
45
|
-
async adaptRequest(
|
|
46
|
-
event: LambdaEvent,
|
|
47
|
-
context: LambdaContext,
|
|
48
|
-
): Promise<HttpRequest> {
|
|
45
|
+
async adaptRequest(event: LambdaEvent, context: LambdaContext): Promise<HttpRequest> {
|
|
49
46
|
const { pathname, query } = this.parseUrl(event.path);
|
|
50
47
|
|
|
51
48
|
// Merge query parameters from event
|
|
@@ -57,12 +54,9 @@ export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
|
57
54
|
// Parse body
|
|
58
55
|
let body: any;
|
|
59
56
|
if (event.body) {
|
|
60
|
-
const contentType =
|
|
61
|
-
event.headers?.["content-type"] ||
|
|
62
|
-
event.headers?.["Content-Type"] ||
|
|
63
|
-
"";
|
|
57
|
+
const contentType = event.headers?.['content-type'] || event.headers?.['Content-Type'] || '';
|
|
64
58
|
if (event.isBase64Encoded) {
|
|
65
|
-
body = Buffer.from(event.body,
|
|
59
|
+
body = Buffer.from(event.body, 'base64').toString();
|
|
66
60
|
} else {
|
|
67
61
|
body = event.body;
|
|
68
62
|
}
|
|
@@ -76,19 +70,17 @@ export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
|
76
70
|
query: mergedQuery,
|
|
77
71
|
body,
|
|
78
72
|
headers: event.headers || {},
|
|
79
|
-
ip: event.requestContext?.identity?.sourceIp ||
|
|
73
|
+
ip: event.requestContext?.identity?.sourceIp || 'unknown',
|
|
80
74
|
params: event.pathParameters || {},
|
|
81
75
|
requestId: context.awsRequestId,
|
|
82
|
-
cookies: this.parseCookies(event.headers?.cookie ||
|
|
76
|
+
cookies: this.parseCookies(event.headers?.cookie || ''),
|
|
83
77
|
files: {},
|
|
84
78
|
} as Partial<HttpRequest>;
|
|
85
79
|
|
|
86
80
|
return this.enhanceRequest(baseRequest);
|
|
87
81
|
}
|
|
88
82
|
|
|
89
|
-
async adaptResponse(
|
|
90
|
-
moroResponse: HttpResponse | RuntimeHttpResponse,
|
|
91
|
-
): Promise<LambdaResponse> {
|
|
83
|
+
async adaptResponse(moroResponse: HttpResponse | RuntimeHttpResponse): Promise<LambdaResponse> {
|
|
92
84
|
const runtimeResponse = moroResponse as RuntimeHttpResponse;
|
|
93
85
|
|
|
94
86
|
let body = runtimeResponse.body;
|
|
@@ -96,11 +88,11 @@ export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
|
96
88
|
const headers = runtimeResponse.headers || {};
|
|
97
89
|
|
|
98
90
|
// Convert body to string
|
|
99
|
-
if (typeof body ===
|
|
91
|
+
if (typeof body === 'object' && body !== null) {
|
|
100
92
|
body = JSON.stringify(body);
|
|
101
|
-
headers[
|
|
93
|
+
headers['Content-Type'] = 'application/json';
|
|
102
94
|
} else if (body === null || body === undefined) {
|
|
103
|
-
body =
|
|
95
|
+
body = '';
|
|
104
96
|
} else {
|
|
105
97
|
body = String(body);
|
|
106
98
|
}
|
|
@@ -113,9 +105,7 @@ export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
|
113
105
|
};
|
|
114
106
|
}
|
|
115
107
|
|
|
116
|
-
createServer(
|
|
117
|
-
handler: (req: HttpRequest, res: HttpResponse) => Promise<void>,
|
|
118
|
-
) {
|
|
108
|
+
createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>) {
|
|
119
109
|
// Return a Lambda-compatible handler function
|
|
120
110
|
return async (event: LambdaEvent, context: LambdaContext) => {
|
|
121
111
|
try {
|
|
@@ -128,11 +118,11 @@ export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
|
128
118
|
} catch (error) {
|
|
129
119
|
return {
|
|
130
120
|
statusCode: 500,
|
|
131
|
-
headers: {
|
|
121
|
+
headers: { 'Content-Type': 'application/json' },
|
|
132
122
|
body: JSON.stringify({
|
|
133
123
|
success: false,
|
|
134
|
-
error:
|
|
135
|
-
message: error instanceof Error ? error.message :
|
|
124
|
+
error: 'Internal server error',
|
|
125
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
136
126
|
}),
|
|
137
127
|
};
|
|
138
128
|
}
|
|
@@ -145,10 +135,10 @@ export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
|
145
135
|
private parseCookies(cookieHeader: string): Record<string, string> {
|
|
146
136
|
const cookies: Record<string, string> = {};
|
|
147
137
|
if (cookieHeader) {
|
|
148
|
-
cookieHeader.split(
|
|
149
|
-
const [name, ...rest] = cookie.trim().split(
|
|
138
|
+
cookieHeader.split(';').forEach(cookie => {
|
|
139
|
+
const [name, ...rest] = cookie.trim().split('=');
|
|
150
140
|
if (name && rest.length > 0) {
|
|
151
|
-
cookies[name] = rest.join(
|
|
141
|
+
cookies[name] = rest.join('=');
|
|
152
142
|
}
|
|
153
143
|
});
|
|
154
144
|
}
|