@morojs/moro 1.5.17 → 1.6.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 +48 -65
- package/dist/core/auth/morojs-adapter.js +12 -16
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/file-loader.d.ts +5 -0
- package/dist/core/config/file-loader.js +171 -0
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +10 -39
- package/dist/core/config/index.js +29 -66
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +7 -0
- package/dist/core/config/loader.js +269 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.js +31 -41
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -9
- package/dist/core/config/utils.js +32 -19
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/config/validation.d.ts +17 -0
- package/dist/core/config/validation.js +131 -0
- package/dist/core/config/validation.js.map +1 -0
- package/dist/core/database/adapters/mongodb.d.ts +0 -10
- package/dist/core/database/adapters/mongodb.js +2 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +0 -11
- package/dist/core/database/adapters/mysql.js +0 -1
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -9
- package/dist/core/database/adapters/postgresql.js +1 -1
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +0 -9
- package/dist/core/database/adapters/redis.js +4 -14
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/framework.d.ts +7 -6
- package/dist/core/framework.js +16 -131
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +0 -12
- package/dist/core/http/http-server.js +23 -151
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/router.d.ts +0 -12
- package/dist/core/http/router.js +36 -114
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.js +4 -12
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +1 -1
- package/dist/core/logger/index.js +1 -2
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +13 -29
- package/dist/core/logger/logger.js +203 -380
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.js +2 -0
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/auth.js +17 -88
- package/dist/core/middleware/built-in/auth.js.map +1 -1
- package/dist/core/middleware/built-in/cache.js +1 -3
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +0 -1
- package/dist/core/middleware/built-in/index.js +1 -6
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +2 -3
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/sse.js +7 -9
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +0 -17
- package/dist/core/modules/auto-discovery.js +12 -367
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/modules.js +2 -12
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/ws-adapter.js +2 -2
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/service-discovery.js +7 -7
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/routing/index.d.ts +0 -20
- package/dist/core/routing/index.js +13 -178
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.js +6 -12
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/moro.d.ts +0 -48
- package/dist/moro.js +148 -456
- package/dist/moro.js.map +1 -1
- package/dist/types/config.d.ts +2 -58
- package/dist/types/core.d.ts +40 -34
- package/dist/types/http.d.ts +1 -16
- package/dist/types/logger.d.ts +0 -7
- package/dist/types/module.d.ts +0 -11
- package/package.json +2 -2
- package/src/core/auth/morojs-adapter.ts +13 -18
- package/src/core/config/file-loader.ts +233 -0
- package/src/core/config/index.ts +32 -77
- package/src/core/config/loader.ts +633 -0
- package/src/core/config/schema.ts +31 -41
- package/src/core/config/utils.ts +29 -22
- package/src/core/config/validation.ts +140 -0
- package/src/core/database/README.md +16 -26
- package/src/core/database/adapters/mongodb.ts +2 -30
- package/src/core/database/adapters/mysql.ts +0 -14
- package/src/core/database/adapters/postgresql.ts +2 -12
- package/src/core/database/adapters/redis.ts +4 -27
- package/src/core/framework.ts +23 -163
- package/src/core/http/http-server.ts +36 -176
- package/src/core/http/router.ts +38 -127
- package/src/core/logger/filters.ts +4 -12
- package/src/core/logger/index.ts +0 -1
- package/src/core/logger/logger.ts +216 -427
- package/src/core/logger/outputs.ts +2 -0
- package/src/core/middleware/built-in/auth.ts +17 -98
- package/src/core/middleware/built-in/cache.ts +1 -3
- package/src/core/middleware/built-in/index.ts +0 -8
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/sse.ts +7 -9
- package/src/core/modules/auto-discovery.ts +13 -476
- package/src/core/modules/modules.ts +9 -20
- package/src/core/networking/adapters/ws-adapter.ts +5 -2
- package/src/core/networking/service-discovery.ts +7 -6
- package/src/core/routing/index.ts +14 -198
- package/src/core/runtime/node-adapter.ts +6 -12
- package/src/moro.ts +166 -554
- package/src/types/config.ts +2 -59
- package/src/types/core.ts +45 -47
- package/src/types/http.ts +1 -23
- package/src/types/logger.ts +0 -9
- package/src/types/module.ts +0 -12
- package/dist/core/config/config-manager.d.ts +0 -44
- package/dist/core/config/config-manager.js +0 -114
- package/dist/core/config/config-manager.js.map +0 -1
- package/dist/core/config/config-sources.d.ts +0 -21
- package/dist/core/config/config-sources.js +0 -502
- package/dist/core/config/config-sources.js.map +0 -1
- package/dist/core/config/config-validator.d.ts +0 -21
- package/dist/core/config/config-validator.js +0 -765
- package/dist/core/config/config-validator.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +0 -118
- package/dist/core/middleware/built-in/jwt-helpers.js +0 -221
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -596
- package/src/core/config/config-validator.ts +0 -1078
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -240
|
@@ -256,91 +256,20 @@ export class IntelligentRouteBuilder implements RouteBuilder {
|
|
|
256
256
|
|
|
257
257
|
// Executable route with intelligent middleware ordering
|
|
258
258
|
export class ExecutableRoute implements CompiledRoute {
|
|
259
|
-
|
|
260
|
-
private readonly requiresAuth: boolean;
|
|
261
|
-
private readonly requiresValidation: boolean;
|
|
262
|
-
private readonly requiresRateLimit: boolean;
|
|
263
|
-
private readonly requiresCache: boolean;
|
|
264
|
-
private readonly hasBeforeMiddleware: boolean;
|
|
265
|
-
private readonly hasAfterMiddleware: boolean;
|
|
266
|
-
private readonly hasTransformMiddleware: boolean;
|
|
267
|
-
private readonly isFastPath: boolean;
|
|
268
|
-
|
|
269
|
-
constructor(public readonly schema: RouteSchema) {
|
|
270
|
-
// Pre-calculate what this route actually needs
|
|
271
|
-
this.requiresAuth = !!this.schema.auth;
|
|
272
|
-
this.requiresValidation = !!this.schema.validation;
|
|
273
|
-
this.requiresRateLimit = !!this.schema.rateLimit;
|
|
274
|
-
this.requiresCache = !!this.schema.cache;
|
|
275
|
-
this.hasBeforeMiddleware = !!this.schema.middleware?.before?.length;
|
|
276
|
-
this.hasAfterMiddleware = !!this.schema.middleware?.after?.length;
|
|
277
|
-
this.hasTransformMiddleware = !!this.schema.middleware?.transform?.length;
|
|
278
|
-
|
|
279
|
-
// Fast path: no middleware, no auth, no validation, no rate limiting
|
|
280
|
-
this.isFastPath =
|
|
281
|
-
!this.requiresAuth &&
|
|
282
|
-
!this.requiresValidation &&
|
|
283
|
-
!this.requiresRateLimit &&
|
|
284
|
-
!this.requiresCache &&
|
|
285
|
-
!this.hasBeforeMiddleware &&
|
|
286
|
-
!this.hasAfterMiddleware &&
|
|
287
|
-
!this.hasTransformMiddleware;
|
|
288
|
-
|
|
289
|
-
// Log fast path routes for monitoring
|
|
290
|
-
if (this.isFastPath) {
|
|
291
|
-
logger.debug(`Fast path route: ${this.schema.method} ${this.schema.path}`, 'FastPath');
|
|
292
|
-
}
|
|
293
|
-
}
|
|
259
|
+
constructor(public readonly schema: RouteSchema) {}
|
|
294
260
|
|
|
295
261
|
async execute(req: HttpRequest, res: HttpResponse): Promise<void> {
|
|
296
262
|
const validatedReq = req as ValidatedRequest;
|
|
297
263
|
|
|
298
264
|
try {
|
|
299
|
-
//
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// Optimized middleware execution - only run what's needed
|
|
310
|
-
if (this.hasBeforeMiddleware) {
|
|
311
|
-
await this.executePhase('before', validatedReq, res);
|
|
312
|
-
if (res.headersSent) return;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (this.requiresRateLimit) {
|
|
316
|
-
await this.executePhase('rateLimit', validatedReq, res);
|
|
317
|
-
if (res.headersSent) return;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
if (this.requiresAuth) {
|
|
321
|
-
await this.executePhase('auth', validatedReq, res);
|
|
322
|
-
if (res.headersSent) return;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
if (this.requiresValidation) {
|
|
326
|
-
await this.executePhase('validation', validatedReq, res);
|
|
327
|
-
if (res.headersSent) return;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
if (this.hasTransformMiddleware) {
|
|
331
|
-
await this.executePhase('transform', validatedReq, res);
|
|
332
|
-
if (res.headersSent) return;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (this.requiresCache) {
|
|
336
|
-
await this.executePhase('cache', validatedReq, res);
|
|
337
|
-
if (res.headersSent) return;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (this.hasAfterMiddleware) {
|
|
341
|
-
await this.executePhase('after', validatedReq, res);
|
|
342
|
-
if (res.headersSent) return;
|
|
343
|
-
}
|
|
265
|
+
// Execute middleware in intelligent order
|
|
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);
|
|
344
273
|
|
|
345
274
|
// Execute handler last
|
|
346
275
|
if (!res.headersSent) {
|
|
@@ -432,32 +361,15 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
432
361
|
req: HttpRequest,
|
|
433
362
|
res: HttpResponse
|
|
434
363
|
): Promise<void> {
|
|
435
|
-
// PERFORMANCE OPTIMIZATION: Reduce Promise overhead
|
|
436
364
|
return new Promise((resolve, reject) => {
|
|
437
|
-
let resolved = false;
|
|
438
|
-
|
|
439
|
-
const next = () => {
|
|
440
|
-
if (!resolved) {
|
|
441
|
-
resolved = true;
|
|
442
|
-
resolve();
|
|
443
|
-
}
|
|
444
|
-
};
|
|
445
|
-
|
|
446
365
|
try {
|
|
366
|
+
const next = () => resolve();
|
|
447
367
|
const result = middleware(req, res, next);
|
|
448
368
|
if (result instanceof Promise) {
|
|
449
|
-
result.then(() =>
|
|
450
|
-
} else {
|
|
451
|
-
// Synchronous middleware - call next immediately if not called
|
|
452
|
-
if (!resolved) {
|
|
453
|
-
next();
|
|
454
|
-
}
|
|
369
|
+
result.then(() => resolve()).catch(reject);
|
|
455
370
|
}
|
|
456
371
|
} catch (error) {
|
|
457
|
-
|
|
458
|
-
resolved = true;
|
|
459
|
-
reject(error);
|
|
460
|
-
}
|
|
372
|
+
reject(error);
|
|
461
373
|
}
|
|
462
374
|
});
|
|
463
375
|
}
|
|
@@ -471,90 +383,10 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
471
383
|
}
|
|
472
384
|
|
|
473
385
|
private async executeAuth(req: ValidatedRequest, res: HttpResponse): Promise<void> {
|
|
474
|
-
|
|
475
|
-
const auth = req.auth;
|
|
476
|
-
|
|
477
|
-
// This should never happen since executeAuth is only called when auth config exists
|
|
478
|
-
if (!authConfig) {
|
|
479
|
-
logger.error('executeAuth called without auth config', 'Auth');
|
|
480
|
-
return;
|
|
481
|
-
}
|
|
482
|
-
|
|
386
|
+
// Authentication implementation will be added
|
|
483
387
|
logger.debug('Auth check', 'Auth', {
|
|
484
|
-
config:
|
|
485
|
-
isAuthenticated: auth?.isAuthenticated,
|
|
486
|
-
userRoles: auth?.user?.roles,
|
|
388
|
+
config: this.schema.auth,
|
|
487
389
|
});
|
|
488
|
-
|
|
489
|
-
// Check if auth middleware ran
|
|
490
|
-
if (!auth) {
|
|
491
|
-
res.status(500);
|
|
492
|
-
res.json({
|
|
493
|
-
success: false,
|
|
494
|
-
error: 'Authentication middleware not configured',
|
|
495
|
-
message: 'Auth middleware must be installed before using route-level auth',
|
|
496
|
-
});
|
|
497
|
-
return;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Check authentication requirement (default is required unless optional: true)
|
|
501
|
-
if (!authConfig.optional && !auth.isAuthenticated) {
|
|
502
|
-
res.status(401);
|
|
503
|
-
res.json({
|
|
504
|
-
success: false,
|
|
505
|
-
error: 'Authentication required',
|
|
506
|
-
message: 'You must be logged in to access this resource',
|
|
507
|
-
});
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// Skip further checks if not authenticated but optional
|
|
512
|
-
if (!auth.isAuthenticated && authConfig.optional) {
|
|
513
|
-
return; // Continue to handler
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
// Only check roles/permissions if user is authenticated
|
|
517
|
-
if (auth.isAuthenticated) {
|
|
518
|
-
const user = auth.user;
|
|
519
|
-
|
|
520
|
-
// Check roles if specified
|
|
521
|
-
if (authConfig.roles && authConfig.roles.length > 0) {
|
|
522
|
-
const userRoles = user?.roles || [];
|
|
523
|
-
const hasRole = authConfig.roles.some((role: string) => userRoles.includes(role));
|
|
524
|
-
|
|
525
|
-
if (!hasRole) {
|
|
526
|
-
res.status(403);
|
|
527
|
-
res.json({
|
|
528
|
-
success: false,
|
|
529
|
-
error: 'Insufficient permissions',
|
|
530
|
-
message: `Required roles: ${authConfig.roles.join(', ')}`,
|
|
531
|
-
userRoles,
|
|
532
|
-
});
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
// Check permissions if specified
|
|
538
|
-
if (authConfig.permissions && authConfig.permissions.length > 0) {
|
|
539
|
-
const userPermissions = user?.permissions || [];
|
|
540
|
-
const hasPermission = authConfig.permissions.every((permission: string) =>
|
|
541
|
-
userPermissions.includes(permission)
|
|
542
|
-
);
|
|
543
|
-
|
|
544
|
-
if (!hasPermission) {
|
|
545
|
-
res.status(403);
|
|
546
|
-
res.json({
|
|
547
|
-
success: false,
|
|
548
|
-
error: 'Insufficient permissions',
|
|
549
|
-
message: `Required permissions: ${authConfig.permissions.join(', ')}`,
|
|
550
|
-
userPermissions,
|
|
551
|
-
});
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
// All auth checks passed
|
|
558
390
|
}
|
|
559
391
|
|
|
560
392
|
private async executeValidation(req: ValidatedRequest, res: HttpResponse): Promise<void> {
|
|
@@ -643,22 +475,6 @@ export class ExecutableRoute implements CompiledRoute {
|
|
|
643
475
|
config: this.schema.cache,
|
|
644
476
|
});
|
|
645
477
|
}
|
|
646
|
-
|
|
647
|
-
// Performance monitoring
|
|
648
|
-
getPerformanceInfo() {
|
|
649
|
-
return {
|
|
650
|
-
path: this.schema.path,
|
|
651
|
-
method: this.schema.method,
|
|
652
|
-
isFastPath: this.isFastPath,
|
|
653
|
-
requiresAuth: this.requiresAuth,
|
|
654
|
-
requiresValidation: this.requiresValidation,
|
|
655
|
-
requiresRateLimit: this.requiresRateLimit,
|
|
656
|
-
requiresCache: this.requiresCache,
|
|
657
|
-
hasBeforeMiddleware: this.hasBeforeMiddleware,
|
|
658
|
-
hasAfterMiddleware: this.hasAfterMiddleware,
|
|
659
|
-
hasTransformMiddleware: this.hasTransformMiddleware,
|
|
660
|
-
};
|
|
661
|
-
}
|
|
662
478
|
}
|
|
663
479
|
|
|
664
480
|
// Factory functions for creating routes
|
|
@@ -138,30 +138,24 @@ export class NodeRuntimeAdapter extends BaseRuntimeAdapter {
|
|
|
138
138
|
|
|
139
139
|
if (!enhanced.cookie) {
|
|
140
140
|
enhanced.cookie = function (name: string, value: string, options?: any) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.setHeader('Set-Cookie', cookieString);
|
|
144
|
-
}
|
|
141
|
+
const cookieString = `${name}=${value}`;
|
|
142
|
+
this.setHeader('Set-Cookie', cookieString);
|
|
145
143
|
return this;
|
|
146
144
|
};
|
|
147
145
|
}
|
|
148
146
|
|
|
149
147
|
if (!enhanced.clearCookie) {
|
|
150
148
|
enhanced.clearCookie = function (name: string, options?: any) {
|
|
151
|
-
|
|
152
|
-
this.setHeader('Set-Cookie', `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`);
|
|
153
|
-
}
|
|
149
|
+
this.setHeader('Set-Cookie', `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`);
|
|
154
150
|
return this;
|
|
155
151
|
};
|
|
156
152
|
}
|
|
157
153
|
|
|
158
154
|
if (!enhanced.redirect) {
|
|
159
155
|
enhanced.redirect = function (url: string, status?: number) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
this.end();
|
|
164
|
-
}
|
|
156
|
+
this.statusCode = status || 302;
|
|
157
|
+
this.setHeader('Location', url);
|
|
158
|
+
this.end();
|
|
165
159
|
};
|
|
166
160
|
}
|
|
167
161
|
|