@morojs/moro 1.7.30 → 1.8.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 +89 -46
- package/dist/core/auth/morojs-adapter.js +95 -45
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-manager.js.map +1 -1
- package/dist/core/config/config-sources.js +119 -48
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.js +189 -8
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.js +35 -4
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.js +2 -2
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -0
- package/dist/core/database/adapters/mongodb.js +16 -0
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -0
- package/dist/core/database/adapters/mysql.js +13 -2
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.js +2 -2
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sql-safety.js +5 -4
- package/dist/core/database/adapters/sql-safety.js.map +1 -1
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.js +11 -7
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.js +8 -6
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.js +3 -3
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +2 -2
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.js +14 -5
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +41 -3
- package/dist/core/framework.js +342 -95
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/adapter.js.map +1 -1
- package/dist/core/graphql/adapters/graphql-js-adapter.js.map +1 -1
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/graphql/index.js.map +1 -1
- package/dist/core/graphql/loader.js.map +1 -1
- package/dist/core/graphql/types.js.map +1 -1
- package/dist/core/grpc/adapters/grpc-js-adapter.js +4 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -1
- package/dist/core/grpc/adapters/index.js.map +1 -1
- package/dist/core/grpc/grpc-adapter.js.map +1 -1
- package/dist/core/grpc/grpc-manager.js.map +1 -1
- package/dist/core/grpc/index.js.map +1 -1
- package/dist/core/grpc/middleware/auth.js +1 -1
- package/dist/core/grpc/middleware/auth.js.map +1 -1
- package/dist/core/grpc/middleware/logging.js.map +1 -1
- package/dist/core/grpc/middleware/validation.js +1 -1
- package/dist/core/grpc/middleware/validation.js.map +1 -1
- package/dist/core/grpc/types.d.ts +7 -7
- package/dist/core/grpc/types.js.map +1 -1
- package/dist/core/http/http-server.d.ts +17 -23
- package/dist/core/http/http-server.js +109 -249
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.d.ts +6 -16
- package/dist/core/http/http2-server.js +40 -83
- package/dist/core/http/http2-server.js.map +1 -1
- package/dist/core/http/index.d.ts +1 -0
- package/dist/core/http/index.js +3 -0
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/moro-engine-server.d.ts +263 -0
- package/dist/core/http/moro-engine-server.js +1962 -0
- package/dist/core/http/moro-engine-server.js.map +1 -0
- package/dist/core/http/utils/compression.d.ts +47 -0
- package/dist/core/http/utils/compression.js +132 -0
- package/dist/core/http/utils/compression.js.map +1 -0
- package/dist/core/http/utils/lazy-event-emitter.d.ts +11 -0
- package/dist/core/http/utils/lazy-event-emitter.js +69 -0
- package/dist/core/http/utils/lazy-event-emitter.js.map +1 -0
- package/dist/core/http/utils/multipart-parser.d.ts +32 -0
- package/dist/core/http/utils/multipart-parser.js +215 -0
- package/dist/core/http/utils/multipart-parser.js.map +1 -0
- package/dist/core/http/utils/query-parser.d.ts +1 -0
- package/dist/core/http/utils/query-parser.js +44 -0
- package/dist/core/http/utils/query-parser.js.map +1 -0
- package/dist/core/http/utils/size.d.ts +33 -0
- package/dist/core/http/utils/size.js +37 -0
- package/dist/core/http/utils/size.js.map +1 -0
- package/dist/core/http/utils/ssl-config.d.ts +69 -0
- package/dist/core/http/utils/ssl-config.js +116 -0
- package/dist/core/http/utils/ssl-config.js.map +1 -0
- package/dist/core/http/utils/uws-worker-clustering.js +45 -32
- package/dist/core/http/utils/uws-worker-clustering.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +25 -3
- package/dist/core/http/uws-http-server.js +465 -86
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/jobs/cron-parser.js +7 -5
- package/dist/core/jobs/cron-parser.js.map +1 -1
- package/dist/core/jobs/index.js.map +1 -1
- package/dist/core/jobs/job-executor.d.ts +1 -1
- package/dist/core/jobs/job-executor.js.map +1 -1
- package/dist/core/jobs/job-scheduler.d.ts +3 -3
- package/dist/core/jobs/job-scheduler.js.map +1 -1
- package/dist/core/jobs/job-state-manager.d.ts +3 -3
- package/dist/core/jobs/job-state-manager.js +25 -4
- package/dist/core/jobs/job-state-manager.js.map +1 -1
- package/dist/core/jobs/leader-election.d.ts +15 -0
- package/dist/core/jobs/leader-election.js +158 -69
- package/dist/core/jobs/leader-election.js.map +1 -1
- package/dist/core/jobs/types.d.ts +4 -4
- package/dist/core/jobs/types.js.map +1 -1
- package/dist/core/jobs/utils.d.ts +1 -1
- package/dist/core/jobs/utils.js +7 -3
- package/dist/core/jobs/utils.js.map +1 -1
- package/dist/core/logger/filters.js +3 -2
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.js +56 -25
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/mail/adapters/console-adapter.js.map +1 -1
- package/dist/core/mail/adapters/index.js.map +1 -1
- package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -1
- package/dist/core/mail/adapters/resend-adapter.js.map +1 -1
- package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -1
- package/dist/core/mail/adapters/ses-adapter.js.map +1 -1
- package/dist/core/mail/index.js.map +1 -1
- package/dist/core/mail/mail-adapter.js.map +1 -1
- package/dist/core/mail/mail-manager.d.ts +10 -0
- package/dist/core/mail/mail-manager.js +21 -5
- package/dist/core/mail/mail-manager.js.map +1 -1
- package/dist/core/mail/template-engine.js.map +1 -1
- package/dist/core/mail/types.js.map +1 -1
- package/dist/core/middleware/built-in/auth/core.js +3 -3
- package/dist/core/middleware/built-in/auth/core.js.map +1 -1
- package/dist/core/middleware/built-in/auth/helpers.js +4 -4
- package/dist/core/middleware/built-in/auth/helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth/hook.js.map +1 -1
- package/dist/core/middleware/built-in/auth/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth/jwt-helpers.d.ts +4 -4
- package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/auth/providers.js.map +1 -1
- package/dist/core/middleware/built-in/body-parsers/index.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/core.js +2 -2
- package/dist/core/middleware/built-in/body-size/core.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/hook.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/index.js.map +1 -1
- package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js +3 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/cache/core.js.map +1 -1
- package/dist/core/middleware/built-in/cache/hook.js +3 -3
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/cache/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/core.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/compression/core.d.ts +3 -0
- package/dist/core/middleware/built-in/compression/core.js +28 -34
- package/dist/core/middleware/built-in/compression/core.js.map +1 -1
- package/dist/core/middleware/built-in/compression/hook.js.map +1 -1
- package/dist/core/middleware/built-in/compression/index.js.map +1 -1
- package/dist/core/middleware/built-in/compression/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/index.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/cors/core.js.map +1 -1
- package/dist/core/middleware/built-in/cors/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cors/index.js.map +1 -1
- package/dist/core/middleware/built-in/cors/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/csp/core.js.map +1 -1
- package/dist/core/middleware/built-in/csp/hook.js.map +1 -1
- package/dist/core/middleware/built-in/csp/index.js.map +1 -1
- package/dist/core/middleware/built-in/csp/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/core.js +1 -1
- package/dist/core/middleware/built-in/csrf/core.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/hook.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/index.js.map +1 -1
- package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/core.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/helpers.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/hook.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/index.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/graphql/subscriptions.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/core.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/hook.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/index.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/http2/core.js.map +1 -1
- package/dist/core/middleware/built-in/http2/hook.js.map +1 -1
- package/dist/core/middleware/built-in/http2/index.js.map +1 -1
- package/dist/core/middleware/built-in/http2/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/range/core.js +4 -1
- package/dist/core/middleware/built-in/range/core.js.map +1 -1
- package/dist/core/middleware/built-in/range/hook.js.map +1 -1
- package/dist/core/middleware/built-in/range/index.js.map +1 -1
- package/dist/core/middleware/built-in/range/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/session/core.js +4 -4
- package/dist/core/middleware/built-in/session/core.js.map +1 -1
- package/dist/core/middleware/built-in/session/hook.js.map +1 -1
- package/dist/core/middleware/built-in/session/index.js.map +1 -1
- package/dist/core/middleware/built-in/session/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/sse/core.js.map +1 -1
- package/dist/core/middleware/built-in/sse/hook.js.map +1 -1
- package/dist/core/middleware/built-in/sse/index.js.map +1 -1
- package/dist/core/middleware/built-in/sse/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/static/core.js.map +1 -1
- package/dist/core/middleware/built-in/static/hook.js.map +1 -1
- package/dist/core/middleware/built-in/static/index.js.map +1 -1
- package/dist/core/middleware/built-in/static/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/template/core.js +1 -1
- package/dist/core/middleware/built-in/template/core.js.map +1 -1
- package/dist/core/middleware/built-in/template/hook.js.map +1 -1
- package/dist/core/middleware/built-in/template/index.js.map +1 -1
- package/dist/core/middleware/built-in/template/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/upload/core.js.map +1 -1
- package/dist/core/middleware/built-in/upload/hook.js.map +1 -1
- package/dist/core/middleware/built-in/upload/index.js.map +1 -1
- package/dist/core/middleware/built-in/upload/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/validation/core.js.map +1 -1
- package/dist/core/middleware/built-in/validation/hook.js.map +1 -1
- package/dist/core/middleware/built-in/validation/index.js.map +1 -1
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
- package/dist/core/middleware/index.js +2 -2
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.js +11 -7
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.js +18 -13
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/engine-adapter.d.ts +23 -0
- package/dist/core/networking/adapters/engine-adapter.js +365 -0
- package/dist/core/networking/adapters/engine-adapter.js.map +1 -0
- package/dist/core/networking/adapters/index.d.ts +1 -0
- package/dist/core/networking/adapters/index.js +1 -0
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -0
- package/dist/core/networking/adapters/socketio-adapter.js +12 -1
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.js +27 -16
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +15 -0
- package/dist/core/networking/adapters/ws-adapter.js +120 -6
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +7 -5
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.d.ts +22 -3
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.js +70 -67
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.js +6 -0
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/queue/adapters/bull-adapter.js.map +1 -1
- package/dist/core/queue/adapters/index.js.map +1 -1
- package/dist/core/queue/adapters/kafka-adapter.js +2 -2
- package/dist/core/queue/adapters/kafka-adapter.js.map +1 -1
- package/dist/core/queue/adapters/memory-adapter.js +6 -6
- package/dist/core/queue/adapters/memory-adapter.js.map +1 -1
- package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +50 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js +176 -20
- package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -1
- package/dist/core/queue/adapters/sqs-adapter.d.ts +12 -2
- package/dist/core/queue/adapters/sqs-adapter.js +75 -24
- package/dist/core/queue/adapters/sqs-adapter.js.map +1 -1
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/queue/middleware/index.js.map +1 -1
- package/dist/core/queue/middleware/monitoring.d.ts +1 -1
- package/dist/core/queue/middleware/monitoring.js.map +1 -1
- package/dist/core/queue/middleware/priority.js +2 -1
- package/dist/core/queue/middleware/priority.js.map +1 -1
- package/dist/core/queue/middleware/rate-limit.js.map +1 -1
- package/dist/core/queue/queue-adapter.js.map +1 -1
- package/dist/core/queue/queue-manager.js.map +1 -1
- package/dist/core/queue/types.d.ts +8 -8
- package/dist/core/queue/types.js.map +1 -1
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/create-router.js.map +1 -1
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/path-matcher.js.map +1 -1
- package/dist/core/routing/radix-tree.js.map +1 -1
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/unified-router.js +12 -4
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.js +2 -2
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.js +2 -0
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.js +19 -17
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.js +2 -0
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.d.ts +1 -0
- package/dist/core/utilities/circuit-breaker.js +25 -2
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +9 -9
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.js +28 -6
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/module-path.js.map +1 -1
- package/dist/core/utilities/package-utils.d.ts +68 -0
- package/dist/core/utilities/package-utils.js +198 -1
- package/dist/core/utilities/package-utils.js.map +1 -1
- package/dist/core/utilities/response-helpers.js +1 -1
- package/dist/core/utilities/response-helpers.js.map +1 -1
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/error-handler.js.map +1 -1
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/core/workers/facade.js.map +1 -1
- package/dist/core/workers/index.js.map +1 -1
- package/dist/core/workers/worker-entry.d.ts +1 -0
- package/dist/core/workers/worker-entry.js +12 -0
- package/dist/core/workers/worker-entry.js.map +1 -0
- package/dist/core/workers/worker-manager.d.ts +23 -2
- package/dist/core/workers/worker-manager.js +117 -17
- package/dist/core/workers/worker-manager.js.map +1 -1
- package/dist/core/workers/worker.js +8 -6
- package/dist/core/workers/worker.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +20 -1
- package/dist/moro.js +230 -70
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.d.ts +4 -4
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js.map +1 -1
- package/dist/types/cdn.js.map +1 -1
- package/dist/types/config.d.ts +100 -15
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.js.map +1 -1
- package/dist/types/database.js.map +1 -1
- package/dist/types/discovery.js.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/hooks.js.map +1 -1
- package/dist/types/http.js.map +1 -1
- package/dist/types/logger.js.map +1 -1
- package/dist/types/module.js.map +1 -1
- package/dist/types/runtime.js.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/package.json +32 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/session/hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAC;AAE7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAA0B,EAAE,EAAuB,EAAE,CAAC,CAAC;IAC7E,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,4DAA4D;QACzE,MAAM,EAAE,aAAa;KACtB;IAED,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,oBAAyB,EAAE,EAAE,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC,CAAC;QAE9D,gBAAgB;QAChB,MAAM,MAAM,GAAmB;YAC7B,GAAG,OAAO;YACV,GAAG,iBAAiB;SACrB,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC;QAEhD,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAc,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAe,CAAC;YAEpC,6BAA6B;YAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAE5C,4BAA4B;YAC5B,GAAG,CAAC,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAc,CAAC;YAEnC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,KAAK,QAAQ,EAAE,cAAc,CAAC,CAAC;IACzF,CAAC;CACF,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/session/hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAC;AAE7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAA0B,EAAE,EAAuB,EAAE,CAAC,CAAC;IAC7E,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,4DAA4D;QACzE,MAAM,EAAE,aAAa;KACtB;IAED,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,oBAAyB,EAAE,EAAE,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC,CAAC;QAE9D,gBAAgB;QAChB,MAAM,MAAM,GAAmB;YAC7B,GAAG,OAAO;YACV,GAAG,iBAAiB;SACrB,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC;QAEhD,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAc,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAe,CAAC;YAEpC,6BAA6B;YAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAE5C,4BAA4B;YAC5B,GAAG,CAAC,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAc,CAAC;YAEnC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,KAAK,QAAQ,EAAE,cAAc,CAAC,CAAC;IACzF,CAAC;CACF,CAAC,CAAC","sourcesContent":["// Session Hook - MiddlewareInterface for global registration\nimport { MiddlewareInterface, HookContext } from '../../../../types/hooks.js';\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { SessionCore, type SessionOptions } from './core.js';\n\nconst logger = createFrameworkLogger('SessionMiddleware');\n\n/**\n * Session hook for global usage\n * Registers with the hooks system for application-wide session management\n *\n * @example\n * ```ts\n * import { session } from '@/middleware/built-in/session';\n *\n * app.use(session({\n * store: 'redis',\n * cookie: { maxAge: 86400000 }\n * }));\n * ```\n */\nexport const session = (options: SessionOptions = {}): MiddlewareInterface => ({\n name: 'session',\n version: '1.0.0',\n metadata: {\n name: 'session',\n version: '1.0.0',\n description: 'Session management middleware with multiple store adapters',\n author: 'MoroJS Team',\n },\n\n install: async (hooks: any, middlewareOptions: any = {}) => {\n logger.debug('Installing session middleware', 'Installation');\n\n // Merge options\n const config: SessionOptions = {\n ...options,\n ...middlewareOptions,\n };\n\n const sessionCore = new SessionCore(config);\n const cookieName = config.name || 'connect.sid';\n\n hooks.before('request', async (context: HookContext) => {\n const req = context.request as any;\n const res = context.response as any;\n\n // Get session ID from cookie\n const sessionId = req.cookies?.[cookieName];\n\n // Attach session to request\n req.session = await sessionCore.attachSession(req, res, sessionId);\n });\n\n hooks.after('response', async (context: HookContext) => {\n const req = context.request as any;\n\n if (req.session) {\n await sessionCore.saveSession(req.session);\n }\n });\n\n logger.info(`Session middleware installed with ${config.store} store`, 'Installation');\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/session/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,sDAAsD;AAEtD,6DAA6D;AAC7D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAyC,MAAM,WAAW,CAAC;AAExF,qCAAqC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,iCAAiC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/session/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,sDAAsD;AAEtD,6DAA6D;AAC7D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAyC,MAAM,WAAW,CAAC;AAExF,qCAAqC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,iCAAiC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC","sourcesContent":["// Session - Main entry point\n// Re-exports all public APIs for the session built-in\n\n// Core (for direct use by router and custom implementations)\nexport { Session, SessionCore, type SessionOptions, type SessionData } from './core.js';\n\n// Middleware (for middleware chains)\nexport { createSessionMiddleware } from './middleware.js';\n\n// Hook (for global registration)\nexport { session } from './hook.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/session/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAC;AAE7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA0B,EAAE;IAClE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC;IAEjD,OAAO,KAAK,EAAE,GAAgB,EAAE,GAAiB,EAAE,IAAyB,EAAE,EAAE;QAC9E,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAE5C,4BAA4B;YAC3B,GAAW,CAAC,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YAE5E,0BAA0B;YAC1B,MAAM,IAAI,EAAE,CAAC;YAEb,8BAA8B;YAC9B,MAAM,WAAW,CAAC,WAAW,CAAE,GAAW,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/session/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAC;AAE7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA0B,EAAE;IAClE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC;IAEjD,OAAO,KAAK,EAAE,GAAgB,EAAE,GAAiB,EAAE,IAAyB,EAAE,EAAE;QAC9E,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAE5C,4BAA4B;YAC3B,GAAW,CAAC,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YAE5E,0BAA0B;YAC1B,MAAM,IAAI,EAAE,CAAC;YAEb,8BAA8B;YAC9B,MAAM,WAAW,CAAC,WAAW,CAAE,GAAW,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Session Middleware - Standard (req, res, next) middleware function\nimport { StandardMiddleware } from '../../../../types/hooks.js';\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\nimport { SessionCore, type SessionOptions } from './core.js';\n\nconst logger = createFrameworkLogger('SessionMiddleware');\n\n/**\n * Create session middleware for use in middleware chains\n *\n * @example\n * ```ts\n * const sessionMw = createSessionMiddleware({\n * store: 'redis',\n * name: 'my-session',\n * cookie: { maxAge: 3600000 }\n * });\n *\n * app.use(sessionMw);\n * ```\n */\nexport function createSessionMiddleware(options: SessionOptions = {}): StandardMiddleware {\n const sessionCore = new SessionCore(options);\n const cookieName = options.name || 'connect.sid';\n\n return async (req: HttpRequest, res: HttpResponse, next: () => Promise<void>) => {\n try {\n // Get session ID from cookie\n const sessionId = req.cookies?.[cookieName];\n\n // Attach session to request\n (req as any).session = await sessionCore.attachSession(req, res, sessionId);\n\n // Execute next middleware\n await next();\n\n // Save session after response\n await sessionCore.saveSession((req as any).session);\n } catch (error) {\n logger.error('Session middleware error', 'SessionError', { error });\n throw error;\n }\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/core.ts"],"names":[],"mappings":"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","sourcesContent":["// SSE Core - Reusable Server-Sent Events logic\nimport { HttpResponse } from '../../../../types/http.js';\n\n// ===== Types =====\n\nexport interface SSEOptions {\n heartbeat?: number;\n retry?: number;\n cors?: boolean;\n}\n\nexport interface SSEConnection {\n sendEvent: (data: any, event?: string, id?: string) => void;\n sendComment: (comment: string) => void;\n sendRetry: (ms: number) => void;\n close: () => void;\n}\n\n// ===== Core Logic =====\n\n/**\n * Format SSE event data\n */\nexport function formatSSEEvent(data: any, event?: string, id?: string): string {\n let message = '';\n\n if (id) {\n message += `id: ${id}\\n`;\n }\n\n if (event) {\n message += `event: ${event}\\n`;\n }\n\n const dataStr = typeof data === 'string' ? data : JSON.stringify(data);\n message += `data: ${dataStr}\\n\\n`;\n\n return message;\n}\n\n/**\n * Format SSE comment\n */\nexport function formatSSEComment(comment: string): string {\n return `: ${comment}\\n\\n`;\n}\n\n/**\n * Format SSE retry directive\n */\nexport function formatSSERetry(ms: number): string {\n return `retry: ${ms}\\n\\n`;\n}\n\n/**\n * SSECore - Core Server-Sent Events management logic\n * Used directly by the router for route-based SSE\n */\nexport class SSECore {\n private options: SSEOptions;\n\n constructor(options: SSEOptions = {}) {\n this.options = options;\n }\n\n /**\n * Check if request accepts SSE\n */\n isSSERequest(acceptHeader?: string): boolean {\n if (!acceptHeader) {\n return false;\n }\n return acceptHeader.includes('text/event-stream');\n }\n\n /**\n * Initialize SSE headers on response\n */\n initializeSSE(res: HttpResponse): void {\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n };\n\n if (this.options.cors) {\n headers['Access-Control-Allow-Origin'] = '*';\n headers['Access-Control-Allow-Headers'] = 'Cache-Control';\n }\n\n res.writeHead(200, headers);\n }\n\n /**\n * Create SSE connection with helper methods\n */\n createConnection(res: HttpResponse, onClose?: () => void): SSEConnection {\n const resAny = res as any;\n let heartbeatInterval: NodeJS.Timeout | null = null;\n let closed = false;\n\n // Send initial retry if configured\n if (this.options.retry) {\n resAny.write(formatSSERetry(this.options.retry));\n }\n\n // Set up heartbeat if configured\n if (this.options.heartbeat) {\n heartbeatInterval = setInterval(() => {\n if (!closed) {\n resAny.write(formatSSEComment('heartbeat'));\n }\n }, this.options.heartbeat);\n }\n\n const connection: SSEConnection = {\n sendEvent: (data: any, event?: string, id?: string) => {\n if (!closed) {\n resAny.write(formatSSEEvent(data, event, id));\n }\n },\n\n sendComment: (comment: string) => {\n if (!closed) {\n resAny.write(formatSSEComment(comment));\n }\n },\n\n sendRetry: (ms: number) => {\n if (!closed) {\n resAny.write(formatSSERetry(ms));\n }\n },\n\n close: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (heartbeatInterval) {\n clearInterval(heartbeatInterval);\n heartbeatInterval = null;\n }\n\n if (onClose) {\n onClose();\n }\n\n if (resAny.end && !resAny.writableEnded) {\n resAny.end();\n }\n },\n };\n\n return connection;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,OAAO,EAAmB,MAAM,WAAW,CAAC;AAErD,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,UAAsB,EAAE,EAAuB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,gEAAgE;QAC7E,MAAM,EAAE,aAAa;KACtB;IAED,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,oBAAyB,EAAE,EAAE,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAc,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAe,CAAC;YAEpC,2BAA2B;YAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC;YAEtD,4BAA4B;YAC5B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YAED,mDAAmD;YACnD,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;gBACpD,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;YACrC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;YACzC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;YAErC,oBAAoB;YACpB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,gDAAgD;YAC/C,OAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,OAAO,EAAmB,MAAM,WAAW,CAAC;AAErD,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,UAAsB,EAAE,EAAuB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,gEAAgE;QAC7E,MAAM,EAAE,aAAa;KACtB;IAED,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,oBAAyB,EAAE,EAAE,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAc,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAe,CAAC;YAEpC,2BAA2B;YAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC;YAEtD,4BAA4B;YAC5B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YAED,mDAAmD;YACnD,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;gBACpD,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;YACrC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;YACzC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;YAErC,oBAAoB;YACpB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,gDAAgD;YAC/C,OAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC","sourcesContent":["// SSE Hook - MiddlewareInterface for global registration\nimport { MiddlewareInterface, HookContext } from '../../../../types/hooks.js';\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { SSECore, type SSEOptions } from './core.js';\n\nconst logger = createFrameworkLogger('SSEMiddleware');\n\n/**\n * SSE hook for global usage\n * Registers with the hooks system for application-wide Server-Sent Events support\n *\n * @example\n * ```ts\n * import { sse } from '@/middleware/built-in/sse';\n *\n * app.use(sse({\n * heartbeat: 30000,\n * retry: 3000,\n * cors: true\n * }));\n * ```\n */\nexport const sse = (options: SSEOptions = {}): MiddlewareInterface => ({\n name: 'sse',\n version: '1.0.0',\n metadata: {\n name: 'sse',\n version: '1.0.0',\n description: 'Server-Sent Events middleware with heartbeat and retry support',\n author: 'MoroJS Team',\n },\n\n install: async (hooks: any, middlewareOptions: any = {}) => {\n logger.debug('Installing SSE middleware', 'Installation', { options: middlewareOptions });\n\n const config = { ...options, ...middlewareOptions };\n const sseCore = new SSECore(config);\n\n hooks.before('request', async (context: HookContext) => {\n const req = context.request as any;\n const res = context.response as any;\n\n // Only handle SSE requests\n if (!sseCore.isSSERequest(req.headers.accept)) {\n return;\n }\n\n logger.debug('Setting up SSE connection', 'SSESetup');\n\n // Initialize SSE connection\n if (!res.headersSent) {\n sseCore.initializeSSE(res);\n }\n\n // Create connection and attach methods to response\n const connection = sseCore.createConnection(res, () => {\n logger.debug('SSE connection closed', 'SSECleanup');\n });\n\n res.sendEvent = connection.sendEvent;\n res.sendComment = connection.sendComment;\n res.sendRetry = connection.sendRetry;\n\n // Clean up on close\n req.on('close', () => {\n connection.close();\n });\n\n // Mark that this middleware handled the request\n (context as any).handled = true;\n });\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,kDAAkD;AAElD,6DAA6D;AAC7D,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,cAAc,GAGf,MAAM,WAAW,CAAC;AAEnB,qCAAqC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,iCAAiC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,kDAAkD;AAElD,6DAA6D;AAC7D,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,cAAc,GAGf,MAAM,WAAW,CAAC;AAEnB,qCAAqC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,iCAAiC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC","sourcesContent":["// SSE - Main entry point\n// Re-exports all public APIs for the SSE built-in\n\n// Core (for direct use by router and custom implementations)\nexport {\n SSECore,\n formatSSEEvent,\n formatSSEComment,\n formatSSERetry,\n type SSEOptions,\n type SSEConnection,\n} from './core.js';\n\n// Middleware (for middleware chains)\nexport { createSSEMiddleware } from './middleware.js';\n\n// Hook (for global registration)\nexport { sse } from './hook.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAmB,MAAM,WAAW,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAsB,EAAE;IAC1D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,KAAK,EAAE,GAAgB,EAAE,GAAiB,EAAE,IAAyB,EAAE,EAAE;QAC9E,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAG,GAAU,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,mDAAmD;QACnD,MAAM,MAAM,GAAG,GAAU,CAAC;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEjD,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACxC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAC5C,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QAExC,oBAAoB;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/sse/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAmB,MAAM,WAAW,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAsB,EAAE;IAC1D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,KAAK,EAAE,GAAgB,EAAE,GAAiB,EAAE,IAAyB,EAAE,EAAE;QAC9E,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAG,GAAU,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,mDAAmD;QACnD,MAAM,MAAM,GAAG,GAAU,CAAC;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEjD,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACxC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAC5C,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QAExC,oBAAoB;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// SSE Middleware - Standard (req, res, next) middleware function\nimport { StandardMiddleware } from '../../../../types/hooks.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\nimport { SSECore, type SSEOptions } from './core.js';\n\n/**\n * Create SSE middleware for use in middleware chains\n * Only activates for requests with 'text/event-stream' Accept header\n *\n * @example\n * ```ts\n * const sseMw = createSSEMiddleware({\n * heartbeat: 30000,\n * retry: 3000,\n * cors: true\n * });\n *\n * app.use(sseMw);\n * ```\n */\nexport function createSSEMiddleware(options: SSEOptions = {}): StandardMiddleware {\n const sseCore = new SSECore(options);\n\n return async (req: HttpRequest, res: HttpResponse, next: () => Promise<void>) => {\n // Only handle SSE requests\n if (!sseCore.isSSERequest(req.headers.accept)) {\n await next();\n return;\n }\n\n // Initialize SSE connection\n const resAny = res as any;\n if (!resAny.headersSent) {\n sseCore.initializeSSE(res);\n }\n\n // Create connection and attach methods to response\n const reqAny = req as any;\n const connection = sseCore.createConnection(res);\n\n resAny.sendEvent = connection.sendEvent;\n resAny.sendComment = connection.sendComment;\n resAny.sendRetry = connection.sendRetry;\n\n // Clean up on close\n reqAny.on('close', () => {\n connection.close();\n });\n\n await next();\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/core.ts"],"names":[],"mappings":"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","sourcesContent":["// Static File Serving Core Logic\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\n\nexport interface StaticOptions {\n root: string;\n maxAge?: number;\n index?: string[];\n dotfiles?: 'allow' | 'deny' | 'ignore';\n etag?: boolean;\n}\n\nexport class StaticCore {\n private root: string;\n private maxAge: number;\n private index: string[];\n private dotfiles: 'allow' | 'deny' | 'ignore';\n private etag: boolean;\n\n private mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.eot': 'application/vnd.ms-fontobject',\n };\n\n constructor(options: StaticOptions) {\n this.root = path.resolve(options.root);\n this.maxAge = options.maxAge || 0;\n this.index = options.index || ['index.html', 'index.htm'];\n this.dotfiles = options.dotfiles || 'ignore';\n this.etag = options.etag !== false;\n }\n\n async handleRequest(req: HttpRequest, res: HttpResponse): Promise<boolean> {\n // Only handle GET and HEAD requests\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n return false;\n }\n\n try {\n let filePath = path.join(this.root, req.path);\n\n // Security: prevent directory traversal. The trailing separator is required —\n // a bare prefix check would allow sibling dirs like `/app/static-backups` to\n // satisfy `startsWith('/app/static')` and escape the root.\n const rootWithSep = this.root.endsWith(path.sep) ? this.root : this.root + path.sep;\n if (filePath !== this.root && !filePath.startsWith(rootWithSep)) {\n res.status(403).json({ success: false, error: 'Forbidden' });\n return true;\n }\n\n // Security: resolve symlinks and re-check path to prevent symlink-based traversal\n try {\n const realPath = await fs.realpath(filePath);\n if (realPath !== this.root && !realPath.startsWith(rootWithSep)) {\n res.status(403).json({ success: false, error: 'Forbidden' });\n return true;\n }\n filePath = realPath;\n } catch {\n // realpath fails if file doesn't exist — handled by stat below\n }\n\n // Handle dotfiles\n const basename = path.basename(filePath);\n if (basename.startsWith('.')) {\n if (this.dotfiles === 'deny') {\n res.status(403).json({ success: false, error: 'Forbidden' });\n return true;\n } else if (this.dotfiles === 'ignore') {\n return false;\n }\n }\n\n let stats;\n try {\n stats = await fs.stat(filePath);\n } catch {\n return false; // File not found, let other middleware handle\n }\n\n // Handle directories\n if (stats.isDirectory()) {\n let indexFound = false;\n\n for (const indexFile of this.index) {\n const indexPath = path.join(filePath, indexFile);\n try {\n const indexStats = await fs.stat(indexPath);\n if (indexStats.isFile()) {\n filePath = indexPath;\n stats = indexStats;\n indexFound = true;\n break;\n }\n } catch {\n // Continue to next index file\n }\n }\n\n if (!indexFound) {\n return false;\n }\n }\n\n // Get mime type and add charset for text files\n const ext = path.extname(filePath);\n const baseMimeType = this.mimeTypes[ext.toLowerCase()] || 'application/octet-stream';\n const contentType = this.addCharsetIfNeeded(baseMimeType);\n\n res.setHeader('Content-Type', contentType);\n res.setHeader('Content-Length', stats.size);\n\n // Cache headers\n if (this.maxAge > 0) {\n res.setHeader('Cache-Control', `public, max-age=${this.maxAge}`);\n }\n\n // ETag support\n if (this.etag) {\n const etag = crypto\n .createHash('md5')\n .update(`${stats.mtime.getTime()}-${stats.size}`)\n .digest('hex');\n res.setHeader('ETag', `\"${etag}\"`);\n\n // Handle conditional requests\n const ifNoneMatch = req.headers['if-none-match'];\n if (ifNoneMatch === `\"${etag}\"`) {\n res.statusCode = 304;\n res.end();\n return true;\n }\n }\n\n // Handle HEAD requests\n if (req.method === 'HEAD') {\n res.end();\n return true;\n }\n\n // Send file\n const data = await fs.readFile(filePath);\n res.end(data);\n return true;\n } catch {\n res.status(500).json({ success: false, error: 'Internal server error' });\n return true;\n }\n }\n\n private addCharsetIfNeeded(mimeType: string): string {\n const textTypes = [\n 'text/',\n 'application/json',\n 'application/javascript',\n 'application/xml',\n 'image/svg+xml',\n ];\n const needsCharset = textTypes.some(type => mimeType.startsWith(type));\n return needsCharset ? `${mimeType}; charset=utf-8` : mimeType;\n }\n\n getRoot(): string {\n return this.root;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/hook.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,WAAgB,EAAE,OAAsB;IAC1E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/hook.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,WAAgB,EAAE,OAAsB;IAC1E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["// Static File Serving Hook Integration\nimport { StaticCore, StaticOptions } from './core.js';\n\nexport function registerStaticHooks(hookManager: any, options: StaticOptions): void {\n const core = new StaticCore(options);\n\n hookManager.on('request', async (context: any) => {\n const { request, response } = context;\n if (!request || !response) return;\n\n await core.handleRequest(request, response);\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC","sourcesContent":["// Static File Serving Middleware - Centralized Exports\nexport { StaticCore } from './core.js';\nexport type { StaticOptions } from './core.js';\nexport { createStaticMiddleware } from './middleware.js';\nexport { registerStaticHooks } from './hook.js';\n\nimport { createStaticMiddleware } from './middleware.js';\n\nexport const staticFiles = createStaticMiddleware;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/static/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Static File Serving Middleware\nimport { Middleware } from '../../../../types/http.js';\nimport { StaticCore, StaticOptions } from './core.js';\n\n/**\n * Create static file serving middleware\n *\n * @example\n * ```typescript\n * import { staticFiles } from '@morojs/moro';\n *\n * app.use(staticFiles({\n * root: './public',\n * maxAge: 3600, // 1 hour cache\n * index: ['index.html'],\n * etag: true,\n * }));\n * ```\n */\nexport function createStaticMiddleware(options: StaticOptions): Middleware {\n const core = new StaticCore(options);\n\n return async (req, res, next) => {\n const handled = await core.handleRequest(req, res);\n if (!handled) {\n next();\n }\n };\n}\n"]}
|
|
@@ -8,7 +8,7 @@ const ESCAPE_MAP = {
|
|
|
8
8
|
"'": ''',
|
|
9
9
|
};
|
|
10
10
|
function escapeHtml(str) {
|
|
11
|
-
return str.replace(/[&<>"']/g, char => ESCAPE_MAP[char]);
|
|
11
|
+
return str.replace(/[&<>"']/g, char => ESCAPE_MAP[char] ?? char);
|
|
12
12
|
}
|
|
13
13
|
// Pre-compiled regex patterns — avoids recompilation on every render call.
|
|
14
14
|
// Triple-brace {{{var}}} is raw output; double-brace {{var}} is HTML-escaped.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/core.ts"],"names":[],"mappings":"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","sourcesContent":["// Template Rendering Core Logic\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nconst ESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nfunction escapeHtml(str: string): string {\n return str.replace(/[&<>\"']/g, char => ESCAPE_MAP[char] ?? char);\n}\n\n// Pre-compiled regex patterns — avoids recompilation on every render call.\n// Triple-brace {{{var}}} is raw output; double-brace {{var}} is HTML-escaped.\n// Triple MUST be matched before double to avoid double consuming its braces.\nconst RE_RAW_VAR = /\\{\\{\\{([\\w.]+)\\}\\}\\}/g;\nconst RE_VAR = /\\{\\{([\\w.]+)\\}\\}/g;\nconst RE_EACH_BLOCK = /\\{\\{#each (\\w+)\\}\\}(.*?)\\{\\{\\/each\\}\\}/gs;\nconst RE_IF_BLOCK = /\\{\\{#if (\\w+)\\}\\}(.*?)\\{\\{\\/if\\}\\}/gs;\n\nfunction resolveNestedValue(obj: any, path: string): any {\n if (!path.includes('.')) return obj?.[path];\n return path.split('.').reduce((o: any, p: string) => o?.[p], obj);\n}\n\nexport interface TemplateOptions {\n views: string;\n engine?: 'moro' | 'handlebars' | 'ejs';\n cache?: boolean;\n defaultLayout?: string;\n}\n\nexport class TemplateCore {\n private views: string;\n private engine: string;\n private cache: boolean;\n private defaultLayout?: string | undefined;\n private templateCache = new Map<string, string>();\n\n constructor(options: TemplateOptions) {\n this.views = path.resolve(options.views);\n this.engine = options.engine || 'moro';\n this.cache = options.cache !== false;\n this.defaultLayout = options.defaultLayout;\n }\n\n addRenderMethod(req: HttpRequest, res: HttpResponse): void {\n res.render = async (template: string, data: any = {}) => {\n try {\n const templatePath = path.join(this.views, `${template}.html`);\n\n // Security: prevent directory traversal via user-controlled template names.\n const viewsWithSep = this.views.endsWith(path.sep) ? this.views : this.views + path.sep;\n if (!templatePath.startsWith(viewsWithSep)) {\n res.status(403).json({ success: false, error: 'Forbidden' });\n return;\n }\n\n let templateContent: string;\n\n // Check cache first\n if (this.cache && this.templateCache.has(templatePath)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n templateContent = this.templateCache.get(templatePath)!;\n } else {\n templateContent = await fs.readFile(templatePath, 'utf-8');\n if (this.cache) {\n this.templateCache.set(templatePath, templateContent);\n }\n }\n\n // Render based on engine\n let rendered = this.renderTemplate(templateContent, data);\n\n // Handle layout\n if (this.defaultLayout) {\n rendered = await this.applyLayout(rendered, data);\n }\n\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(rendered);\n } catch (error) {\n const isProduction = process.env.NODE_ENV === 'production';\n res.status(500).json({\n success: false,\n error: 'Template rendering failed',\n ...(isProduction\n ? {}\n : { details: error instanceof Error ? error.message : String(error) }),\n });\n }\n };\n }\n\n private renderTemplate(content: string, data: any): string {\n let rendered = content;\n\n // Raw output: {{{variable}}} — inserted verbatim. Must run before {{var}}\n // so the outer braces of the triple form aren't consumed as a double match.\n rendered = rendered.replace(RE_RAW_VAR, (match: string, key: string) => {\n const value = resolveNestedValue(data, key);\n return value !== undefined ? String(value) : match;\n });\n\n // Default: {{variable}} is HTML-escaped (Mustache/Handlebars convention).\n rendered = rendered.replace(RE_VAR, (match: string, key: string) => {\n const value = resolveNestedValue(data, key);\n return value !== undefined ? escapeHtml(String(value)) : match;\n });\n\n // Handle loops: {{#each items}}{{name}}{{/each}}\n rendered = rendered.replace(RE_EACH_BLOCK, (match, arrayKey, template) => {\n const array = data[arrayKey];\n if (!Array.isArray(array)) return '';\n\n return array\n .map(item => {\n let itemTemplate = template;\n // {{{key}}} raw inside loops\n itemTemplate = itemTemplate.replace(RE_RAW_VAR, (match: string, key: string) => {\n const value = resolveNestedValue(item, key);\n return value !== undefined ? String(value) : match;\n });\n // {{key}} escaped inside loops\n itemTemplate = itemTemplate.replace(RE_VAR, (match: string, key: string) => {\n const value = resolveNestedValue(item, key);\n return value !== undefined ? escapeHtml(String(value)) : match;\n });\n return itemTemplate;\n })\n .join('');\n });\n\n // Handle conditionals: {{#if condition}}content{{/if}}\n rendered = rendered.replace(RE_IF_BLOCK, (match, conditionKey, content) => {\n const condition = data[conditionKey];\n return condition ? content : '';\n });\n\n return rendered;\n }\n\n private async applyLayout(content: string, _data: any): Promise<string> {\n const layoutPath = path.join(this.views, 'layouts', `${this.defaultLayout}.html`);\n try {\n let layoutContent: string;\n\n if (this.cache && this.templateCache.has(layoutPath)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n layoutContent = this.templateCache.get(layoutPath)!;\n } else {\n layoutContent = await fs.readFile(layoutPath, 'utf-8');\n if (this.cache) {\n this.templateCache.set(layoutPath, layoutContent);\n }\n }\n\n return layoutContent.replace(/\\{\\{body\\}\\}/, content);\n } catch {\n // Layout not found, return content as-is\n return content;\n }\n }\n\n clearCache(): void {\n this.templateCache.clear();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/hook.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,WAAgB,EAAE,OAAwB;IAC9E,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/hook.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,WAAgB,EAAE,OAAwB;IAC9E,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["// Template Rendering Hook Integration\nimport { TemplateCore, TemplateOptions } from './core.js';\n\nexport function registerTemplateHooks(hookManager: any, options: TemplateOptions): void {\n const core = new TemplateCore(options);\n\n hookManager.on('request', async (context: any) => {\n const { request, response } = context;\n if (!request || !response) return;\n\n core.addRenderMethod(request, response);\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,MAAM,QAAQ,GAAG,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,CAAC,MAAM,QAAQ,GAAG,wBAAwB,CAAC","sourcesContent":["// Template Rendering Middleware - Centralized Exports\nexport { TemplateCore } from './core.js';\nexport type { TemplateOptions } from './core.js';\nexport { createTemplateMiddleware } from './middleware.js';\nexport { registerTemplateHooks } from './hook.js';\n\nimport { createTemplateMiddleware } from './middleware.js';\n\nexport const template = createTemplateMiddleware;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAE1D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAwB;IAC/D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/template/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAE1D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAwB;IAC/D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Template Rendering Middleware\nimport { Middleware } from '../../../../types/http.js';\nimport { TemplateCore, TemplateOptions } from './core.js';\n\n/**\n * Create template rendering middleware\n *\n * @example\n * ```typescript\n * import { template } from '@morojs/moro';\n *\n * app.use(template({\n * views: './views',\n * cache: true,\n * defaultLayout: 'main',\n * }));\n *\n * app.get('/', (req, res) => {\n * res.render('index', { title: 'Home', user: { name: 'John' } });\n * });\n * ```\n */\nexport function createTemplateMiddleware(options: TemplateOptions): Middleware {\n const core = new TemplateCore(options);\n\n return (req, res, next) => {\n core.addRenderMethod(req, res);\n next();\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/core.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,qDAAqD;AACrD,4CAA4C;AAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAgBxC,MAAM,OAAO,UAAU;IACb,IAAI,CAAS;IACb,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,YAAY,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/core.ts"],"names":[],"mappings":"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","sourcesContent":["// File Upload Core Logic\nimport * as path from 'path';\nimport { HttpRequest } from '../../../../types/http.js';\n\n// Pre-compiled regex — avoids recompilation per file\n// eslint-disable-next-line no-control-regex\nconst RE_CONTROL_CHARS = /[\\x00-\\x1f]/g;\n\nexport interface UploadOptions {\n dest?: string;\n maxFileSize?: number;\n maxFiles?: number;\n allowedTypes?: string[];\n}\n\nexport interface UploadedFile {\n filename: string;\n mimetype: string;\n data: Buffer;\n size: number;\n}\n\nexport class UploadCore {\n private dest: string;\n private maxFileSize: number;\n private maxFiles: number;\n private allowedTypes?: string[] | undefined;\n\n constructor(options: UploadOptions = {}) {\n this.dest = options.dest || '/tmp';\n this.maxFileSize = options.maxFileSize || 5 * 1024 * 1024; // 5MB default\n this.maxFiles = options.maxFiles || 10;\n this.allowedTypes = options.allowedTypes;\n }\n\n validateUpload(files: Record<string, any>): { valid: boolean; error?: string } {\n // Validate file count\n const fileCount = Object.keys(files).length;\n if (fileCount > this.maxFiles) {\n return {\n valid: false,\n error: `Too many files. Maximum ${this.maxFiles} allowed.`,\n };\n }\n\n // Validate each file\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [fieldName, file] of Object.entries(files)) {\n const fileData = file as UploadedFile;\n\n // Validate file size\n if (fileData.size > this.maxFileSize) {\n return {\n valid: false,\n error: `File ${fileData.filename} is too large. Maximum ${this.formatSize(this.maxFileSize)} allowed.`,\n };\n }\n\n // Validate file type\n if (this.allowedTypes && !this.allowedTypes.includes(fileData.mimetype)) {\n return {\n valid: false,\n error: `File type ${fileData.mimetype} not allowed.`,\n };\n }\n }\n\n return { valid: true };\n }\n\n attachFiles(req: HttpRequest): void {\n if (req.body && req.body.files) {\n // Sanitize filenames to prevent path traversal when writing to disk\n for (const [, file] of Object.entries(req.body.files)) {\n const f = file as UploadedFile;\n if (f.filename) {\n (f as any).originalFilename = f.filename;\n f.filename = path.basename(f.filename).replace(RE_CONTROL_CHARS, '');\n }\n }\n req.files = req.body.files;\n }\n }\n\n private formatSize(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;\n } else if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(2)}KB`;\n }\n return `${bytes}B`;\n }\n\n getMaxFileSize(): number {\n return this.maxFileSize;\n }\n\n getMaxFiles(): number {\n return this.maxFiles;\n }\n\n getAllowedTypes(): string[] | undefined {\n return this.allowedTypes;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/hook.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,WAAgB,EAAE,UAAyB,EAAE;IAC/E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE1B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACxB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/hook.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,WAAgB,EAAE,UAAyB,EAAE;IAC/E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE1B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACxB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["// Upload Hook Integration\nimport { UploadCore, UploadOptions } from './core.js';\n\nexport function registerUploadHooks(hookManager: any, options: UploadOptions = {}): void {\n const core = new UploadCore(options);\n\n hookManager.on('request', async (context: any) => {\n const { request, response } = context;\n if (!request || !response) return;\n\n const contentType = request.headers['content-type'] || '';\n if (!contentType.includes('multipart/form-data')) {\n return;\n }\n\n core.attachFiles(request);\n\n if (request.files) {\n const validation = core.validateUpload(request.files);\n if (!validation.valid) {\n response.status(400).json({\n success: false,\n error: validation.error,\n });\n }\n }\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG,sBAAsB,CAAC","sourcesContent":["// Upload Middleware - Centralized Exports\nexport { UploadCore } from './core.js';\nexport type { UploadOptions, UploadedFile } from './core.js';\nexport { createUploadMiddleware } from './middleware.js';\nexport { registerUploadHooks } from './hook.js';\n\nimport { createUploadMiddleware } from './middleware.js';\n\nexport const upload = createUploadMiddleware;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAyB,EAAE;IAChE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEtD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjD,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,kDAAkD;QAClD,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEtB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK;iBACxB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/upload/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAyB,EAAE;IAChE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEtD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjD,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,kDAAkD;QAClD,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEtB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK;iBACxB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// File Upload Middleware\nimport { Middleware } from '../../../../types/http.js';\nimport { UploadCore, UploadOptions } from './core.js';\n\n/**\n * Create file upload middleware\n *\n * @example\n * ```typescript\n * import { upload } from '@morojs/moro';\n *\n * app.use(upload({\n * dest: './uploads',\n * maxFileSize: 5 * 1024 * 1024, // 5MB\n * maxFiles: 10,\n * allowedTypes: ['image/jpeg', 'image/png', 'image/gif'],\n * }));\n * ```\n */\nexport function createUploadMiddleware(options: UploadOptions = {}): Middleware {\n const core = new UploadCore(options);\n\n return (req, res, next) => {\n const contentType = req.headers['content-type'] || '';\n\n if (!contentType.includes('multipart/form-data')) {\n next();\n return;\n }\n\n // File upload handling is built into body parsing\n // This middleware validates after parsing\n core.attachFiles(req);\n\n if (req.files) {\n const validation = core.validateUpload(req.files);\n if (!validation.valid) {\n res.status(400).json({\n success: false,\n error: validation.error,\n });\n return;\n }\n }\n\n next();\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/core.ts"],"names":[],"mappings":"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","sourcesContent":["// Validation Core - Reusable validation logic\nimport { createFrameworkLogger } from '../../../logger/index.js';\nimport { HttpRequest, HttpResponse } from '../../../../types/http.js';\nimport {\n ValidationSchema,\n normalizeValidationError,\n} from '../../../validation/schema-interface.js';\nimport { handleValidationError, normalizeErrors } from '../../../validation/error-handler.js';\nimport { getGlobalConfig } from '../../../config/index.js';\nimport type { ValidationErrorHandler } from '../../../../types/config.js';\n\nconst logger = createFrameworkLogger('ValidationCore');\n\n// ===== Types =====\n\nexport interface ValidationConfig {\n body?: ValidationSchema;\n query?: ValidationSchema;\n params?: ValidationSchema;\n headers?: ValidationSchema;\n onValidationError?: ValidationErrorHandler;\n}\n\nexport interface ValidationErrorDetail {\n field: string;\n message: string;\n code: string;\n}\n\ntype SchemaRunResult = { success: boolean; data?: any; error?: any };\n\n// Schemas that threw from safeParse (async refinements) - always use parseAsync for these\nconst asyncOnlySchemas = new WeakSet<object>();\n\n/**\n * Run a schema against data, preferring the synchronous safeParse fast path\n * (no promise, no exception-based control flow) when the library supports it.\n * Falls back to parseAsync for libraries without safeParse (Joi/Yup adapters)\n * and for schemas with async refinements.\n */\nfunction runSchema(\n schema: ValidationSchema,\n data: unknown\n): SchemaRunResult | Promise<SchemaRunResult> {\n const s: any = schema;\n if (typeof s.safeParse === 'function' && !asyncOnlySchemas.has(s)) {\n try {\n const r = s.safeParse(data);\n return r.success ? { success: true, data: r.data } : { success: false, error: r.error };\n } catch {\n // safeParse throws (rather than failing) only when the schema requires\n // async parsing (e.g. zod async refinements) - remember and fall through\n asyncOnlySchemas.add(s);\n }\n }\n return s.parseAsync(data).then(\n (d: any) => ({ success: true, data: d }),\n (e: any) => ({ success: false, error: e })\n );\n}\n\n// ===== Core Logic =====\n\n/**\n * ValidationCore - Core validation logic\n * Used directly by the router for route-based validation\n * Can be instantiated for use in middleware or hooks\n */\nexport class ValidationCore {\n async validate(req: HttpRequest, res: HttpResponse, config: ValidationConfig): Promise<boolean> {\n // Don't validate if headers already sent\n if (res.headersSent) {\n return false;\n }\n\n try {\n // Order by likelihood and cost: params > query > body > headers\n // Params are fastest (already parsed, small) and most common in REST APIs\n if (config.params !== undefined && req.params !== undefined) {\n // Skip empty params objects for better performance\n let hasParams = false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in req.params) {\n hasParams = true;\n break;\n }\n if (hasParams) {\n let result = runSchema(config.params, req.params);\n if (typeof (result as any).then === 'function') result = await result;\n if ((result as SchemaRunResult).success) {\n (req as any).validatedParams = (result as SchemaRunResult).data;\n req.params = (req as any).validatedParams;\n } else {\n this.handleValidationError(\n (result as SchemaRunResult).error,\n 'params',\n req,\n res,\n config.onValidationError\n );\n return false;\n }\n }\n }\n\n // Query is second (common on GET requests, already parsed)\n if (config.query !== undefined && req.query !== undefined) {\n // Skip empty query objects for better performance\n let hasQuery = false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in req.query) {\n hasQuery = true;\n break;\n }\n if (hasQuery) {\n let result = runSchema(config.query, req.query);\n if (typeof (result as any).then === 'function') result = await result;\n if ((result as SchemaRunResult).success) {\n (req as any).validatedQuery = (result as SchemaRunResult).data;\n req.query = (req as any).validatedQuery;\n } else {\n this.handleValidationError(\n (result as SchemaRunResult).error,\n 'query',\n req,\n res,\n config.onValidationError\n );\n return false;\n }\n }\n }\n\n // Body is expensive (POST/PUT/PATCH only, requires parsing)\n if (config.body !== undefined && req.body !== undefined) {\n let result = runSchema(config.body, req.body);\n if (typeof (result as any).then === 'function') result = await result;\n if ((result as SchemaRunResult).success) {\n (req as any).validatedBody = (result as SchemaRunResult).data;\n req.body = (req as any).validatedBody;\n } else {\n this.handleValidationError(\n (result as SchemaRunResult).error,\n 'body',\n req,\n res,\n config.onValidationError\n );\n return false;\n }\n }\n\n // Headers are rarely validated\n if (config.headers !== undefined && req.headers !== undefined) {\n let result = runSchema(config.headers, req.headers);\n if (typeof (result as any).then === 'function') result = await result;\n if ((result as SchemaRunResult).success) {\n (req as any).validatedHeaders = (result as SchemaRunResult).data;\n } else {\n this.handleValidationError(\n (result as SchemaRunResult).error,\n 'headers',\n req,\n res,\n config.onValidationError\n );\n return false;\n }\n }\n\n return true;\n } catch (error: any) {\n logger.error('Unexpected validation error', 'Validation', {\n error: error.message,\n });\n\n if (!res.headersSent) {\n res.status(500).json({\n success: false,\n error: 'Internal server error',\n requestId: req.requestId,\n });\n }\n return false;\n }\n }\n\n private handleValidationError(\n error: any,\n field: 'body' | 'query' | 'params' | 'headers',\n req: HttpRequest,\n res: HttpResponse,\n customHandler?: ValidationErrorHandler\n ): void {\n // Don't send error if headers already sent\n if (res.headersSent) {\n return;\n }\n\n // Resolve the global handler on the error path only - the success path\n // (the overwhelming majority of requests) never touches config\n let globalHandler: ValidationErrorHandler | undefined;\n try {\n globalHandler = getGlobalConfig().modules.validation.onError;\n } catch {\n globalHandler = undefined;\n }\n\n const normalizedError = normalizeValidationError(error);\n const errors = normalizeErrors(normalizedError.issues, field);\n\n handleValidationError(errors, field, req, res, customHandler, globalHandler);\n }\n}\n\n// Shared instance for route-based validation\nexport const sharedValidationCore = new ValidationCore();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;AAE7D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAwB,EAAE,CAAC,CAAC;IACpD,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,0DAA0D;QACvE,MAAM,EAAE,aAAa;KACtB;IAED,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,qBAA0B,EAAE,EAAE,EAAE;QAC1D,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,cAAc,CAAC,CAAC;QAEjE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAc,CAAC;YAEvC,gCAAgC;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBACpD,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,aAAa,CAAC,CAAC;oBACtE,4CAA4C;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;AAE7D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAwB,EAAE,CAAC,CAAC;IACpD,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,0DAA0D;QACvE,MAAM,EAAE,aAAa;KACtB;IAED,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,qBAA0B,EAAE,EAAE,EAAE;QAC1D,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,cAAc,CAAC,CAAC;QAEjE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAc,CAAC;YAEvC,gCAAgC;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBACpD,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,aAAa,CAAC,CAAC;oBACtE,4CAA4C;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC","sourcesContent":["// Validation Hook - MiddlewareInterface for global registration\nimport { MiddlewareInterface, HookContext } from '../../../../types/hooks.js';\nimport { createFrameworkLogger } from '../../../logger/index.js';\n\nconst logger = createFrameworkLogger('ValidationMiddleware');\n\n/**\n * Basic validation hook for global usage\n * Registers with the hooks system for content-type checking\n *\n * @example\n * ```ts\n * import { validation } from '@/middleware/built-in/validation';\n *\n * app.use(validation());\n * ```\n */\nexport const validation = (): MiddlewareInterface => ({\n name: 'validation',\n version: '1.0.0',\n metadata: {\n name: 'validation',\n version: '1.0.0',\n description: 'Request validation middleware with content type checking',\n author: 'MoroJS Team',\n },\n\n install: async (hooks: any, _middlewareOptions: any = {}) => {\n logger.debug('Installing validation middleware', 'Installation');\n\n hooks.before('request', async (context: HookContext) => {\n const request = context.request as any;\n\n // Basic content type validation\n if (request.method === 'POST' || request.method === 'PUT') {\n const contentType = request.headers['content-type'];\n if (contentType && contentType.includes('application/json')) {\n logger.debug('Validation: JSON content type verified', 'ContentType');\n // Additional validation logic would go here\n }\n }\n });\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,yDAAyD;AAEzD,6DAA6D;AAC7D,OAAO,EACL,cAAc,EACd,oBAAoB,GAGrB,MAAM,WAAW,CAAC;AAEnB,qCAAqC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,iCAAiC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,yDAAyD;AAEzD,6DAA6D;AAC7D,OAAO,EACL,cAAc,EACd,oBAAoB,GAGrB,MAAM,WAAW,CAAC;AAEnB,qCAAqC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,iCAAiC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC","sourcesContent":["// Validation - Main entry point\n// Re-exports all public APIs for the validation built-in\n\n// Core (for direct use by router and custom implementations)\nexport {\n ValidationCore,\n sharedValidationCore,\n type ValidationConfig,\n type ValidationErrorDetail,\n} from './core.js';\n\n// Middleware (for middleware chains)\nexport { createValidationMiddleware } from './middleware.js';\n\n// Hook (for global registration)\nexport { validation } from './hook.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,WAAW,CAAC;AAExE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAwB;IACjE,4DAA4D;IAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpF,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,IAAgB,EAAE,EAAE;QACpD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC;QACT,CAAC;QACD,iDAAiD;IACnD,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../../src/core/middleware/built-in/validation/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,WAAW,CAAC;AAExE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAwB;IACjE,4DAA4D;IAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpF,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,IAAgB,EAAE,EAAE;QACpD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC;QACT,CAAC;QACD,iDAAiD;IACnD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Validation Middleware - Standard (req, res, next) middleware function\nimport { StandardMiddleware } from '../../../../types/hooks.js';\nimport { sharedValidationCore, type ValidationConfig } from './core.js';\n\n/**\n * Create validation middleware for use in middleware chains\n *\n * @example\n * ```ts\n * const validateMw = createValidationMiddleware({\n * body: myBodySchema,\n * query: myQuerySchema\n * });\n *\n * app.use(validateMw);\n * ```\n */\nexport function createValidationMiddleware(config: ValidationConfig): StandardMiddleware {\n // Check if any validation config exists without Object.keys\n if (!config || (!config.body && !config.query && !config.params && !config.headers)) {\n return (_req, _res, next) => next();\n }\n\n return async (req: any, res: any, next: () => void) => {\n const success = await sharedValidationCore.validate(req, res, config);\n if (success) {\n next();\n }\n // If validation failed, response is already sent\n };\n}\n"]}
|
|
@@ -55,7 +55,7 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
55
55
|
this.logger.debug(`Installing middleware: ${name}`, 'Installation');
|
|
56
56
|
// Initialize middleware
|
|
57
57
|
if (middleware.install) {
|
|
58
|
-
middleware.install(this.hooks, options);
|
|
58
|
+
void middleware.install(this.hooks, options);
|
|
59
59
|
}
|
|
60
60
|
this.emit('installed', { name, middleware, options });
|
|
61
61
|
this.logger.info(`Middleware installed: ${name}`, 'Installation');
|
|
@@ -70,7 +70,7 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
70
70
|
this.logger.debug(`Uninstalling middleware: ${name}`, 'Uninstallation');
|
|
71
71
|
// Call cleanup if available
|
|
72
72
|
if (middleware.uninstall) {
|
|
73
|
-
middleware.uninstall(this.hooks);
|
|
73
|
+
void middleware.uninstall(this.hooks);
|
|
74
74
|
}
|
|
75
75
|
this.middleware.delete(name);
|
|
76
76
|
this.emit('uninstalled', { name, middleware });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/middleware/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B;;;;;EAKE;AAEF,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAK3D,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACzC,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;IACpD,gBAAgB,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC/D,KAAK,CAAc;IACnB,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAErD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,yCAAyC;IACzC,QAAQ,CAAC,IAAY,EAAE,UAA+B;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,wBAAwB,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,2CAA2C;IAC3C,OAAO,CAAC,UAA0D,EAAE,UAAe,EAAE;QACnF,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,mCAAmC;YACnC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,IAAI,WAAW,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,UAAU,EAAE,EAAE,cAAc,CAAC,CAAC;YAEjF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,UAAU,EAAE,EAAE,cAAc,CAAC,CAAC;YAC/E,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAC;QAEpD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,uBAAuB,CAAC,CAAC;QAC7D,CAAC;QAED,qBAAqB;QACrB,IAAI,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,6BAA6B,IAAI,EAAE,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;QAEpE,wBAAwB;QACxB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;IACpE,CAAC;IAED,oCAAoC;IACpC,SAAS,CAAC,IAAY;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,mBAAmB,CAAC,CAAC;QACzD,CAAC;QAED,oEAAoE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAExE,4BAA4B;QAC5B,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACxE,CAAC;IAED,2BAA2B;IAC3B,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,+BAA+B;IAC/B,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAC7C,CAAC;IAED,mCAAmC;IACnC,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,wDAAwD;IACxD,GAAG,CAAC,IAAY;QACd,mCAAmC;QACnC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,uBAAuB,CAC3B,UAAiC,EACjC,OAA6B;QAE7B,sDAAsD;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAElD,KAAK,MAAM,cAAc,IAAI,QAAQ,EAAE,CAAC;YACtC,MAAM,iBAAiB,GAAG,OAAO,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,wEAAwE;IAChE,eAAe,CAAC,UAAiC;QACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,MAAM,KAAK,GAAG,CAAC,cAAmC,EAAE,EAAE;YACpD,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,iCAAiC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAE9B,2BAA2B;gBAC3B,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;oBAChC,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;wBAClD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;wBAC5D,IAAI,UAAU,EAAE,CAAC;4BACf,KAAK,CAAC,UAAU,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,cAAc,IAAI,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,cAAc,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,8BAA8B;AAC9B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/middleware/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Middleware System for Moro\n/*\n All middleware in Moro should follow or adopt all of the following patterns:\n Core - Core.method(req, res, config) - Direct logic, no next, used by router directly\n Middleware - (req, res, next) => { ... next() } - For middleware chains, calls next\n Hooks - MiddlewareInterface with before/after hooks\n*/\n\nimport { EventEmitter } from 'events';\nimport { HookManager } from '../utilities/index.js';\nimport { MiddlewareInterface, SimpleMiddlewareFunction } from '../../types/hooks.js';\nimport { createFrameworkLogger } from '../logger/index.js';\n\n// Export types needed by built-in middleware\nexport type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks.js';\n\nexport class MiddlewareManager extends EventEmitter {\n private middleware = new Map<string, MiddlewareInterface>();\n private simpleMiddleware = new Map<string, SimpleMiddlewareFunction>();\n private hooks: HookManager;\n private logger = createFrameworkLogger('Middleware');\n\n constructor() {\n super();\n this.hooks = new HookManager();\n }\n\n // Register middleware without installing\n register(name: string, middleware: MiddlewareInterface): void {\n if (this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is already registered`);\n }\n\n this.middleware.set(name, middleware);\n this.logger.debug(`Registered middleware: ${name}`, 'Registration');\n this.emit('registered', { name, middleware });\n }\n\n // Install simple function-style middleware\n install(middleware: SimpleMiddlewareFunction | MiddlewareInterface, options: any = {}): void {\n if (typeof middleware === 'function') {\n // Simple function-style middleware\n const simpleName = middleware.name || 'anonymous';\n this.logger.debug(`Installing simple middleware: ${simpleName}`, 'Installation');\n\n this.simpleMiddleware.set(simpleName, middleware);\n this.emit('installed', { name: simpleName, type: 'simple' });\n this.logger.info(`Simple middleware installed: ${simpleName}`, 'Installation');\n return;\n }\n\n // Advanced middleware with dependencies and lifecycle\n const name = middleware.metadata?.name || 'unknown';\n\n if (this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is already installed`);\n }\n\n // Check dependencies\n if (middleware.metadata?.dependencies) {\n for (const dep of middleware.metadata.dependencies) {\n if (!this.middleware.has(dep)) {\n throw new Error(`Dependency ${dep} not found for middleware ${name}`);\n }\n }\n }\n\n // Store middleware\n this.middleware.set(name, middleware);\n\n this.logger.debug(`Installing middleware: ${name}`, 'Installation');\n\n // Initialize middleware\n if (middleware.install) {\n void middleware.install(this.hooks, options);\n }\n\n this.emit('installed', { name, middleware, options });\n this.logger.info(`Middleware installed: ${name}`, 'Installation');\n }\n\n // Uninstall middleware and clean up\n uninstall(name: string): void {\n if (!this.middleware.has(name)) {\n throw new Error(`Middleware ${name} is not installed`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const middleware = this.middleware.get(name)!;\n\n this.logger.debug(`Uninstalling middleware: ${name}`, 'Uninstallation');\n\n // Call cleanup if available\n if (middleware.uninstall) {\n void middleware.uninstall(this.hooks);\n }\n\n this.middleware.delete(name);\n this.emit('uninstalled', { name, middleware });\n this.logger.info(`Middleware uninstalled: ${name}`, 'Uninstallation');\n }\n\n // Get installed middleware\n getInstalled(): string[] {\n return Array.from(this.middleware.keys());\n }\n\n // Get middleware configuration\n getConfig(name: string): any {\n return this.middleware.get(name)?.metadata;\n }\n\n // Check if middleware is installed\n isInstalled(name: string): boolean {\n return this.middleware.has(name);\n }\n\n // Get middleware by name (safe getter for module usage)\n get(name: string): MiddlewareInterface | SimpleMiddlewareFunction | undefined {\n // Check installed middleware first\n if (this.middleware.has(name)) {\n return this.middleware.get(name);\n }\n\n // Check simple middleware\n if (this.simpleMiddleware.has(name)) {\n return this.simpleMiddleware.get(name);\n }\n\n return undefined;\n }\n\n // List all registered middleware\n list(): MiddlewareInterface[] {\n return Array.from(this.middleware.values());\n }\n\n // Dependency resolution with topological sorting for optimal middleware loading\n async installWithDependencies(\n middleware: MiddlewareInterface[],\n options?: Record<string, any>\n ): Promise<void> {\n // Advanced topological sort for dependency resolution\n const resolved = this.topologicalSort(middleware);\n\n for (const middlewareItem of resolved) {\n const middlewareOptions = options?.[middlewareItem.name];\n await this.install(middlewareItem, middlewareOptions);\n }\n }\n\n // Optimized topological sort implementation for middleware dependencies\n private topologicalSort(middleware: MiddlewareInterface[]): MiddlewareInterface[] {\n const visited = new Set<string>();\n const temp = new Set<string>();\n const result: MiddlewareInterface[] = [];\n\n const visit = (middlewareItem: MiddlewareInterface) => {\n if (temp.has(middlewareItem.name)) {\n throw new Error(`Circular dependency detected: ${middlewareItem.name}`);\n }\n\n if (!visited.has(middlewareItem.name)) {\n temp.add(middlewareItem.name);\n\n // Visit dependencies first\n if (middlewareItem.dependencies) {\n for (const depName of middlewareItem.dependencies) {\n const dependency = middleware.find(m => m.name === depName);\n if (dependency) {\n visit(dependency);\n }\n }\n }\n\n temp.delete(middlewareItem.name);\n visited.add(middlewareItem.name);\n result.push(middlewareItem);\n }\n };\n\n for (const middlewareItem of middleware) {\n if (!visited.has(middlewareItem.name)) {\n visit(middlewareItem);\n }\n }\n\n return result;\n }\n}\n\n// Built-in middleware exports\nexport { builtInMiddleware, simpleMiddleware } from './built-in/index.js';\nexport * from './built-in/index.js';\n"]}
|
|
@@ -469,10 +469,12 @@ export class ModuleDiscovery {
|
|
|
469
469
|
const modulePaths = this.findModuleFiles();
|
|
470
470
|
modulePaths.forEach(path => {
|
|
471
471
|
try {
|
|
472
|
-
fs.watchFile(path,
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
472
|
+
fs.watchFile(path, () => {
|
|
473
|
+
void (async () => {
|
|
474
|
+
this.discoveryLogger.info(`Module file changed: ${path}`);
|
|
475
|
+
const modules = await this.discoverModules();
|
|
476
|
+
callback(modules);
|
|
477
|
+
})().catch(err => this.discoveryLogger.error(`Module reload failed: ${String(err)}`));
|
|
476
478
|
});
|
|
477
479
|
}
|
|
478
480
|
catch {
|
|
@@ -498,12 +500,14 @@ export class ModuleDiscovery {
|
|
|
498
500
|
try {
|
|
499
501
|
if (statSync(fullPath).isDirectory() && !watchedPaths.has(fullPath)) {
|
|
500
502
|
watchedPaths.add(fullPath);
|
|
501
|
-
const watcher = fs.watch(fullPath, { recursive: config.recursive },
|
|
502
|
-
if (filename
|
|
503
|
+
const watcher = fs.watch(fullPath, { recursive: config.recursive }, (eventType, filename) => {
|
|
504
|
+
if (!filename || !this.matchesPatterns(filename, config.patterns))
|
|
505
|
+
return;
|
|
506
|
+
void (async () => {
|
|
503
507
|
this.discoveryLogger.info(`Module file changed: ${filename}`);
|
|
504
508
|
const modules = await this.discoverModulesAdvanced(config);
|
|
505
509
|
callback(modules);
|
|
506
|
-
}
|
|
510
|
+
})().catch(err => this.discoveryLogger.error(`Module reload failed: ${String(err)}`));
|
|
507
511
|
});
|
|
508
512
|
// Store watcher for cleanup
|
|
509
513
|
this.watchers.push(watcher);
|