@zintrust/core 0.1.19 → 0.1.21
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 +10 -10
- package/bin/zintrust-main.d.ts.map +1 -1
- package/bin/zintrust-main.js +9 -0
- package/package.json +3 -2
- package/public/error-pages/404.html +145 -0
- package/public/error-pages/500.html +266 -0
- package/public/error-pages/error.css +628 -0
- package/public/error-pages/error.js +428 -0
- package/public/zintrust.svg +30 -0
- package/routes/api.d.ts.map +1 -1
- package/routes/api.js +41 -17
- package/routes/metrics.d.ts +9 -0
- package/routes/metrics.d.ts.map +1 -0
- package/routes/metrics.js +20 -0
- package/routes/openapi.d.ts +9 -0
- package/routes/openapi.d.ts.map +1 -0
- package/routes/openapi.js +76 -0
- package/src/boot/Application.d.ts +2 -2
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +66 -13
- package/src/boot/Server.d.ts +3 -2
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/Server.js +39 -165
- package/src/boot/bootstrap.js +2 -0
- package/src/cache/Cache.d.ts +1 -1
- package/src/cache/Cache.d.ts.map +1 -1
- package/src/cache/CacheDriver.d.ts +4 -0
- package/src/cache/CacheDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVDriver.d.ts +1 -1
- package/src/cache/drivers/KVDriver.d.ts.map +1 -1
- package/src/cache/drivers/MemoryDriver.d.ts +1 -1
- package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
- package/src/cache/drivers/MemoryDriver.js +16 -0
- package/src/cache/drivers/MongoDriver.d.ts +1 -1
- package/src/cache/drivers/MongoDriver.d.ts.map +1 -1
- package/src/cache/drivers/RedisDriver.d.ts +1 -1
- package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +10 -4
- package/src/cli/commands/AddCommand.d.ts +2 -2
- package/src/cli/commands/AddCommand.d.ts.map +1 -1
- package/src/cli/commands/AddCommand.js +135 -58
- package/src/cli/commands/ConfigCommand.d.ts +1 -1
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/CreateCommand.d.ts +15 -0
- package/src/cli/commands/CreateCommand.d.ts.map +1 -0
- package/src/cli/commands/CreateCommand.js +143 -0
- package/src/cli/commands/D1MigrateCommand.d.ts +1 -1
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +16 -20
- package/src/cli/commands/DbSeedCommand.d.ts +9 -0
- package/src/cli/commands/DbSeedCommand.d.ts.map +1 -0
- package/src/cli/commands/DbSeedCommand.js +171 -0
- package/src/cli/commands/DebugCommand.d.ts +1 -1
- package/src/cli/commands/DebugCommand.d.ts.map +1 -1
- package/src/cli/commands/FixCommand.d.ts +1 -1
- package/src/cli/commands/FixCommand.d.ts.map +1 -1
- package/src/cli/commands/JwtDevCommand.d.ts +8 -0
- package/src/cli/commands/JwtDevCommand.d.ts.map +1 -0
- package/src/cli/commands/JwtDevCommand.js +114 -0
- package/src/cli/commands/KeyGenerateCommand.d.ts +1 -1
- package/src/cli/commands/KeyGenerateCommand.d.ts.map +1 -1
- package/src/cli/commands/LogsCommand.d.ts +2 -2
- package/src/cli/commands/LogsCommand.d.ts.map +1 -1
- package/src/cli/commands/LogsCommand.js +36 -2
- package/src/cli/commands/MakeMailTemplateCommand.d.ts +1 -1
- package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -1
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +1 -1
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.d.ts +1 -1
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +324 -35
- package/src/cli/commands/NewCommand.d.ts +1 -1
- package/src/cli/commands/NewCommand.d.ts.map +1 -1
- package/src/cli/commands/NewCommand.js +12 -4
- package/src/cli/commands/PluginCommand.d.ts +1 -1
- package/src/cli/commands/PluginCommand.d.ts.map +1 -1
- package/src/cli/commands/PrepareCommand.d.ts +1 -1
- package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
- package/src/cli/commands/QACommand.d.ts +2 -2
- package/src/cli/commands/QACommand.d.ts.map +1 -1
- package/src/cli/commands/RoutesCommand.d.ts +10 -0
- package/src/cli/commands/RoutesCommand.d.ts.map +1 -0
- package/src/cli/commands/RoutesCommand.js +242 -0
- package/src/cli/commands/SimulateCommand.d.ts +1 -1
- package/src/cli/commands/SimulateCommand.d.ts.map +1 -1
- package/src/cli/commands/index.d.ts +3 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +3 -0
- package/src/cli/config/ConfigManager.d.ts +1 -1
- package/src/cli/config/ConfigManager.d.ts.map +1 -1
- package/src/cli/config/ConfigValidator.d.ts +1 -1
- package/src/cli/config/ConfigValidator.d.ts.map +1 -1
- package/src/cli/config/ConfigValidator.js +1 -1
- package/src/cli/d1/D1SqlMigrations.d.ts +20 -0
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -0
- package/src/cli/d1/D1SqlMigrations.js +229 -0
- package/src/cli/d1/WranglerConfig.d.ts +4 -0
- package/src/cli/d1/WranglerConfig.d.ts.map +1 -0
- package/src/cli/d1/WranglerConfig.js +122 -0
- package/src/cli/d1/WranglerD1.d.ts +11 -0
- package/src/cli/d1/WranglerD1.d.ts.map +1 -0
- package/src/cli/d1/WranglerD1.js +16 -0
- package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ControllerGenerator.js +76 -26
- package/src/cli/scaffolding/FactoryGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/FactoryGenerator.js +3 -1
- package/src/cli/scaffolding/GovernanceScaffolder.d.ts +23 -0
- package/src/cli/scaffolding/GovernanceScaffolder.d.ts.map +1 -0
- package/src/cli/scaffolding/GovernanceScaffolder.js +327 -0
- package/src/cli/scaffolding/MigrationGenerator.d.ts +10 -0
- package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/MigrationGenerator.js +137 -51
- package/src/cli/scaffolding/ModelGenerator.js +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +36 -4
- package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/RouteGenerator.js +79 -43
- package/src/cli/scaffolding/SeederGenerator.d.ts +5 -0
- package/src/cli/scaffolding/SeederGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/SeederGenerator.js +63 -15
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +28 -7
- package/src/cli/scaffolding/index.d.ts +2 -0
- package/src/cli/scaffolding/index.d.ts.map +1 -1
- package/src/cli/scaffolding/index.js +1 -0
- package/src/common/index.d.ts +8 -0
- package/src/common/index.d.ts.map +1 -1
- package/src/common/index.js +28 -0
- package/src/common/utility.d.ts +38 -0
- package/src/common/utility.d.ts.map +1 -0
- package/src/common/utility.js +101 -0
- package/src/config/FileLogWriter.d.ts +2 -1
- package/src/config/FileLogWriter.d.ts.map +1 -1
- package/src/config/FileLogWriter.js +83 -2
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +3 -1
- package/src/config/broadcast.d.ts +14 -28
- package/src/config/broadcast.d.ts.map +1 -1
- package/src/config/broadcast.js +69 -35
- package/src/config/cache.d.ts +13 -45
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +69 -25
- package/src/config/cloudflare.d.ts +1 -1
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/database.d.ts +22 -64
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +191 -37
- package/src/config/env.d.ts +12 -0
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +14 -0
- package/src/config/index.d.ts +33 -137
- package/src/config/index.d.ts.map +1 -1
- package/src/config/logging/KvLogger.js +1 -1
- package/src/config/logging/SlackLogger.js +2 -2
- package/src/config/mail.d.ts +19 -55
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +63 -21
- package/src/config/middleware.d.ts +44 -1
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +157 -5
- package/src/config/notification.d.ts +14 -27
- package/src/config/notification.d.ts.map +1 -1
- package/src/config/notification.js +82 -36
- package/src/config/queue.d.ts +21 -51
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +72 -27
- package/src/config/security.d.ts +1 -1
- package/src/config/security.js +1 -1
- package/src/config/storage.d.ts +27 -34
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +97 -56
- package/src/config/type.d.ts +13 -2
- package/src/config/type.d.ts.map +1 -1
- package/src/events/EventDispatcher.d.ts.map +1 -1
- package/src/events/EventDispatcher.js +6 -4
- package/src/exceptions/ZintrustError.d.ts +7 -0
- package/src/exceptions/ZintrustError.d.ts.map +1 -1
- package/src/exceptions/ZintrustError.js +56 -0
- package/src/features/Auth.d.ts +1 -1
- package/src/features/Auth.d.ts.map +1 -1
- package/src/features/Auth.js +3 -3
- package/src/features/Queue.js +1 -1
- package/src/functions/cloudflare.d.ts.map +1 -1
- package/src/functions/cloudflare.js +3 -14
- package/src/functions/deno.d.ts.map +1 -1
- package/src/functions/deno.js +3 -14
- package/src/functions/lambda.d.ts.map +1 -1
- package/src/functions/lambda.js +3 -14
- package/src/health/StartupHealthChecks.js +1 -1
- package/src/http/Controller.d.ts +2 -2
- package/src/http/Controller.d.ts.map +1 -1
- package/src/http/FileUpload.d.ts +68 -0
- package/src/http/FileUpload.d.ts.map +1 -0
- package/src/http/FileUpload.js +120 -0
- package/src/http/Kernel.d.ts +5 -5
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +139 -23
- package/src/http/Request.d.ts +20 -1
- package/src/http/Request.d.ts.map +1 -1
- package/src/http/Request.js +23 -0
- package/src/http/RequestContext.d.ts +6 -0
- package/src/http/RequestContext.d.ts.map +1 -1
- package/src/http/RequestContext.js +77 -1
- package/src/http/Response.d.ts +1 -1
- package/src/http/Response.d.ts.map +1 -1
- package/src/http/ValidationHelper.d.ts +78 -0
- package/src/http/ValidationHelper.d.ts.map +1 -0
- package/src/http/ValidationHelper.js +121 -0
- package/src/http/error-pages/ErrorPageRenderer.d.ts +17 -0
- package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -0
- package/src/http/error-pages/ErrorPageRenderer.js +88 -0
- package/src/http/middleware/BodyParsingMiddleware.d.ts +12 -0
- package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -0
- package/src/http/middleware/BodyParsingMiddleware.js +251 -0
- package/src/http/middleware/FileUploadMiddleware.d.ts +12 -0
- package/src/http/middleware/FileUploadMiddleware.d.ts.map +1 -0
- package/src/http/middleware/FileUploadMiddleware.js +74 -0
- package/src/http/parsers/BodyParsers.d.ts +32 -0
- package/src/http/parsers/BodyParsers.d.ts.map +1 -0
- package/src/http/parsers/BodyParsers.js +159 -0
- package/src/http/parsers/MultipartParser.d.ts +33 -0
- package/src/http/parsers/MultipartParser.d.ts.map +1 -0
- package/src/http/parsers/MultipartParser.js +156 -0
- package/src/http/parsers/MultipartParserRegistry.d.ts +34 -0
- package/src/http/parsers/MultipartParserRegistry.d.ts.map +1 -0
- package/src/http/parsers/MultipartParserRegistry.js +20 -0
- package/src/http/validated.d.ts +12 -0
- package/src/http/validated.d.ts.map +1 -0
- package/src/http/validated.js +41 -0
- package/src/index.d.ts +73 -12
- package/src/index.d.ts.map +1 -1
- package/src/index.js +60 -5
- package/src/microservices/PostgresAdapter.d.ts.map +1 -1
- package/src/microservices/PostgresAdapter.js +0 -1
- package/src/microservices/RequestTracingMiddleware.d.ts +2 -2
- package/src/microservices/RequestTracingMiddleware.d.ts.map +1 -1
- package/src/microservices/RequestTracingMiddleware.js +3 -0
- package/src/microservices/ServiceAuthMiddleware.d.ts +2 -2
- package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
- package/src/middleware/AuthMiddleware.d.ts +10 -0
- package/src/middleware/AuthMiddleware.d.ts.map +1 -0
- package/src/middleware/AuthMiddleware.js +16 -0
- package/src/middleware/CsrfMiddleware.d.ts +11 -1
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +33 -0
- package/src/middleware/JwtAuthMiddleware.d.ts +11 -0
- package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -0
- package/src/middleware/JwtAuthMiddleware.js +73 -0
- package/src/middleware/LoggingMiddleware.d.ts.map +1 -1
- package/src/middleware/LoggingMiddleware.js +8 -3
- package/src/middleware/MiddlewareStack.d.ts +2 -2
- package/src/middleware/MiddlewareStack.d.ts.map +1 -1
- package/src/middleware/RateLimiter.d.ts +2 -2
- package/src/middleware/RateLimiter.d.ts.map +1 -1
- package/src/middleware/SanitizeBodyMiddleware.d.ts +12 -0
- package/src/middleware/SanitizeBodyMiddleware.d.ts.map +1 -0
- package/src/middleware/SanitizeBodyMiddleware.js +31 -0
- package/src/middleware/SecurityMiddleware.d.ts +1 -1
- package/src/middleware/SecurityMiddleware.d.ts.map +1 -1
- package/src/middleware/SessionMiddleware.d.ts +1 -1
- package/src/middleware/SessionMiddleware.d.ts.map +1 -1
- package/src/middleware/ValidationMiddleware.d.ts +25 -0
- package/src/middleware/ValidationMiddleware.d.ts.map +1 -0
- package/src/middleware/ValidationMiddleware.js +251 -0
- package/src/migrations/MigrationDiscovery.d.ts +5 -0
- package/src/migrations/MigrationDiscovery.d.ts.map +1 -0
- package/src/migrations/MigrationDiscovery.js +16 -0
- package/src/migrations/MigrationLoader.d.ts +5 -0
- package/src/migrations/MigrationLoader.d.ts.map +1 -0
- package/src/migrations/MigrationLoader.js +43 -0
- package/src/migrations/MigrationLock.d.ts +4 -0
- package/src/migrations/MigrationLock.d.ts.map +1 -0
- package/src/migrations/MigrationLock.js +33 -0
- package/src/migrations/Migrator.d.ts +23 -0
- package/src/migrations/Migrator.d.ts.map +1 -0
- package/src/migrations/Migrator.js +4 -0
- package/src/migrations/MigratorFactory.d.ts +25 -0
- package/src/migrations/MigratorFactory.d.ts.map +1 -0
- package/src/migrations/MigratorFactory.js +339 -0
- package/src/migrations/schema/Blueprint.d.ts +5 -0
- package/src/migrations/schema/Blueprint.d.ts.map +1 -0
- package/src/migrations/schema/Blueprint.js +189 -0
- package/src/migrations/schema/Schema.d.ts +8 -0
- package/src/migrations/schema/Schema.d.ts.map +1 -0
- package/src/migrations/schema/Schema.js +141 -0
- package/src/migrations/schema/SchemaCompiler.d.ts +20 -0
- package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -0
- package/src/migrations/schema/SchemaCompiler.js +262 -0
- package/src/migrations/schema/index.d.ts +5 -0
- package/src/migrations/schema/index.d.ts.map +1 -0
- package/src/migrations/schema/index.js +3 -0
- package/src/migrations/schema/types.d.ts +86 -0
- package/src/migrations/schema/types.d.ts.map +1 -0
- package/src/migrations/schema/types.js +1 -0
- package/src/migrations/types.d.ts +45 -0
- package/src/migrations/types.d.ts.map +1 -0
- package/src/migrations/types.js +1 -0
- package/src/node-singletons/crypto.d.ts +1 -1
- package/src/node-singletons/crypto.d.ts.map +1 -1
- package/src/node-singletons/crypto.js +1 -1
- package/src/node-singletons/fs.d.ts +2 -2
- package/src/node-singletons/fs.d.ts.map +1 -1
- package/src/node-singletons/fs.js +1 -1
- package/src/node-singletons/util.d.ts +6 -0
- package/src/node-singletons/util.d.ts.map +1 -0
- package/src/node-singletons/util.js +5 -0
- package/src/node.d.ts +3 -1
- package/src/node.d.ts.map +1 -1
- package/src/node.js +6 -2
- package/src/observability/OpenTelemetry.d.ts +62 -0
- package/src/observability/OpenTelemetry.d.ts.map +1 -0
- package/src/observability/OpenTelemetry.js +167 -0
- package/src/observability/PrometheusMetrics.d.ts +25 -0
- package/src/observability/PrometheusMetrics.d.ts.map +1 -0
- package/src/observability/PrometheusMetrics.js +114 -0
- package/src/openapi/OpenApiGenerator.d.ts +68 -0
- package/src/openapi/OpenApiGenerator.d.ts.map +1 -0
- package/src/openapi/OpenApiGenerator.js +287 -0
- package/src/orm/Database.d.ts +5 -2
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +219 -63
- package/src/orm/DatabaseAdapter.d.ts +14 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/DatabaseAdapterRegistry.d.ts.map +1 -1
- package/src/orm/DatabaseAdapterRegistry.js +3 -1
- package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.js +12 -0
- package/src/orm/Model.d.ts +30 -2
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +255 -62
- package/src/orm/QueryBuilder.d.ts +22 -1
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +406 -99
- package/src/orm/Relationships.d.ts +7 -1
- package/src/orm/Relationships.d.ts.map +1 -1
- package/src/orm/Relationships.js +18 -0
- package/src/orm/SchemaCompiler.d.ts +9 -0
- package/src/orm/SchemaCompiler.d.ts.map +1 -0
- package/src/orm/SchemaCompiler.js +145 -0
- package/src/orm/adapters/D1Adapter.d.ts +1 -1
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.d.ts +1 -1
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.js +88 -69
- package/src/orm/adapters/PostgreSQLAdapter.d.ts +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.js +88 -69
- package/src/orm/adapters/SQLServerAdapter.d.ts +1 -1
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.d.ts +1 -1
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +59 -3
- package/src/orm/maintenance/SqliteMaintenance.d.ts +5 -0
- package/src/orm/maintenance/SqliteMaintenance.d.ts.map +1 -0
- package/src/orm/maintenance/SqliteMaintenance.js +14 -0
- package/src/orm/migrations/MigrationStore.d.ts +38 -0
- package/src/orm/migrations/MigrationStore.d.ts.map +1 -0
- package/src/orm/migrations/MigrationStore.js +157 -0
- package/src/performance/CodeGenerationBenchmark.d.ts.map +1 -1
- package/src/performance/Optimizer.d.ts +7 -6
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +170 -55
- package/src/profiling/MemoryProfiler.d.ts +1 -1
- package/src/profiling/MemoryProfiler.d.ts.map +1 -1
- package/src/profiling/N1Detector.d.ts +1 -1
- package/src/profiling/N1Detector.d.ts.map +1 -1
- package/src/profiling/QueryLogger.d.ts +1 -1
- package/src/profiling/QueryLogger.d.ts.map +1 -1
- package/src/profiling/RequestProfiler.d.ts +3 -3
- package/src/profiling/RequestProfiler.d.ts.map +1 -1
- package/src/routes/metrics.d.ts +2 -0
- package/src/routes/metrics.d.ts.map +1 -0
- package/src/routes/metrics.js +1 -0
- package/src/routing/CoreRoutes.d.ts +12 -0
- package/src/routing/CoreRoutes.d.ts.map +1 -0
- package/src/routing/CoreRoutes.js +151 -0
- package/src/routing/RouteRegistry.d.ts +39 -0
- package/src/routing/RouteRegistry.d.ts.map +1 -0
- package/src/routing/RouteRegistry.js +44 -0
- package/src/routing/Router.d.ts +26 -9
- package/src/routing/Router.d.ts.map +1 -1
- package/src/routing/Router.js +79 -35
- package/src/routing/common.d.ts +15 -0
- package/src/routing/common.d.ts.map +1 -0
- package/src/routing/common.js +47 -0
- package/src/routing/doc.d.ts +27 -0
- package/src/routing/doc.d.ts.map +1 -0
- package/src/routing/doc.js +110 -0
- package/src/routing/error.d.ts +21 -0
- package/src/routing/error.d.ts.map +1 -0
- package/src/routing/error.js +126 -0
- package/src/routing/errorPages.d.ts +14 -0
- package/src/routing/errorPages.d.ts.map +1 -0
- package/src/routing/errorPages.js +103 -0
- package/src/routing/publicRoot.d.ts +27 -0
- package/src/routing/publicRoot.d.ts.map +1 -0
- package/src/routing/publicRoot.js +110 -0
- package/src/runtime/PluginAutoImports.d.ts +21 -0
- package/src/runtime/PluginAutoImports.d.ts.map +1 -0
- package/src/runtime/PluginAutoImports.js +59 -0
- package/src/runtime/PluginManager.d.ts +1 -5
- package/src/runtime/PluginManager.d.ts.map +1 -1
- package/src/runtime/PluginManager.js +25 -18
- package/src/runtime/RuntimeDetector.d.ts +1 -1
- package/src/runtime/RuntimeDetector.d.ts.map +1 -1
- package/src/runtime/StartupConfigFileRegistry.d.ts +20 -0
- package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -0
- package/src/runtime/StartupConfigFileRegistry.js +44 -0
- package/src/runtime/adapters/CloudflareAdapter.d.ts +1 -1
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.js +1 -1
- package/src/runtime/adapters/DenoAdapter.d.ts +1 -1
- package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/DenoAdapter.js +1 -1
- package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
- package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +1 -1
- package/src/runtime/adapters/NodeServerAdapter.d.ts +1 -1
- package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
- package/src/runtime/getKernel.d.ts +9 -0
- package/src/runtime/getKernel.d.ts.map +1 -0
- package/src/runtime/getKernel.js +27 -0
- package/src/runtime/useFileLoader.d.ts +26 -0
- package/src/runtime/useFileLoader.d.ts.map +1 -0
- package/src/runtime/useFileLoader.js +188 -0
- package/src/scripts/TemplateImportsCheck.js +40 -0
- package/src/scripts/TemplateSync.js +90 -24
- package/src/security/Encryptor.d.ts.map +1 -1
- package/src/security/Encryptor.js +64 -7
- package/src/security/JwtManager.d.ts +1 -0
- package/src/security/JwtManager.d.ts.map +1 -1
- package/src/security/JwtManager.js +33 -0
- package/src/security/Sanitizer.d.ts +76 -0
- package/src/security/Sanitizer.d.ts.map +1 -0
- package/src/security/Sanitizer.js +412 -0
- package/src/security/TokenRevocation.d.ts +7 -0
- package/src/security/TokenRevocation.d.ts.map +1 -0
- package/src/security/TokenRevocation.js +57 -0
- package/src/security/XssProtection.d.ts.map +1 -1
- package/src/security/XssProtection.js +62 -14
- package/src/seeders/SeederDiscovery.d.ts +5 -0
- package/src/seeders/SeederDiscovery.d.ts.map +1 -0
- package/src/seeders/SeederDiscovery.js +21 -0
- package/src/seeders/SeederLoader.d.ts +5 -0
- package/src/seeders/SeederLoader.d.ts.map +1 -0
- package/src/seeders/SeederLoader.js +60 -0
- package/src/seeders/types.d.ts +18 -0
- package/src/seeders/types.d.ts.map +1 -0
- package/src/seeders/types.js +1 -0
- package/src/session/SessionManager.js +1 -1
- package/src/templates/adapters/MySQLAdapter.ts.tpl +109 -85
- package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +129 -88
- package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -9
- package/src/templates/adapters/SQLiteAdapter.ts.tpl +78 -11
- package/src/templates/features/Queue.ts.tpl +3 -2
- package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +217 -0
- package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +1 -12
- package/src/templates/project/basic/app/Types/controller.ts.tpl +46 -0
- package/src/templates/project/basic/config/FileLogWriter.ts.tpl +5 -236
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +10 -447
- package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +9 -268
- package/src/templates/project/basic/config/app.ts.tpl +13 -153
- package/src/templates/project/basic/config/broadcast.ts.tpl +29 -126
- package/src/templates/project/basic/config/cache.ts.tpl +12 -70
- package/src/templates/project/basic/config/cloudflare.ts.tpl +4 -39
- package/src/templates/project/basic/config/constants.ts.tpl +9 -65
- package/src/templates/project/basic/config/database.ts.tpl +66 -123
- package/src/templates/project/basic/config/env.ts.tpl +5 -169
- package/src/templates/project/basic/config/features.ts.tpl +6 -54
- package/src/templates/project/basic/config/index.ts.tpl +8 -23
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +7 -114
- package/src/templates/project/basic/config/mail.ts.tpl +9 -62
- package/src/templates/project/basic/config/microservices.ts.tpl +11 -97
- package/src/templates/project/basic/config/middleware.ts.tpl +25 -43
- package/src/templates/project/basic/config/notification.ts.tpl +13 -114
- package/src/templates/project/basic/config/queue.ts.tpl +9 -40
- package/src/templates/project/basic/config/security.ts.tpl +11 -163
- package/src/templates/project/basic/config/startup.ts.tpl +10 -21
- package/src/templates/project/basic/config/storage.ts.tpl +57 -137
- package/src/templates/project/basic/config/type.ts.tpl +32 -451
- package/src/templates/project/basic/database/factories/UserFactory.ts.tpl +80 -0
- package/src/templates/project/basic/database/migrations/create_tasks_table.ts.tpl +28 -0
- package/src/templates/project/basic/database/migrations/create_users_table.ts.tpl +29 -0
- package/src/templates/project/basic/database/seeders/DatabaseSeeder.ts.tpl +19 -0
- package/src/templates/project/basic/database/seeders/UserSeeder.ts.tpl +18 -0
- package/src/templates/project/basic/database/seeders/index.ts.tpl +2 -0
- package/src/templates/project/basic/routes/api.ts.tpl +71 -33
- package/src/templates/project/basic/routes/metrics.ts.tpl +22 -0
- package/src/templates/project/basic/src/index.ts.tpl +3 -0
- package/src/templates/project/basic/tsconfig.json.tpl +12 -11
- package/src/testing/TestEnvironment.d.ts +40 -0
- package/src/testing/TestEnvironment.d.ts.map +1 -0
- package/src/testing/TestEnvironment.js +141 -0
- package/src/testing/TestHttp.d.ts +29 -0
- package/src/testing/TestHttp.d.ts.map +1 -0
- package/src/testing/TestHttp.js +96 -0
- package/src/testing/index.d.ts +5 -0
- package/src/testing/index.d.ts.map +1 -0
- package/src/testing/index.js +2 -0
- package/src/time/DateTime.d.ts +181 -0
- package/src/time/DateTime.d.ts.map +1 -0
- package/src/time/DateTime.js +300 -0
- package/src/time/index.d.ts +7 -0
- package/src/time/index.d.ts.map +1 -0
- package/src/time/index.js +5 -0
- package/src/tools/http/Http.d.ts.map +1 -1
- package/src/tools/http/Http.js +4 -0
- package/src/tools/mail/drivers/Smtp.js +1 -1
- package/src/tools/queue/drivers/InMemory.d.ts +1 -1
- package/src/tools/queue/drivers/InMemory.d.ts.map +1 -1
- package/src/tools/queue/drivers/InMemory.js +1 -1
- package/src/tools/queue/drivers/Redis.d.ts +1 -1
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
- package/src/tools/queue/drivers/Redis.js +1 -1
- package/src/validation/ValidationError.d.ts.map +1 -1
- package/src/validation/ValidationError.js +4 -2
- package/src/validation/Validator.d.ts +49 -16
- package/src/validation/Validator.d.ts.map +1 -1
- package/src/validation/Validator.js +307 -5
- package/src/common/uuid.d.ts +0 -3
- package/src/common/uuid.d.ts.map +0 -1
- package/src/common/uuid.js +0 -30
- package/src/templates/project/basic/.env.example.tpl +0 -74
- package/src/templates/project/basic/.env.tpl +0 -166
- package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +0 -181
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +0 -156
- package/src/templates/project/basic/database/migrations/index.ts.tpl +0 -2
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const generateUuid: () => string;
|
|
2
|
+
export declare function generateSecureJobId(errMsg?: string): string;
|
|
3
|
+
export declare const getString: (value: unknown) => string;
|
|
4
|
+
export declare function isEmpty(value: unknown): boolean;
|
|
5
|
+
export declare function toStr(value: unknown): string;
|
|
6
|
+
export declare function stripSpaces(value: unknown): string;
|
|
7
|
+
export declare function sanitize(value: unknown, pattern: RegExp, stripSpace?: boolean): string;
|
|
8
|
+
export declare function isNumericString(value: string): boolean;
|
|
9
|
+
export declare function toPlusDecimal(num: unknown, dec?: number): number;
|
|
10
|
+
export declare function toMinusDecimal(num: unknown, dec?: number): number;
|
|
11
|
+
export declare const nowIso: () => string;
|
|
12
|
+
export interface UtilitiesType {
|
|
13
|
+
generateUuid: () => string;
|
|
14
|
+
getString: (value: unknown) => string;
|
|
15
|
+
generateSecureJobId: (errMsg?: string) => string;
|
|
16
|
+
isEmpty: (value: unknown) => boolean;
|
|
17
|
+
toStr: (value: unknown) => string;
|
|
18
|
+
stripSpaces: (value: unknown) => string;
|
|
19
|
+
sanitize: (value: unknown, pattern: RegExp, stripSpace?: boolean) => string;
|
|
20
|
+
isNumericString: (value: string) => boolean;
|
|
21
|
+
toPlusDecimal: (num: unknown, dec?: number) => number;
|
|
22
|
+
toMinusDecimal: (num: unknown, dec?: number) => number;
|
|
23
|
+
nowIso: () => string;
|
|
24
|
+
}
|
|
25
|
+
export declare const Utilities: Readonly<{
|
|
26
|
+
generateUuid: () => string;
|
|
27
|
+
getString: (value: unknown) => string;
|
|
28
|
+
generateSecureJobId: typeof generateSecureJobId;
|
|
29
|
+
isEmpty: typeof isEmpty;
|
|
30
|
+
toStr: typeof toStr;
|
|
31
|
+
stripSpaces: typeof stripSpaces;
|
|
32
|
+
sanitize: typeof sanitize;
|
|
33
|
+
isNumericString: typeof isNumericString;
|
|
34
|
+
toPlusDecimal: typeof toPlusDecimal;
|
|
35
|
+
toMinusDecimal: typeof toMinusDecimal;
|
|
36
|
+
nowIso: () => string;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=utility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utility.d.ts","sourceRoot":"","sources":["../../../src/common/utility.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,QAAO,MAG/B,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,MAAgE,GACvE,MAAM,CAoBR;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,MAAkD,CAAC;AAQ9F,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAS/C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE5C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM,CAGpF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKtD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,MAAM,CAqB3D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,MAAM,CAe5D;AAED,eAAO,MAAM,MAAM,QAAO,MAAkC,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACtC,mBAAmB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACrC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5E,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,SAAS;wBA5HU,MAAM;uBA6BL,OAAO,KAAG,MAAM;;;;;;;;;kBA+EvB,MAAM;EA4B9B,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
2
|
+
import { randomBytes } from '../node-singletons/crypto.js';
|
|
3
|
+
export const generateUuid = () => {
|
|
4
|
+
if (typeof globalThis?.crypto?.randomUUID === 'function')
|
|
5
|
+
return globalThis.crypto.randomUUID();
|
|
6
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`; // NOSONAR
|
|
7
|
+
};
|
|
8
|
+
export function generateSecureJobId(errMsg = 'Secure crypto API not available to generate a job id.') {
|
|
9
|
+
if (typeof globalThis.crypto?.randomUUID === 'function') {
|
|
10
|
+
return globalThis.crypto.randomUUID();
|
|
11
|
+
}
|
|
12
|
+
if (typeof globalThis.crypto?.getRandomValues === 'function') {
|
|
13
|
+
const bytes = new Uint8Array(16);
|
|
14
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
15
|
+
return bytesToHex(bytes);
|
|
16
|
+
}
|
|
17
|
+
// Node fallback for environments without Web Crypto
|
|
18
|
+
try {
|
|
19
|
+
return randomBytes(16).toString('hex');
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw ErrorFactory.createTryCatchError(errMsg || 'Secure crypto API not available to generate a job id.', error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export const getString = (value) => (typeof value === 'string' ? value : '');
|
|
26
|
+
function bytesToHex(bytes) {
|
|
27
|
+
let out = '';
|
|
28
|
+
for (const b of bytes)
|
|
29
|
+
out += b.toString(16).padStart(2, '0');
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
export function isEmpty(value) {
|
|
33
|
+
return (value === null ||
|
|
34
|
+
value === undefined ||
|
|
35
|
+
value === false ||
|
|
36
|
+
value === 0 ||
|
|
37
|
+
value === '' ||
|
|
38
|
+
value === '0');
|
|
39
|
+
}
|
|
40
|
+
export function toStr(value) {
|
|
41
|
+
return String(value ?? '');
|
|
42
|
+
}
|
|
43
|
+
export function stripSpaces(value) {
|
|
44
|
+
return toStr(value).replaceAll(' ', '');
|
|
45
|
+
}
|
|
46
|
+
export function sanitize(value, pattern, stripSpace = false) {
|
|
47
|
+
const input = stripSpace ? stripSpaces(value) : toStr(value);
|
|
48
|
+
return input.replace(pattern, '');
|
|
49
|
+
}
|
|
50
|
+
export function isNumericString(value) {
|
|
51
|
+
const trimmed = value.trim();
|
|
52
|
+
if (trimmed.length === 0)
|
|
53
|
+
return false;
|
|
54
|
+
const n = Number(trimmed);
|
|
55
|
+
return Number.isFinite(n);
|
|
56
|
+
}
|
|
57
|
+
export function toPlusDecimal(num, dec = 8) {
|
|
58
|
+
if (isEmpty(num))
|
|
59
|
+
return 0;
|
|
60
|
+
const numStr = toStr(num);
|
|
61
|
+
const hasDot = numStr.includes('.');
|
|
62
|
+
const hasExponent = /e/i.test(numStr);
|
|
63
|
+
const normalized = hasExponent ? Number(numStr).toFixed(dec + 1) : numStr;
|
|
64
|
+
const valueNew = hasDot
|
|
65
|
+
? (() => {
|
|
66
|
+
const [whole, frac = ''] = normalized.split('.');
|
|
67
|
+
return Number.parseFloat(`${whole}.${frac.slice(0, dec)}`);
|
|
68
|
+
})()
|
|
69
|
+
: Number.parseFloat(normalized);
|
|
70
|
+
if (valueNew < 0 && String(valueNew).startsWith('-')) {
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
return valueNew;
|
|
74
|
+
}
|
|
75
|
+
export function toMinusDecimal(num, dec = 8) {
|
|
76
|
+
if (isEmpty(num))
|
|
77
|
+
return 0;
|
|
78
|
+
const numStr = toStr(num);
|
|
79
|
+
const hasDot = numStr.includes('.');
|
|
80
|
+
const hasExponent = /e/i.test(numStr);
|
|
81
|
+
const normalized = hasExponent ? Number(numStr).toFixed(dec + 1) : numStr;
|
|
82
|
+
if (hasDot) {
|
|
83
|
+
const [whole, frac = ''] = normalized.split('.');
|
|
84
|
+
return Number.parseFloat(`${whole}.${frac.slice(0, dec)}`);
|
|
85
|
+
}
|
|
86
|
+
return Number.parseFloat(normalized);
|
|
87
|
+
}
|
|
88
|
+
export const nowIso = () => new Date().toISOString();
|
|
89
|
+
export const Utilities = Object.freeze({
|
|
90
|
+
generateUuid,
|
|
91
|
+
getString,
|
|
92
|
+
generateSecureJobId,
|
|
93
|
+
isEmpty,
|
|
94
|
+
toStr,
|
|
95
|
+
stripSpaces,
|
|
96
|
+
sanitize,
|
|
97
|
+
isNumericString,
|
|
98
|
+
toPlusDecimal,
|
|
99
|
+
toMinusDecimal,
|
|
100
|
+
nowIso,
|
|
101
|
+
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* FileLogWriter (Node.js only)
|
|
3
3
|
*
|
|
4
4
|
* Provides best-effort file logging with daily + size-based rotation.
|
|
5
|
-
*
|
|
5
|
+
* Uses async write streams to avoid blocking the event loop.
|
|
6
6
|
*/
|
|
7
7
|
type CleanOnceOptions = {
|
|
8
8
|
logsDir?: string;
|
|
@@ -17,6 +17,7 @@ type CleanOnceOptions = {
|
|
|
17
17
|
export declare const cleanOnce: (options?: CleanOnceOptions) => string[];
|
|
18
18
|
export declare const FileLogWriter: Readonly<{
|
|
19
19
|
write(line: string): void;
|
|
20
|
+
flush(): void;
|
|
20
21
|
}>;
|
|
21
22
|
export default FileLogWriter;
|
|
22
23
|
//# sourceMappingURL=FileLogWriter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLogWriter.d.ts","sourceRoot":"","sources":["../../../src/config/FileLogWriter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"FileLogWriter.d.ts","sourceRoot":"","sources":["../../../src/config/FileLogWriter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwGH,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAiFF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,gBAAgB,KAAG,MAAM,EAsB5D,CAAC;AAwEF,eAAO,MAAM,aAAa;gBACZ,MAAM,GAAG,IAAI;aAqChB,IAAI;EAQb,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -2,12 +2,34 @@
|
|
|
2
2
|
* FileLogWriter (Node.js only)
|
|
3
3
|
*
|
|
4
4
|
* Provides best-effort file logging with daily + size-based rotation.
|
|
5
|
-
*
|
|
5
|
+
* Uses async write streams to avoid blocking the event loop.
|
|
6
6
|
*/
|
|
7
7
|
import { ensureDirSafe } from '../common/index.js';
|
|
8
8
|
import { Env } from './env.js';
|
|
9
9
|
import * as fs from '../node-singletons/fs.js';
|
|
10
10
|
import * as path from '../node-singletons/path.js';
|
|
11
|
+
// Write stream cache to avoid recreating streams
|
|
12
|
+
const streamCache = new Map();
|
|
13
|
+
const pendingWrites = new Map();
|
|
14
|
+
const canUseWriteStreams = () => {
|
|
15
|
+
try {
|
|
16
|
+
// Vitest's ESM module mocks can throw when accessing missing exports.
|
|
17
|
+
// Treat missing createWriteStream as "no stream support".
|
|
18
|
+
return (typeof fs.createWriteStream === 'function');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const appendFileSafe = (logFile, content) => {
|
|
25
|
+
try {
|
|
26
|
+
// Some tests/mock environments provide only appendFileSync (no streams).
|
|
27
|
+
fs.appendFileSync(logFile, content);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// best-effort
|
|
31
|
+
}
|
|
32
|
+
};
|
|
11
33
|
const getCwdSafe = () => {
|
|
12
34
|
try {
|
|
13
35
|
if (typeof process === 'undefined' || typeof process.cwd !== 'function')
|
|
@@ -160,6 +182,12 @@ const rotateIfNeeded = (logFile, maxSizeBytes) => {
|
|
|
160
182
|
const stat = fs.statSync(logFile);
|
|
161
183
|
if (stat.size <= maxSizeBytes)
|
|
162
184
|
return;
|
|
185
|
+
// Close and clear existing stream before rotation
|
|
186
|
+
const stream = streamCache.get(logFile);
|
|
187
|
+
if (stream !== undefined) {
|
|
188
|
+
stream.end();
|
|
189
|
+
streamCache.delete(logFile);
|
|
190
|
+
}
|
|
163
191
|
const ext = '.log';
|
|
164
192
|
const base = logFile.endsWith(ext) ? logFile.slice(0, -ext.length) : logFile;
|
|
165
193
|
const rotated = `${base}-${Date.now()}${ext}`;
|
|
@@ -169,6 +197,38 @@ const rotateIfNeeded = (logFile, maxSizeBytes) => {
|
|
|
169
197
|
// best-effort
|
|
170
198
|
}
|
|
171
199
|
};
|
|
200
|
+
const getOrCreateStream = (logFile) => {
|
|
201
|
+
let stream = streamCache.get(logFile);
|
|
202
|
+
if (stream === undefined || stream.destroyed) {
|
|
203
|
+
const createWriteStream = fs
|
|
204
|
+
.createWriteStream;
|
|
205
|
+
stream = createWriteStream(logFile, { flags: 'a', encoding: 'utf-8' });
|
|
206
|
+
// Clean up on error
|
|
207
|
+
stream.on('error', () => {
|
|
208
|
+
streamCache.delete(logFile);
|
|
209
|
+
});
|
|
210
|
+
streamCache.set(logFile, stream);
|
|
211
|
+
}
|
|
212
|
+
return stream;
|
|
213
|
+
};
|
|
214
|
+
const flushPendingWrites = (logFile) => {
|
|
215
|
+
const pending = pendingWrites.get(logFile);
|
|
216
|
+
if (pending === undefined || pending.length === 0)
|
|
217
|
+
return;
|
|
218
|
+
const lines = pending.join('');
|
|
219
|
+
if (!canUseWriteStreams()) {
|
|
220
|
+
appendFileSafe(logFile, lines);
|
|
221
|
+
pendingWrites.delete(logFile);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const stream = getOrCreateStream(logFile);
|
|
225
|
+
stream.write(lines, (error) => {
|
|
226
|
+
if (error !== null && error !== undefined) {
|
|
227
|
+
// Silent failure for best-effort logging
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
pendingWrites.delete(logFile);
|
|
231
|
+
};
|
|
172
232
|
export const FileLogWriter = Object.freeze({
|
|
173
233
|
write(line) {
|
|
174
234
|
const cwd = getCwdSafe();
|
|
@@ -179,8 +239,20 @@ export const FileLogWriter = Object.freeze({
|
|
|
179
239
|
const dateStr = getDateStr(new Date());
|
|
180
240
|
const logFile = path.join(logsDir, `app-${dateStr}.log`);
|
|
181
241
|
rotateIfNeeded(logFile, Env.LOG_ROTATION_SIZE);
|
|
242
|
+
// In test environments we sometimes mock @node-singletons/fs without stream APIs.
|
|
243
|
+
// Fall back to synchronous append to avoid runtime crashes.
|
|
244
|
+
if (!canUseWriteStreams()) {
|
|
245
|
+
appendFileSafe(logFile, `${line}\n`);
|
|
246
|
+
cleanupOldLogs(logsDir, Env.LOG_ROTATION_DAYS);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
182
249
|
try {
|
|
183
|
-
|
|
250
|
+
// Buffer writes for async processing
|
|
251
|
+
const pending = pendingWrites.get(logFile) ?? [];
|
|
252
|
+
pending.push(`${line}\n`);
|
|
253
|
+
pendingWrites.set(logFile, pending);
|
|
254
|
+
// Flush on next tick to batch multiple rapid writes
|
|
255
|
+
process.nextTick(() => flushPendingWrites(logFile));
|
|
184
256
|
}
|
|
185
257
|
catch {
|
|
186
258
|
// best-effort
|
|
@@ -188,5 +260,14 @@ export const FileLogWriter = Object.freeze({
|
|
|
188
260
|
}
|
|
189
261
|
cleanupOldLogs(logsDir, Env.LOG_ROTATION_DAYS);
|
|
190
262
|
},
|
|
263
|
+
// Flush all streams (for graceful shutdown)
|
|
264
|
+
flush() {
|
|
265
|
+
for (const [logFile, stream] of streamCache.entries()) {
|
|
266
|
+
flushPendingWrites(logFile);
|
|
267
|
+
stream.end();
|
|
268
|
+
}
|
|
269
|
+
streamCache.clear();
|
|
270
|
+
pendingWrites.clear();
|
|
271
|
+
},
|
|
191
272
|
});
|
|
192
273
|
export default FileLogWriter;
|
package/src/config/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAA4B,SAAS,EAAE,MAAM,cAAc,CAAC;AAsCxE,QAAA,MAAM,UAAU,QAAO,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAA4B,SAAS,EAAE,MAAM,cAAc,CAAC;AAsCxE,QAAA,MAAM,UAAU,QAAO,MAAM,CAAC,UA0B7B,CAAC;AA0FF,eAAO,MAAM,SAAS;IA5EpB;;OAEG;;IAMH;;OAEG;;IAGH;;OAEG;;IAMH;;OAEG;;IAMH;;OAEG;kCACc,OAAO;IAIxB;;OAEG;iCACa,OAAO;IAIvB;;OAEG;8BACU,OAAO;IAIpB;;OAEG;;IAMH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;+BA9GkB,MAAM,CAAC,UAAU;EAoHY,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC"}
|
package/src/config/app.js
CHANGED
|
@@ -42,7 +42,9 @@ const getSafeEnv = () => {
|
|
|
42
42
|
readEnvString('NODE_ENV', 'development'),
|
|
43
43
|
USE_RAW_QRY: baseEnv.USE_RAW_QRY ?? (readEnvString('USE_RAW_QRY', '') || undefined),
|
|
44
44
|
SERVICE_API_KEY: baseEnv.SERVICE_API_KEY ?? readEnvString('SERVICE_API_KEY', ''),
|
|
45
|
-
SERVICE_JWT_SECRET: baseEnv.SERVICE_JWT_SECRET ??
|
|
45
|
+
SERVICE_JWT_SECRET: baseEnv.SERVICE_JWT_SECRET ??
|
|
46
|
+
readEnvString('SERVICE_JWT_SECRET', '') ??
|
|
47
|
+
readEnvString('APP_KEY', ''),
|
|
46
48
|
BASE_URL: baseEnv['BASE_URL'] ?? readEnvString('BASE_URL', ''),
|
|
47
49
|
MODE: baseEnv['MODE'] ?? readEnvString('MODE', ''),
|
|
48
50
|
// Hardening for child-process usage
|
|
@@ -4,33 +4,19 @@
|
|
|
4
4
|
* Centralizes broadcast driver selection and provider env mappings.
|
|
5
5
|
* Driver selection must be dynamic (tests may mutate process.env).
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
readonly default: string;
|
|
13
|
-
/**
|
|
14
|
-
* Broadcast drivers.
|
|
15
|
-
*
|
|
16
|
-
* You may add custom named broadcasters (e.g. `ops`, `billing`) that point to any
|
|
17
|
-
* known driver config.
|
|
18
|
-
*/
|
|
19
|
-
readonly drivers: {
|
|
20
|
-
readonly inmemory: InMemoryBroadcastDriverConfig;
|
|
21
|
-
readonly pusher: PusherBroadcastDriverConfig;
|
|
22
|
-
readonly redis: RedisBroadcastDriverConfig;
|
|
23
|
-
readonly redishttps: RedisHttpsBroadcastDriverConfig;
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Normalized broadcast driver name for the default broadcaster.
|
|
27
|
-
*/
|
|
28
|
-
readonly getDriverName: () => string;
|
|
29
|
-
/**
|
|
30
|
-
* Get a config object for the currently selected driver.
|
|
31
|
-
* Defaults to inmemory for unknown/unsupported names.
|
|
32
|
-
*/
|
|
33
|
-
readonly getDriverConfig: (name?: string) => KnownBroadcastDriverConfig;
|
|
7
|
+
import type { BroadcastDrivers, KnownBroadcastDriverConfig } from './type';
|
|
8
|
+
export type BroadcastConfigOverrides = Partial<{
|
|
9
|
+
default: string;
|
|
10
|
+
drivers: Record<string, KnownBroadcastDriverConfig>;
|
|
34
11
|
}>;
|
|
35
|
-
|
|
12
|
+
type BroadcastRuntimeConfig = {
|
|
13
|
+
default: string;
|
|
14
|
+
drivers: BroadcastDrivers;
|
|
15
|
+
getDriverName: () => string;
|
|
16
|
+
getDriverConfig: (name?: string) => KnownBroadcastDriverConfig;
|
|
17
|
+
};
|
|
18
|
+
declare const createBroadcastConfig: () => BroadcastRuntimeConfig;
|
|
19
|
+
export type BroadcastConfig = ReturnType<typeof createBroadcastConfig>;
|
|
20
|
+
declare const broadcastConfig: BroadcastConfig;
|
|
21
|
+
export default broadcastConfig;
|
|
36
22
|
//# sourceMappingURL=broadcast.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/config/broadcast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/config/broadcast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAEV,gBAAgB,EAEhB,0BAA0B,EAI3B,MAAM,cAAc,CAAC;AAGtB,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACrD,CAAC,CAAC;AAEH,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,0BAA0B,CAAC;CAChE,CAAC;AA0EF,QAAA,MAAM,qBAAqB,QAAO,sBAoDjC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAqBvE,QAAA,MAAM,eAAe,EAAE,eAYrB,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
package/src/config/broadcast.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Centralizes broadcast driver selection and provider env mappings.
|
|
5
5
|
* Driver selection must be dynamic (tests may mutate process.env).
|
|
6
6
|
*/
|
|
7
|
+
import { StartupConfigFile, StartupConfigFileRegistry } from '../runtime/StartupConfigFileRegistry.js';
|
|
7
8
|
import { Env } from './env.js';
|
|
8
9
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
9
10
|
const normalizeDriverName = (value) => value.trim().toLowerCase();
|
|
@@ -60,45 +61,78 @@ const getBroadcastDriver = (config, name) => {
|
|
|
60
61
|
return fallback;
|
|
61
62
|
throw ErrorFactory.createConfigError('No broadcast drivers are configured');
|
|
62
63
|
};
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return { driver: 'inmemory' };
|
|
64
|
+
const createBroadcastConfig = () => {
|
|
65
|
+
const overrides = StartupConfigFileRegistry.get(StartupConfigFile.Broadcast) ?? {};
|
|
66
|
+
const broadcastConfigObj = {
|
|
67
|
+
/**
|
|
68
|
+
* Default broadcaster name (normalized).
|
|
69
|
+
*/
|
|
70
|
+
get default() {
|
|
71
|
+
const overrideDefault = overrides.default;
|
|
72
|
+
if (typeof overrideDefault === 'string' && overrideDefault.trim().length > 0) {
|
|
73
|
+
const value = normalizeDriverName(overrideDefault);
|
|
74
|
+
if (value.length > 0 && hasOwn(this.drivers, value))
|
|
75
|
+
return value;
|
|
76
|
+
throw ErrorFactory.createConfigError(`Broadcast driver not configured: ${value}`);
|
|
77
|
+
}
|
|
78
|
+
return getDefaultBroadcaster(this.drivers);
|
|
79
79
|
},
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Broadcast drivers.
|
|
82
|
+
*
|
|
83
|
+
* You may add custom named broadcasters (e.g. `ops`, `billing`) that point to any
|
|
84
|
+
* known driver config.
|
|
85
|
+
*/
|
|
86
|
+
get drivers() {
|
|
87
|
+
return {
|
|
88
|
+
inmemory: { driver: 'inmemory' },
|
|
89
|
+
pusher: getPusherConfig(),
|
|
90
|
+
redis: getRedisConfig(),
|
|
91
|
+
redishttps: getRedisHttpsConfig(),
|
|
92
|
+
...(overrides.drivers ?? {}),
|
|
93
|
+
};
|
|
82
94
|
},
|
|
83
|
-
|
|
84
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Normalized broadcast driver name for the default broadcaster.
|
|
97
|
+
*/
|
|
98
|
+
getDriverName() {
|
|
99
|
+
return normalizeDriverName(this.default);
|
|
85
100
|
},
|
|
86
|
-
|
|
87
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Get a config object for the currently selected driver.
|
|
103
|
+
* Defaults to inmemory for unknown/unsupported names.
|
|
104
|
+
*/
|
|
105
|
+
getDriverConfig(name) {
|
|
106
|
+
return getBroadcastDriver(this, name);
|
|
88
107
|
},
|
|
108
|
+
};
|
|
109
|
+
return Object.freeze(broadcastConfigObj);
|
|
110
|
+
};
|
|
111
|
+
let cached = null;
|
|
112
|
+
const proxyTarget = {};
|
|
113
|
+
const ensureBroadcastConfig = () => {
|
|
114
|
+
if (cached)
|
|
115
|
+
return cached;
|
|
116
|
+
cached = createBroadcastConfig();
|
|
117
|
+
try {
|
|
118
|
+
Object.defineProperties(proxyTarget, Object.getOwnPropertyDescriptors(cached));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// best-effort
|
|
122
|
+
}
|
|
123
|
+
return cached;
|
|
124
|
+
};
|
|
125
|
+
const broadcastConfig = new Proxy(proxyTarget, {
|
|
126
|
+
get(_target, prop) {
|
|
127
|
+
return ensureBroadcastConfig()[prop];
|
|
89
128
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
getDriverName() {
|
|
94
|
-
return normalizeDriverName(this.default);
|
|
129
|
+
ownKeys() {
|
|
130
|
+
ensureBroadcastConfig();
|
|
131
|
+
return Reflect.ownKeys(proxyTarget);
|
|
95
132
|
},
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
*/
|
|
100
|
-
getDriverConfig(name) {
|
|
101
|
-
return getBroadcastDriver(this, name);
|
|
133
|
+
getOwnPropertyDescriptor(_target, prop) {
|
|
134
|
+
ensureBroadcastConfig();
|
|
135
|
+
return Object.getOwnPropertyDescriptor(proxyTarget, prop);
|
|
102
136
|
},
|
|
103
|
-
};
|
|
104
|
-
export default
|
|
137
|
+
});
|
|
138
|
+
export default broadcastConfig;
|
package/src/config/cache.d.ts
CHANGED
|
@@ -3,53 +3,21 @@
|
|
|
3
3
|
* Caching drivers and settings
|
|
4
4
|
* Sealed namespace for immutability
|
|
5
5
|
*/
|
|
6
|
-
import { CacheDriverConfig } from './type';
|
|
7
|
-
export
|
|
8
|
-
/**
|
|
9
|
-
* Default cache driver
|
|
10
|
-
*/
|
|
6
|
+
import type { CacheConfigInput, CacheDriverConfig } from './type';
|
|
7
|
+
export type CacheConfigOverrides = Partial<{
|
|
11
8
|
default: string;
|
|
12
|
-
|
|
13
|
-
* Cache drivers
|
|
14
|
-
*/
|
|
15
|
-
drivers: {
|
|
16
|
-
memory: {
|
|
17
|
-
driver: "memory";
|
|
18
|
-
ttl: number;
|
|
19
|
-
};
|
|
20
|
-
redis: {
|
|
21
|
-
driver: "redis";
|
|
22
|
-
host: string;
|
|
23
|
-
port: number;
|
|
24
|
-
ttl: number;
|
|
25
|
-
};
|
|
26
|
-
mongodb: {
|
|
27
|
-
driver: "mongodb";
|
|
28
|
-
uri: string;
|
|
29
|
-
db: string;
|
|
30
|
-
ttl: number;
|
|
31
|
-
};
|
|
32
|
-
kv: {
|
|
33
|
-
driver: "kv";
|
|
34
|
-
ttl: number;
|
|
35
|
-
};
|
|
36
|
-
'kv-remote': {
|
|
37
|
-
driver: "kv-remote";
|
|
38
|
-
ttl: number;
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Get cache driver config
|
|
43
|
-
*/
|
|
44
|
-
getDriver(name?: string): CacheDriverConfig;
|
|
45
|
-
/**
|
|
46
|
-
* Key prefix for all cache keys
|
|
47
|
-
*/
|
|
9
|
+
drivers: CacheConfigInput['drivers'];
|
|
48
10
|
keyPrefix: string;
|
|
49
|
-
/**
|
|
50
|
-
* Default cache TTL (seconds)
|
|
51
|
-
*/
|
|
52
11
|
ttl: number;
|
|
53
12
|
}>;
|
|
54
|
-
|
|
13
|
+
declare const createCacheConfig: () => {
|
|
14
|
+
default: string;
|
|
15
|
+
drivers: CacheConfigInput["drivers"];
|
|
16
|
+
getDriver: (name?: string) => CacheDriverConfig;
|
|
17
|
+
keyPrefix: string;
|
|
18
|
+
ttl: number;
|
|
19
|
+
};
|
|
20
|
+
export type CacheConfig = ReturnType<typeof createCacheConfig>;
|
|
21
|
+
export declare const cacheConfig: CacheConfig;
|
|
22
|
+
export {};
|
|
55
23
|
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/config/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/config/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGxE,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAAC;AA0BH,QAAA,MAAM,iBAAiB,QAAO;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CA4Fb,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAqB/D,eAAO,MAAM,WAAW,EAAE,WAYxB,CAAC"}
|