@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
@@ -1,240 +0,0 @@
1
- /**
2
- * JWT Error Handling Utilities for Custom Middleware
3
- *
4
- * This module provides utilities to help users handle JWT errors gracefully
5
- * in their custom authentication middleware.
6
- */
7
-
8
- export interface JWTVerificationResult {
9
- success: boolean;
10
- payload?: any;
11
- error?: {
12
- type: 'expired' | 'invalid' | 'malformed' | 'missing_secret' | 'unknown';
13
- message: string;
14
- expiredAt?: Date;
15
- date?: Date;
16
- };
17
- }
18
-
19
- /**
20
- * Safely verify a JWT token with proper error handling
21
- *
22
- * @param token - The JWT token to verify
23
- * @param secret - The secret key for verification
24
- * @param options - Additional JWT verification options
25
- * @returns JWTVerificationResult with success status and payload or error details
26
- */
27
- export function safeVerifyJWT(
28
- token: string,
29
- secret: string,
30
- options: any = {}
31
- ): JWTVerificationResult {
32
- // Check if jsonwebtoken is available
33
- let jwt: any;
34
- try {
35
- jwt = require('jsonwebtoken');
36
- } catch (error) {
37
- return {
38
- success: false,
39
- error: {
40
- type: 'missing_secret',
41
- message:
42
- 'JWT verification requires the "jsonwebtoken" package. ' +
43
- 'Please install it with: npm install jsonwebtoken @types/jsonwebtoken',
44
- },
45
- };
46
- }
47
-
48
- if (!secret) {
49
- return {
50
- success: false,
51
- error: {
52
- type: 'missing_secret',
53
- message:
54
- 'JWT verification requires a secret. ' +
55
- 'Please provide a secret for token verification.',
56
- },
57
- };
58
- }
59
-
60
- try {
61
- const payload = jwt.verify(token, secret, options);
62
- return {
63
- success: true,
64
- payload,
65
- };
66
- } catch (error: any) {
67
- // Handle specific JWT errors gracefully
68
- if (error.name === 'TokenExpiredError') {
69
- return {
70
- success: false,
71
- error: {
72
- type: 'expired',
73
- message: 'JWT token has expired',
74
- expiredAt: error.expiredAt,
75
- },
76
- };
77
- } else if (error.name === 'JsonWebTokenError') {
78
- return {
79
- success: false,
80
- error: {
81
- type: 'invalid',
82
- message: 'Invalid JWT token format or signature',
83
- },
84
- };
85
- } else if (error.name === 'NotBeforeError') {
86
- return {
87
- success: false,
88
- error: {
89
- type: 'malformed',
90
- message: 'JWT token is not active yet',
91
- date: error.date,
92
- },
93
- };
94
- } else {
95
- return {
96
- success: false,
97
- error: {
98
- type: 'unknown',
99
- message: `JWT verification failed: ${error.message}`,
100
- },
101
- };
102
- }
103
- }
104
- }
105
-
106
- /**
107
- * Extract JWT token from Authorization header
108
- *
109
- * @param authHeader - The Authorization header value
110
- * @returns The JWT token or null if not found/invalid format
111
- */
112
- export function extractJWTFromHeader(authHeader: string | undefined): string | null {
113
- if (!authHeader) {
114
- return null;
115
- }
116
-
117
- if (!authHeader.startsWith('Bearer ')) {
118
- return null;
119
- }
120
-
121
- const token = authHeader.substring(7);
122
- return token.trim() || null;
123
- }
124
-
125
- /**
126
- * Create a standardized auth middleware error response
127
- *
128
- * @param error - The JWT verification error
129
- * @returns Standardized error response object
130
- */
131
- export function createAuthErrorResponse(error: JWTVerificationResult['error']) {
132
- if (!error) {
133
- return {
134
- success: false,
135
- error: 'Authentication failed',
136
- message: 'Unknown authentication error',
137
- };
138
- }
139
-
140
- switch (error.type) {
141
- case 'expired':
142
- return {
143
- success: false,
144
- error: 'Token expired',
145
- message: 'Your session has expired. Please sign in again.',
146
- expiredAt: error.expiredAt,
147
- };
148
-
149
- case 'invalid':
150
- return {
151
- success: false,
152
- error: 'Invalid token',
153
- message: 'The provided authentication token is invalid.',
154
- };
155
-
156
- case 'malformed':
157
- return {
158
- success: false,
159
- error: 'Token not ready',
160
- message: 'The authentication token is not yet valid.',
161
- availableAt: error.date,
162
- };
163
-
164
- case 'missing_secret':
165
- return {
166
- success: false,
167
- error: 'Configuration error',
168
- message: 'Authentication service is not properly configured.',
169
- };
170
-
171
- default:
172
- return {
173
- success: false,
174
- error: 'Authentication failed',
175
- message: error.message || 'Authentication verification failed.',
176
- };
177
- }
178
- }
179
-
180
- /**
181
- * Example usage for custom middleware with elegant error handling:
182
- *
183
- * ```typescript
184
- * import { safeVerifyJWT, extractJWTFromHeader, createAuthErrorResponse } from '@morojs/moro';
185
- *
186
- * const authMiddleware = async (req: any, res: any, next: any) => {
187
- * const token = extractJWTFromHeader(req.headers.authorization);
188
- *
189
- * if (!token) {
190
- * return res.status(401).json({
191
- * success: false,
192
- * error: 'Missing token',
193
- * message: 'Authorization header with Bearer token is required'
194
- * });
195
- * }
196
- *
197
- * const result = safeVerifyJWT(token, process.env.JWT_SECRET!);
198
- *
199
- * if (!result.success) {
200
- * // This provides elegant, user-friendly error messages instead of stack traces
201
- * const errorResponse = createAuthErrorResponse(result.error);
202
- * return res.status(401).json(errorResponse);
203
- * }
204
- *
205
- * // Token is valid - attach user info to request
206
- * req.user = result.payload;
207
- * req.auth = {
208
- * user: result.payload,
209
- * isAuthenticated: true,
210
- * token
211
- * };
212
- *
213
- * next();
214
- * };
215
- * ```
216
- *
217
- * Benefits of using safeVerifyJWT vs raw jsonwebtoken.verify():
218
- *
219
- * ❌ Raw approach (shows ugly error messages to users):
220
- * ```typescript
221
- * try {
222
- * const decoded = jwt.verify(token, secret);
223
- * req.user = decoded;
224
- * } catch (error) {
225
- * // This exposes technical details and stack traces to users:
226
- * // "Invalid token: TokenExpiredError: jwt expired at /node_modules/jsonwebtoken/verify.js:190:21..."
227
- * throw error; // BAD - exposes internal details
228
- * }
229
- * ```
230
- *
231
- * ✅ Safe approach (shows clean, user-friendly messages):
232
- * ```typescript
233
- * const result = safeVerifyJWT(token, secret);
234
- * if (!result.success) {
235
- * // This returns clean messages like:
236
- * // { "error": "Token expired", "message": "Your session has expired. Please sign in again." }
237
- * return res.status(401).json(createAuthErrorResponse(result.error));
238
- * }
239
- * ```
240
- */