@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,6 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFrameworkLogger = exports.logger = exports.MoroLogger = void 0;
|
|
4
|
+
exports.configureGlobalLogger = configureGlobalLogger;
|
|
5
|
+
exports.applyLoggingConfiguration = applyLoggingConfiguration;
|
|
1
6
|
// Moro Logger - Beautiful, Fast, Feature-Rich
|
|
2
|
-
|
|
3
|
-
|
|
7
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
8
|
+
class MoroLogger {
|
|
4
9
|
level = 'info';
|
|
5
10
|
options;
|
|
6
11
|
outputs = new Map();
|
|
@@ -27,23 +32,12 @@ export class MoroLogger {
|
|
|
27
32
|
cachedTimestamp = '';
|
|
28
33
|
lastTimestamp = 0;
|
|
29
34
|
timestampCacheInterval = 100; // 100ms for better precision
|
|
30
|
-
//
|
|
31
|
-
static ENTRY_POOL = [];
|
|
32
|
-
static MAX_POOL_SIZE = 100;
|
|
33
|
-
static poolIndex = 0;
|
|
34
|
-
// String builder for efficient concatenation
|
|
35
|
-
static stringBuilder = [];
|
|
36
|
-
static stringBuilderIndex = 0;
|
|
37
|
-
// Buffered output for performance
|
|
35
|
+
// Buffered output for micro-batching
|
|
38
36
|
outputBuffer = [];
|
|
39
37
|
bufferSize = 0;
|
|
40
|
-
maxBufferSize =
|
|
38
|
+
maxBufferSize = 1024; // 1KB buffer
|
|
41
39
|
flushTimeout = null;
|
|
42
40
|
flushInterval = 1; // 1ms micro-batching
|
|
43
|
-
// Buffer overflow protection
|
|
44
|
-
bufferOverflowThreshold;
|
|
45
|
-
emergencyFlushInProgress = false;
|
|
46
|
-
isDestroyed = false;
|
|
47
41
|
// High-performance output methods
|
|
48
42
|
static LEVELS = {
|
|
49
43
|
debug: 0,
|
|
@@ -52,6 +46,76 @@ export class MoroLogger {
|
|
|
52
46
|
error: 3,
|
|
53
47
|
fatal: 4,
|
|
54
48
|
};
|
|
49
|
+
// Static pre-allocated strings for maximum performance
|
|
50
|
+
static LEVEL_STRINGS = {
|
|
51
|
+
debug: 'DEBUG',
|
|
52
|
+
info: 'INFO',
|
|
53
|
+
warn: 'WARN',
|
|
54
|
+
error: 'ERROR',
|
|
55
|
+
fatal: 'FATAL',
|
|
56
|
+
};
|
|
57
|
+
// Pre-allocated ANSI color codes
|
|
58
|
+
static ANSI_COLORS = {
|
|
59
|
+
reset: '\x1b[0m',
|
|
60
|
+
bold: '\x1b[1m',
|
|
61
|
+
dim: '\x1b[2m',
|
|
62
|
+
red: '\x1b[31m',
|
|
63
|
+
green: '\x1b[32m',
|
|
64
|
+
yellow: '\x1b[33m',
|
|
65
|
+
blue: '\x1b[34m',
|
|
66
|
+
magenta: '\x1b[35m',
|
|
67
|
+
cyan: '\x1b[36m',
|
|
68
|
+
white: '\x1b[37m',
|
|
69
|
+
gray: '\x1b[90m',
|
|
70
|
+
};
|
|
71
|
+
// Object pool for LogEntry reuse
|
|
72
|
+
static ENTRY_POOL = [];
|
|
73
|
+
static MAX_POOL_SIZE = 100;
|
|
74
|
+
static poolIndex = 0;
|
|
75
|
+
// Object pool management
|
|
76
|
+
static getPooledEntry() {
|
|
77
|
+
if (MoroLogger.poolIndex > 0) {
|
|
78
|
+
return MoroLogger.ENTRY_POOL[--MoroLogger.poolIndex];
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
timestamp: new Date(),
|
|
82
|
+
level: 'info',
|
|
83
|
+
message: '',
|
|
84
|
+
context: undefined,
|
|
85
|
+
metadata: undefined,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
static returnPooledEntry(entry) {
|
|
89
|
+
if (MoroLogger.poolIndex < MoroLogger.MAX_POOL_SIZE) {
|
|
90
|
+
// Reset the entry
|
|
91
|
+
entry.timestamp = new Date();
|
|
92
|
+
entry.level = 'info';
|
|
93
|
+
entry.message = '';
|
|
94
|
+
entry.context = undefined;
|
|
95
|
+
entry.metadata = undefined;
|
|
96
|
+
MoroLogger.ENTRY_POOL[MoroLogger.poolIndex++] = entry;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// String builder for efficient concatenation
|
|
100
|
+
static stringBuilder = [];
|
|
101
|
+
static stringBuilderIndex = 0;
|
|
102
|
+
static resetStringBuilder() {
|
|
103
|
+
MoroLogger.stringBuilderIndex = 0;
|
|
104
|
+
}
|
|
105
|
+
static appendToBuilder(str) {
|
|
106
|
+
if (MoroLogger.stringBuilderIndex < MoroLogger.stringBuilder.length) {
|
|
107
|
+
MoroLogger.stringBuilder[MoroLogger.stringBuilderIndex++] = str;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
MoroLogger.stringBuilder.push(str);
|
|
111
|
+
MoroLogger.stringBuilderIndex++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
static buildString() {
|
|
115
|
+
const result = MoroLogger.stringBuilder.slice(0, MoroLogger.stringBuilderIndex).join('');
|
|
116
|
+
MoroLogger.resetStringBuilder();
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
55
119
|
static COLORS = {
|
|
56
120
|
debug: '\x1b[36m', // Cyan
|
|
57
121
|
info: '\x1b[32m', // Green
|
|
@@ -62,20 +126,11 @@ export class MoroLogger {
|
|
|
62
126
|
context: '\x1b[34m', // Blue
|
|
63
127
|
metadata: '\x1b[37m', // White
|
|
64
128
|
performance: '\x1b[36m', // Cyan
|
|
65
|
-
reset: '\x1b[0m', // Reset
|
|
66
129
|
};
|
|
67
130
|
static RESET = '\x1b[0m';
|
|
68
131
|
static BOLD = '\x1b[1m';
|
|
69
|
-
// Static pre-allocated strings for performance
|
|
70
|
-
static LEVEL_STRINGS = {
|
|
71
|
-
debug: 'DEBUG',
|
|
72
|
-
info: 'INFO ',
|
|
73
|
-
warn: 'WARN ',
|
|
74
|
-
error: 'ERROR',
|
|
75
|
-
fatal: 'FATAL',
|
|
76
|
-
};
|
|
77
132
|
constructor(options = {}) {
|
|
78
|
-
this.options =
|
|
133
|
+
this.options = {
|
|
79
134
|
level: 'info',
|
|
80
135
|
enableColors: true,
|
|
81
136
|
enableTimestamp: true,
|
|
@@ -86,14 +141,9 @@ export class MoroLogger {
|
|
|
86
141
|
outputs: [],
|
|
87
142
|
filters: [],
|
|
88
143
|
maxEntries: 1000,
|
|
89
|
-
maxBufferSize: 1000,
|
|
90
144
|
...options,
|
|
91
|
-
}
|
|
145
|
+
};
|
|
92
146
|
this.level = this.options.level || 'info';
|
|
93
|
-
// Initialize buffer size from options
|
|
94
|
-
this.maxBufferSize = this.options.maxBufferSize || 1000;
|
|
95
|
-
// Initialize buffer overflow protection
|
|
96
|
-
this.bufferOverflowThreshold = this.maxBufferSize * 2;
|
|
97
147
|
// Add default console output
|
|
98
148
|
this.addOutput({
|
|
99
149
|
name: 'console',
|
|
@@ -104,52 +154,6 @@ export class MoroLogger {
|
|
|
104
154
|
this.options.outputs?.forEach(output => this.addOutput(output));
|
|
105
155
|
this.options.filters?.forEach(filter => this.addFilter(filter));
|
|
106
156
|
}
|
|
107
|
-
// Object pooling methods
|
|
108
|
-
static getPooledEntry() {
|
|
109
|
-
if (MoroLogger.ENTRY_POOL.length > 0) {
|
|
110
|
-
const entry = MoroLogger.ENTRY_POOL.pop();
|
|
111
|
-
// Properly reset ALL properties to prevent memory leaks
|
|
112
|
-
entry.timestamp = new Date();
|
|
113
|
-
entry.level = 'info';
|
|
114
|
-
entry.message = '';
|
|
115
|
-
entry.context = undefined;
|
|
116
|
-
entry.metadata = undefined;
|
|
117
|
-
entry.performance = undefined;
|
|
118
|
-
entry.moduleId = undefined;
|
|
119
|
-
return entry;
|
|
120
|
-
}
|
|
121
|
-
return MoroLogger.createFreshEntry();
|
|
122
|
-
}
|
|
123
|
-
// ADD this new method:
|
|
124
|
-
static createFreshEntry() {
|
|
125
|
-
return {
|
|
126
|
-
timestamp: new Date(),
|
|
127
|
-
level: 'info',
|
|
128
|
-
message: '',
|
|
129
|
-
context: undefined,
|
|
130
|
-
metadata: undefined,
|
|
131
|
-
performance: undefined,
|
|
132
|
-
moduleId: undefined,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
static returnPooledEntry(entry) {
|
|
136
|
-
if (MoroLogger.ENTRY_POOL.length < MoroLogger.MAX_POOL_SIZE) {
|
|
137
|
-
MoroLogger.ENTRY_POOL.push(entry);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
// String builder methods
|
|
141
|
-
static resetStringBuilder() {
|
|
142
|
-
MoroLogger.stringBuilder.length = 0;
|
|
143
|
-
MoroLogger.stringBuilderIndex = 0;
|
|
144
|
-
}
|
|
145
|
-
static appendToBuilder(str) {
|
|
146
|
-
MoroLogger.stringBuilder[MoroLogger.stringBuilderIndex++] = str;
|
|
147
|
-
}
|
|
148
|
-
static buildString() {
|
|
149
|
-
const result = MoroLogger.stringBuilder.join('');
|
|
150
|
-
MoroLogger.resetStringBuilder();
|
|
151
|
-
return result;
|
|
152
|
-
}
|
|
153
157
|
debug(message, context, metadata) {
|
|
154
158
|
this.log('debug', message, context, metadata);
|
|
155
159
|
}
|
|
@@ -170,12 +174,12 @@ export class MoroLogger {
|
|
|
170
174
|
this.log('fatal', msg, context, { ...metadata, stack });
|
|
171
175
|
}
|
|
172
176
|
time(label) {
|
|
173
|
-
this.timers.set(label, performance.now());
|
|
177
|
+
this.timers.set(label, perf_hooks_1.performance.now());
|
|
174
178
|
}
|
|
175
179
|
timeEnd(label, context, metadata) {
|
|
176
180
|
const startTime = this.timers.get(label);
|
|
177
181
|
if (startTime !== undefined) {
|
|
178
|
-
const duration = performance.now() - startTime;
|
|
182
|
+
const duration = perf_hooks_1.performance.now() - startTime;
|
|
179
183
|
this.timers.delete(label);
|
|
180
184
|
this.log('info', `Timer: ${label}`, context, {
|
|
181
185
|
...metadata,
|
|
@@ -184,9 +188,7 @@ export class MoroLogger {
|
|
|
184
188
|
}
|
|
185
189
|
}
|
|
186
190
|
child(context, metadata) {
|
|
187
|
-
|
|
188
|
-
const childOptions = { ...this.options, level: this.level };
|
|
189
|
-
const childLogger = new MoroLogger(childOptions);
|
|
191
|
+
const childLogger = new MoroLogger(this.options);
|
|
190
192
|
childLogger.contextPrefix = this.contextPrefix ? `${this.contextPrefix}:${context}` : context;
|
|
191
193
|
childLogger.contextMetadata = { ...this.contextMetadata, ...metadata };
|
|
192
194
|
childLogger.outputs = this.outputs;
|
|
@@ -198,9 +200,6 @@ export class MoroLogger {
|
|
|
198
200
|
setLevel(level) {
|
|
199
201
|
this.level = level;
|
|
200
202
|
}
|
|
201
|
-
getLevel() {
|
|
202
|
-
return this.level;
|
|
203
|
-
}
|
|
204
203
|
addOutput(output) {
|
|
205
204
|
this.outputs.set(output.name, output);
|
|
206
205
|
}
|
|
@@ -243,16 +242,6 @@ export class MoroLogger {
|
|
|
243
242
|
}
|
|
244
243
|
return this.cachedTimestamp;
|
|
245
244
|
}
|
|
246
|
-
// Cached timestamp generation (updates once per second)
|
|
247
|
-
getFastCachedTimestamp() {
|
|
248
|
-
const now = Date.now();
|
|
249
|
-
if (now - this.lastTimestamp > 1000) {
|
|
250
|
-
// Update every second
|
|
251
|
-
this.lastTimestamp = now;
|
|
252
|
-
this.cachedTimestamp = new Date(now).toISOString().slice(0, 19).replace('T', ' ');
|
|
253
|
-
}
|
|
254
|
-
return this.cachedTimestamp;
|
|
255
|
-
}
|
|
256
245
|
getMetrics() {
|
|
257
246
|
const now = Date.now();
|
|
258
247
|
const uptime = (now - this.startTime) / 1000; // seconds
|
|
@@ -277,38 +266,47 @@ export class MoroLogger {
|
|
|
277
266
|
memoryUsage: 0,
|
|
278
267
|
};
|
|
279
268
|
}
|
|
280
|
-
// Optimized logging method
|
|
269
|
+
// Optimized logging method with aggressive level checking
|
|
281
270
|
log(level, message, context, metadata) {
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
// Absolute minimal path for simple logs - pure speed
|
|
271
|
+
// AGGRESSIVE LEVEL CHECK - numeric comparison for maximum speed
|
|
272
|
+
const levelNum = MoroLogger.LEVELS[level];
|
|
273
|
+
const effectiveLevelNum = this.parent
|
|
274
|
+
? MoroLogger.LEVELS[this.parent.level]
|
|
275
|
+
: MoroLogger.LEVELS[this.level];
|
|
276
|
+
if (levelNum < effectiveLevelNum) {
|
|
277
|
+
return; // Exit immediately if level is too low
|
|
278
|
+
}
|
|
279
|
+
// ULTRA-FAST PATH: Just message, no context, no metadata
|
|
292
280
|
if (!metadata && !context && !this.contextPrefix && !this.contextMetadata) {
|
|
293
|
-
|
|
281
|
+
const levelStr = MoroLogger.LEVEL_STRINGS[level];
|
|
282
|
+
this.output(`${levelStr} ${message}\n`, level);
|
|
294
283
|
return;
|
|
295
284
|
}
|
|
296
|
-
//
|
|
285
|
+
// FAST PATH: Message + context, no metadata
|
|
297
286
|
if (!metadata && !this.contextMetadata) {
|
|
298
|
-
|
|
287
|
+
const levelStr = MoroLogger.LEVEL_STRINGS[level];
|
|
288
|
+
if (context) {
|
|
289
|
+
this.output(`${levelStr} [${context}] ${message}\n`, level);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
this.output(`${levelStr} ${message}\n`, level);
|
|
293
|
+
}
|
|
299
294
|
return;
|
|
300
295
|
}
|
|
301
|
-
//
|
|
302
|
-
if (metadata && Object.keys(metadata).length
|
|
303
|
-
|
|
296
|
+
// MEDIUM PATH: Message + context + simple metadata
|
|
297
|
+
if (metadata && Object.keys(metadata).length <= 3 && !this.contextMetadata) {
|
|
298
|
+
const levelStr = MoroLogger.LEVEL_STRINGS[level];
|
|
299
|
+
const contextStr = context ? `[${context}] ` : '';
|
|
300
|
+
const metaStr = this.stringify(metadata);
|
|
301
|
+
this.output(`${levelStr} ${contextStr}${message} ${metaStr}\n`, level);
|
|
304
302
|
return;
|
|
305
303
|
}
|
|
306
|
-
//
|
|
304
|
+
// FULL PATH: All features enabled
|
|
307
305
|
this.fullLog(level, message, context, metadata);
|
|
308
306
|
}
|
|
309
|
-
// Full logging with all features
|
|
307
|
+
// Full logging with all features using object pooling
|
|
310
308
|
fullLog(level, message, context, metadata) {
|
|
311
|
-
//
|
|
309
|
+
// Get pooled entry to avoid allocation
|
|
312
310
|
const entry = MoroLogger.getPooledEntry();
|
|
313
311
|
const now = Date.now();
|
|
314
312
|
entry.timestamp = new Date(now);
|
|
@@ -325,7 +323,6 @@ export class MoroLogger {
|
|
|
325
323
|
if (this.filters.size > 0) {
|
|
326
324
|
for (const filter of this.filters.values()) {
|
|
327
325
|
if (!filter.filter(entry)) {
|
|
328
|
-
MoroLogger.returnPooledEntry(entry);
|
|
329
326
|
return;
|
|
330
327
|
}
|
|
331
328
|
}
|
|
@@ -336,76 +333,8 @@ export class MoroLogger {
|
|
|
336
333
|
this.addToHistory(entry);
|
|
337
334
|
// Write to outputs with batched processing
|
|
338
335
|
this.writeToOutputs(entry, level);
|
|
339
|
-
// Return entry to pool
|
|
340
|
-
MoroLogger.returnPooledEntry(entry);
|
|
341
|
-
}
|
|
342
|
-
// Absolute minimal logging - pure speed, no overhead
|
|
343
|
-
complexLog(level, message, context, metadata) {
|
|
344
|
-
// Use object pooling for LogEntry (Pino's technique)
|
|
345
|
-
const entry = MoroLogger.getPooledEntry();
|
|
346
|
-
const now = Date.now();
|
|
347
|
-
entry.timestamp = new Date(now);
|
|
348
|
-
entry.level = level;
|
|
349
|
-
entry.message = message;
|
|
350
|
-
entry.context = this.contextPrefix
|
|
351
|
-
? context
|
|
352
|
-
? `${this.contextPrefix}:${context}`
|
|
353
|
-
: this.contextPrefix
|
|
354
|
-
: context;
|
|
355
|
-
entry.metadata = this.createMetadata(metadata);
|
|
356
|
-
entry.performance = this.options.enablePerformance ? this.getPerformanceData(now) : undefined;
|
|
357
|
-
// Write to outputs with batched processing
|
|
358
|
-
this.writeToOutputs(entry, level);
|
|
359
|
-
// Return entry to pool
|
|
360
|
-
MoroLogger.returnPooledEntry(entry);
|
|
361
|
-
}
|
|
362
|
-
// Simple log writer with colors for minimal overhead cases
|
|
363
|
-
writeSimpleLog(level, message, context) {
|
|
364
|
-
const colors = this.options.enableColors !== false;
|
|
365
|
-
const levelReset = colors ? MoroLogger.RESET : '';
|
|
366
|
-
MoroLogger.resetStringBuilder();
|
|
367
|
-
// Timestamp with caching optimization
|
|
368
|
-
if (this.options.enableTimestamp !== false) {
|
|
369
|
-
const timestamp = this.getFastCachedTimestamp();
|
|
370
|
-
if (colors) {
|
|
371
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS.timestamp);
|
|
372
|
-
MoroLogger.appendToBuilder(timestamp);
|
|
373
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
MoroLogger.appendToBuilder(timestamp);
|
|
377
|
-
}
|
|
378
|
-
MoroLogger.appendToBuilder(' ');
|
|
379
|
-
}
|
|
380
|
-
// Level with pre-allocated strings
|
|
381
|
-
const levelStr = MoroLogger.LEVEL_STRINGS[level];
|
|
382
|
-
if (colors) {
|
|
383
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS[level]);
|
|
384
|
-
MoroLogger.appendToBuilder(MoroLogger.BOLD);
|
|
385
|
-
MoroLogger.appendToBuilder(levelStr);
|
|
386
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
387
|
-
}
|
|
388
|
-
else {
|
|
389
|
-
MoroLogger.appendToBuilder(levelStr);
|
|
390
|
-
}
|
|
391
|
-
// Context
|
|
392
|
-
if (context && this.options.enableContext !== false) {
|
|
393
|
-
MoroLogger.appendToBuilder(' ');
|
|
394
|
-
if (colors) {
|
|
395
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS.context);
|
|
396
|
-
MoroLogger.appendToBuilder(`[${context}]`);
|
|
397
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
MoroLogger.appendToBuilder(`[${context}]`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
// Message
|
|
404
|
-
MoroLogger.appendToBuilder(' ');
|
|
405
|
-
MoroLogger.appendToBuilder(message);
|
|
406
|
-
// Output main log line with high-performance method
|
|
407
|
-
const finalMessage = MoroLogger.buildString();
|
|
408
|
-
this.output(`${finalMessage}\n`, level);
|
|
336
|
+
// Return entry to pool after a short delay to allow async operations
|
|
337
|
+
setTimeout(() => MoroLogger.returnPooledEntry(entry), 0);
|
|
409
338
|
}
|
|
410
339
|
updateMetrics(entry) {
|
|
411
340
|
this.metrics.totalLogs++;
|
|
@@ -453,35 +382,23 @@ export class MoroLogger {
|
|
|
453
382
|
writeToOutputs(entry, level) {
|
|
454
383
|
if (this.outputs.size === 0)
|
|
455
384
|
return;
|
|
456
|
-
let successCount = 0;
|
|
457
|
-
const errors = [];
|
|
458
385
|
for (const output of this.outputs.values()) {
|
|
459
386
|
if (!output.level || MoroLogger.LEVELS[level] >= MoroLogger.LEVELS[output.level]) {
|
|
460
387
|
try {
|
|
461
388
|
output.write(entry);
|
|
462
|
-
successCount++;
|
|
463
389
|
}
|
|
464
390
|
catch (error) {
|
|
465
|
-
|
|
466
|
-
|
|
391
|
+
// Fallback to console.error for logger errors
|
|
392
|
+
// eslint-disable-next-line no-console
|
|
393
|
+
console.error('Logger output error:', error);
|
|
467
394
|
}
|
|
468
395
|
}
|
|
469
396
|
}
|
|
470
|
-
// If all outputs fail, use emergency console
|
|
471
|
-
if (successCount === 0 && this.outputs.size > 0) {
|
|
472
|
-
this.emergencyConsoleWrite(entry);
|
|
473
|
-
}
|
|
474
|
-
// Log output errors (but avoid infinite loops)
|
|
475
|
-
if (errors.length > 0 && level !== 'error') {
|
|
476
|
-
this.error(`Logger output errors: ${errors.length} failed`, 'MoroLogger', {
|
|
477
|
-
errors: errors.map(e => e.outputName),
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
397
|
}
|
|
481
398
|
writeToConsole(entry) {
|
|
482
399
|
const format = this.options.format || 'pretty';
|
|
483
400
|
if (format === 'json') {
|
|
484
|
-
this.output(
|
|
401
|
+
this.output(JSON.stringify(entry) + '\n', entry.level);
|
|
485
402
|
return;
|
|
486
403
|
}
|
|
487
404
|
if (format === 'compact') {
|
|
@@ -495,7 +412,6 @@ export class MoroLogger {
|
|
|
495
412
|
}
|
|
496
413
|
writePrettyLog(entry) {
|
|
497
414
|
const colors = this.options.enableColors !== false;
|
|
498
|
-
const levelReset = colors ? MoroLogger.RESET : '';
|
|
499
415
|
MoroLogger.resetStringBuilder();
|
|
500
416
|
// Timestamp with caching optimization
|
|
501
417
|
if (this.options.enableTimestamp !== false) {
|
|
@@ -503,29 +419,35 @@ export class MoroLogger {
|
|
|
503
419
|
if (colors) {
|
|
504
420
|
MoroLogger.appendToBuilder(MoroLogger.COLORS.timestamp);
|
|
505
421
|
MoroLogger.appendToBuilder(timestamp);
|
|
506
|
-
MoroLogger.appendToBuilder(
|
|
422
|
+
MoroLogger.appendToBuilder(MoroLogger.RESET);
|
|
507
423
|
}
|
|
508
424
|
else {
|
|
509
425
|
MoroLogger.appendToBuilder(timestamp);
|
|
510
426
|
}
|
|
427
|
+
}
|
|
428
|
+
// Level with color using pre-allocated strings
|
|
429
|
+
const levelColor = colors ? MoroLogger.COLORS[entry.level] : '';
|
|
430
|
+
const levelReset = colors ? MoroLogger.RESET : '';
|
|
431
|
+
const levelText = MoroLogger.LEVEL_STRINGS[entry.level];
|
|
432
|
+
// Add space after timestamp if present
|
|
433
|
+
if (this.options.enableTimestamp !== false) {
|
|
511
434
|
MoroLogger.appendToBuilder(' ');
|
|
512
435
|
}
|
|
513
|
-
// Level with pre-allocated strings
|
|
514
|
-
const levelStr = MoroLogger.LEVEL_STRINGS[entry.level];
|
|
515
436
|
if (colors) {
|
|
516
|
-
MoroLogger.appendToBuilder(
|
|
437
|
+
MoroLogger.appendToBuilder(levelColor);
|
|
517
438
|
MoroLogger.appendToBuilder(MoroLogger.BOLD);
|
|
518
|
-
MoroLogger.appendToBuilder(
|
|
439
|
+
MoroLogger.appendToBuilder(levelText);
|
|
519
440
|
MoroLogger.appendToBuilder(levelReset);
|
|
520
441
|
}
|
|
521
442
|
else {
|
|
522
|
-
MoroLogger.appendToBuilder(
|
|
443
|
+
MoroLogger.appendToBuilder(levelText);
|
|
523
444
|
}
|
|
524
445
|
// Context
|
|
525
446
|
if (entry.context && this.options.enableContext !== false) {
|
|
526
|
-
MoroLogger.
|
|
447
|
+
const contextColor = colors ? MoroLogger.COLORS.context : '';
|
|
448
|
+
MoroLogger.appendToBuilder(' '); // Space before context
|
|
527
449
|
if (colors) {
|
|
528
|
-
MoroLogger.appendToBuilder(
|
|
450
|
+
MoroLogger.appendToBuilder(contextColor);
|
|
529
451
|
MoroLogger.appendToBuilder(`[${entry.context}]`);
|
|
530
452
|
MoroLogger.appendToBuilder(levelReset);
|
|
531
453
|
}
|
|
@@ -534,7 +456,7 @@ export class MoroLogger {
|
|
|
534
456
|
}
|
|
535
457
|
}
|
|
536
458
|
// Message
|
|
537
|
-
MoroLogger.appendToBuilder(' ');
|
|
459
|
+
MoroLogger.appendToBuilder(' '); // Space before message
|
|
538
460
|
MoroLogger.appendToBuilder(entry.message);
|
|
539
461
|
// Performance info
|
|
540
462
|
if (entry.performance && this.options.enablePerformance !== false) {
|
|
@@ -547,7 +469,7 @@ export class MoroLogger {
|
|
|
547
469
|
perfParts.push(`${Math.round(entry.performance.memory)}MB`);
|
|
548
470
|
}
|
|
549
471
|
if (perfParts.length > 0) {
|
|
550
|
-
MoroLogger.appendToBuilder(' ');
|
|
472
|
+
MoroLogger.appendToBuilder(' '); // Space before performance info
|
|
551
473
|
if (colors) {
|
|
552
474
|
MoroLogger.appendToBuilder(perfColor);
|
|
553
475
|
MoroLogger.appendToBuilder(`(${perfParts.join(', ')})`);
|
|
@@ -565,20 +487,19 @@ export class MoroLogger {
|
|
|
565
487
|
const metaColor = colors ? MoroLogger.COLORS.metadata : '';
|
|
566
488
|
const cleanMetadata = this.cleanMetadata(entry.metadata);
|
|
567
489
|
if (Object.keys(cleanMetadata).length > 0) {
|
|
568
|
-
MoroLogger.appendToBuilder(' ');
|
|
569
490
|
if (colors) {
|
|
570
491
|
MoroLogger.appendToBuilder(metaColor);
|
|
571
|
-
MoroLogger.appendToBuilder(this.
|
|
492
|
+
MoroLogger.appendToBuilder(this.stringify(cleanMetadata));
|
|
572
493
|
MoroLogger.appendToBuilder(levelReset);
|
|
573
494
|
}
|
|
574
495
|
else {
|
|
575
|
-
MoroLogger.appendToBuilder(this.
|
|
496
|
+
MoroLogger.appendToBuilder(this.stringify(cleanMetadata));
|
|
576
497
|
}
|
|
577
498
|
}
|
|
578
499
|
}
|
|
579
500
|
// Output main log line with high-performance method
|
|
580
501
|
const finalMessage = MoroLogger.buildString();
|
|
581
|
-
this.output(
|
|
502
|
+
this.output(finalMessage + '\n', entry.level);
|
|
582
503
|
// Stack trace for errors
|
|
583
504
|
if (entry.metadata?.stack && (entry.level === 'error' || entry.level === 'fatal')) {
|
|
584
505
|
const stackColor = colors ? MoroLogger.COLORS.error : '';
|
|
@@ -595,181 +516,77 @@ export class MoroLogger {
|
|
|
595
516
|
}
|
|
596
517
|
return clean;
|
|
597
518
|
}
|
|
598
|
-
//
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
!this.emergencyFlushInProgress) {
|
|
603
|
-
this.emergencyFlushInProgress = true;
|
|
604
|
-
this.forceFlushBuffer();
|
|
605
|
-
this.emergencyFlushInProgress = false;
|
|
519
|
+
// Fast JSON stringify with error handling
|
|
520
|
+
stringify(obj) {
|
|
521
|
+
try {
|
|
522
|
+
return JSON.stringify(obj);
|
|
606
523
|
}
|
|
524
|
+
catch {
|
|
525
|
+
return '[Circular Reference]';
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
// High-performance output with micro-batching
|
|
529
|
+
output(message, level = 'info') {
|
|
530
|
+
// Add to buffer
|
|
607
531
|
this.outputBuffer.push(message);
|
|
608
|
-
this.bufferSize
|
|
609
|
-
//
|
|
610
|
-
if (
|
|
532
|
+
this.bufferSize += message.length;
|
|
533
|
+
// Flush immediately if buffer is full or for errors
|
|
534
|
+
if (this.bufferSize >= this.maxBufferSize || level === 'error' || level === 'fatal') {
|
|
611
535
|
this.flushBuffer();
|
|
612
536
|
}
|
|
613
537
|
else {
|
|
538
|
+
// Schedule flush with micro-batching
|
|
614
539
|
this.scheduleFlush();
|
|
615
540
|
}
|
|
616
541
|
}
|
|
617
542
|
scheduleFlush() {
|
|
618
|
-
if (this.flushTimeout
|
|
619
|
-
return; // Already scheduled
|
|
620
|
-
}
|
|
543
|
+
if (this.flushTimeout)
|
|
544
|
+
return; // Already scheduled
|
|
621
545
|
this.flushTimeout = setTimeout(() => {
|
|
622
546
|
this.flushBuffer();
|
|
547
|
+
this.flushTimeout = null;
|
|
623
548
|
}, this.flushInterval);
|
|
624
|
-
// Unref the timeout so it doesn't prevent process exit (important for tests)
|
|
625
|
-
this.flushTimeout.unref();
|
|
626
549
|
}
|
|
627
550
|
flushBuffer() {
|
|
628
|
-
if (this.outputBuffer.length === 0)
|
|
551
|
+
if (this.outputBuffer.length === 0)
|
|
629
552
|
return;
|
|
630
|
-
}
|
|
631
|
-
// Group messages by stream type
|
|
632
|
-
const stdoutMessages = [];
|
|
633
|
-
const stderrMessages = [];
|
|
634
|
-
for (const message of this.outputBuffer) {
|
|
635
|
-
// Determine stream based on message content or level
|
|
636
|
-
if (message.includes('ERROR') || message.includes('FATAL')) {
|
|
637
|
-
stderrMessages.push(message);
|
|
638
|
-
}
|
|
639
|
-
else {
|
|
640
|
-
stdoutMessages.push(message);
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
// Write to appropriate streams with error handling
|
|
644
553
|
try {
|
|
645
|
-
|
|
554
|
+
// Group by stream type for efficiency
|
|
555
|
+
const stdoutMessages = [];
|
|
556
|
+
const stderrMessages = [];
|
|
557
|
+
for (const message of this.outputBuffer) {
|
|
558
|
+
// Determine stream based on message content (simple heuristic)
|
|
559
|
+
if (message.includes('ERROR') || message.includes('FATAL')) {
|
|
560
|
+
stderrMessages.push(message);
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
stdoutMessages.push(message);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
// Write to streams
|
|
567
|
+
if (stdoutMessages.length > 0) {
|
|
646
568
|
process.stdout.write(stdoutMessages.join(''));
|
|
647
569
|
}
|
|
648
|
-
if (stderrMessages.length > 0
|
|
570
|
+
if (stderrMessages.length > 0) {
|
|
649
571
|
process.stderr.write(stderrMessages.join(''));
|
|
650
572
|
}
|
|
651
573
|
}
|
|
652
574
|
catch {
|
|
653
|
-
// Fallback to console if
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
catch {
|
|
659
|
-
// If even console.log fails, just ignore
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
// Clear buffer
|
|
663
|
-
this.outputBuffer.length = 0;
|
|
664
|
-
this.bufferSize = 0;
|
|
665
|
-
// Clear timeout
|
|
666
|
-
if (this.flushTimeout) {
|
|
667
|
-
clearTimeout(this.flushTimeout);
|
|
668
|
-
this.flushTimeout = null;
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
// Emergency flush for buffer overflow protection
|
|
672
|
-
forceFlushBuffer() {
|
|
673
|
-
if (this.outputBuffer.length === 0)
|
|
674
|
-
return;
|
|
675
|
-
try {
|
|
676
|
-
const message = this.outputBuffer.join('');
|
|
677
|
-
process.stdout.write(message);
|
|
678
|
-
}
|
|
679
|
-
catch (error) {
|
|
680
|
-
// Emergency fallback - write individual messages
|
|
681
|
-
for (const msg of this.outputBuffer) {
|
|
682
|
-
try {
|
|
683
|
-
process.stdout.write(msg);
|
|
684
|
-
}
|
|
685
|
-
catch {
|
|
686
|
-
// If even this fails, give up on this batch
|
|
687
|
-
break;
|
|
575
|
+
// Fallback to console methods if stream write fails
|
|
576
|
+
for (const message of this.outputBuffer) {
|
|
577
|
+
if (message.includes('ERROR') || message.includes('FATAL')) {
|
|
578
|
+
// eslint-disable-next-line no-console
|
|
579
|
+
console.error(message.trim());
|
|
688
580
|
}
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
this.outputBuffer.length = 0;
|
|
693
|
-
this.bufferSize = 0;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
// Safe stringify with circular reference detection
|
|
697
|
-
safeStringify(obj, maxDepth = 3) {
|
|
698
|
-
const seen = new WeakSet();
|
|
699
|
-
const stringify = (value, depth) => {
|
|
700
|
-
if (depth > maxDepth)
|
|
701
|
-
return '[Max Depth Reached]';
|
|
702
|
-
if (value === null || typeof value !== 'object')
|
|
703
|
-
return value;
|
|
704
|
-
if (seen.has(value))
|
|
705
|
-
return '[Circular Reference]';
|
|
706
|
-
seen.add(value);
|
|
707
|
-
if (Array.isArray(value)) {
|
|
708
|
-
return value.map(item => stringify(item, depth + 1));
|
|
709
|
-
}
|
|
710
|
-
const result = {};
|
|
711
|
-
for (const [key, val] of Object.entries(value)) {
|
|
712
|
-
if (typeof val !== 'function') {
|
|
713
|
-
// Skip functions
|
|
714
|
-
result[key] = stringify(val, depth + 1);
|
|
581
|
+
else {
|
|
582
|
+
// eslint-disable-next-line no-console
|
|
583
|
+
console.log(message.trim());
|
|
715
584
|
}
|
|
716
585
|
}
|
|
717
|
-
return result;
|
|
718
|
-
};
|
|
719
|
-
try {
|
|
720
|
-
return JSON.stringify(stringify(obj, 0));
|
|
721
|
-
}
|
|
722
|
-
catch (error) {
|
|
723
|
-
return '[Stringify Error]';
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
// Configuration validation
|
|
727
|
-
validateOptions(options) {
|
|
728
|
-
const validated = { ...options };
|
|
729
|
-
// Validate log level
|
|
730
|
-
const validLevels = ['debug', 'info', 'warn', 'error', 'fatal'];
|
|
731
|
-
if (validated.level && !validLevels.includes(validated.level)) {
|
|
732
|
-
console.warn(`[MoroLogger] Invalid log level: ${validated.level}, defaulting to 'info'`);
|
|
733
|
-
validated.level = 'info';
|
|
734
|
-
}
|
|
735
|
-
// Validate max entries
|
|
736
|
-
if (validated.maxEntries !== undefined) {
|
|
737
|
-
if (validated.maxEntries < 1 || validated.maxEntries > 100000) {
|
|
738
|
-
console.warn(`[MoroLogger] Invalid maxEntries: ${validated.maxEntries}, defaulting to 1000`);
|
|
739
|
-
validated.maxEntries = 1000;
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
// Validate buffer size
|
|
743
|
-
if (validated.maxBufferSize !== undefined) {
|
|
744
|
-
if (validated.maxBufferSize < 10 || validated.maxBufferSize > 10000) {
|
|
745
|
-
console.warn(`[MoroLogger] Invalid maxBufferSize: ${validated.maxBufferSize}, defaulting to 1000`);
|
|
746
|
-
validated.maxBufferSize = 1000;
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
return validated;
|
|
750
|
-
}
|
|
751
|
-
// Error handling methods
|
|
752
|
-
handleOutputError(outputName, error) {
|
|
753
|
-
// Could implement output retry logic, circuit breaker, etc.
|
|
754
|
-
// For now, just track the error
|
|
755
|
-
if (!this.metrics.outputErrors) {
|
|
756
|
-
this.metrics.outputErrors = {};
|
|
757
|
-
}
|
|
758
|
-
this.metrics.outputErrors[outputName] = (this.metrics.outputErrors[outputName] || 0) + 1;
|
|
759
|
-
}
|
|
760
|
-
emergencyConsoleWrite(entry) {
|
|
761
|
-
const message = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()} ${entry.message}`;
|
|
762
|
-
try {
|
|
763
|
-
if (entry.level === 'error' || entry.level === 'fatal') {
|
|
764
|
-
process.stderr.write(`[EMERGENCY] ${message}\n`);
|
|
765
|
-
}
|
|
766
|
-
else {
|
|
767
|
-
process.stdout.write(`[EMERGENCY] ${message}\n`);
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
catch {
|
|
771
|
-
// If even emergency write fails, there's nothing more we can do
|
|
772
586
|
}
|
|
587
|
+
// Reset buffer
|
|
588
|
+
this.outputBuffer.length = 0;
|
|
589
|
+
this.bufferSize = 0;
|
|
773
590
|
}
|
|
774
591
|
// Force flush streams (useful for shutdown)
|
|
775
592
|
flush() {
|
|
@@ -781,69 +598,76 @@ export class MoroLogger {
|
|
|
781
598
|
// Flush any remaining buffer
|
|
782
599
|
this.flushBuffer();
|
|
783
600
|
try {
|
|
784
|
-
// Force flush streams
|
|
601
|
+
// Force flush streams
|
|
785
602
|
if (process.stdout.writable) {
|
|
786
|
-
process.stdout.
|
|
603
|
+
process.stdout.end();
|
|
787
604
|
}
|
|
788
605
|
if (process.stderr.writable) {
|
|
789
|
-
process.stderr.
|
|
606
|
+
process.stderr.end();
|
|
790
607
|
}
|
|
791
608
|
}
|
|
792
609
|
catch {
|
|
793
610
|
// Ignore flush errors
|
|
794
611
|
}
|
|
795
612
|
}
|
|
796
|
-
//
|
|
797
|
-
|
|
798
|
-
//
|
|
799
|
-
this.isDestroyed = true;
|
|
800
|
-
// Clear any remaining timeouts
|
|
613
|
+
// Cleanup method to clear all timeouts and handles
|
|
614
|
+
cleanup() {
|
|
615
|
+
// Clear any pending flush timeout
|
|
801
616
|
if (this.flushTimeout) {
|
|
802
617
|
clearTimeout(this.flushTimeout);
|
|
803
618
|
this.flushTimeout = null;
|
|
804
619
|
}
|
|
805
|
-
// Flush any remaining
|
|
620
|
+
// Flush any remaining output
|
|
806
621
|
this.flushBuffer();
|
|
807
|
-
// Clear outputs and filters
|
|
808
|
-
this.outputs.clear();
|
|
809
|
-
this.filters.clear();
|
|
810
|
-
// Clear history
|
|
811
|
-
this.history.length = 0;
|
|
812
|
-
this.historyIndex = 0;
|
|
813
|
-
this.historySize = 0;
|
|
814
622
|
}
|
|
815
623
|
}
|
|
624
|
+
exports.MoroLogger = MoroLogger;
|
|
816
625
|
// Global logger instance
|
|
817
626
|
const initialLogLevel = process.env.LOG_LEVEL ||
|
|
818
627
|
process.env.MORO_LOG_LEVEL ||
|
|
819
628
|
(process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
|
|
820
|
-
|
|
629
|
+
exports.logger = new MoroLogger({
|
|
821
630
|
level: initialLogLevel,
|
|
822
631
|
enableColors: !process.env.NO_COLOR,
|
|
823
632
|
format: process.env.LOG_FORMAT || 'pretty',
|
|
824
633
|
});
|
|
634
|
+
// Add cleanup handlers for Jest and other test runners
|
|
635
|
+
if (typeof process !== 'undefined') {
|
|
636
|
+
// Cleanup on process exit
|
|
637
|
+
process.on('beforeExit', () => {
|
|
638
|
+
exports.logger.cleanup();
|
|
639
|
+
});
|
|
640
|
+
process.on('SIGINT', () => {
|
|
641
|
+
exports.logger.cleanup();
|
|
642
|
+
process.exit(0);
|
|
643
|
+
});
|
|
644
|
+
process.on('SIGTERM', () => {
|
|
645
|
+
exports.logger.cleanup();
|
|
646
|
+
process.exit(0);
|
|
647
|
+
});
|
|
648
|
+
// For Jest and other test runners - cleanup on uncaught exceptions
|
|
649
|
+
process.on('uncaughtException', () => {
|
|
650
|
+
exports.logger.cleanup();
|
|
651
|
+
});
|
|
652
|
+
process.on('unhandledRejection', () => {
|
|
653
|
+
exports.logger.cleanup();
|
|
654
|
+
});
|
|
655
|
+
}
|
|
825
656
|
/**
|
|
826
657
|
* Configure the global logger with new settings
|
|
827
658
|
* This allows runtime configuration of the logger
|
|
828
659
|
*/
|
|
829
|
-
|
|
660
|
+
function configureGlobalLogger(options) {
|
|
830
661
|
if (options.level) {
|
|
831
|
-
logger.setLevel(options.level);
|
|
662
|
+
exports.logger.setLevel(options.level);
|
|
832
663
|
}
|
|
833
664
|
// Additional configuration options can be added here as needed
|
|
834
665
|
// For now, focusing on level which is the most critical
|
|
835
666
|
}
|
|
836
|
-
/**
|
|
837
|
-
* Destroy the global logger and clean up resources (for testing)
|
|
838
|
-
* @internal
|
|
839
|
-
*/
|
|
840
|
-
export function destroyGlobalLogger() {
|
|
841
|
-
logger.destroy();
|
|
842
|
-
}
|
|
843
667
|
/**
|
|
844
668
|
* Apply logging configuration from the config system and/or createApp options
|
|
845
669
|
*/
|
|
846
|
-
|
|
670
|
+
function applyLoggingConfiguration(configLogging, appOptions) {
|
|
847
671
|
// First apply config system settings (from environment variables)
|
|
848
672
|
if (configLogging?.level) {
|
|
849
673
|
configureGlobalLogger({ level: configLogging.level });
|
|
@@ -860,19 +684,20 @@ export function applyLoggingConfiguration(configLogging, appOptions) {
|
|
|
860
684
|
}
|
|
861
685
|
}
|
|
862
686
|
// Framework-specific logger
|
|
863
|
-
|
|
864
|
-
return logger.child('Moro', { framework: 'moro', context });
|
|
687
|
+
const createFrameworkLogger = (context) => {
|
|
688
|
+
return exports.logger.child('Moro', { framework: 'moro', context });
|
|
865
689
|
};
|
|
690
|
+
exports.createFrameworkLogger = createFrameworkLogger;
|
|
866
691
|
// Graceful shutdown handler to flush any pending logs
|
|
867
692
|
process.on('SIGINT', () => {
|
|
868
|
-
logger.flush();
|
|
693
|
+
exports.logger.flush();
|
|
869
694
|
process.exit(0);
|
|
870
695
|
});
|
|
871
696
|
process.on('SIGTERM', () => {
|
|
872
|
-
logger.flush();
|
|
697
|
+
exports.logger.flush();
|
|
873
698
|
process.exit(0);
|
|
874
699
|
});
|
|
875
700
|
process.on('beforeExit', () => {
|
|
876
|
-
logger.flush();
|
|
701
|
+
exports.logger.flush();
|
|
877
702
|
});
|
|
878
703
|
//# sourceMappingURL=logger.js.map
|