@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
|
@@ -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
|
-
|
|
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
|
|
190
|
-
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
-
//
|
|
284
|
+
// Mock sign in
|
|
366
285
|
return { url: `${config.basePath}/signin${provider ? `/${provider}` : ''}` };
|
|
367
286
|
},
|
|
368
287
|
|
|
369
288
|
signOut: async (options?: any) => {
|
|
370
|
-
//
|
|
289
|
+
// Mock sign out
|
|
371
290
|
return { url: `${config.basePath}/signout` };
|
|
372
291
|
},
|
|
373
292
|
|
|
374
293
|
updateSession: async (session: any) => {
|
|
375
|
-
//
|
|
294
|
+
// Mock session update
|
|
376
295
|
return session;
|
|
377
296
|
},
|
|
378
297
|
|
|
379
298
|
getCsrfToken: async () => {
|
|
380
|
-
//
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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) => {
|