@morojs/moro 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -74
- package/dist/core/auth/morojs-adapter.js +20 -20
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/file-loader.d.ts +6 -1
- package/dist/core/config/file-loader.js +249 -19
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +12 -41
- package/dist/core/config/index.js +54 -65
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +7 -0
- package/dist/core/config/loader.js +269 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +44 -52
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +3 -10
- package/dist/core/config/utils.js +58 -31
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/config/validation.d.ts +17 -0
- package/dist/core/config/validation.js +131 -0
- package/dist/core/config/validation.js.map +1 -0
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +11 -18
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +29 -19
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -13
- package/dist/core/database/adapters/mongodb.js +10 -46
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -14
- package/dist/core/database/adapters/mysql.js +9 -19
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +2 -12
- package/dist/core/database/adapters/postgresql.js +9 -19
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -12
- package/dist/core/database/adapters/redis.js +13 -48
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -3
- package/dist/core/database/adapters/sqlite.js +8 -19
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/database/index.js +18 -2
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.d.ts +9 -9
- package/dist/core/docs/index.js +35 -14
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +2 -2
- package/dist/core/docs/openapi-generator.js +16 -11
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +2 -2
- package/dist/core/docs/schema-to-openapi.js +11 -5
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +9 -4
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +29 -26
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +28 -31
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +10 -6
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/events/index.js +5 -1
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +12 -19
- package/dist/core/framework.js +100 -277
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +1 -13
- package/dist/core/http/http-server.js +85 -175
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -4
- package/dist/core/http/index.js +8 -3
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/router.d.ts +1 -13
- package/dist/core/http/router.js +43 -117
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +23 -20
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/index.js +24 -2
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +14 -30
- package/dist/core/logger/logger.js +223 -398
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +1 -1
- package/dist/core/logger/outputs.js +17 -8
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +47 -10
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +17 -10
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +7 -3
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -3
- package/dist/core/middleware/built-in/adapters/cache/redis.js +9 -11
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +7 -3
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +7 -3
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -3
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +10 -12
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +17 -10
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/index.js +23 -4
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth-helpers.js +22 -11
- package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
- package/dist/core/middleware/built-in/auth-providers.js +9 -4
- package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
- package/dist/core/middleware/built-in/auth.d.ts +2 -2
- package/dist/core/middleware/built-in/auth.js +26 -93
- package/dist/core/middleware/built-in/auth.js.map +1 -1
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +12 -11
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +9 -5
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie.js +7 -3
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +7 -3
- package/dist/core/middleware/built-in/cors.js.map +1 -1
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +8 -5
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +8 -5
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +7 -3
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +27 -28
- package/dist/core/middleware/built-in/index.js +78 -48
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor.js +7 -3
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +7 -3
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +8 -5
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +2 -2
- package/dist/core/middleware/built-in/session.js +15 -11
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +14 -12
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +7 -3
- package/dist/core/middleware/built-in/validation.js.map +1 -1
- package/dist/core/middleware/index.d.ts +4 -4
- package/dist/core/middleware/index.js +28 -8
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -19
- package/dist/core/modules/auto-discovery.js +74 -391
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js +9 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +54 -23
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +3 -4
- package/dist/core/networking/adapters/index.js +7 -3
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/socketio-adapter.js +40 -5
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
- package/dist/core/networking/adapters/ws-adapter.js +43 -8
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -3
- package/dist/core/networking/index.js +7 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +12 -8
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.js +2 -1
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +11 -9
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +12 -7
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +2 -22
- package/dist/core/routing/index.js +27 -185
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +6 -2
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +7 -3
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +6 -2
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +12 -12
- package/dist/core/runtime/index.js +35 -22
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +4 -4
- package/dist/core/runtime/node-adapter.js +49 -18
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +6 -2
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +5 -1
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +22 -12
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +2 -2
- package/dist/core/utilities/hooks.js +12 -7
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -5
- package/dist/core/utilities/index.js +19 -5
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/validation/adapters.d.ts +1 -1
- package/dist/core/validation/adapters.js +26 -15
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/index.d.ts +4 -6
- package/dist/core/validation/index.js +28 -57
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js +9 -3
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/index.d.ts +52 -51
- package/dist/index.js +132 -23
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +10 -61
- package/dist/moro.js +237 -575
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.js +9 -3
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js +2 -1
- package/dist/types/cdn.js +2 -1
- package/dist/types/config.d.ts +2 -70
- package/dist/types/config.js +2 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +42 -36
- package/dist/types/core.js +2 -1
- package/dist/types/database.js +2 -1
- package/dist/types/discovery.js +2 -1
- package/dist/types/events.js +2 -1
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/hooks.js +2 -1
- package/dist/types/http.d.ts +1 -16
- package/dist/types/http.js +2 -1
- package/dist/types/logger.d.ts +0 -7
- package/dist/types/logger.js +2 -1
- package/dist/types/module.d.ts +0 -11
- package/dist/types/module.js +2 -1
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.js +2 -1
- package/dist/types/session.js +2 -1
- package/package.json +52 -19
- package/src/core/auth/morojs-adapter.ts +13 -18
- package/src/core/config/file-loader.ts +273 -13
- package/src/core/config/index.ts +34 -83
- package/src/core/config/loader.ts +633 -0
- package/src/core/config/schema.ts +33 -44
- package/src/core/config/utils.ts +31 -24
- package/src/core/config/validation.ts +140 -0
- package/src/core/database/README.md +16 -26
- package/src/core/database/adapters/drizzle.ts +6 -18
- package/src/core/database/adapters/index.ts +13 -13
- package/src/core/database/adapters/mongodb.ts +5 -53
- package/src/core/database/adapters/mysql.ts +4 -32
- package/src/core/database/adapters/postgresql.ts +5 -30
- package/src/core/database/adapters/redis.ts +8 -61
- package/src/core/database/adapters/sqlite.ts +3 -19
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +8 -8
- package/src/core/docs/openapi-generator.ts +4 -4
- package/src/core/docs/schema-to-openapi.ts +6 -3
- package/src/core/docs/simple-docs.ts +2 -2
- package/src/core/docs/swagger-ui.ts +16 -19
- package/src/core/docs/zod-to-openapi.ts +34 -34
- package/src/core/events/event-bus.ts +2 -2
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +67 -311
- package/src/core/http/http-server.ts +45 -190
- package/src/core/http/index.ts +3 -4
- package/src/core/http/router.ts +40 -129
- package/src/core/logger/filters.ts +5 -13
- package/src/core/logger/index.ts +3 -4
- package/src/core/logger/logger.ts +216 -435
- package/src/core/logger/outputs.ts +3 -1
- package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
- package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
- package/src/core/middleware/built-in/adapters/cache/redis.ts +4 -18
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +5 -16
- package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth-helpers.ts +1 -1
- package/src/core/middleware/built-in/auth-providers.ts +1 -1
- package/src/core/middleware/built-in/auth.ts +21 -102
- package/src/core/middleware/built-in/cache.ts +6 -8
- package/src/core/middleware/built-in/cdn.ts +4 -4
- package/src/core/middleware/built-in/cookie.ts +2 -2
- package/src/core/middleware/built-in/cors.ts +2 -2
- package/src/core/middleware/built-in/csp.ts +3 -3
- package/src/core/middleware/built-in/csrf.ts +3 -3
- package/src/core/middleware/built-in/error-tracker.ts +1 -1
- package/src/core/middleware/built-in/index.ts +30 -38
- package/src/core/middleware/built-in/performance-monitor.ts +1 -1
- package/src/core/middleware/built-in/rate-limit.ts +2 -2
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +8 -7
- package/src/core/middleware/built-in/sse.ts +9 -11
- package/src/core/middleware/built-in/validation.ts +2 -2
- package/src/core/middleware/index.ts +6 -6
- package/src/core/modules/auto-discovery.ts +15 -478
- package/src/core/modules/index.ts +2 -2
- package/src/core/modules/modules.ts +12 -23
- package/src/core/networking/adapters/index.ts +3 -4
- package/src/core/networking/adapters/socketio-adapter.ts +3 -5
- package/src/core/networking/adapters/ws-adapter.ts +9 -8
- package/src/core/networking/index.ts +2 -3
- package/src/core/networking/service-discovery.ts +7 -6
- package/src/core/networking/websocket-manager.ts +7 -7
- package/src/core/routing/app-integration.ts +3 -3
- package/src/core/routing/index.ts +17 -201
- package/src/core/runtime/aws-lambda-adapter.ts +3 -3
- package/src/core/runtime/base-adapter.ts +2 -2
- package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
- package/src/core/runtime/index.ts +13 -13
- package/src/core/runtime/node-adapter.ts +10 -16
- package/src/core/runtime/vercel-edge-adapter.ts +3 -3
- package/src/core/utilities/hooks.ts +3 -3
- package/src/core/utilities/index.ts +4 -5
- package/src/core/validation/adapters.ts +1 -1
- package/src/core/validation/index.ts +16 -68
- package/src/index.ts +66 -73
- package/src/moro.ts +204 -685
- package/src/types/config.ts +2 -71
- package/src/types/core.ts +47 -49
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +1 -23
- package/src/types/logger.ts +0 -9
- package/src/types/module.ts +0 -12
- package/src/types/runtime.ts +1 -1
- package/tsconfig.json +2 -4
- package/dist/core/config/config-manager.d.ts +0 -44
- package/dist/core/config/config-manager.js +0 -104
- package/dist/core/config/config-manager.js.map +0 -1
- package/dist/core/config/config-sources.d.ts +0 -21
- package/dist/core/config/config-sources.js +0 -499
- package/dist/core/config/config-sources.js.map +0 -1
- package/dist/core/config/config-validator.d.ts +0 -21
- package/dist/core/config/config-validator.js +0 -788
- package/dist/core/config/config-validator.js.map +0 -1
- package/dist/core/http/uws-http-server.d.ts +0 -64
- package/dist/core/http/uws-http-server.js +0 -688
- package/dist/core/http/uws-http-server.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +0 -118
- package/dist/core/middleware/built-in/jwt-helpers.js +0 -218
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/dist/core/networking/adapters/uws-adapter.d.ts +0 -44
- package/dist/core/networking/adapters/uws-adapter.js +0 -513
- package/dist/core/networking/adapters/uws-adapter.js.map +0 -1
- package/dist/core/utilities/package-utils.d.ts +0 -38
- package/dist/core/utilities/package-utils.js +0 -57
- package/dist/core/utilities/package-utils.js.map +0 -1
- package/jest.config.mjs +0 -41
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -596
- package/src/core/config/config-validator.ts +0 -1113
- package/src/core/http/uws-http-server.ts +0 -794
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
- package/src/core/networking/adapters/uws-adapter.ts +0 -619
- package/src/core/utilities/package-utils.ts +0 -59
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
// Session Middleware
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { FileCacheAdapter } from './adapters/cache/file.js';
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
|
+
import { CacheAdapter } from '../../../types/cache';
|
|
5
|
+
import { MemoryCacheAdapter } from './adapters/cache/memory';
|
|
6
|
+
import { RedisCacheAdapter } from './adapters/cache/redis';
|
|
7
|
+
import { FileCacheAdapter } from './adapters/cache/file';
|
|
9
8
|
|
|
10
9
|
const logger = createFrameworkLogger('SessionMiddleware');
|
|
11
10
|
|
|
@@ -158,6 +157,7 @@ class Session {
|
|
|
158
157
|
return this.options.genid();
|
|
159
158
|
}
|
|
160
159
|
|
|
160
|
+
const crypto = require('crypto');
|
|
161
161
|
return crypto.randomBytes(24).toString('hex');
|
|
162
162
|
}
|
|
163
163
|
|
|
@@ -229,6 +229,7 @@ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
|
229
229
|
if (config.genid) {
|
|
230
230
|
return config.genid();
|
|
231
231
|
}
|
|
232
|
+
const crypto = require('crypto');
|
|
232
233
|
return crypto.randomBytes(24).toString('hex');
|
|
233
234
|
};
|
|
234
235
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Server-Sent Events Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from '../../../types/hooks
|
|
3
|
-
import { createFrameworkLogger } from '../../logger
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
const logger = createFrameworkLogger('SSEMiddleware');
|
|
6
6
|
|
|
@@ -35,15 +35,13 @@ export const sse = (
|
|
|
35
35
|
logger.debug('Setting up SSE connection', 'SSESetup');
|
|
36
36
|
|
|
37
37
|
// Set SSE headers
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
});
|
|
46
|
-
}
|
|
38
|
+
res.writeHead(200, {
|
|
39
|
+
'Content-Type': 'text/event-stream',
|
|
40
|
+
'Cache-Control': 'no-cache',
|
|
41
|
+
Connection: 'keep-alive',
|
|
42
|
+
'Access-Control-Allow-Origin': options.cors ? '*' : undefined,
|
|
43
|
+
'Access-Control-Allow-Headers': options.cors ? 'Cache-Control' : undefined,
|
|
44
|
+
});
|
|
47
45
|
|
|
48
46
|
// Add SSE methods to response
|
|
49
47
|
res.sendEvent = (data: any, event?: string, id?: string) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Validation Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from '../../../types/hooks
|
|
3
|
-
import { createFrameworkLogger } from '../../logger
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
const logger = createFrameworkLogger('ValidationMiddleware');
|
|
6
6
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
// Middleware System for Moro
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
-
import { HookManager } from '../utilities
|
|
3
|
+
import { HookManager } from '../utilities';
|
|
4
4
|
import {
|
|
5
5
|
MiddlewareMetadata,
|
|
6
6
|
MiddlewareContext,
|
|
7
7
|
MiddlewareInterface,
|
|
8
8
|
SimpleMiddlewareFunction,
|
|
9
9
|
MoroMiddleware,
|
|
10
|
-
} from '../../types/hooks
|
|
11
|
-
import { createFrameworkLogger } from '../logger
|
|
10
|
+
} from '../../types/hooks';
|
|
11
|
+
import { createFrameworkLogger } from '../logger';
|
|
12
12
|
|
|
13
13
|
// Export types needed by built-in middleware
|
|
14
|
-
export type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks
|
|
14
|
+
export type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks';
|
|
15
15
|
|
|
16
16
|
export class MiddlewareManager extends EventEmitter {
|
|
17
17
|
private middleware = new Map<string, MiddlewareInterface>();
|
|
@@ -173,5 +173,5 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
// Built-in middleware exports
|
|
176
|
-
export { builtInMiddleware, simpleMiddleware } from './built-in
|
|
177
|
-
export * from './built-in
|
|
176
|
+
export { builtInMiddleware, simpleMiddleware } from './built-in';
|
|
177
|
+
export * from './built-in';
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
// Auto-discovery system for Moro modules
|
|
2
2
|
import { readdirSync, statSync } from 'fs';
|
|
3
|
-
import { join, extname
|
|
4
|
-
import { ModuleConfig } from '../../types/module
|
|
5
|
-
import { DiscoveryOptions } from '../../types/discovery
|
|
6
|
-
import {
|
|
7
|
-
import { createFrameworkLogger } from '../logger/index.js';
|
|
3
|
+
import { join, extname } from 'path';
|
|
4
|
+
import { ModuleConfig } from '../../types/module';
|
|
5
|
+
import { DiscoveryOptions } from '../../types/discovery';
|
|
6
|
+
import { logger, createFrameworkLogger } from '../logger';
|
|
8
7
|
|
|
9
8
|
export class ModuleDiscovery {
|
|
10
9
|
private baseDir: string;
|
|
11
10
|
private options: DiscoveryOptions;
|
|
12
11
|
private discoveryLogger = createFrameworkLogger('MODULE_DISCOVERY');
|
|
13
|
-
private watchers: any[] = []; // Store file watchers for cleanup
|
|
14
12
|
|
|
15
13
|
constructor(baseDir: string = process.cwd(), options: DiscoveryOptions = {}) {
|
|
16
14
|
this.baseDir = baseDir;
|
|
@@ -37,7 +35,7 @@ export class ModuleDiscovery {
|
|
|
37
35
|
);
|
|
38
36
|
}
|
|
39
37
|
} catch (error) {
|
|
40
|
-
this.discoveryLogger.warn(`Failed to load module from ${modulePath}
|
|
38
|
+
this.discoveryLogger.warn(`Failed to load module from ${modulePath}:`, 'ModuleDiscovery', {
|
|
41
39
|
error: error instanceof Error ? error.message : String(error),
|
|
42
40
|
});
|
|
43
41
|
}
|
|
@@ -179,483 +177,22 @@ export class ModuleDiscovery {
|
|
|
179
177
|
);
|
|
180
178
|
}
|
|
181
179
|
|
|
182
|
-
// Enhanced auto-discovery with advanced configuration
|
|
183
|
-
async discoverModulesAdvanced(
|
|
184
|
-
config: ModuleDefaultsConfig['autoDiscovery']
|
|
185
|
-
): Promise<ModuleConfig[]> {
|
|
186
|
-
if (!config.enabled) {
|
|
187
|
-
return [];
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const allModules: ModuleConfig[] = [];
|
|
191
|
-
|
|
192
|
-
// Discover from all configured paths
|
|
193
|
-
for (const searchPath of config.paths) {
|
|
194
|
-
const modules = await this.discoverFromPath(searchPath, config);
|
|
195
|
-
allModules.push(...modules);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// Remove duplicates based on name@version
|
|
199
|
-
const uniqueModules = this.deduplicateModules(allModules);
|
|
200
|
-
|
|
201
|
-
// Sort modules based on load order strategy
|
|
202
|
-
const sortedModules = this.sortModules(uniqueModules, config.loadOrder);
|
|
203
|
-
|
|
204
|
-
// Validate dependencies if using dependency order
|
|
205
|
-
if (config.loadOrder === 'dependency') {
|
|
206
|
-
return this.resolveDependencyOrder(sortedModules);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return sortedModules;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Discover modules from a specific path with advanced filtering
|
|
213
|
-
private async discoverFromPath(
|
|
214
|
-
searchPath: string,
|
|
215
|
-
config: ModuleDefaultsConfig['autoDiscovery']
|
|
216
|
-
): Promise<ModuleConfig[]> {
|
|
217
|
-
const modules: ModuleConfig[] = [];
|
|
218
|
-
const fullPath = join(this.baseDir, searchPath);
|
|
219
|
-
|
|
220
|
-
try {
|
|
221
|
-
const stat = statSync(fullPath);
|
|
222
|
-
|
|
223
|
-
if (!stat.isDirectory()) {
|
|
224
|
-
return modules;
|
|
225
|
-
}
|
|
226
|
-
} catch (error) {
|
|
227
|
-
return modules;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
try {
|
|
231
|
-
const files = await this.findMatchingFilesWithGlob(
|
|
232
|
-
fullPath,
|
|
233
|
-
config.patterns,
|
|
234
|
-
config.ignorePatterns,
|
|
235
|
-
config.maxDepth
|
|
236
|
-
);
|
|
237
|
-
|
|
238
|
-
for (const filePath of files) {
|
|
239
|
-
try {
|
|
240
|
-
// Convert relative path to absolute path for import
|
|
241
|
-
const absolutePath = join(this.baseDir, filePath);
|
|
242
|
-
const module = await this.loadModule(absolutePath);
|
|
243
|
-
if (module && this.validateAdvancedModule(module, config)) {
|
|
244
|
-
modules.push(module);
|
|
245
|
-
this.discoveryLogger.info(
|
|
246
|
-
`Auto-discovered module: ${module.name}@${module.version} from ${filePath}`
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
} catch (error) {
|
|
250
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
251
|
-
|
|
252
|
-
if (config.failOnError) {
|
|
253
|
-
throw new Error(`Failed to load module from ${filePath}: ${errorMsg}`);
|
|
254
|
-
} else {
|
|
255
|
-
this.discoveryLogger.warn(
|
|
256
|
-
`Failed to load module from ${filePath}`,
|
|
257
|
-
'MODULE_DISCOVERY',
|
|
258
|
-
{
|
|
259
|
-
error: errorMsg,
|
|
260
|
-
}
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
} catch (error) {
|
|
266
|
-
if (config.failOnError) {
|
|
267
|
-
throw error;
|
|
268
|
-
}
|
|
269
|
-
// Directory doesn't exist or other error, continue silently
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
return modules;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// Find files matching patterns with ignore support
|
|
276
|
-
private findMatchingFiles(
|
|
277
|
-
basePath: string,
|
|
278
|
-
config: ModuleDefaultsConfig['autoDiscovery'],
|
|
279
|
-
currentDepth: number = 0
|
|
280
|
-
): string[] {
|
|
281
|
-
const files: string[] = [];
|
|
282
|
-
|
|
283
|
-
if (currentDepth >= config.maxDepth) {
|
|
284
|
-
return files;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
try {
|
|
288
|
-
const items = readdirSync(basePath);
|
|
289
|
-
|
|
290
|
-
for (const item of items) {
|
|
291
|
-
const fullPath = join(basePath, item);
|
|
292
|
-
const relativePath = relative(this.baseDir, fullPath);
|
|
293
|
-
|
|
294
|
-
// Check ignore patterns
|
|
295
|
-
if (this.shouldIgnore(relativePath, config.ignorePatterns)) {
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
const stat = statSync(fullPath);
|
|
300
|
-
|
|
301
|
-
if (stat.isDirectory() && config.recursive) {
|
|
302
|
-
files.push(...this.findMatchingFiles(fullPath, config, currentDepth + 1));
|
|
303
|
-
} else if (stat.isFile()) {
|
|
304
|
-
// Check if file matches any pattern
|
|
305
|
-
if (this.matchesPatterns(relativePath, config.patterns)) {
|
|
306
|
-
files.push(fullPath);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
} catch {
|
|
311
|
-
// Directory not accessible, skip
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
return files;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Use native Node.js glob to find matching files
|
|
318
|
-
private async findMatchingFilesWithGlob(
|
|
319
|
-
searchPath: string,
|
|
320
|
-
patterns: string[],
|
|
321
|
-
ignorePatterns: string[],
|
|
322
|
-
maxDepth: number = 5
|
|
323
|
-
): Promise<string[]> {
|
|
324
|
-
// Force fallback in CI environments or if Node.js version is uncertain
|
|
325
|
-
const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true';
|
|
326
|
-
|
|
327
|
-
if (isCI) {
|
|
328
|
-
return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const allFiles: string[] = [];
|
|
332
|
-
|
|
333
|
-
try {
|
|
334
|
-
// Try to use native fs.glob if available (Node.js 20+)
|
|
335
|
-
const { glob } = await import('fs/promises');
|
|
336
|
-
|
|
337
|
-
// Check if glob is actually a function and test it
|
|
338
|
-
if (typeof glob !== 'function') {
|
|
339
|
-
return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Test glob with a simple pattern first
|
|
343
|
-
try {
|
|
344
|
-
const testIterator = glob(join(searchPath, '*'));
|
|
345
|
-
let testCount = 0;
|
|
346
|
-
for await (const _ of testIterator) {
|
|
347
|
-
testCount++;
|
|
348
|
-
if (testCount > 0) break; // Just test that it works
|
|
349
|
-
}
|
|
350
|
-
} catch (testError) {
|
|
351
|
-
return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
for (const pattern of patterns) {
|
|
355
|
-
const fullPattern = join(searchPath, pattern);
|
|
356
|
-
try {
|
|
357
|
-
// fs.glob returns an AsyncIterator, need to collect results
|
|
358
|
-
const globIterator = glob(fullPattern);
|
|
359
|
-
const files: string[] = [];
|
|
360
|
-
|
|
361
|
-
for await (const file of globIterator) {
|
|
362
|
-
const filePath = typeof file === 'string' ? file : (file as any).name || String(file);
|
|
363
|
-
const relativePath = relative(this.baseDir, filePath);
|
|
364
|
-
|
|
365
|
-
// Check if file should be ignored and within max depth
|
|
366
|
-
if (
|
|
367
|
-
!this.shouldIgnore(relativePath, ignorePatterns) &&
|
|
368
|
-
this.isWithinMaxDepth(relativePath, searchPath, maxDepth)
|
|
369
|
-
) {
|
|
370
|
-
files.push(relativePath);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
allFiles.push(...files);
|
|
375
|
-
} catch (error) {
|
|
376
|
-
// If any glob call fails, fall back to manual discovery
|
|
377
|
-
this.discoveryLogger.warn(`Glob pattern failed: ${pattern}`, String(error));
|
|
378
|
-
return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
} catch (error) {
|
|
382
|
-
// fs.glob not available, fall back to manual file discovery
|
|
383
|
-
this.discoveryLogger.debug('Native fs.glob not available, using fallback');
|
|
384
|
-
return this.findMatchingFilesFallback(searchPath, patterns, ignorePatterns, maxDepth);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
return [...new Set(allFiles)]; // Remove duplicates
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Fallback for Node.js versions without fs.glob
|
|
391
|
-
private async findMatchingFilesFallback(
|
|
392
|
-
searchPath: string,
|
|
393
|
-
patterns: string[],
|
|
394
|
-
ignorePatterns: string[],
|
|
395
|
-
maxDepth: number = 5
|
|
396
|
-
): Promise<string[]> {
|
|
397
|
-
const config = {
|
|
398
|
-
patterns,
|
|
399
|
-
ignorePatterns,
|
|
400
|
-
maxDepth,
|
|
401
|
-
recursive: true,
|
|
402
|
-
} as ModuleDefaultsConfig['autoDiscovery'];
|
|
403
|
-
|
|
404
|
-
// Handle both absolute and relative paths
|
|
405
|
-
const fullSearchPath = isAbsolute(searchPath) ? searchPath : join(this.baseDir, searchPath);
|
|
406
|
-
|
|
407
|
-
// Check if search path exists
|
|
408
|
-
try {
|
|
409
|
-
const { access } = await import('fs/promises');
|
|
410
|
-
await access(fullSearchPath);
|
|
411
|
-
} catch (e) {
|
|
412
|
-
return [];
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
// Get files and convert to relative paths
|
|
416
|
-
const files = this.findMatchingFiles(fullSearchPath, config);
|
|
417
|
-
const relativeFiles = files.map(file => relative(this.baseDir, file));
|
|
418
|
-
|
|
419
|
-
return relativeFiles;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// Simple pattern matching for fallback (basic glob support)
|
|
423
|
-
private matchesSimplePattern(path: string, pattern: string): boolean {
|
|
424
|
-
try {
|
|
425
|
-
// Normalize path separators
|
|
426
|
-
const normalizedPath = path.replace(/\\/g, '/');
|
|
427
|
-
const normalizedPattern = pattern.replace(/\\/g, '/');
|
|
428
|
-
|
|
429
|
-
// Convert simple glob patterns to regex
|
|
430
|
-
const regexPattern = normalizedPattern
|
|
431
|
-
.replace(/\*\*/g, '___DOUBLESTAR___') // Temporarily replace ** BEFORE escaping
|
|
432
|
-
.replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex chars
|
|
433
|
-
.replace(/\\\*/g, '[^/]*') // * matches anything except /
|
|
434
|
-
.replace(/___DOUBLESTAR___/g, '.*') // ** matches anything including /
|
|
435
|
-
.replace(/\\\?/g, '[^/]') // ? matches single character except /
|
|
436
|
-
.replace(/\\\{([^}]+)\\\}/g, '($1)') // {ts,js} -> (ts|js)
|
|
437
|
-
.replace(/,/g, '|'); // Convert comma to OR
|
|
438
|
-
|
|
439
|
-
const regex = new RegExp(`^${regexPattern}$`, 'i');
|
|
440
|
-
const result = regex.test(normalizedPath);
|
|
441
|
-
|
|
442
|
-
return result;
|
|
443
|
-
} catch (error) {
|
|
444
|
-
this.discoveryLogger.warn(`Pattern matching error for "${pattern}": ${String(error)}`);
|
|
445
|
-
return false;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// Check if path should be ignored
|
|
450
|
-
private shouldIgnore(path: string, ignorePatterns: string[]): boolean {
|
|
451
|
-
return ignorePatterns.some(pattern => this.matchesSimplePattern(path, pattern));
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// Check if path matches any of the patterns
|
|
455
|
-
private matchesPatterns(path: string, patterns: string[]): boolean {
|
|
456
|
-
return patterns.some(pattern => this.matchesSimplePattern(path, pattern));
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// Check if file is within max depth (for glob results)
|
|
460
|
-
private isWithinMaxDepth(relativePath: string, searchPath: string, maxDepth: number): boolean {
|
|
461
|
-
// Count directory separators to determine depth
|
|
462
|
-
const pathFromSearch = relative(searchPath, join(this.baseDir, relativePath));
|
|
463
|
-
const depth = pathFromSearch.split('/').length - 1; // -1 because file itself doesn't count as depth
|
|
464
|
-
return depth <= maxDepth;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// Remove duplicate modules
|
|
468
|
-
private deduplicateModules(modules: ModuleConfig[]): ModuleConfig[] {
|
|
469
|
-
const seen = new Set<string>();
|
|
470
|
-
return modules.filter(module => {
|
|
471
|
-
const key = `${module.name}@${module.version}`;
|
|
472
|
-
if (seen.has(key)) {
|
|
473
|
-
this.discoveryLogger.warn(`Duplicate module found: ${key}`, 'MODULE_DISCOVERY');
|
|
474
|
-
return false;
|
|
475
|
-
}
|
|
476
|
-
seen.add(key);
|
|
477
|
-
return true;
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// Sort modules based on strategy
|
|
482
|
-
private sortModules(
|
|
483
|
-
modules: ModuleConfig[],
|
|
484
|
-
strategy: ModuleDefaultsConfig['autoDiscovery']['loadOrder']
|
|
485
|
-
): ModuleConfig[] {
|
|
486
|
-
switch (strategy) {
|
|
487
|
-
case 'alphabetical':
|
|
488
|
-
return modules.sort((a, b) => a.name.localeCompare(b.name));
|
|
489
|
-
|
|
490
|
-
case 'dependency':
|
|
491
|
-
// Will be handled by resolveDependencyOrder
|
|
492
|
-
return modules;
|
|
493
|
-
|
|
494
|
-
case 'custom':
|
|
495
|
-
// Allow custom sorting via module priority (if defined)
|
|
496
|
-
return modules.sort((a, b) => {
|
|
497
|
-
const aPriority = (a.config as any)?.priority || 0;
|
|
498
|
-
const bPriority = (b.config as any)?.priority || 0;
|
|
499
|
-
return bPriority - aPriority; // Higher priority first
|
|
500
|
-
});
|
|
501
|
-
|
|
502
|
-
default:
|
|
503
|
-
return modules;
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
// Resolve dependency order using topological sort
|
|
508
|
-
private resolveDependencyOrder(modules: ModuleConfig[]): ModuleConfig[] {
|
|
509
|
-
const moduleMap = new Map<string, ModuleConfig>();
|
|
510
|
-
const dependencyGraph = new Map<string, string[]>();
|
|
511
|
-
|
|
512
|
-
// Build module map and dependency graph
|
|
513
|
-
modules.forEach(module => {
|
|
514
|
-
const key = `${module.name}@${module.version}`;
|
|
515
|
-
moduleMap.set(key, module);
|
|
516
|
-
dependencyGraph.set(key, module.dependencies || []);
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
// Topological sort
|
|
520
|
-
const visited = new Set<string>();
|
|
521
|
-
const visiting = new Set<string>();
|
|
522
|
-
const sorted: ModuleConfig[] = [];
|
|
523
|
-
|
|
524
|
-
const visit = (moduleKey: string): void => {
|
|
525
|
-
if (visiting.has(moduleKey)) {
|
|
526
|
-
throw new Error(`Circular dependency detected involving ${moduleKey}`);
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
if (visited.has(moduleKey)) {
|
|
530
|
-
return;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
visiting.add(moduleKey);
|
|
534
|
-
|
|
535
|
-
const dependencies = dependencyGraph.get(moduleKey) || [];
|
|
536
|
-
dependencies.forEach(dep => {
|
|
537
|
-
// Find the dependency in our modules
|
|
538
|
-
const depModule = Array.from(moduleMap.keys()).find(key =>
|
|
539
|
-
key.startsWith(`${dep.split('@')[0]}@`)
|
|
540
|
-
);
|
|
541
|
-
if (depModule) {
|
|
542
|
-
visit(depModule);
|
|
543
|
-
}
|
|
544
|
-
});
|
|
545
|
-
|
|
546
|
-
visiting.delete(moduleKey);
|
|
547
|
-
visited.add(moduleKey);
|
|
548
|
-
|
|
549
|
-
const module = moduleMap.get(moduleKey);
|
|
550
|
-
if (module) {
|
|
551
|
-
sorted.push(module);
|
|
552
|
-
}
|
|
553
|
-
};
|
|
554
|
-
|
|
555
|
-
// Visit all modules
|
|
556
|
-
Array.from(moduleMap.keys()).forEach(key => {
|
|
557
|
-
if (!visited.has(key)) {
|
|
558
|
-
visit(key);
|
|
559
|
-
}
|
|
560
|
-
});
|
|
561
|
-
|
|
562
|
-
return sorted;
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
// Enhanced module validation
|
|
566
|
-
private validateAdvancedModule(
|
|
567
|
-
module: ModuleConfig,
|
|
568
|
-
_config: ModuleDefaultsConfig['autoDiscovery']
|
|
569
|
-
): boolean {
|
|
570
|
-
// Basic validation
|
|
571
|
-
if (!this.isValidModule(module)) {
|
|
572
|
-
return false;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
// Additional validation can be added here
|
|
576
|
-
// For example, checking module compatibility, version constraints, etc.
|
|
577
|
-
|
|
578
|
-
return true;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
180
|
// Watch for module changes (for development)
|
|
582
181
|
watchModules(callback: (modules: ModuleConfig[]) => void): void {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
.then(fs => {
|
|
586
|
-
const modulePaths = this.findModuleFiles();
|
|
587
|
-
|
|
588
|
-
modulePaths.forEach(path => {
|
|
589
|
-
try {
|
|
590
|
-
fs.watchFile(path, async () => {
|
|
591
|
-
this.discoveryLogger.info(`Module file changed: ${path}`);
|
|
592
|
-
const modules = await this.discoverModules();
|
|
593
|
-
callback(modules);
|
|
594
|
-
});
|
|
595
|
-
} catch {
|
|
596
|
-
// File watching not supported or failed
|
|
597
|
-
}
|
|
598
|
-
});
|
|
599
|
-
})
|
|
600
|
-
.catch(() => {
|
|
601
|
-
// fs module not available
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
// Watch modules with advanced configuration
|
|
606
|
-
watchModulesAdvanced(
|
|
607
|
-
config: ModuleDefaultsConfig['autoDiscovery'],
|
|
608
|
-
callback: (modules: ModuleConfig[]) => void
|
|
609
|
-
): void {
|
|
610
|
-
if (!config.watchForChanges) {
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
import('fs')
|
|
615
|
-
.then(fs => {
|
|
616
|
-
const watchedPaths = new Set<string>();
|
|
617
|
-
|
|
618
|
-
// Watch all configured paths
|
|
619
|
-
config.paths.forEach(searchPath => {
|
|
620
|
-
const fullPath = join(this.baseDir, searchPath);
|
|
621
|
-
|
|
622
|
-
try {
|
|
623
|
-
if (statSync(fullPath).isDirectory() && !watchedPaths.has(fullPath)) {
|
|
624
|
-
watchedPaths.add(fullPath);
|
|
625
|
-
|
|
626
|
-
const watcher = fs.watch(
|
|
627
|
-
fullPath,
|
|
628
|
-
{ recursive: config.recursive },
|
|
629
|
-
async (eventType: string, filename: string | null) => {
|
|
630
|
-
if (filename && this.matchesPatterns(filename, config.patterns)) {
|
|
631
|
-
this.discoveryLogger.info(`Module file changed: ${filename}`);
|
|
632
|
-
const modules = await this.discoverModulesAdvanced(config);
|
|
633
|
-
callback(modules);
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
);
|
|
182
|
+
const fs = require('fs');
|
|
183
|
+
const modulePaths = this.findModuleFiles();
|
|
637
184
|
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
185
|
+
modulePaths.forEach(path => {
|
|
186
|
+
try {
|
|
187
|
+
fs.watchFile(path, async () => {
|
|
188
|
+
this.discoveryLogger.info(`Module file changed: ${path}`);
|
|
189
|
+
const modules = await this.discoverModules();
|
|
190
|
+
callback(modules);
|
|
644
191
|
});
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// fs module not available
|
|
648
|
-
});
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
// Clean up file watchers
|
|
652
|
-
cleanup(): void {
|
|
653
|
-
this.watchers.forEach(watcher => {
|
|
654
|
-
if (watcher && typeof watcher.close === 'function') {
|
|
655
|
-
watcher.close();
|
|
192
|
+
} catch {
|
|
193
|
+
// File watching not supported or failed
|
|
656
194
|
}
|
|
657
195
|
});
|
|
658
|
-
this.watchers = [];
|
|
659
196
|
}
|
|
660
197
|
}
|
|
661
198
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Module System - Centralized Exports
|
|
2
|
-
export { defineModule, ModuleLoader } from './modules
|
|
3
|
-
export { ModuleDiscovery, autoDiscoverModuleDirectories } from './auto-discovery
|
|
2
|
+
export { defineModule, ModuleLoader } from './modules';
|
|
3
|
+
export { ModuleDiscovery, autoDiscoverModuleDirectories } from './auto-discovery';
|