@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
package/src/moro.ts
CHANGED
|
@@ -1,35 +1,31 @@
|
|
|
1
1
|
// Moro Framework - Modern TypeScript API Framework
|
|
2
2
|
// Built for developers who demand performance, elegance, and zero compromises
|
|
3
3
|
// Event-driven • Modular • Enterprise-ready • Developer-first
|
|
4
|
-
import { Moro as MoroCore } from
|
|
5
|
-
import { HttpRequest, HttpResponse, middleware } from
|
|
6
|
-
import { ModuleConfig, InternalRouteDefinition } from
|
|
7
|
-
import { MoroOptions } from
|
|
8
|
-
import { MoroEventBus } from
|
|
4
|
+
import { Moro as MoroCore } from './core/framework';
|
|
5
|
+
import { HttpRequest, HttpResponse, middleware } from './core/http';
|
|
6
|
+
import { ModuleConfig, InternalRouteDefinition } from './types/module';
|
|
7
|
+
import { MoroOptions } from './types/core';
|
|
8
|
+
import { MoroEventBus } from './core/events';
|
|
9
9
|
import {
|
|
10
10
|
createFrameworkLogger,
|
|
11
11
|
logger as globalLogger,
|
|
12
12
|
applyLoggingConfiguration,
|
|
13
|
-
} from
|
|
14
|
-
import { IntelligentRoutingManager } from
|
|
15
|
-
import { RouteBuilder, RouteSchema, CompiledRoute } from
|
|
16
|
-
import { AppDocumentationManager, DocsConfig } from
|
|
17
|
-
import { readdirSync, statSync } from
|
|
18
|
-
import { join } from
|
|
19
|
-
import { EventEmitter } from
|
|
13
|
+
} from './core/logger';
|
|
14
|
+
import { IntelligentRoutingManager } from './core/routing/app-integration';
|
|
15
|
+
import { RouteBuilder, RouteSchema, CompiledRoute } from './core/routing';
|
|
16
|
+
import { AppDocumentationManager, DocsConfig } from './core/docs';
|
|
17
|
+
import { readdirSync, statSync } from 'fs';
|
|
18
|
+
import { join } from 'path';
|
|
19
|
+
import { EventEmitter } from 'events';
|
|
20
20
|
// Configuration System Integration
|
|
21
|
-
import {
|
|
22
|
-
initializeConfig,
|
|
23
|
-
getGlobalConfig,
|
|
24
|
-
type AppConfig,
|
|
25
|
-
} from "./core/config";
|
|
21
|
+
import { initializeConfig, getGlobalConfig, type AppConfig } from './core/config';
|
|
26
22
|
// Runtime System Integration
|
|
27
23
|
import {
|
|
28
24
|
RuntimeAdapter,
|
|
29
25
|
RuntimeType,
|
|
30
26
|
createRuntimeAdapter,
|
|
31
27
|
NodeRuntimeAdapter,
|
|
32
|
-
} from
|
|
28
|
+
} from './core/runtime';
|
|
33
29
|
|
|
34
30
|
export class Moro extends EventEmitter {
|
|
35
31
|
private coreFramework: MoroCore;
|
|
@@ -40,7 +36,7 @@ export class Moro extends EventEmitter {
|
|
|
40
36
|
// Enterprise event system integration
|
|
41
37
|
private eventBus: MoroEventBus;
|
|
42
38
|
// Application logger
|
|
43
|
-
private logger = createFrameworkLogger(
|
|
39
|
+
private logger = createFrameworkLogger('App');
|
|
44
40
|
// Intelligent routing system
|
|
45
41
|
private intelligentRouting = new IntelligentRoutingManager();
|
|
46
42
|
// Documentation system
|
|
@@ -70,18 +66,14 @@ export class Moro extends EventEmitter {
|
|
|
70
66
|
}
|
|
71
67
|
|
|
72
68
|
this.logger.info(
|
|
73
|
-
`Configuration system initialized: ${this.config.server.environment}:${this.config.server.port}
|
|
69
|
+
`Configuration system initialized: ${this.config.server.environment}:${this.config.server.port}`
|
|
74
70
|
);
|
|
75
71
|
|
|
76
72
|
// Initialize runtime system
|
|
77
|
-
this.runtimeType = options.runtime?.type ||
|
|
78
|
-
this.runtimeAdapter =
|
|
79
|
-
options.runtime?.adapter || createRuntimeAdapter(this.runtimeType);
|
|
73
|
+
this.runtimeType = options.runtime?.type || 'node';
|
|
74
|
+
this.runtimeAdapter = options.runtime?.adapter || createRuntimeAdapter(this.runtimeType);
|
|
80
75
|
|
|
81
|
-
this.logger.info(
|
|
82
|
-
`Runtime system initialized: ${this.runtimeType}`,
|
|
83
|
-
"Runtime",
|
|
84
|
-
);
|
|
76
|
+
this.logger.info(`Runtime system initialized: ${this.runtimeType}`, 'Runtime');
|
|
85
77
|
|
|
86
78
|
this.coreFramework = new MoroCore();
|
|
87
79
|
|
|
@@ -96,11 +88,11 @@ export class Moro extends EventEmitter {
|
|
|
96
88
|
|
|
97
89
|
// Auto-discover modules if enabled
|
|
98
90
|
if (options.autoDiscover !== false) {
|
|
99
|
-
this.autoDiscoverModules(options.modulesPath ||
|
|
91
|
+
this.autoDiscoverModules(options.modulesPath || './modules');
|
|
100
92
|
}
|
|
101
93
|
|
|
102
94
|
// Emit initialization event through enterprise event bus
|
|
103
|
-
this.eventBus.emit(
|
|
95
|
+
this.eventBus.emit('framework:initialized', {
|
|
104
96
|
options,
|
|
105
97
|
config: this.config,
|
|
106
98
|
runtime: this.runtimeType,
|
|
@@ -142,95 +134,75 @@ export class Moro extends EventEmitter {
|
|
|
142
134
|
// Intelligent route methods - chainable with automatic middleware ordering
|
|
143
135
|
// Overloads for better TypeScript inference
|
|
144
136
|
get(path: string): RouteBuilder;
|
|
145
|
-
get(
|
|
146
|
-
path: string,
|
|
147
|
-
handler: (req: HttpRequest, res: HttpResponse) => any,
|
|
148
|
-
options?: any,
|
|
149
|
-
): this;
|
|
137
|
+
get(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
150
138
|
get(
|
|
151
139
|
path: string,
|
|
152
140
|
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
153
|
-
options?: any
|
|
141
|
+
options?: any
|
|
154
142
|
): RouteBuilder | this {
|
|
155
143
|
if (handler) {
|
|
156
144
|
// Direct route registration
|
|
157
|
-
return this.addRoute(
|
|
145
|
+
return this.addRoute('GET', path, handler, options);
|
|
158
146
|
}
|
|
159
147
|
// Chainable route builder
|
|
160
148
|
return this.intelligentRouting.get(path);
|
|
161
149
|
}
|
|
162
150
|
|
|
163
151
|
post(path: string): RouteBuilder;
|
|
164
|
-
post(
|
|
165
|
-
path: string,
|
|
166
|
-
handler: (req: HttpRequest, res: HttpResponse) => any,
|
|
167
|
-
options?: any,
|
|
168
|
-
): this;
|
|
152
|
+
post(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
169
153
|
post(
|
|
170
154
|
path: string,
|
|
171
155
|
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
172
|
-
options?: any
|
|
156
|
+
options?: any
|
|
173
157
|
): RouteBuilder | this {
|
|
174
158
|
if (handler) {
|
|
175
159
|
// Direct route registration
|
|
176
|
-
return this.addRoute(
|
|
160
|
+
return this.addRoute('POST', path, handler, options);
|
|
177
161
|
}
|
|
178
162
|
// Chainable route builder
|
|
179
163
|
return this.intelligentRouting.post(path);
|
|
180
164
|
}
|
|
181
165
|
|
|
182
166
|
put(path: string): RouteBuilder;
|
|
183
|
-
put(
|
|
184
|
-
path: string,
|
|
185
|
-
handler: (req: HttpRequest, res: HttpResponse) => any,
|
|
186
|
-
options?: any,
|
|
187
|
-
): this;
|
|
167
|
+
put(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
188
168
|
put(
|
|
189
169
|
path: string,
|
|
190
170
|
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
191
|
-
options?: any
|
|
171
|
+
options?: any
|
|
192
172
|
): RouteBuilder | this {
|
|
193
173
|
if (handler) {
|
|
194
174
|
// Direct route registration
|
|
195
|
-
return this.addRoute(
|
|
175
|
+
return this.addRoute('PUT', path, handler, options);
|
|
196
176
|
}
|
|
197
177
|
// Chainable route builder
|
|
198
178
|
return this.intelligentRouting.put(path);
|
|
199
179
|
}
|
|
200
180
|
|
|
201
181
|
delete(path: string): RouteBuilder;
|
|
202
|
-
delete(
|
|
203
|
-
path: string,
|
|
204
|
-
handler: (req: HttpRequest, res: HttpResponse) => any,
|
|
205
|
-
options?: any,
|
|
206
|
-
): this;
|
|
182
|
+
delete(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
207
183
|
delete(
|
|
208
184
|
path: string,
|
|
209
185
|
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
210
|
-
options?: any
|
|
186
|
+
options?: any
|
|
211
187
|
): RouteBuilder | this {
|
|
212
188
|
if (handler) {
|
|
213
189
|
// Direct route registration
|
|
214
|
-
return this.addRoute(
|
|
190
|
+
return this.addRoute('DELETE', path, handler, options);
|
|
215
191
|
}
|
|
216
192
|
// Chainable route builder
|
|
217
193
|
return this.intelligentRouting.delete(path);
|
|
218
194
|
}
|
|
219
195
|
|
|
220
196
|
patch(path: string): RouteBuilder;
|
|
221
|
-
patch(
|
|
222
|
-
path: string,
|
|
223
|
-
handler: (req: HttpRequest, res: HttpResponse) => any,
|
|
224
|
-
options?: any,
|
|
225
|
-
): this;
|
|
197
|
+
patch(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
226
198
|
patch(
|
|
227
199
|
path: string,
|
|
228
200
|
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
229
|
-
options?: any
|
|
201
|
+
options?: any
|
|
230
202
|
): RouteBuilder | this {
|
|
231
203
|
if (handler) {
|
|
232
204
|
// Direct route registration
|
|
233
|
-
return this.addRoute(
|
|
205
|
+
return this.addRoute('PATCH', path, handler, options);
|
|
234
206
|
}
|
|
235
207
|
// Chainable route builder
|
|
236
208
|
return this.intelligentRouting.patch(path);
|
|
@@ -245,11 +217,8 @@ export class Moro extends EventEmitter {
|
|
|
245
217
|
enableDocs(config: DocsConfig): void {
|
|
246
218
|
this.documentation.enableDocs(config, this.intelligentRouting);
|
|
247
219
|
|
|
248
|
-
this.logger.info(
|
|
249
|
-
|
|
250
|
-
"Documentation",
|
|
251
|
-
);
|
|
252
|
-
this.eventBus.emit("docs:enabled", { config });
|
|
220
|
+
this.logger.info(`API Documentation enabled at ${config.basePath || '/docs'}`, 'Documentation');
|
|
221
|
+
this.eventBus.emit('docs:enabled', { config });
|
|
253
222
|
}
|
|
254
223
|
|
|
255
224
|
// Get OpenAPI specification
|
|
@@ -275,39 +244,33 @@ export class Moro extends EventEmitter {
|
|
|
275
244
|
// Universal middleware system - seamlessly handles standard and advanced middleware
|
|
276
245
|
async use(middlewareOrFunction: any, config?: any) {
|
|
277
246
|
// Standard middleware integration (req, res, next pattern)
|
|
278
|
-
if (
|
|
279
|
-
typeof middlewareOrFunction === "function" &&
|
|
280
|
-
middlewareOrFunction.length >= 3
|
|
281
|
-
) {
|
|
247
|
+
if (typeof middlewareOrFunction === 'function' && middlewareOrFunction.length >= 3) {
|
|
282
248
|
this.coreFramework.addMiddleware(middlewareOrFunction);
|
|
283
|
-
this.eventBus.emit(
|
|
284
|
-
type:
|
|
249
|
+
this.eventBus.emit('middleware:registered', {
|
|
250
|
+
type: 'standard',
|
|
285
251
|
middleware: middlewareOrFunction,
|
|
286
252
|
});
|
|
287
253
|
return this;
|
|
288
254
|
}
|
|
289
255
|
|
|
290
256
|
// Function-style middleware execution
|
|
291
|
-
if (
|
|
292
|
-
typeof middlewareOrFunction === "function" &&
|
|
293
|
-
middlewareOrFunction.length <= 1
|
|
294
|
-
) {
|
|
257
|
+
if (typeof middlewareOrFunction === 'function' && middlewareOrFunction.length <= 1) {
|
|
295
258
|
await middlewareOrFunction(this);
|
|
296
|
-
this.eventBus.emit(
|
|
297
|
-
type:
|
|
259
|
+
this.eventBus.emit('middleware:executed', {
|
|
260
|
+
type: 'function',
|
|
298
261
|
middleware: middlewareOrFunction,
|
|
299
262
|
});
|
|
300
263
|
return this;
|
|
301
264
|
}
|
|
302
265
|
|
|
303
266
|
// Advanced middleware pipeline integration
|
|
304
|
-
this.eventBus.emit(
|
|
267
|
+
this.eventBus.emit('middleware:advanced', {
|
|
305
268
|
middleware: middlewareOrFunction,
|
|
306
269
|
config,
|
|
307
270
|
});
|
|
308
271
|
this.logger.debug(
|
|
309
|
-
|
|
310
|
-
|
|
272
|
+
'Advanced middleware integration - enhanced capabilities loading...',
|
|
273
|
+
'Middleware'
|
|
311
274
|
);
|
|
312
275
|
return this;
|
|
313
276
|
}
|
|
@@ -319,25 +282,24 @@ export class Moro extends EventEmitter {
|
|
|
319
282
|
|
|
320
283
|
// Module loading with events
|
|
321
284
|
async loadModule(moduleOrPath: ModuleConfig | string) {
|
|
322
|
-
this.eventBus.emit(
|
|
323
|
-
moduleId:
|
|
324
|
-
typeof moduleOrPath === "string" ? moduleOrPath : moduleOrPath.name,
|
|
285
|
+
this.eventBus.emit('module:loading', {
|
|
286
|
+
moduleId: typeof moduleOrPath === 'string' ? moduleOrPath : moduleOrPath.name,
|
|
325
287
|
});
|
|
326
288
|
|
|
327
|
-
if (typeof moduleOrPath ===
|
|
289
|
+
if (typeof moduleOrPath === 'string') {
|
|
328
290
|
const module = await this.importModule(moduleOrPath);
|
|
329
291
|
await this.coreFramework.loadModule(module);
|
|
330
292
|
this.loadedModules.add(moduleOrPath);
|
|
331
|
-
this.eventBus.emit(
|
|
293
|
+
this.eventBus.emit('module:loaded', {
|
|
332
294
|
moduleId: module.name,
|
|
333
|
-
version: module.version ||
|
|
295
|
+
version: module.version || '1.0.0',
|
|
334
296
|
});
|
|
335
297
|
} else {
|
|
336
298
|
await this.coreFramework.loadModule(moduleOrPath);
|
|
337
299
|
this.loadedModules.add(moduleOrPath.name);
|
|
338
|
-
this.eventBus.emit(
|
|
300
|
+
this.eventBus.emit('module:loaded', {
|
|
339
301
|
moduleId: moduleOrPath.name,
|
|
340
|
-
version: moduleOrPath.version ||
|
|
302
|
+
version: moduleOrPath.version || '1.0.0',
|
|
341
303
|
});
|
|
342
304
|
}
|
|
343
305
|
return this;
|
|
@@ -345,9 +307,9 @@ export class Moro extends EventEmitter {
|
|
|
345
307
|
|
|
346
308
|
// Database helper with events
|
|
347
309
|
database(adapter: any) {
|
|
348
|
-
this.eventBus.emit(
|
|
310
|
+
this.eventBus.emit('database:connected', {
|
|
349
311
|
adapter: adapter.constructor.name,
|
|
350
|
-
config:
|
|
312
|
+
config: 'hidden',
|
|
351
313
|
});
|
|
352
314
|
this.coreFramework.registerDatabase(adapter);
|
|
353
315
|
return this;
|
|
@@ -355,35 +317,35 @@ export class Moro extends EventEmitter {
|
|
|
355
317
|
|
|
356
318
|
// WebSocket helper with events
|
|
357
319
|
websocket(namespace: string, handlers: Record<string, Function>) {
|
|
358
|
-
this.emit(
|
|
320
|
+
this.emit('websocket:registering', { namespace, handlers });
|
|
359
321
|
|
|
360
322
|
const io = this.coreFramework.getIOServer();
|
|
361
323
|
const ns = io.of(namespace);
|
|
362
324
|
|
|
363
325
|
Object.entries(handlers).forEach(([event, handler]) => {
|
|
364
|
-
ns.on(
|
|
365
|
-
this.emit(
|
|
326
|
+
ns.on('connection', socket => {
|
|
327
|
+
this.emit('websocket:connection', { namespace, event, socket });
|
|
366
328
|
|
|
367
329
|
socket.on(event, (data, callback) => {
|
|
368
|
-
this.emit(
|
|
330
|
+
this.emit('websocket:event', { namespace, event, data });
|
|
369
331
|
|
|
370
332
|
Promise.resolve(handler(socket, data))
|
|
371
|
-
.then(
|
|
372
|
-
this.emit(
|
|
333
|
+
.then(result => {
|
|
334
|
+
this.emit('websocket:response', { namespace, event, result });
|
|
373
335
|
if (callback) callback(result);
|
|
374
336
|
else if (result) socket.emit(`${event}:response`, result);
|
|
375
337
|
})
|
|
376
|
-
.catch(
|
|
377
|
-
this.emit(
|
|
338
|
+
.catch(error => {
|
|
339
|
+
this.emit('websocket:error', { namespace, event, error });
|
|
378
340
|
const errorResponse = { success: false, error: error.message };
|
|
379
341
|
if (callback) callback(errorResponse);
|
|
380
|
-
else socket.emit(
|
|
342
|
+
else socket.emit('error', errorResponse);
|
|
381
343
|
});
|
|
382
344
|
});
|
|
383
345
|
});
|
|
384
346
|
});
|
|
385
347
|
|
|
386
|
-
this.emit(
|
|
348
|
+
this.emit('websocket:registered', { namespace, handlers });
|
|
387
349
|
return this;
|
|
388
350
|
}
|
|
389
351
|
|
|
@@ -392,41 +354,38 @@ export class Moro extends EventEmitter {
|
|
|
392
354
|
listen(port: number, host: string, callback?: () => void): void;
|
|
393
355
|
listen(port: number, host?: string | (() => void), callback?: () => void) {
|
|
394
356
|
// Only available for Node.js runtime
|
|
395
|
-
if (this.runtimeType !==
|
|
357
|
+
if (this.runtimeType !== 'node') {
|
|
396
358
|
throw new Error(
|
|
397
|
-
`listen() is only available for Node.js runtime. Current runtime: ${this.runtimeType}. Use getHandler() for other runtimes
|
|
359
|
+
`listen() is only available for Node.js runtime. Current runtime: ${this.runtimeType}. Use getHandler() for other runtimes.`
|
|
398
360
|
);
|
|
399
361
|
}
|
|
400
362
|
|
|
401
363
|
// Handle overloaded parameters (port, callback) or (port, host, callback)
|
|
402
|
-
if (typeof host ===
|
|
364
|
+
if (typeof host === 'function') {
|
|
403
365
|
callback = host;
|
|
404
366
|
host = undefined;
|
|
405
367
|
}
|
|
406
|
-
this.eventBus.emit(
|
|
368
|
+
this.eventBus.emit('server:starting', { port, runtime: this.runtimeType });
|
|
407
369
|
|
|
408
370
|
// Add documentation middleware first (if enabled)
|
|
409
371
|
try {
|
|
410
372
|
const docsMiddleware = this.documentation.getDocsMiddleware();
|
|
411
373
|
this.coreFramework.addMiddleware(docsMiddleware);
|
|
412
|
-
this.logger.debug(
|
|
374
|
+
this.logger.debug('Documentation middleware added', 'Documentation');
|
|
413
375
|
} catch (error) {
|
|
414
376
|
// Documentation not enabled, that's fine
|
|
415
|
-
this.logger.debug(
|
|
377
|
+
this.logger.debug('Documentation not enabled', 'Documentation');
|
|
416
378
|
}
|
|
417
379
|
|
|
418
380
|
// Add intelligent routing middleware to handle chainable routes
|
|
419
381
|
this.coreFramework.addMiddleware(
|
|
420
382
|
async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
421
383
|
// Try intelligent routing first
|
|
422
|
-
const handled = await this.intelligentRouting.handleIntelligentRoute(
|
|
423
|
-
req,
|
|
424
|
-
res,
|
|
425
|
-
);
|
|
384
|
+
const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
|
|
426
385
|
if (!handled) {
|
|
427
386
|
next(); // Fall back to direct routes
|
|
428
387
|
}
|
|
429
|
-
}
|
|
388
|
+
}
|
|
430
389
|
);
|
|
431
390
|
|
|
432
391
|
// Register direct routes with the HTTP server
|
|
@@ -435,31 +394,25 @@ export class Moro extends EventEmitter {
|
|
|
435
394
|
}
|
|
436
395
|
|
|
437
396
|
const actualCallback = () => {
|
|
438
|
-
const displayHost = host ||
|
|
439
|
-
this.logger.info(
|
|
440
|
-
this.logger.info(`Runtime: ${this.runtimeType}`,
|
|
441
|
-
this.logger.info(`HTTP API: http://${displayHost}:${port}`,
|
|
442
|
-
this.logger.info(`WebSocket: ws://${displayHost}:${port}`,
|
|
443
|
-
this.logger.info(
|
|
444
|
-
|
|
445
|
-
"Server",
|
|
446
|
-
);
|
|
447
|
-
this.logger.info("Learn more at https://morojs.com", "Server");
|
|
397
|
+
const displayHost = host || 'localhost';
|
|
398
|
+
this.logger.info('Moro Server Started', 'Server');
|
|
399
|
+
this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
|
|
400
|
+
this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
|
|
401
|
+
this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
|
|
402
|
+
this.logger.info('Native Node.js HTTP • Zero Dependencies • Maximum Performance', 'Server');
|
|
403
|
+
this.logger.info('Learn more at https://morojs.com', 'Server');
|
|
448
404
|
|
|
449
405
|
// Log intelligent routes info
|
|
450
406
|
const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
|
|
451
407
|
if (intelligentRoutes.length > 0) {
|
|
452
|
-
this.logger.info(
|
|
453
|
-
`Intelligent Routes: ${intelligentRoutes.length} registered`,
|
|
454
|
-
"Server",
|
|
455
|
-
);
|
|
408
|
+
this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
|
|
456
409
|
}
|
|
457
410
|
|
|
458
|
-
this.eventBus.emit(
|
|
411
|
+
this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
|
|
459
412
|
if (callback) callback();
|
|
460
413
|
};
|
|
461
414
|
|
|
462
|
-
if (host && typeof host ===
|
|
415
|
+
if (host && typeof host === 'string') {
|
|
463
416
|
this.coreFramework.listen(port, host, actualCallback);
|
|
464
417
|
} else {
|
|
465
418
|
this.coreFramework.listen(port, actualCallback);
|
|
@@ -480,10 +433,7 @@ export class Moro extends EventEmitter {
|
|
|
480
433
|
}
|
|
481
434
|
|
|
482
435
|
// Try intelligent routing first
|
|
483
|
-
const handled = await this.intelligentRouting.handleIntelligentRoute(
|
|
484
|
-
req,
|
|
485
|
-
res,
|
|
486
|
-
);
|
|
436
|
+
const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
|
|
487
437
|
if (handled) return;
|
|
488
438
|
|
|
489
439
|
// Handle direct routes
|
|
@@ -501,7 +451,7 @@ export class Moro extends EventEmitter {
|
|
|
501
451
|
// Find matching route
|
|
502
452
|
const route = this.findMatchingRoute(req.method!, req.path);
|
|
503
453
|
if (!route) {
|
|
504
|
-
(res as any).status(404).json({ success: false, error:
|
|
454
|
+
(res as any).status(404).json({ success: false, error: 'Not found' });
|
|
505
455
|
return;
|
|
506
456
|
}
|
|
507
457
|
|
|
@@ -518,9 +468,7 @@ export class Moro extends EventEmitter {
|
|
|
518
468
|
// Get handler function
|
|
519
469
|
const handler = this.routeHandlers[route.handler];
|
|
520
470
|
if (!handler) {
|
|
521
|
-
(res as any)
|
|
522
|
-
.status(500)
|
|
523
|
-
.json({ success: false, error: "Handler not found" });
|
|
471
|
+
(res as any).status(500).json({ success: false, error: 'Handler not found' });
|
|
524
472
|
return;
|
|
525
473
|
}
|
|
526
474
|
|
|
@@ -533,9 +481,9 @@ export class Moro extends EventEmitter {
|
|
|
533
481
|
if (error.issues) {
|
|
534
482
|
(res as any).status(400).json({
|
|
535
483
|
success: false,
|
|
536
|
-
error:
|
|
484
|
+
error: 'Validation failed',
|
|
537
485
|
details: error.issues.map((issue: any) => ({
|
|
538
|
-
field: issue.path.length > 0 ? issue.path.join(
|
|
486
|
+
field: issue.path.length > 0 ? issue.path.join('.') : 'body',
|
|
539
487
|
message: issue.message,
|
|
540
488
|
code: issue.code,
|
|
541
489
|
})),
|
|
@@ -548,13 +496,13 @@ export class Moro extends EventEmitter {
|
|
|
548
496
|
|
|
549
497
|
// Execute rate limiting if present
|
|
550
498
|
if (route.rateLimit) {
|
|
551
|
-
const clientId = req.ip ||
|
|
499
|
+
const clientId = req.ip || 'unknown';
|
|
552
500
|
const key = `${route.method}:${route.path}:${clientId}`;
|
|
553
501
|
|
|
554
502
|
if (!this.checkRateLimit(key, route.rateLimit)) {
|
|
555
503
|
(res as any).status(429).json({
|
|
556
504
|
success: false,
|
|
557
|
-
error:
|
|
505
|
+
error: 'Rate limit exceeded',
|
|
558
506
|
retryAfter: Math.ceil(route.rateLimit.window / 1000),
|
|
559
507
|
});
|
|
560
508
|
return;
|
|
@@ -570,8 +518,7 @@ export class Moro extends EventEmitter {
|
|
|
570
518
|
if (!(res as any).headersSent) {
|
|
571
519
|
(res as any).status(500).json({
|
|
572
520
|
success: false,
|
|
573
|
-
error:
|
|
574
|
-
error instanceof Error ? error.message : "Internal server error",
|
|
521
|
+
error: error instanceof Error ? error.message : 'Internal server error',
|
|
575
522
|
});
|
|
576
523
|
}
|
|
577
524
|
}
|
|
@@ -597,12 +544,10 @@ export class Moro extends EventEmitter {
|
|
|
597
544
|
// Convert path to regex (simplified version)
|
|
598
545
|
private pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {
|
|
599
546
|
const paramNames: string[] = [];
|
|
600
|
-
const regexPath = path
|
|
601
|
-
.
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
return "([^/]+)";
|
|
605
|
-
});
|
|
547
|
+
const regexPath = path.replace(/\//g, '\\/').replace(/:([^/]+)/g, (match, paramName) => {
|
|
548
|
+
paramNames.push(paramName);
|
|
549
|
+
return '([^/]+)';
|
|
550
|
+
});
|
|
606
551
|
|
|
607
552
|
return {
|
|
608
553
|
pattern: new RegExp(`^${regexPath}$`),
|
|
@@ -621,12 +566,7 @@ export class Moro extends EventEmitter {
|
|
|
621
566
|
}
|
|
622
567
|
|
|
623
568
|
// Private methods
|
|
624
|
-
private addRoute(
|
|
625
|
-
method: string,
|
|
626
|
-
path: string,
|
|
627
|
-
handler: Function,
|
|
628
|
-
options: any = {},
|
|
629
|
-
) {
|
|
569
|
+
private addRoute(method: string, path: string, handler: Function, options: any = {}) {
|
|
630
570
|
const handlerName = `handler_${this.routes.length}`;
|
|
631
571
|
|
|
632
572
|
this.routes.push({
|
|
@@ -669,10 +609,9 @@ export class Moro extends EventEmitter {
|
|
|
669
609
|
if (error.issues) {
|
|
670
610
|
res.status(400).json({
|
|
671
611
|
success: false,
|
|
672
|
-
error:
|
|
612
|
+
error: 'Validation failed',
|
|
673
613
|
details: error.issues.map((issue: any) => ({
|
|
674
|
-
field:
|
|
675
|
-
issue.path.length > 0 ? issue.path.join(".") : "body",
|
|
614
|
+
field: issue.path.length > 0 ? issue.path.join('.') : 'body',
|
|
676
615
|
message: issue.message,
|
|
677
616
|
code: issue.code,
|
|
678
617
|
})),
|
|
@@ -685,14 +624,13 @@ export class Moro extends EventEmitter {
|
|
|
685
624
|
|
|
686
625
|
// Rate limiting middleware
|
|
687
626
|
if (route.rateLimit) {
|
|
688
|
-
const clientId =
|
|
689
|
-
req.ip || req.connection.remoteAddress || "unknown";
|
|
627
|
+
const clientId = req.ip || req.connection.remoteAddress || 'unknown';
|
|
690
628
|
const key = `${route.method}:${route.path}:${clientId}`;
|
|
691
629
|
|
|
692
630
|
if (!this.checkRateLimit(key, route.rateLimit)) {
|
|
693
631
|
res.status(429).json({
|
|
694
632
|
success: false,
|
|
695
|
-
error:
|
|
633
|
+
error: 'Rate limit exceeded',
|
|
696
634
|
retryAfter: Math.ceil(route.rateLimit.window / 1000),
|
|
697
635
|
});
|
|
698
636
|
return;
|
|
@@ -708,10 +646,7 @@ export class Moro extends EventEmitter {
|
|
|
708
646
|
if (!res.headersSent) {
|
|
709
647
|
res.status(500).json({
|
|
710
648
|
success: false,
|
|
711
|
-
error:
|
|
712
|
-
error instanceof Error
|
|
713
|
-
? error.message
|
|
714
|
-
: "Internal server error",
|
|
649
|
+
error: error instanceof Error ? error.message : 'Internal server error',
|
|
715
650
|
});
|
|
716
651
|
}
|
|
717
652
|
}
|
|
@@ -726,15 +661,9 @@ export class Moro extends EventEmitter {
|
|
|
726
661
|
}
|
|
727
662
|
|
|
728
663
|
// Simple rate limiting for direct routes
|
|
729
|
-
private rateLimitStore = new Map<
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
>();
|
|
733
|
-
|
|
734
|
-
private checkRateLimit(
|
|
735
|
-
key: string,
|
|
736
|
-
config: { requests: number; window: number },
|
|
737
|
-
): boolean {
|
|
664
|
+
private rateLimitStore = new Map<string, { count: number; resetTime: number }>();
|
|
665
|
+
|
|
666
|
+
private checkRateLimit(key: string, config: { requests: number; window: number }): boolean {
|
|
738
667
|
const now = Date.now();
|
|
739
668
|
const bucket = this.rateLimitStore.get(key);
|
|
740
669
|
|
|
@@ -758,7 +687,7 @@ export class Moro extends EventEmitter {
|
|
|
758
687
|
private setupDefaultMiddleware(options: MoroOptions) {
|
|
759
688
|
// CORS
|
|
760
689
|
if (options.cors !== false) {
|
|
761
|
-
const corsOptions = typeof options.cors ===
|
|
690
|
+
const corsOptions = typeof options.cors === 'object' ? options.cors : {};
|
|
762
691
|
this.use(middleware.cors(corsOptions));
|
|
763
692
|
}
|
|
764
693
|
|
|
@@ -769,13 +698,12 @@ export class Moro extends EventEmitter {
|
|
|
769
698
|
|
|
770
699
|
// Compression
|
|
771
700
|
if (options.compression !== false) {
|
|
772
|
-
const compressionOptions =
|
|
773
|
-
typeof options.compression === "object" ? options.compression : {};
|
|
701
|
+
const compressionOptions = typeof options.compression === 'object' ? options.compression : {};
|
|
774
702
|
this.use(middleware.compression(compressionOptions));
|
|
775
703
|
}
|
|
776
704
|
|
|
777
705
|
// Body size limiting
|
|
778
|
-
this.use(middleware.bodySize({ limit:
|
|
706
|
+
this.use(middleware.bodySize({ limit: '10mb' }));
|
|
779
707
|
}
|
|
780
708
|
|
|
781
709
|
private autoDiscoverModules(modulesPath: string) {
|
|
@@ -783,14 +711,14 @@ export class Moro extends EventEmitter {
|
|
|
783
711
|
if (!statSync(modulesPath).isDirectory()) return;
|
|
784
712
|
|
|
785
713
|
const items = readdirSync(modulesPath);
|
|
786
|
-
items.forEach(
|
|
714
|
+
items.forEach(item => {
|
|
787
715
|
const fullPath = join(modulesPath, item);
|
|
788
716
|
if (statSync(fullPath).isDirectory()) {
|
|
789
|
-
const indexPath = join(fullPath,
|
|
717
|
+
const indexPath = join(fullPath, 'index.ts');
|
|
790
718
|
try {
|
|
791
719
|
statSync(indexPath);
|
|
792
720
|
// Module directory found, will be loaded later
|
|
793
|
-
this.logger.debug(`Discovered module: ${item}`,
|
|
721
|
+
this.logger.debug(`Discovered module: ${item}`, 'ModuleDiscovery');
|
|
794
722
|
} catch {
|
|
795
723
|
// No index.ts, skip
|
|
796
724
|
}
|
|
@@ -813,30 +741,30 @@ export function createApp(options?: MoroOptions): Moro {
|
|
|
813
741
|
}
|
|
814
742
|
|
|
815
743
|
// Runtime-specific convenience functions
|
|
816
|
-
export function createAppNode(options?: Omit<MoroOptions,
|
|
744
|
+
export function createAppNode(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
817
745
|
return new Moro({
|
|
818
746
|
...options,
|
|
819
|
-
runtime: { type:
|
|
747
|
+
runtime: { type: 'node' },
|
|
820
748
|
});
|
|
821
749
|
}
|
|
822
750
|
|
|
823
|
-
export function createAppEdge(options?: Omit<MoroOptions,
|
|
751
|
+
export function createAppEdge(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
824
752
|
return new Moro({
|
|
825
753
|
...options,
|
|
826
|
-
runtime: { type:
|
|
754
|
+
runtime: { type: 'vercel-edge' },
|
|
827
755
|
});
|
|
828
756
|
}
|
|
829
757
|
|
|
830
|
-
export function createAppLambda(options?: Omit<MoroOptions,
|
|
758
|
+
export function createAppLambda(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
831
759
|
return new Moro({
|
|
832
760
|
...options,
|
|
833
|
-
runtime: { type:
|
|
761
|
+
runtime: { type: 'aws-lambda' },
|
|
834
762
|
});
|
|
835
763
|
}
|
|
836
764
|
|
|
837
|
-
export function createAppWorker(options?: Omit<MoroOptions,
|
|
765
|
+
export function createAppWorker(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
838
766
|
return new Moro({
|
|
839
767
|
...options,
|
|
840
|
-
runtime: { type:
|
|
768
|
+
runtime: { type: 'cloudflare-workers' },
|
|
841
769
|
});
|
|
842
770
|
}
|