@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
@@ -29,6 +29,7 @@ export class FileOutput implements LogOutput {
29
29
 
30
30
  // TODO: Implement log rotation if needed
31
31
  } catch (error) {
32
+ // Use console.error as fallback since this is the logger itself
32
33
  console.error('File logger error:', error);
33
34
  }
34
35
  }
@@ -76,6 +77,7 @@ export class WebhookOutput implements LogOutput {
76
77
  throw new Error(`Webhook failed: ${response.status}`);
77
78
  }
78
79
  } catch (error) {
80
+ // Use console.error as fallback since this is the logger itself
79
81
  console.error('Webhook logger error:', error);
80
82
  }
81
83
  }
@@ -12,7 +12,6 @@ import {
12
12
  CredentialsProvider,
13
13
  EmailProvider,
14
14
  } from '../../../types/auth';
15
- import { safeVerifyJWT, createAuthErrorResponse } from './jwt-helpers';
16
15
 
17
16
  const logger = createFrameworkLogger('AuthMiddleware');
18
17
 
@@ -152,15 +151,7 @@ export const auth = (options: AuthOptions): MiddlewareInterface => ({
152
151
  return authInstance.getSession({ req });
153
152
  },
154
153
  getToken: async () => {
155
- try {
156
- return authInstance.verifyJWT(authRequest.token || '');
157
- } catch (error: any) {
158
- // Handle JWT errors gracefully in getToken method
159
- logger.debug('Failed to verify token in getToken', 'TokenValidation', {
160
- error: error.message,
161
- });
162
- return null;
163
- }
154
+ return authInstance.verifyJWT(authRequest.token || '');
164
155
  },
165
156
  getCsrfToken: async () => {
166
157
  return authInstance.getCsrfToken();
@@ -186,60 +177,8 @@ export const auth = (options: AuthOptions): MiddlewareInterface => ({
186
177
  if (decoded) {
187
178
  session = await authInstance.getSession({ req: { ...req, token } });
188
179
  }
189
- } catch (error: any) {
190
- // Handle specific JWT errors gracefully and return proper HTTP responses
191
- if (error.name === 'TokenExpiredError') {
192
- logger.debug('JWT token expired', 'TokenValidation', {
193
- message: error.message,
194
- expiredAt: error.expiredAt,
195
- });
196
-
197
- // If this is a protected route request, return a proper 401 response
198
- if (req.headers.accept?.includes('application/json')) {
199
- return res.status(401).json(
200
- createAuthErrorResponse({
201
- type: 'expired',
202
- message: error.message,
203
- expiredAt: error.expiredAt,
204
- })
205
- );
206
- }
207
- } else if (error.name === 'JsonWebTokenError') {
208
- logger.debug('Invalid JWT token format', 'TokenValidation', {
209
- message: error.message,
210
- });
211
-
212
- // If this is a protected route request, return a proper 401 response
213
- if (req.headers.accept?.includes('application/json')) {
214
- return res.status(401).json(
215
- createAuthErrorResponse({
216
- type: 'invalid',
217
- message: error.message,
218
- })
219
- );
220
- }
221
- } else if (error.name === 'NotBeforeError') {
222
- logger.debug('JWT token not active yet', 'TokenValidation', {
223
- message: error.message,
224
- date: error.date,
225
- });
226
-
227
- // If this is a protected route request, return a proper 401 response
228
- if (req.headers.accept?.includes('application/json')) {
229
- return res.status(401).json(
230
- createAuthErrorResponse({
231
- type: 'malformed',
232
- message: error.message,
233
- date: error.date,
234
- })
235
- );
236
- }
237
- } else {
238
- logger.debug('JWT token validation failed', 'TokenValidation', {
239
- error: error.message || error,
240
- });
241
- }
242
- // Continue with unauthenticated state for non-API requests
180
+ } catch (error) {
181
+ logger.debug('Invalid JWT token', 'TokenValidation', { error });
243
182
  }
244
183
  }
245
184
 
@@ -290,11 +229,11 @@ export const auth = (options: AuthOptions): MiddlewareInterface => ({
290
229
  },
291
230
  });
292
231
 
293
- // Auth.js implementation with proper JWT handling
232
+ // Mock Auth.js implementation (would be replaced with actual Auth.js)
294
233
  async function initializeAuthJS(config: AuthOptions): Promise<any> {
295
234
  return {
296
235
  handler: async (req: any, res: any) => {
297
- // Basic Auth.js request handler
236
+ // Mock Auth.js request handler
298
237
  const path = req.url.replace(config.basePath!, '');
299
238
 
300
239
  if (path.startsWith('/signin')) {
@@ -315,7 +254,7 @@ async function initializeAuthJS(config: AuthOptions): Promise<any> {
315
254
  },
316
255
 
317
256
  getSession: async ({ req }: { req: any }) => {
318
- // Basic session retrieval
257
+ // Mock session retrieval
319
258
  const sessionId =
320
259
  req.cookies?.['next-auth.session-token'] ||
321
260
  req.cookies?.['__Secure-next-auth.session-token'];
@@ -331,53 +270,33 @@ async function initializeAuthJS(config: AuthOptions): Promise<any> {
331
270
  },
332
271
 
333
272
  verifyJWT: async (token: string) => {
334
- const secret = process.env.JWT_SECRET || config.jwt?.secret || config.secret || '';
335
-
336
- // Use the safe JWT verification function
337
- const result = safeVerifyJWT(token, secret);
338
-
339
- if (!result.success) {
340
- // Create a custom error that includes the structured error information
341
- const customError = new Error(result.error?.message || 'JWT verification failed');
342
-
343
- // Add the error type information for upstream handling
344
- (customError as any).jwtErrorType = result.error?.type;
345
- (customError as any).jwtErrorDetails = result.error;
346
-
347
- // Map the safe error types back to standard JWT error names for compatibility
348
- if (result.error?.type === 'expired') {
349
- customError.name = 'TokenExpiredError';
350
- (customError as any).expiredAt = result.error.expiredAt;
351
- } else if (result.error?.type === 'invalid') {
352
- customError.name = 'JsonWebTokenError';
353
- } else if (result.error?.type === 'malformed') {
354
- customError.name = 'NotBeforeError';
355
- (customError as any).date = result.error.date;
356
- }
357
-
358
- throw customError;
273
+ // Mock JWT verification
274
+ try {
275
+ // In real implementation, use jose or jsonwebtoken
276
+ const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
277
+ return payload;
278
+ } catch {
279
+ return null;
359
280
  }
360
-
361
- return result.payload;
362
281
  },
363
282
 
364
283
  signIn: async (provider?: string, options?: any) => {
365
- // Basic sign in redirect
284
+ // Mock sign in
366
285
  return { url: `${config.basePath}/signin${provider ? `/${provider}` : ''}` };
367
286
  },
368
287
 
369
288
  signOut: async (options?: any) => {
370
- // Basic sign out redirect
289
+ // Mock sign out
371
290
  return { url: `${config.basePath}/signout` };
372
291
  },
373
292
 
374
293
  updateSession: async (session: any) => {
375
- // Basic session update
294
+ // Mock session update
376
295
  return session;
377
296
  },
378
297
 
379
298
  getCsrfToken: async () => {
380
- // Basic CSRF token generation
299
+ // Mock CSRF token generation
381
300
  const crypto = require('crypto');
382
301
  return crypto.randomBytes(32).toString('hex');
383
302
  },
@@ -188,9 +188,7 @@ export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
188
188
  parts.push(`stale-while-revalidate=${directives.staleWhileRevalidate}`);
189
189
  }
190
190
 
191
- if (!res.headersSent) {
192
- res.setHeader('Cache-Control', parts.join(', '));
193
- }
191
+ res.setHeader('Cache-Control', parts.join(', '));
194
192
  return res;
195
193
  };
196
194
 
@@ -33,14 +33,6 @@ export {
33
33
  sessionHelpers,
34
34
  } from './auth-helpers';
35
35
 
36
- // JWT Utilities for Custom Middleware
37
- export {
38
- safeVerifyJWT,
39
- extractJWTFromHeader,
40
- createAuthErrorResponse,
41
- type JWTVerificationResult,
42
- } from './jwt-helpers';
43
-
44
36
  export {
45
37
  extendedProviders,
46
38
  enterpriseProviders,
@@ -1,7 +1,5 @@
1
1
  // Simple request logging middleware
2
- import { createFrameworkLogger } from '../../logger';
3
-
4
- const logger = createFrameworkLogger('RequestLogger');
2
+ import { logger } from '../../logger';
5
3
 
6
4
  export const requestLogger = async (context: any): Promise<void> => {
7
5
  const startTime = Date.now();
@@ -35,15 +35,13 @@ export const sse = (
35
35
  logger.debug('Setting up SSE connection', 'SSESetup');
36
36
 
37
37
  // Set SSE headers
38
- if (!res.headersSent) {
39
- res.writeHead(200, {
40
- 'Content-Type': 'text/event-stream',
41
- 'Cache-Control': 'no-cache',
42
- Connection: 'keep-alive',
43
- 'Access-Control-Allow-Origin': options.cors ? '*' : undefined,
44
- 'Access-Control-Allow-Headers': options.cors ? 'Cache-Control' : undefined,
45
- });
46
- }
38
+ res.writeHead(200, {
39
+ 'Content-Type': 'text/event-stream',
40
+ 'Cache-Control': 'no-cache',
41
+ Connection: 'keep-alive',
42
+ 'Access-Control-Allow-Origin': options.cors ? '*' : undefined,
43
+ 'Access-Control-Allow-Headers': options.cors ? 'Cache-Control' : undefined,
44
+ });
47
45
 
48
46
  // Add SSE methods to response
49
47
  res.sendEvent = (data: any, event?: string, id?: string) => {