@morojs/moro 1.6.2 → 1.6.3
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/dist/core/http/http-server.js +12 -9
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/uws-http-server.js +1 -1
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/middleware/built-in/auth/core.d.ts +78 -0
- package/dist/core/middleware/built-in/auth/core.js +358 -0
- package/dist/core/middleware/built-in/auth/core.js.map +1 -0
- package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +1 -1
- package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
- package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
- package/dist/core/middleware/built-in/auth/hook.js +99 -0
- package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
- package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
- package/dist/core/middleware/built-in/auth/index.js +15 -0
- package/dist/core/middleware/built-in/auth/index.js.map +1 -0
- package/dist/core/middleware/built-in/{jwt-helpers.js → auth/jwt-helpers.js} +1 -1
- package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
- package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
- package/dist/core/middleware/built-in/auth/middleware.js +71 -0
- package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
- package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +1 -1
- package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +2 -2
- package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/index.d.ts +0 -2
- package/{src/core/middleware/built-in/adapters/index.ts → dist/core/middleware/built-in/cache/adapters/index.js} +1 -3
- package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
- package/dist/core/middleware/built-in/cache/core.js +87 -0
- package/dist/core/middleware/built-in/cache/core.js.map +1 -0
- package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +22 -5
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cache/index.js +9 -0
- package/dist/core/middleware/built-in/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/cache/middleware.js +44 -0
- package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +2 -2
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/index.js +0 -2
- package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
- package/dist/core/middleware/built-in/cdn/core.js +144 -0
- package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
- package/dist/core/middleware/built-in/cdn/hook.js +70 -0
- package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/cdn/index.js +11 -0
- package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
- package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
- package/dist/core/middleware/built-in/cookie/core.js +83 -0
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/cookie/hook.js +47 -0
- package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cookie/index.js +9 -0
- package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
- package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
- package/dist/core/middleware/built-in/cors/core.js +51 -0
- package/dist/core/middleware/built-in/cors/core.js.map +1 -0
- package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/cors/hook.js +37 -0
- package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cors/index.js +9 -0
- package/dist/core/middleware/built-in/cors/index.js.map +1 -0
- package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/cors/middleware.js +22 -0
- package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
- package/dist/core/middleware/built-in/csp/core.js +88 -0
- package/dist/core/middleware/built-in/csp/core.js.map +1 -0
- package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
- package/dist/core/middleware/built-in/csp/hook.js +47 -0
- package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
- package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
- package/dist/core/middleware/built-in/csp/index.js +9 -0
- package/dist/core/middleware/built-in/csp/index.js.map +1 -0
- package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
- package/dist/core/middleware/built-in/csp/middleware.js +29 -0
- package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
- package/dist/core/middleware/built-in/csrf/core.js +69 -0
- package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/csrf/hook.js +45 -0
- package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
- package/dist/core/middleware/built-in/csrf/index.js +9 -0
- package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
- package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{error-tracker.js → error-tracker/middleware.js} +14 -3
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +25 -59
- package/dist/core/middleware/built-in/index.js +31 -31
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
- package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{performance-monitor.js → performance-monitor/middleware.js} +14 -3
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
- package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
- package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +22 -16
- package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
- package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
- package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
- package/dist/core/middleware/built-in/request-logger/index.js +4 -0
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{request-logger.js → request-logger/middleware.js} +14 -3
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/session/core.d.ts +73 -0
- package/dist/core/middleware/built-in/session/core.js +227 -0
- package/dist/core/middleware/built-in/session/core.js.map +1 -0
- package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/session/hook.js +53 -0
- package/dist/core/middleware/built-in/session/hook.js.map +1 -0
- package/dist/core/middleware/built-in/session/index.d.ts +3 -0
- package/dist/core/middleware/built-in/session/index.js +9 -0
- package/dist/core/middleware/built-in/session/index.js.map +1 -0
- package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/session/middleware.js +38 -0
- package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
- package/dist/core/middleware/built-in/sse/core.js +117 -0
- package/dist/core/middleware/built-in/sse/core.js.map +1 -0
- package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
- package/dist/core/middleware/built-in/sse/hook.js +60 -0
- package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
- package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
- package/dist/core/middleware/built-in/sse/index.js +9 -0
- package/dist/core/middleware/built-in/sse/index.js.map +1 -0
- package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/sse/middleware.js +43 -0
- package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
- package/dist/core/middleware/built-in/validation/core.js +93 -0
- package/dist/core/middleware/built-in/validation/core.js.map +1 -0
- package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
- package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +14 -3
- package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
- package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
- package/dist/core/middleware/built-in/validation/index.js +9 -0
- package/dist/core/middleware/built-in/validation/index.js.map +1 -0
- package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/validation/middleware.js +27 -0
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
- package/dist/core/middleware/index.js +6 -0
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +4 -20
- package/dist/core/routing/unified-router.js +61 -106
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.js +12 -18
- package/dist/moro.js.map +1 -1
- package/dist/types/hooks.d.ts +3 -0
- package/package.json +2 -6
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
- package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
- package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
- package/dist/core/middleware/built-in/auth.d.ts +0 -30
- package/dist/core/middleware/built-in/auth.js +0 -348
- package/dist/core/middleware/built-in/auth.js.map +0 -1
- package/dist/core/middleware/built-in/cache.d.ts +0 -3
- package/dist/core/middleware/built-in/cache.js.map +0 -1
- package/dist/core/middleware/built-in/cdn.d.ts +0 -3
- package/dist/core/middleware/built-in/cdn.js +0 -109
- package/dist/core/middleware/built-in/cdn.js.map +0 -1
- package/dist/core/middleware/built-in/cookie.d.ts +0 -14
- package/dist/core/middleware/built-in/cookie.js +0 -64
- package/dist/core/middleware/built-in/cookie.js.map +0 -1
- package/dist/core/middleware/built-in/cors.d.ts +0 -2
- package/dist/core/middleware/built-in/cors.js +0 -25
- package/dist/core/middleware/built-in/cors.js.map +0 -1
- package/dist/core/middleware/built-in/csp.d.ts +0 -22
- package/dist/core/middleware/built-in/csp.js +0 -68
- package/dist/core/middleware/built-in/csp.js.map +0 -1
- package/dist/core/middleware/built-in/csrf.d.ts +0 -9
- package/dist/core/middleware/built-in/csrf.js +0 -60
- package/dist/core/middleware/built-in/csrf.js.map +0 -1
- package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
- package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
- package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
- package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
- package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
- package/dist/core/middleware/built-in/request-logger.js.map +0 -1
- package/dist/core/middleware/built-in/session.d.ts +0 -41
- package/dist/core/middleware/built-in/session.js +0 -205
- package/dist/core/middleware/built-in/session.js.map +0 -1
- package/dist/core/middleware/built-in/sse.d.ts +0 -6
- package/dist/core/middleware/built-in/sse.js +0 -69
- package/dist/core/middleware/built-in/sse.js.map +0 -1
- package/dist/core/middleware/built-in/validation.d.ts +0 -2
- package/dist/core/middleware/built-in/validation.js.map +0 -1
- package/jest.config.mjs +0 -41
- package/src/core/auth/README.md +0 -339
- package/src/core/auth/morojs-adapter.ts +0 -415
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -600
- package/src/core/config/config-validator.ts +0 -1116
- package/src/core/config/file-loader.ts +0 -150
- package/src/core/config/index.ts +0 -109
- package/src/core/config/schema.ts +0 -164
- package/src/core/config/utils.ts +0 -244
- package/src/core/database/README.md +0 -238
- package/src/core/database/adapters/drizzle.ts +0 -415
- package/src/core/database/adapters/index.ts +0 -42
- package/src/core/database/adapters/mongodb.ts +0 -317
- package/src/core/database/adapters/mysql.ts +0 -235
- package/src/core/database/adapters/postgresql.ts +0 -226
- package/src/core/database/adapters/redis.ts +0 -379
- package/src/core/database/adapters/sqlite.ts +0 -263
- package/src/core/database/index.ts +0 -3
- package/src/core/docs/index.ts +0 -231
- package/src/core/docs/openapi-generator.ts +0 -576
- package/src/core/docs/schema-to-openapi.ts +0 -145
- package/src/core/docs/simple-docs.ts +0 -295
- package/src/core/docs/swagger-ui.ts +0 -354
- package/src/core/docs/zod-to-openapi.ts +0 -532
- package/src/core/events/event-bus.ts +0 -231
- package/src/core/events/index.ts +0 -12
- package/src/core/framework.ts +0 -885
- package/src/core/http/http-server.ts +0 -1847
- package/src/core/http/index.ts +0 -7
- package/src/core/http/uws-http-server.ts +0 -591
- package/src/core/logger/filters.ts +0 -153
- package/src/core/logger/index.ts +0 -21
- package/src/core/logger/logger.ts +0 -1033
- package/src/core/logger/outputs.ts +0 -132
- package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
- package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
- package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
- package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -114
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -94
- package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
- package/src/core/middleware/built-in/auth-helpers.ts +0 -401
- package/src/core/middleware/built-in/auth-providers.ts +0 -480
- package/src/core/middleware/built-in/auth.ts +0 -410
- package/src/core/middleware/built-in/cache.ts +0 -213
- package/src/core/middleware/built-in/cdn.ts +0 -124
- package/src/core/middleware/built-in/cookie.ts +0 -85
- package/src/core/middleware/built-in/cors.ts +0 -38
- package/src/core/middleware/built-in/csp.ts +0 -101
- package/src/core/middleware/built-in/csrf.ts +0 -82
- package/src/core/middleware/built-in/error-tracker.ts +0 -16
- package/src/core/middleware/built-in/index.ts +0 -87
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
- package/src/core/middleware/built-in/performance-monitor.ts +0 -25
- package/src/core/middleware/built-in/rate-limit.ts +0 -60
- package/src/core/middleware/built-in/request-logger.ts +0 -16
- package/src/core/middleware/built-in/session.ts +0 -287
- package/src/core/middleware/built-in/sse.ts +0 -88
- package/src/core/middleware/built-in/validation.ts +0 -33
- package/src/core/middleware/index.ts +0 -177
- package/src/core/modules/auto-discovery.ts +0 -726
- package/src/core/modules/index.ts +0 -3
- package/src/core/modules/modules.ts +0 -135
- package/src/core/networking/adapters/index.ts +0 -17
- package/src/core/networking/adapters/socketio-adapter.ts +0 -254
- package/src/core/networking/adapters/uws-adapter.ts +0 -619
- package/src/core/networking/adapters/ws-adapter.ts +0 -429
- package/src/core/networking/index.ts +0 -4
- package/src/core/networking/service-discovery.ts +0 -303
- package/src/core/networking/websocket-adapter.ts +0 -217
- package/src/core/networking/websocket-manager.ts +0 -308
- package/src/core/pooling/object-pool-manager.ts +0 -630
- package/src/core/routing/app-integration.ts +0 -164
- package/src/core/routing/index.ts +0 -261
- package/src/core/routing/path-matcher.ts +0 -222
- package/src/core/routing/router.ts +0 -97
- package/src/core/routing/unified-router.ts +0 -870
- package/src/core/runtime/aws-lambda-adapter.ts +0 -147
- package/src/core/runtime/base-adapter.ts +0 -130
- package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
- package/src/core/runtime/index.ts +0 -62
- package/src/core/runtime/node-adapter.ts +0 -202
- package/src/core/runtime/vercel-edge-adapter.ts +0 -114
- package/src/core/utilities/circuit-breaker.ts +0 -46
- package/src/core/utilities/container.ts +0 -736
- package/src/core/utilities/hooks.ts +0 -142
- package/src/core/utilities/index.ts +0 -17
- package/src/core/utilities/package-utils.ts +0 -59
- package/src/core/validation/adapters.ts +0 -147
- package/src/core/validation/index.ts +0 -258
- package/src/core/validation/schema-interface.ts +0 -100
- package/src/index.ts +0 -233
- package/src/moro.ts +0 -1728
- package/src/types/auth.ts +0 -440
- package/src/types/cache.ts +0 -38
- package/src/types/cdn.ts +0 -22
- package/src/types/config.ts +0 -229
- package/src/types/core.ts +0 -58
- package/src/types/database.ts +0 -32
- package/src/types/discovery.ts +0 -7
- package/src/types/events.ts +0 -82
- package/src/types/hooks.ts +0 -47
- package/src/types/http.ts +0 -89
- package/src/types/logger.ts +0 -102
- package/src/types/module.ts +0 -99
- package/src/types/runtime.ts +0 -76
- package/src/types/session.ts +0 -89
- package/tsconfig.json +0 -23
- /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
- /package/dist/core/middleware/built-in/{jwt-helpers.d.ts → auth/jwt-helpers.d.ts} +0 -0
- /package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.js +0 -0
- /package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.js +0 -0
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
// Hook System for Moro
|
|
2
|
-
import { EventEmitter } from 'events';
|
|
3
|
-
import { HookFunction, HookContext, MoroMiddleware } from '../../types/hooks.js';
|
|
4
|
-
import { createFrameworkLogger } from '../logger/index.js';
|
|
5
|
-
|
|
6
|
-
export const HOOK_EVENTS = {
|
|
7
|
-
BEFORE_REQUEST: 'before:request',
|
|
8
|
-
AFTER_REQUEST: 'after:request',
|
|
9
|
-
BEFORE_RESPONSE: 'before:response',
|
|
10
|
-
AFTER_RESPONSE: 'after:response',
|
|
11
|
-
ERROR: 'error',
|
|
12
|
-
} as const;
|
|
13
|
-
|
|
14
|
-
export class HookManager extends EventEmitter {
|
|
15
|
-
private hooks = new Map<string, HookFunction[]>();
|
|
16
|
-
private beforeHooks = new Map<string, HookFunction[]>();
|
|
17
|
-
private afterHooks = new Map<string, HookFunction[]>();
|
|
18
|
-
private logger = createFrameworkLogger('Hooks');
|
|
19
|
-
|
|
20
|
-
constructor() {
|
|
21
|
-
super();
|
|
22
|
-
// Initialize hook arrays
|
|
23
|
-
Object.values(HOOK_EVENTS).forEach(event => {
|
|
24
|
-
this.hooks.set(event, []);
|
|
25
|
-
this.beforeHooks.set(event, []);
|
|
26
|
-
this.afterHooks.set(event, []);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Register a hook for a specific event
|
|
31
|
-
hook(event: string, fn: HookFunction): this {
|
|
32
|
-
if (!this.hooks.has(event)) {
|
|
33
|
-
this.hooks.set(event, []);
|
|
34
|
-
}
|
|
35
|
-
this.hooks.get(event)!.push(fn);
|
|
36
|
-
return this;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Register a before hook
|
|
40
|
-
before(event: string, fn: HookFunction): this {
|
|
41
|
-
if (!this.beforeHooks.has(event)) {
|
|
42
|
-
this.beforeHooks.set(event, []);
|
|
43
|
-
}
|
|
44
|
-
this.beforeHooks.get(event)!.push(fn);
|
|
45
|
-
return this;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Register an after hook
|
|
49
|
-
after(event: string, fn: HookFunction): this {
|
|
50
|
-
if (!this.afterHooks.has(event)) {
|
|
51
|
-
this.afterHooks.set(event, []);
|
|
52
|
-
}
|
|
53
|
-
this.afterHooks.get(event)!.push(fn);
|
|
54
|
-
return this;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Execute hooks for an event
|
|
58
|
-
async execute(event: string, context: HookContext = {}): Promise<HookContext> {
|
|
59
|
-
// Execute before hooks
|
|
60
|
-
const beforeHooks = this.beforeHooks.get(event) || [];
|
|
61
|
-
for (const hook of beforeHooks) {
|
|
62
|
-
await this.executeHook(hook, context);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Execute main hooks
|
|
66
|
-
const hooks = this.hooks.get(event) || [];
|
|
67
|
-
for (const hook of hooks) {
|
|
68
|
-
await this.executeHook(hook, context);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Execute after hooks
|
|
72
|
-
const afterHooks = this.afterHooks.get(event) || [];
|
|
73
|
-
for (const hook of afterHooks) {
|
|
74
|
-
await this.executeHook(hook, context);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Emit event for listeners
|
|
78
|
-
this.emit(event, context);
|
|
79
|
-
|
|
80
|
-
return context;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Execute a single hook with error handling
|
|
84
|
-
private async executeHook(hook: HookFunction, context: HookContext): Promise<void> {
|
|
85
|
-
try {
|
|
86
|
-
await hook(context);
|
|
87
|
-
} catch (error) {
|
|
88
|
-
this.logger.error('Hook execution error', 'HookExecution', {
|
|
89
|
-
error: error instanceof Error ? error.message : String(error),
|
|
90
|
-
context: context.request?.method || 'unknown',
|
|
91
|
-
});
|
|
92
|
-
throw error;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Remove hooks
|
|
97
|
-
removeHook(event: string, fn?: HookFunction): this {
|
|
98
|
-
if (!fn) {
|
|
99
|
-
this.hooks.delete(event);
|
|
100
|
-
this.beforeHooks.delete(event);
|
|
101
|
-
this.afterHooks.delete(event);
|
|
102
|
-
} else {
|
|
103
|
-
[this.hooks, this.beforeHooks, this.afterHooks].forEach(map => {
|
|
104
|
-
const hooks = map.get(event);
|
|
105
|
-
if (hooks) {
|
|
106
|
-
const index = hooks.indexOf(fn);
|
|
107
|
-
if (index !== -1) {
|
|
108
|
-
hooks.splice(index, 1);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Get all registered hooks for debugging
|
|
117
|
-
getHooks(event?: string): Record<string, any> {
|
|
118
|
-
if (event) {
|
|
119
|
-
return {
|
|
120
|
-
before: this.beforeHooks.get(event) || [],
|
|
121
|
-
main: this.hooks.get(event) || [],
|
|
122
|
-
after: this.afterHooks.get(event) || [],
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const allHooks: Record<string, any> = {};
|
|
127
|
-
const allEvents = new Set([
|
|
128
|
-
...this.hooks.keys(),
|
|
129
|
-
...this.beforeHooks.keys(),
|
|
130
|
-
...this.afterHooks.keys(),
|
|
131
|
-
]);
|
|
132
|
-
|
|
133
|
-
allEvents.forEach(event => {
|
|
134
|
-
allHooks[event] = this.getHooks(event);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
return allHooks;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Built-in middleware - now organized in individual files
|
|
142
|
-
export { simpleMiddleware as middleware } from '../middleware/index.js';
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// Core Utilities - Centralized Exports
|
|
2
|
-
export {
|
|
3
|
-
Container,
|
|
4
|
-
FunctionalContainer,
|
|
5
|
-
ServiceScope,
|
|
6
|
-
ServiceLifecycle,
|
|
7
|
-
withLogging,
|
|
8
|
-
withCaching,
|
|
9
|
-
withRetry,
|
|
10
|
-
withTimeout,
|
|
11
|
-
} from './container.js';
|
|
12
|
-
export { CircuitBreaker } from './circuit-breaker.js';
|
|
13
|
-
export { HookManager, HOOK_EVENTS } from './hooks.js';
|
|
14
|
-
export { isPackageAvailable, resolveUserPackage, createUserRequire } from './package-utils.js';
|
|
15
|
-
|
|
16
|
-
// Re-export middleware from hooks
|
|
17
|
-
export { middleware } from './hooks.js';
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// Package and Module Resolution Utilities
|
|
2
|
-
// ESM-compatible helpers for detecting and resolving optional dependencies
|
|
3
|
-
|
|
4
|
-
import { createRequire } from 'module';
|
|
5
|
-
import { join } from 'path';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Check if a package is available in the user's node_modules
|
|
9
|
-
* Uses ESM-compatible module resolution from the user's working directory
|
|
10
|
-
*
|
|
11
|
-
* @param packageName - The name of the package to check (e.g., 'socket.io', 'zod')
|
|
12
|
-
* @returns true if the package is installed, false otherwise
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* if (isPackageAvailable('socket.io')) {
|
|
16
|
-
* // socket.io is installed, safe to import
|
|
17
|
-
* const { Server } = await import('socket.io');
|
|
18
|
-
* }
|
|
19
|
-
*/
|
|
20
|
-
export function isPackageAvailable(packageName: string): boolean {
|
|
21
|
-
try {
|
|
22
|
-
const userRequire = createRequire(join(process.cwd(), 'package.json'));
|
|
23
|
-
userRequire.resolve(packageName);
|
|
24
|
-
return true;
|
|
25
|
-
} catch {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Resolve a package path from the user's node_modules
|
|
32
|
-
* Uses ESM-compatible module resolution from the user's working directory
|
|
33
|
-
*
|
|
34
|
-
* @param packageName - The name of the package to resolve
|
|
35
|
-
* @returns The resolved package path
|
|
36
|
-
* @throws Error if the package is not found
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* const socketIOPath = resolveUserPackage('socket.io');
|
|
40
|
-
* const { Server } = await import(socketIOPath);
|
|
41
|
-
*/
|
|
42
|
-
export function resolveUserPackage(packageName: string): string {
|
|
43
|
-
const userRequire = createRequire(join(process.cwd(), 'package.json'));
|
|
44
|
-
return userRequire.resolve(packageName);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Create a require function for the user's working directory
|
|
49
|
-
* Useful for resolving packages installed by the user, not in Moro's dependencies
|
|
50
|
-
*
|
|
51
|
-
* @returns A require function scoped to the user's working directory
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* const userRequire = createUserRequire();
|
|
55
|
-
* const packagePath = userRequire.resolve('some-package');
|
|
56
|
-
*/
|
|
57
|
-
export function createUserRequire() {
|
|
58
|
-
return createRequire(join(process.cwd(), 'package.json'));
|
|
59
|
-
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
// Validation Library Adapters for Moro Framework
|
|
2
|
-
// Makes Joi, Yup, and other libraries compatible with ValidationSchema interface
|
|
3
|
-
|
|
4
|
-
import { ValidationSchema, ValidationError, normalizeValidationError } from './schema-interface.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Zod Compatibility Check
|
|
8
|
-
* Zod ALREADY implements ValidationSchema interface natively!
|
|
9
|
-
* No adapter needed - it just works.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Joi Adapter - makes Joi schemas compatible with ValidationSchema
|
|
14
|
-
*/
|
|
15
|
-
export class JoiAdapter<T = any> implements ValidationSchema<T> {
|
|
16
|
-
constructor(private joiSchema: any) {
|
|
17
|
-
if (!joiSchema || typeof joiSchema.validateAsync !== 'function') {
|
|
18
|
-
throw new Error('Invalid Joi schema provided to JoiAdapter');
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async parseAsync(data: unknown): Promise<T> {
|
|
23
|
-
try {
|
|
24
|
-
const result = await this.joiSchema.validateAsync(data, { abortEarly: false });
|
|
25
|
-
return result as T;
|
|
26
|
-
} catch (error) {
|
|
27
|
-
throw normalizeValidationError(error);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Yup Adapter - makes Yup schemas compatible with ValidationSchema
|
|
34
|
-
*/
|
|
35
|
-
export class YupAdapter<T = any> implements ValidationSchema<T> {
|
|
36
|
-
constructor(private yupSchema: any) {
|
|
37
|
-
if (!yupSchema || typeof yupSchema.validate !== 'function') {
|
|
38
|
-
throw new Error('Invalid Yup schema provided to YupAdapter');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async parseAsync(data: unknown): Promise<T> {
|
|
43
|
-
try {
|
|
44
|
-
const result = await this.yupSchema.validate(data, { abortEarly: false });
|
|
45
|
-
return result as T;
|
|
46
|
-
} catch (error) {
|
|
47
|
-
throw normalizeValidationError(error);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Custom Validation Function Adapter
|
|
54
|
-
* Allows users to use simple validation functions
|
|
55
|
-
*/
|
|
56
|
-
export class FunctionAdapter<T = any> implements ValidationSchema<T> {
|
|
57
|
-
constructor(
|
|
58
|
-
private validateFn: (data: unknown) => T | Promise<T>,
|
|
59
|
-
private name: string = 'custom'
|
|
60
|
-
) {
|
|
61
|
-
if (typeof validateFn !== 'function') {
|
|
62
|
-
throw new Error('Validation function is required for FunctionAdapter');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async parseAsync(data: unknown): Promise<T> {
|
|
67
|
-
try {
|
|
68
|
-
return await this.validateFn(data);
|
|
69
|
-
} catch (error) {
|
|
70
|
-
throw new ValidationError([
|
|
71
|
-
{
|
|
72
|
-
path: [],
|
|
73
|
-
message: error instanceof Error ? error.message : String(error),
|
|
74
|
-
code: this.name,
|
|
75
|
-
},
|
|
76
|
-
]);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Class Validator Adapter (for TypeScript decorators)
|
|
83
|
-
*/
|
|
84
|
-
export class ClassValidatorAdapter<T extends object = any> implements ValidationSchema<T> {
|
|
85
|
-
constructor(
|
|
86
|
-
private ClassType: new () => T,
|
|
87
|
-
private validate?: (obj: any) => Promise<any[]>
|
|
88
|
-
) {
|
|
89
|
-
if (typeof ClassType !== 'function') {
|
|
90
|
-
throw new Error('Class constructor is required for ClassValidatorAdapter');
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async parseAsync(data: unknown): Promise<T> {
|
|
95
|
-
try {
|
|
96
|
-
const instance = Object.assign(new this.ClassType(), data as Record<string, any>);
|
|
97
|
-
|
|
98
|
-
if (this.validate) {
|
|
99
|
-
const errors = await this.validate(instance);
|
|
100
|
-
if (errors && errors.length > 0) {
|
|
101
|
-
throw new ValidationError(
|
|
102
|
-
errors.map((error: any, index: number) => ({
|
|
103
|
-
path: error.property ? [error.property] : [index],
|
|
104
|
-
message: Object.values(error.constraints || {}).join(', ') || 'Validation failed',
|
|
105
|
-
code: 'class_validator',
|
|
106
|
-
}))
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return instance as T;
|
|
112
|
-
} catch (error) {
|
|
113
|
-
if (error instanceof ValidationError) throw error;
|
|
114
|
-
throw normalizeValidationError(error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Utility functions for creating adapters
|
|
121
|
-
*/
|
|
122
|
-
export function joi<T = any>(joiSchema: any): ValidationSchema<T> {
|
|
123
|
-
return new JoiAdapter<T>(joiSchema);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function yup<T = any>(yupSchema: any): ValidationSchema<T> {
|
|
127
|
-
return new YupAdapter<T>(yupSchema);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function fn<T = any>(
|
|
131
|
-
validateFn: (data: unknown) => T | Promise<T>,
|
|
132
|
-
name?: string
|
|
133
|
-
): ValidationSchema<T> {
|
|
134
|
-
return new FunctionAdapter<T>(validateFn, name);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function classValidator<T extends object = any>(
|
|
138
|
-
ClassType: new () => T,
|
|
139
|
-
validate?: (obj: any) => Promise<any[]>
|
|
140
|
-
): ValidationSchema<T> {
|
|
141
|
-
return new ClassValidatorAdapter<T>(ClassType, validate);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Type helpers
|
|
145
|
-
export type JoiSchema<T> = ValidationSchema<T>;
|
|
146
|
-
export type YupSchema<T> = ValidationSchema<T>;
|
|
147
|
-
export type CustomValidator<T> = ValidationSchema<T>;
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
// Universal Validation System for Moro Framework
|
|
2
|
-
// Works with Zod, Joi, Yup, and any validation library via adapters
|
|
3
|
-
|
|
4
|
-
import { HttpRequest, HttpResponse } from '../http/index.js';
|
|
5
|
-
import { createFrameworkLogger } from '../logger/index.js';
|
|
6
|
-
import { createUserRequire, isPackageAvailable } from '../utilities/package-utils.js';
|
|
7
|
-
import {
|
|
8
|
-
ValidationSchema,
|
|
9
|
-
normalizeValidationError,
|
|
10
|
-
InferSchemaType,
|
|
11
|
-
ValidationError,
|
|
12
|
-
} from './schema-interface.js';
|
|
13
|
-
|
|
14
|
-
const logger = createFrameworkLogger('Validation');
|
|
15
|
-
|
|
16
|
-
// Convenience re-export of Zod (optional - only works if zod is installed)
|
|
17
|
-
// Lazy-loads Zod synchronously on first access
|
|
18
|
-
// If zod is not installed, z will throw a helpful error
|
|
19
|
-
let zodModule: any = null;
|
|
20
|
-
let zodLoadAttempted = false;
|
|
21
|
-
|
|
22
|
-
function loadZodSync() {
|
|
23
|
-
if (zodLoadAttempted) {
|
|
24
|
-
return zodModule;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
zodLoadAttempted = true;
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
if (!isPackageAvailable('zod')) {
|
|
31
|
-
zodModule = null;
|
|
32
|
-
return zodModule;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Use synchronous require for immediate availability
|
|
36
|
-
const userRequire = createUserRequire();
|
|
37
|
-
zodModule = userRequire('zod');
|
|
38
|
-
} catch {
|
|
39
|
-
// Zod not installed or failed to load
|
|
40
|
-
zodModule = null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return zodModule;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export const z = new Proxy({} as any, {
|
|
47
|
-
get(_target, prop) {
|
|
48
|
-
const zod = loadZodSync();
|
|
49
|
-
|
|
50
|
-
if (!zod) {
|
|
51
|
-
throw new Error(
|
|
52
|
-
'Zod is not installed. Please install it with: npm install zod\n' +
|
|
53
|
-
'Or use an alternative validation library (joi, yup, class-validator) via adapters.'
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (!zod.z) {
|
|
58
|
-
throw new Error(
|
|
59
|
-
'Zod module loaded but z export not found. This may be a version compatibility issue.'
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return zod.z[prop];
|
|
64
|
-
},
|
|
65
|
-
apply(_target, thisArg, args) {
|
|
66
|
-
const zod = loadZodSync();
|
|
67
|
-
|
|
68
|
-
if (!zod?.z) {
|
|
69
|
-
throw new Error('Zod is not installed. Please install it with: npm install zod');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return zod.z.apply(thisArg, args);
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Universal validation configuration interface
|
|
77
|
-
export interface ValidationConfig {
|
|
78
|
-
body?: ValidationSchema;
|
|
79
|
-
query?: ValidationSchema;
|
|
80
|
-
params?: ValidationSchema;
|
|
81
|
-
headers?: ValidationSchema;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Validation result types
|
|
85
|
-
export interface ValidationResult<T = any> {
|
|
86
|
-
success: boolean;
|
|
87
|
-
data?: T;
|
|
88
|
-
errors?: ValidationErrorDetail[];
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export interface ValidationErrorDetail {
|
|
92
|
-
field: string;
|
|
93
|
-
message: string;
|
|
94
|
-
code: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Enhanced request type with validated data
|
|
98
|
-
export interface ValidatedRequest<T = any> extends HttpRequest {
|
|
99
|
-
validatedBody?: T;
|
|
100
|
-
validatedQuery?: any;
|
|
101
|
-
validatedParams?: any;
|
|
102
|
-
validatedHeaders?: any;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Main validation wrapper function
|
|
106
|
-
export function validate<TBody = any, TQuery = any, TParams = any>(
|
|
107
|
-
config: ValidationConfig,
|
|
108
|
-
handler: (req: ValidatedRequest<TBody>, res: HttpResponse) => any | Promise<any>
|
|
109
|
-
) {
|
|
110
|
-
return async (req: HttpRequest, res: HttpResponse): Promise<any> => {
|
|
111
|
-
try {
|
|
112
|
-
const validatedReq = req as ValidatedRequest<TBody>;
|
|
113
|
-
|
|
114
|
-
// Validate body
|
|
115
|
-
if (config.body) {
|
|
116
|
-
const result = await validateField(config.body, req.body, 'body');
|
|
117
|
-
if (!result.success) {
|
|
118
|
-
return sendValidationError(res, result.errors!, 'body');
|
|
119
|
-
}
|
|
120
|
-
validatedReq.validatedBody = result.data;
|
|
121
|
-
validatedReq.body = result.data; // Also update original body for compatibility
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Validate query parameters
|
|
125
|
-
if (config.query) {
|
|
126
|
-
const result = await validateField(config.query, req.query, 'query');
|
|
127
|
-
if (!result.success) {
|
|
128
|
-
return sendValidationError(res, result.errors!, 'query');
|
|
129
|
-
}
|
|
130
|
-
validatedReq.validatedQuery = result.data;
|
|
131
|
-
validatedReq.query = result.data; // Also update original query for compatibility
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Validate path parameters
|
|
135
|
-
if (config.params) {
|
|
136
|
-
const result = await validateField(config.params, req.params, 'params');
|
|
137
|
-
if (!result.success) {
|
|
138
|
-
return sendValidationError(res, result.errors!, 'params');
|
|
139
|
-
}
|
|
140
|
-
validatedReq.validatedParams = result.data;
|
|
141
|
-
validatedReq.params = result.data; // Also update original params for compatibility
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Validate headers
|
|
145
|
-
if (config.headers) {
|
|
146
|
-
const result = await validateField(config.headers, req.headers, 'headers');
|
|
147
|
-
if (!result.success) {
|
|
148
|
-
return sendValidationError(res, result.errors!, 'headers');
|
|
149
|
-
}
|
|
150
|
-
validatedReq.validatedHeaders = result.data;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
logger.debug('Request validation passed', 'ValidationSuccess', {
|
|
154
|
-
path: req.path,
|
|
155
|
-
method: req.method,
|
|
156
|
-
validatedFields: Object.keys(config),
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
// Execute the handler with validated request
|
|
160
|
-
return await handler(validatedReq, res);
|
|
161
|
-
} catch (error) {
|
|
162
|
-
logger.error('Validation wrapper error', 'ValidationError', {
|
|
163
|
-
error: error instanceof Error ? error.message : String(error),
|
|
164
|
-
path: req.path,
|
|
165
|
-
method: req.method,
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
if (!res.headersSent) {
|
|
169
|
-
res.status(500).json({
|
|
170
|
-
success: false,
|
|
171
|
-
error: 'Internal validation error',
|
|
172
|
-
requestId: req.requestId,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Validate individual field using universal schema interface
|
|
180
|
-
async function validateField(
|
|
181
|
-
schema: ValidationSchema,
|
|
182
|
-
data: any,
|
|
183
|
-
fieldName: string
|
|
184
|
-
): Promise<ValidationResult> {
|
|
185
|
-
try {
|
|
186
|
-
const validated = await schema.parseAsync(data);
|
|
187
|
-
return {
|
|
188
|
-
success: true,
|
|
189
|
-
data: validated,
|
|
190
|
-
};
|
|
191
|
-
} catch (error) {
|
|
192
|
-
const normalizedError = normalizeValidationError(error);
|
|
193
|
-
const errors: ValidationErrorDetail[] = normalizedError.issues.map(issue => ({
|
|
194
|
-
field: issue.path.length > 0 ? issue.path.join('.') : fieldName,
|
|
195
|
-
message: issue.message,
|
|
196
|
-
code: issue.code,
|
|
197
|
-
}));
|
|
198
|
-
|
|
199
|
-
logger.debug('Field validation failed', 'ValidationFailed', {
|
|
200
|
-
field: fieldName,
|
|
201
|
-
errors: errors.length,
|
|
202
|
-
details: errors,
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
return {
|
|
206
|
-
success: false,
|
|
207
|
-
errors,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Send validation error response
|
|
213
|
-
function sendValidationError(
|
|
214
|
-
res: HttpResponse,
|
|
215
|
-
errors: ValidationErrorDetail[],
|
|
216
|
-
field: string
|
|
217
|
-
): void {
|
|
218
|
-
logger.debug('Sending validation error response', 'ValidationResponse', {
|
|
219
|
-
field,
|
|
220
|
-
errorCount: errors.length,
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
res.status(400).json({
|
|
224
|
-
success: false,
|
|
225
|
-
error: `Validation failed for ${field}`,
|
|
226
|
-
details: errors,
|
|
227
|
-
requestId: (res as any).req?.requestId,
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Convenience functions for single-field validation
|
|
232
|
-
export function body<T>(schema: ValidationSchema<T>) {
|
|
233
|
-
return (handler: (req: ValidatedRequest<T>, res: HttpResponse) => any | Promise<any>) => {
|
|
234
|
-
return validate({ body: schema }, handler);
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
export function query<T>(schema: ValidationSchema<T>) {
|
|
239
|
-
return (handler: (req: ValidatedRequest<any>, res: HttpResponse) => any | Promise<any>) => {
|
|
240
|
-
return validate({ query: schema }, handler);
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
export function params<T>(schema: ValidationSchema<T>) {
|
|
245
|
-
return (handler: (req: ValidatedRequest<any>, res: HttpResponse) => any | Promise<any>) => {
|
|
246
|
-
return validate({ params: schema }, handler);
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Schema composition helpers
|
|
251
|
-
export function combineSchemas(schemas: ValidationConfig): ValidationConfig {
|
|
252
|
-
return schemas;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Re-export common validation tools
|
|
256
|
-
export { ValidationError, normalizeValidationError } from './schema-interface.js';
|
|
257
|
-
export type { ValidationSchema, InferSchemaType } from './schema-interface.js';
|
|
258
|
-
export { joi, yup, fn as customValidator, classValidator } from './adapters.js';
|