@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.
Files changed (138) hide show
  1. package/README.md +48 -65
  2. package/dist/core/auth/morojs-adapter.js +12 -16
  3. package/dist/core/auth/morojs-adapter.js.map +1 -1
  4. package/dist/core/config/file-loader.d.ts +5 -0
  5. package/dist/core/config/file-loader.js +171 -0
  6. package/dist/core/config/file-loader.js.map +1 -1
  7. package/dist/core/config/index.d.ts +10 -39
  8. package/dist/core/config/index.js +29 -66
  9. package/dist/core/config/index.js.map +1 -1
  10. package/dist/core/config/loader.d.ts +7 -0
  11. package/dist/core/config/loader.js +269 -0
  12. package/dist/core/config/loader.js.map +1 -0
  13. package/dist/core/config/schema.js +31 -41
  14. package/dist/core/config/schema.js.map +1 -1
  15. package/dist/core/config/utils.d.ts +2 -9
  16. package/dist/core/config/utils.js +32 -19
  17. package/dist/core/config/utils.js.map +1 -1
  18. package/dist/core/config/validation.d.ts +17 -0
  19. package/dist/core/config/validation.js +131 -0
  20. package/dist/core/config/validation.js.map +1 -0
  21. package/dist/core/database/adapters/mongodb.d.ts +0 -10
  22. package/dist/core/database/adapters/mongodb.js +2 -23
  23. package/dist/core/database/adapters/mongodb.js.map +1 -1
  24. package/dist/core/database/adapters/mysql.d.ts +0 -11
  25. package/dist/core/database/adapters/mysql.js +0 -1
  26. package/dist/core/database/adapters/mysql.js.map +1 -1
  27. package/dist/core/database/adapters/postgresql.d.ts +1 -9
  28. package/dist/core/database/adapters/postgresql.js +1 -1
  29. package/dist/core/database/adapters/postgresql.js.map +1 -1
  30. package/dist/core/database/adapters/redis.d.ts +0 -9
  31. package/dist/core/database/adapters/redis.js +4 -14
  32. package/dist/core/database/adapters/redis.js.map +1 -1
  33. package/dist/core/framework.d.ts +7 -6
  34. package/dist/core/framework.js +16 -131
  35. package/dist/core/framework.js.map +1 -1
  36. package/dist/core/http/http-server.d.ts +0 -12
  37. package/dist/core/http/http-server.js +23 -151
  38. package/dist/core/http/http-server.js.map +1 -1
  39. package/dist/core/http/router.d.ts +0 -12
  40. package/dist/core/http/router.js +36 -114
  41. package/dist/core/http/router.js.map +1 -1
  42. package/dist/core/logger/filters.js +4 -12
  43. package/dist/core/logger/filters.js.map +1 -1
  44. package/dist/core/logger/index.d.ts +1 -1
  45. package/dist/core/logger/index.js +1 -2
  46. package/dist/core/logger/index.js.map +1 -1
  47. package/dist/core/logger/logger.d.ts +13 -29
  48. package/dist/core/logger/logger.js +203 -380
  49. package/dist/core/logger/logger.js.map +1 -1
  50. package/dist/core/logger/outputs.js +2 -0
  51. package/dist/core/logger/outputs.js.map +1 -1
  52. package/dist/core/middleware/built-in/auth.js +17 -88
  53. package/dist/core/middleware/built-in/auth.js.map +1 -1
  54. package/dist/core/middleware/built-in/cache.js +1 -3
  55. package/dist/core/middleware/built-in/cache.js.map +1 -1
  56. package/dist/core/middleware/built-in/index.d.ts +0 -1
  57. package/dist/core/middleware/built-in/index.js +1 -6
  58. package/dist/core/middleware/built-in/index.js.map +1 -1
  59. package/dist/core/middleware/built-in/request-logger.js +2 -3
  60. package/dist/core/middleware/built-in/request-logger.js.map +1 -1
  61. package/dist/core/middleware/built-in/sse.js +7 -9
  62. package/dist/core/middleware/built-in/sse.js.map +1 -1
  63. package/dist/core/modules/auto-discovery.d.ts +0 -17
  64. package/dist/core/modules/auto-discovery.js +12 -367
  65. package/dist/core/modules/auto-discovery.js.map +1 -1
  66. package/dist/core/modules/modules.js +2 -12
  67. package/dist/core/modules/modules.js.map +1 -1
  68. package/dist/core/networking/adapters/ws-adapter.d.ts +1 -1
  69. package/dist/core/networking/adapters/ws-adapter.js +2 -2
  70. package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
  71. package/dist/core/networking/service-discovery.js +7 -7
  72. package/dist/core/networking/service-discovery.js.map +1 -1
  73. package/dist/core/routing/index.d.ts +0 -20
  74. package/dist/core/routing/index.js +13 -178
  75. package/dist/core/routing/index.js.map +1 -1
  76. package/dist/core/runtime/node-adapter.js +6 -12
  77. package/dist/core/runtime/node-adapter.js.map +1 -1
  78. package/dist/moro.d.ts +0 -48
  79. package/dist/moro.js +148 -456
  80. package/dist/moro.js.map +1 -1
  81. package/dist/types/config.d.ts +2 -58
  82. package/dist/types/core.d.ts +40 -34
  83. package/dist/types/http.d.ts +1 -16
  84. package/dist/types/logger.d.ts +0 -7
  85. package/dist/types/module.d.ts +0 -11
  86. package/package.json +2 -2
  87. package/src/core/auth/morojs-adapter.ts +13 -18
  88. package/src/core/config/file-loader.ts +233 -0
  89. package/src/core/config/index.ts +32 -77
  90. package/src/core/config/loader.ts +633 -0
  91. package/src/core/config/schema.ts +31 -41
  92. package/src/core/config/utils.ts +29 -22
  93. package/src/core/config/validation.ts +140 -0
  94. package/src/core/database/README.md +16 -26
  95. package/src/core/database/adapters/mongodb.ts +2 -30
  96. package/src/core/database/adapters/mysql.ts +0 -14
  97. package/src/core/database/adapters/postgresql.ts +2 -12
  98. package/src/core/database/adapters/redis.ts +4 -27
  99. package/src/core/framework.ts +23 -163
  100. package/src/core/http/http-server.ts +36 -176
  101. package/src/core/http/router.ts +38 -127
  102. package/src/core/logger/filters.ts +4 -12
  103. package/src/core/logger/index.ts +0 -1
  104. package/src/core/logger/logger.ts +216 -427
  105. package/src/core/logger/outputs.ts +2 -0
  106. package/src/core/middleware/built-in/auth.ts +17 -98
  107. package/src/core/middleware/built-in/cache.ts +1 -3
  108. package/src/core/middleware/built-in/index.ts +0 -8
  109. package/src/core/middleware/built-in/request-logger.ts +1 -3
  110. package/src/core/middleware/built-in/sse.ts +7 -9
  111. package/src/core/modules/auto-discovery.ts +13 -476
  112. package/src/core/modules/modules.ts +9 -20
  113. package/src/core/networking/adapters/ws-adapter.ts +5 -2
  114. package/src/core/networking/service-discovery.ts +7 -6
  115. package/src/core/routing/index.ts +14 -198
  116. package/src/core/runtime/node-adapter.ts +6 -12
  117. package/src/moro.ts +166 -554
  118. package/src/types/config.ts +2 -59
  119. package/src/types/core.ts +45 -47
  120. package/src/types/http.ts +1 -23
  121. package/src/types/logger.ts +0 -9
  122. package/src/types/module.ts +0 -12
  123. package/dist/core/config/config-manager.d.ts +0 -44
  124. package/dist/core/config/config-manager.js +0 -114
  125. package/dist/core/config/config-manager.js.map +0 -1
  126. package/dist/core/config/config-sources.d.ts +0 -21
  127. package/dist/core/config/config-sources.js +0 -502
  128. package/dist/core/config/config-sources.js.map +0 -1
  129. package/dist/core/config/config-validator.d.ts +0 -21
  130. package/dist/core/config/config-validator.js +0 -765
  131. package/dist/core/config/config-validator.js.map +0 -1
  132. package/dist/core/middleware/built-in/jwt-helpers.d.ts +0 -118
  133. package/dist/core/middleware/built-in/jwt-helpers.js +0 -221
  134. package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
  135. package/src/core/config/config-manager.ts +0 -133
  136. package/src/core/config/config-sources.ts +0 -596
  137. package/src/core/config/config-validator.ts +0 -1078
  138. 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
- // PERFORMANCE OPTIMIZATION: Pre-analyze route requirements
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
- // PERFORMANCE OPTIMIZATION: Fast path for simple routes
300
- if (this.isFastPath) {
301
- // Skip all middleware - execute handler directly
302
- const result = await this.schema.handler(validatedReq, res);
303
- if (result !== undefined && !res.headersSent) {
304
- res.json(result);
305
- }
306
- return;
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(() => !resolved && next()).catch(reject);
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
- if (!resolved) {
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
- const authConfig = this.schema.auth;
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: authConfig,
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
- if (!this.headersSent) {
142
- const cookieString = `${name}=${value}`;
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
- if (!this.headersSent) {
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
- if (!this.headersSent) {
161
- this.statusCode = status || 302;
162
- this.setHeader('Location', url);
163
- this.end();
164
- }
156
+ this.statusCode = status || 302;
157
+ this.setHeader('Location', url);
158
+ this.end();
165
159
  };
166
160
  }
167
161