@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,14 @@
|
|
|
1
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
2
|
+
const supportsResetSchema = (adapter) => typeof adapter.resetSchema === 'function';
|
|
3
|
+
export const SqliteMaintenance = Object.freeze({
|
|
4
|
+
async dropAllTables(db) {
|
|
5
|
+
if (db.getType() !== 'sqlite') {
|
|
6
|
+
throw ErrorFactory.createDatabaseError('dropAllTables is only supported for sqlite');
|
|
7
|
+
}
|
|
8
|
+
const adapter = db.getAdapterInstance(false);
|
|
9
|
+
if (!supportsResetSchema(adapter)) {
|
|
10
|
+
throw ErrorFactory.createDatabaseError('SQLite adapter does not support resetSchema()');
|
|
11
|
+
}
|
|
12
|
+
await adapter.resetSchema();
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IDatabase } from '../Database';
|
|
2
|
+
import type { MigrationRecord, MigrationRecordStatus, MigrationScope } from '../../migrations/types';
|
|
3
|
+
export declare const MigrationStore: Readonly<{
|
|
4
|
+
ensureTable(db: IDatabase): Promise<void>;
|
|
5
|
+
getLastCompletedBatch(db: IDatabase, scope?: MigrationScope, service?: string): Promise<number>;
|
|
6
|
+
getAppliedMap(db: IDatabase, scope: MigrationScope, service: string): Promise<Map<string, MigrationRecord>>;
|
|
7
|
+
insertRunning(db: IDatabase, params: {
|
|
8
|
+
name: string;
|
|
9
|
+
scope: MigrationScope;
|
|
10
|
+
service: string;
|
|
11
|
+
batch: number;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
markStatus(db: IDatabase, params: {
|
|
14
|
+
name: string;
|
|
15
|
+
scope: MigrationScope;
|
|
16
|
+
service: string;
|
|
17
|
+
status: MigrationRecordStatus;
|
|
18
|
+
appliedAt?: string | null;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
listCompletedInBatchesGte(db: IDatabase, params: {
|
|
21
|
+
scope: MigrationScope;
|
|
22
|
+
service: string;
|
|
23
|
+
minBatch: number;
|
|
24
|
+
}): Promise<Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
batch: number;
|
|
27
|
+
}>>;
|
|
28
|
+
listAllCompletedNames(db: IDatabase, params: {
|
|
29
|
+
scope: MigrationScope;
|
|
30
|
+
service: string;
|
|
31
|
+
}): Promise<string[]>;
|
|
32
|
+
deleteRecord(db: IDatabase, params: {
|
|
33
|
+
name: string;
|
|
34
|
+
scope: MigrationScope;
|
|
35
|
+
service: string;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=MigrationStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationStore.d.ts","sourceRoot":"","sources":["../../../../src/orm/migrations/MigrationStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA8CjG,eAAO,MAAM,cAAc;oBACH,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;8BASzC,SAAS,UACN,cAAc,YACZ,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;sBAiBZ,SAAS,SACN,cAAc,WACZ,MAAM,GACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;sBAyBlC,SAAS,UACL;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAC9E,OAAO,CAAC,IAAI,CAAC;mBAuCV,SAAS,UACL;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,cAAc,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,qBAAqB,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC;kCAiBV,SAAS,UACL;QAAE,KAAK,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GACnE,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;8BAyB5C,SAAS,UACL;QAAE,KAAK,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,MAAM,EAAE,CAAC;qBAgBd,SAAS,UACL;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAC/D,OAAO,CAAC,IAAI,CAAC;EAShB,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
2
|
+
import { QueryBuilder } from '../QueryBuilder.js';
|
|
3
|
+
function nowIso() {
|
|
4
|
+
// MySQL/MariaDB DATETIME does not accept ISO8601 with timezone (e.g. trailing 'Z').
|
|
5
|
+
// Use a portable UTC datetime string.
|
|
6
|
+
return new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
7
|
+
}
|
|
8
|
+
const toSafeService = (service) => {
|
|
9
|
+
if (typeof service !== 'string')
|
|
10
|
+
return '';
|
|
11
|
+
return service.length > 0 ? service : '';
|
|
12
|
+
};
|
|
13
|
+
const assertDbSupportsMigrations = (db) => {
|
|
14
|
+
const t = db.getType();
|
|
15
|
+
if (t === 'd1' || t === 'd1-remote') {
|
|
16
|
+
throw ErrorFactory.createCliError('This project is configured for D1. Use `zin d1:migrate --local|--remote` for now.');
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const hasMigrationsTableSupport = (adapter) => {
|
|
20
|
+
return (typeof adapter.ensureMigrationsTable === 'function');
|
|
21
|
+
};
|
|
22
|
+
const requireMigrationsTableSupport = (adapter) => {
|
|
23
|
+
if (!hasMigrationsTableSupport(adapter)) {
|
|
24
|
+
throw ErrorFactory.createCliError('Migrations tracking is not supported for this database adapter yet.');
|
|
25
|
+
}
|
|
26
|
+
return async () => {
|
|
27
|
+
await adapter.ensureMigrationsTable();
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const MigrationStore = Object.freeze({
|
|
31
|
+
async ensureTable(db) {
|
|
32
|
+
assertDbSupportsMigrations(db);
|
|
33
|
+
const adapter = db.getAdapterInstance(false);
|
|
34
|
+
const ensure = requireMigrationsTableSupport(adapter);
|
|
35
|
+
await ensure();
|
|
36
|
+
},
|
|
37
|
+
async getLastCompletedBatch(db, scope = 'global', service = '') {
|
|
38
|
+
assertDbSupportsMigrations(db);
|
|
39
|
+
const normalizedService = toSafeService(service);
|
|
40
|
+
const row = await QueryBuilder.create('migrations', db)
|
|
41
|
+
.max('batch', 'max_batch')
|
|
42
|
+
.where('status', '=', 'completed')
|
|
43
|
+
.andWhere('scope', '=', scope)
|
|
44
|
+
.andWhere('service', '=', normalizedService)
|
|
45
|
+
.first();
|
|
46
|
+
const value = row?.max_batch;
|
|
47
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : 0;
|
|
48
|
+
},
|
|
49
|
+
async getAppliedMap(db, scope, service) {
|
|
50
|
+
assertDbSupportsMigrations(db);
|
|
51
|
+
const normalizedService = toSafeService(service);
|
|
52
|
+
const rows = await QueryBuilder.create('migrations', db)
|
|
53
|
+
.select('name', 'scope', 'service', 'batch', 'status')
|
|
54
|
+
.selectAs('applied_at', 'appliedAt')
|
|
55
|
+
.where('scope', '=', scope)
|
|
56
|
+
.andWhere('service', '=', normalizedService)
|
|
57
|
+
.get();
|
|
58
|
+
const map = new Map();
|
|
59
|
+
for (const r of rows) {
|
|
60
|
+
if (typeof r.name === 'string' && r.name.length > 0) {
|
|
61
|
+
map.set(r.name, {
|
|
62
|
+
...r,
|
|
63
|
+
service: toSafeService(r.service),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return map;
|
|
68
|
+
},
|
|
69
|
+
async insertRunning(db, params) {
|
|
70
|
+
assertDbSupportsMigrations(db);
|
|
71
|
+
const normalizedService = toSafeService(params.service);
|
|
72
|
+
const existing = await QueryBuilder.create('migrations', db)
|
|
73
|
+
.select('id')
|
|
74
|
+
.where('name', '=', params.name)
|
|
75
|
+
.andWhere('scope', '=', params.scope)
|
|
76
|
+
.andWhere('service', '=', normalizedService)
|
|
77
|
+
.first();
|
|
78
|
+
// Allow re-running previously failed/running migrations by updating the existing row.
|
|
79
|
+
// This avoids tripping the UNIQUE(name, scope, service) constraint.
|
|
80
|
+
if (existing?.id !== undefined && existing.id !== null) {
|
|
81
|
+
await QueryBuilder.create('migrations', db)
|
|
82
|
+
.where('name', '=', params.name)
|
|
83
|
+
.andWhere('scope', '=', params.scope)
|
|
84
|
+
.andWhere('service', '=', normalizedService)
|
|
85
|
+
.update({
|
|
86
|
+
batch: params.batch,
|
|
87
|
+
status: 'running',
|
|
88
|
+
applied_at: null,
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
await QueryBuilder.create('migrations', db).insert({
|
|
93
|
+
name: params.name,
|
|
94
|
+
scope: params.scope,
|
|
95
|
+
service: normalizedService,
|
|
96
|
+
batch: params.batch,
|
|
97
|
+
status: 'running',
|
|
98
|
+
applied_at: null,
|
|
99
|
+
created_at: nowIso(),
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
async markStatus(db, params) {
|
|
103
|
+
assertDbSupportsMigrations(db);
|
|
104
|
+
const builder = QueryBuilder.create('migrations', db)
|
|
105
|
+
.where('name', '=', params.name)
|
|
106
|
+
.andWhere('scope', '=', params.scope)
|
|
107
|
+
.andWhere('service', '=', toSafeService(params.service));
|
|
108
|
+
if (params.appliedAt !== undefined) {
|
|
109
|
+
await builder.update({ status: params.status, applied_at: params.appliedAt });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
await builder.update({ status: params.status });
|
|
113
|
+
},
|
|
114
|
+
async listCompletedInBatchesGte(db, params) {
|
|
115
|
+
assertDbSupportsMigrations(db);
|
|
116
|
+
const rows = await QueryBuilder.create('migrations', db)
|
|
117
|
+
.select('name', 'batch')
|
|
118
|
+
.where('status', '=', 'completed')
|
|
119
|
+
.andWhere('scope', '=', params.scope)
|
|
120
|
+
.andWhere('service', '=', toSafeService(params.service))
|
|
121
|
+
.andWhere('batch', '>=', params.minBatch)
|
|
122
|
+
.orderBy('batch', 'DESC')
|
|
123
|
+
.orderBy('id', 'DESC')
|
|
124
|
+
.get();
|
|
125
|
+
const out = [];
|
|
126
|
+
for (const r of rows) {
|
|
127
|
+
const name = typeof r.name === 'string' ? r.name : '';
|
|
128
|
+
const batch = typeof r.batch === 'number' ? r.batch : Number(r.batch);
|
|
129
|
+
if (name.length === 0)
|
|
130
|
+
continue;
|
|
131
|
+
if (!Number.isFinite(batch))
|
|
132
|
+
continue;
|
|
133
|
+
out.push({ name, batch });
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
},
|
|
137
|
+
async listAllCompletedNames(db, params) {
|
|
138
|
+
assertDbSupportsMigrations(db);
|
|
139
|
+
const rows = await QueryBuilder.create('migrations', db)
|
|
140
|
+
.select('name')
|
|
141
|
+
.where('status', '=', 'completed')
|
|
142
|
+
.andWhere('scope', '=', params.scope)
|
|
143
|
+
.andWhere('service', '=', toSafeService(params.service))
|
|
144
|
+
.orderBy('batch', 'DESC')
|
|
145
|
+
.orderBy('id', 'DESC')
|
|
146
|
+
.get();
|
|
147
|
+
return rows.map((r) => (typeof r.name === 'string' ? r.name : '')).filter((n) => n.length > 0);
|
|
148
|
+
},
|
|
149
|
+
async deleteRecord(db, params) {
|
|
150
|
+
assertDbSupportsMigrations(db);
|
|
151
|
+
await QueryBuilder.create('migrations', db)
|
|
152
|
+
.where('name', '=', params.name)
|
|
153
|
+
.andWhere('scope', '=', params.scope)
|
|
154
|
+
.andWhere('service', '=', toSafeService(params.service))
|
|
155
|
+
.delete();
|
|
156
|
+
},
|
|
157
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeGenerationBenchmark.d.ts","sourceRoot":"","sources":["../../../src/performance/CodeGenerationBenchmark.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"CodeGenerationBenchmark.d.ts","sourceRoot":"","sources":["../../../src/performance/CodeGenerationBenchmark.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,wBAAwB;IACvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,KAAK,yBAAyB,GAAG;IAC/B,IAAI,wBAAwB,CAAC;IAC7B,MAAM,EAAE,MAAM,wBAAwB,CAAC;CACxC,CAAC;AAgDF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,yBAmCG,CAAC;AAoL1C;;GAEG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAOjE"}
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
* Implements caching, lazy-loading, and parallel generation
|
|
4
4
|
*/
|
|
5
5
|
export interface IGenerationCache {
|
|
6
|
-
get(type: string, params: Record<string, unknown>): string | null
|
|
7
|
-
set(type: string, params: Record<string, unknown>, code: string): void
|
|
8
|
-
save(): void
|
|
9
|
-
clear(): void
|
|
10
|
-
getStats(): {
|
|
6
|
+
get(type: string, params: Record<string, unknown>): Promise<string | null>;
|
|
7
|
+
set(type: string, params: Record<string, unknown>, code: string): Promise<void>;
|
|
8
|
+
save(): Promise<void>;
|
|
9
|
+
clear(): Promise<void>;
|
|
10
|
+
getStats(): Promise<{
|
|
11
11
|
size: number;
|
|
12
12
|
entries: number;
|
|
13
13
|
diskUsage: string;
|
|
14
14
|
keys: string[];
|
|
15
|
-
}
|
|
15
|
+
}>;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Generation Cache - Cache generated code to avoid re-generating identical code
|
|
@@ -63,6 +63,7 @@ export declare const ParallelGenerator: Readonly<{
|
|
|
63
63
|
export declare function createMemoized<T extends (...args: any[]) => any>(fn: T, options?: {
|
|
64
64
|
ttl?: number;
|
|
65
65
|
keyGenerator?: (args: Parameters<T>) => string;
|
|
66
|
+
maxSize?: number;
|
|
66
67
|
}): T;
|
|
67
68
|
export declare const Memoize: Readonly<{
|
|
68
69
|
create: typeof createMemoized;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Optimizer.d.ts","sourceRoot":"","sources":["../../../src/performance/Optimizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Optimizer.d.ts","sourceRoot":"","sources":["../../../src/performance/Optimizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,IAAI,OAAO,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC,CAAC;CACJ;AAgDD;;;GAGG;AACH,eAAO,MAAM,eAAe;IAC1B;;OAEG;sBAES,MAAM,UACT,MAAM,eACD,MAAM,GACjB,gBAAgB;EAUnB,CAAC;AA6SH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;cACO,WAAW;EAqCrB,CAAC;AAEH;;GAEG;AAEH;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,UAAU,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EACnC,SAAS,GAAE,MAAU,GACpB,OAAO,CAAC,CAAC,EAAE,CAAC,CAcd;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAEjF;AAED,eAAO,MAAM,iBAAiB;;;EAG5B,CAAC;AAEH;;GAEG;AAEH;;GAEG;AAEH,wBAAgB,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC9D,EAAE,EAAE,CAAC,EACL,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/F,CAAC,CA+DH;AAED,eAAO,MAAM,OAAO;;EAElB,CAAC;AAEH,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,CAAC,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;KAC/C,CAAC;IACF,SAAS,IAAI,IAAI,CAAC;IAClB,KAAK,IAAI,IAAI,CAAC;CACf;AASD;;;GAGG;AACH,eAAO,MAAM,oBAAoB;IAC/B;;OAEG;cACO,qBAAqB;EAoE/B,CAAC;AA2HH,eAAe,oBAAoB,CAAC"}
|
|
@@ -95,26 +95,26 @@ function startCacheCleanup(state) {
|
|
|
95
95
|
function createCacheInstance(state) {
|
|
96
96
|
return {
|
|
97
97
|
/**
|
|
98
|
-
* Get from cache
|
|
98
|
+
* Get from cache (async)
|
|
99
99
|
*/
|
|
100
|
-
get(type, params) {
|
|
100
|
+
async get(type, params) {
|
|
101
101
|
const key = getCacheKey(type, params);
|
|
102
102
|
const entry = state.cache.get(key);
|
|
103
103
|
if (entry === undefined)
|
|
104
|
-
return null;
|
|
104
|
+
return Promise.resolve(null); //NoSONAR
|
|
105
105
|
// Check TTL
|
|
106
106
|
if (Date.now() - entry.timestamp > state.ttlMs) {
|
|
107
107
|
state.cache.delete(key);
|
|
108
108
|
const file = path.join(state.cacheDir, `${key}.json`);
|
|
109
109
|
deleteFileNonBlocking(file);
|
|
110
|
-
return null;
|
|
110
|
+
return Promise.resolve(null); //NoSONAR
|
|
111
111
|
}
|
|
112
|
-
return entry.code;
|
|
112
|
+
return Promise.resolve(entry.code); //NoSONAR
|
|
113
113
|
},
|
|
114
114
|
/**
|
|
115
|
-
* Set in cache
|
|
115
|
+
* Set in cache (async)
|
|
116
116
|
*/
|
|
117
|
-
set(type, params, code) {
|
|
117
|
+
async set(type, params, code) {
|
|
118
118
|
const key = getCacheKey(type, params);
|
|
119
119
|
// If key already exists, delete first so insertion order updates for LRU
|
|
120
120
|
if (state.cache.has(key))
|
|
@@ -134,27 +134,36 @@ function createCacheInstance(state) {
|
|
|
134
134
|
deleteFileNonBlocking(file);
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
+
// Save to disk asynchronously
|
|
138
|
+
const file = path.join(state.cacheDir, `${key}.json`);
|
|
139
|
+
try {
|
|
140
|
+
await fs.fsPromises.access(state.cacheDir);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
await fs.fsPromises.mkdir(state.cacheDir, { recursive: true });
|
|
144
|
+
}
|
|
145
|
+
await fs.fsPromises.writeFile(file, JSON.stringify({ code, timestamp: Date.now() }, null, 2));
|
|
137
146
|
},
|
|
138
147
|
/**
|
|
139
|
-
* Save cache to disk
|
|
148
|
+
* Save cache to disk (async)
|
|
140
149
|
*/
|
|
141
|
-
save() {
|
|
142
|
-
saveCacheToDisk(state);
|
|
150
|
+
async save() {
|
|
151
|
+
await saveCacheToDisk(state);
|
|
143
152
|
},
|
|
144
153
|
/**
|
|
145
|
-
* Clear cache
|
|
154
|
+
* Clear cache (async)
|
|
146
155
|
*/
|
|
147
|
-
clear() {
|
|
156
|
+
async clear() {
|
|
148
157
|
if (state.cleanupInterval) {
|
|
149
158
|
clearInterval(state.cleanupInterval);
|
|
150
159
|
state.cleanupInterval = undefined;
|
|
151
160
|
}
|
|
152
|
-
clearCache(state);
|
|
161
|
+
await clearCache(state);
|
|
153
162
|
},
|
|
154
163
|
/**
|
|
155
|
-
* Get cache statistics
|
|
164
|
+
* Get cache statistics (async)
|
|
156
165
|
*/
|
|
157
|
-
getStats() {
|
|
166
|
+
async getStats() {
|
|
158
167
|
return getCacheStats(state);
|
|
159
168
|
},
|
|
160
169
|
};
|
|
@@ -166,38 +175,66 @@ function attachCacheStateForTests(instance, state) {
|
|
|
166
175
|
});
|
|
167
176
|
}
|
|
168
177
|
/**
|
|
169
|
-
* Save cache to disk
|
|
178
|
+
* Save cache to disk (async)
|
|
170
179
|
*/
|
|
171
|
-
function saveCacheToDisk(state) {
|
|
172
|
-
|
|
173
|
-
|
|
180
|
+
async function saveCacheToDisk(state) {
|
|
181
|
+
try {
|
|
182
|
+
try {
|
|
183
|
+
await fs.fsPromises.access(state.cacheDir);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
await fs.fsPromises.mkdir(state.cacheDir, { recursive: true });
|
|
187
|
+
}
|
|
188
|
+
const writes = Array.from(state.cache.entries()).map(async ([key, entry]) => {
|
|
189
|
+
const file = path.join(state.cacheDir, `${key}.json`);
|
|
190
|
+
await fs.fsPromises.writeFile(file, JSON.stringify(entry, null, 2));
|
|
191
|
+
});
|
|
192
|
+
await Promise.all(writes);
|
|
174
193
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
fs.writeFileSync(file, JSON.stringify(entry, null, 2));
|
|
194
|
+
catch (error) {
|
|
195
|
+
Logger.error('Failed to save cache to disk', error);
|
|
178
196
|
}
|
|
179
197
|
}
|
|
180
198
|
/**
|
|
181
|
-
* Clear cache
|
|
199
|
+
* Clear cache (async)
|
|
182
200
|
*/
|
|
183
|
-
function clearCache(state) {
|
|
201
|
+
async function clearCache(state) {
|
|
184
202
|
state.cache.clear();
|
|
185
|
-
|
|
186
|
-
|
|
203
|
+
try {
|
|
204
|
+
try {
|
|
205
|
+
await fs.fsPromises.access(state.cacheDir);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return; // Dir doesn't exist
|
|
209
|
+
}
|
|
210
|
+
await fs.fsPromises.rm(state.cacheDir, { recursive: true });
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
Logger.error('Failed to clear cache', error);
|
|
187
214
|
}
|
|
188
215
|
}
|
|
189
216
|
/**
|
|
190
|
-
* Get cache statistics
|
|
217
|
+
* Get cache statistics (async)
|
|
191
218
|
*/
|
|
192
|
-
function getCacheStats(state) {
|
|
219
|
+
async function getCacheStats(state) {
|
|
193
220
|
let diskUsage = 0;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
|
|
221
|
+
try {
|
|
222
|
+
try {
|
|
223
|
+
await fs.fsPromises.access(state.cacheDir);
|
|
224
|
+
const files = await fs.fsPromises.readdir(state.cacheDir);
|
|
225
|
+
const sizes = await Promise.all(files.map(async (file) => {
|
|
226
|
+
const stats = await fs.fsPromises.stat(path.join(state.cacheDir, file));
|
|
227
|
+
return stats.size;
|
|
228
|
+
}));
|
|
229
|
+
diskUsage = sizes.reduce((sum, size) => sum + size, 0);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// ignore
|
|
199
233
|
}
|
|
200
234
|
}
|
|
235
|
+
catch {
|
|
236
|
+
// ignore
|
|
237
|
+
}
|
|
201
238
|
return {
|
|
202
239
|
size: diskUsage,
|
|
203
240
|
entries: state.cache.size,
|
|
@@ -242,23 +279,38 @@ function toInt32(value) {
|
|
|
242
279
|
return uint32 > 2147483647 ? uint32 - 4294967296 : uint32;
|
|
243
280
|
}
|
|
244
281
|
/**
|
|
245
|
-
* Load cache from disk
|
|
282
|
+
* Load cache from disk (async)
|
|
246
283
|
*/
|
|
247
|
-
function loadFromDisk(state) {
|
|
248
|
-
|
|
284
|
+
async function loadFromDisk(state) {
|
|
285
|
+
try {
|
|
249
286
|
try {
|
|
250
|
-
|
|
251
|
-
for (const file of files) {
|
|
252
|
-
if (file.endsWith('.json') === true) {
|
|
253
|
-
const content = fs.readFileSync(path.join(state.cacheDir, file), 'utf-8');
|
|
254
|
-
const data = JSON.parse(content);
|
|
255
|
-
state.cache.set(file.replace('.json', ''), data);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
287
|
+
await fs.fsPromises.access(state.cacheDir);
|
|
258
288
|
}
|
|
259
|
-
catch
|
|
260
|
-
|
|
289
|
+
catch {
|
|
290
|
+
return;
|
|
261
291
|
}
|
|
292
|
+
const files = await fs.fsPromises.readdir(state.cacheDir);
|
|
293
|
+
const jsonFiles = files.filter((file) => file.endsWith('.json') === true);
|
|
294
|
+
const parsedEntries = await Promise.all(jsonFiles.map(async (file) => {
|
|
295
|
+
const filePath = path.join(state.cacheDir, file);
|
|
296
|
+
const content = await fs.fsPromises.readFile(filePath, 'utf-8');
|
|
297
|
+
try {
|
|
298
|
+
const data = JSON.parse(content);
|
|
299
|
+
return { key: file.replace('.json', ''), data };
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// ignore corrupted files
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
}));
|
|
306
|
+
for (const entry of parsedEntries) {
|
|
307
|
+
if (entry !== null) {
|
|
308
|
+
state.cache.set(entry.key, entry.data);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
Logger.error(`Failed to load cache from disk: ${err instanceof Error ? err.message : String(err)}`);
|
|
262
314
|
}
|
|
263
315
|
}
|
|
264
316
|
/**
|
|
@@ -340,17 +392,51 @@ export const ParallelGenerator = Object.freeze({
|
|
|
340
392
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
341
393
|
export function createMemoized(fn, options = {}) {
|
|
342
394
|
const cache = new Map();
|
|
395
|
+
const maxSize = options.maxSize ?? 1000; // Default max size: 1000 entries
|
|
396
|
+
const evictLRU = () => {
|
|
397
|
+
if (cache.size < maxSize)
|
|
398
|
+
return;
|
|
399
|
+
// Find oldest entry (LRU)
|
|
400
|
+
let oldestKey = null;
|
|
401
|
+
let oldestTime = Infinity;
|
|
402
|
+
for (const [key, entry] of cache.entries()) {
|
|
403
|
+
if (entry.lastAccessAt < oldestTime) {
|
|
404
|
+
oldestTime = entry.lastAccessAt;
|
|
405
|
+
oldestKey = key;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (oldestKey !== null) {
|
|
409
|
+
cache.delete(oldestKey);
|
|
410
|
+
}
|
|
411
|
+
};
|
|
343
412
|
return ((...args) => {
|
|
344
|
-
|
|
413
|
+
let key;
|
|
414
|
+
if (options.keyGenerator === undefined) {
|
|
415
|
+
// Optimization: Avoid JSON.stringify for simple primitive arguments
|
|
416
|
+
const arePrimitives = args.every((a) => a === null ||
|
|
417
|
+
typeof a === 'string' ||
|
|
418
|
+
typeof a === 'number' ||
|
|
419
|
+
typeof a === 'boolean' ||
|
|
420
|
+
a === 'undefined');
|
|
421
|
+
key = arePrimitives ? args.join('|') : JSON.stringify(args);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
key = options.keyGenerator(args);
|
|
425
|
+
}
|
|
345
426
|
const entry = cache.get(key);
|
|
346
427
|
if (entry !== undefined) {
|
|
347
|
-
if (options.ttl === undefined || Date.now() - entry.
|
|
428
|
+
if (options.ttl === undefined || Date.now() - entry.createdAt < options.ttl) {
|
|
429
|
+
// Update access time for LRU; TTL remains based on creation time
|
|
430
|
+
entry.lastAccessAt = Date.now();
|
|
348
431
|
return entry.result;
|
|
349
432
|
}
|
|
350
433
|
cache.delete(key);
|
|
351
434
|
}
|
|
352
435
|
const result = fn(...args);
|
|
353
|
-
|
|
436
|
+
// Evict LRU before adding new entry
|
|
437
|
+
evictLRU();
|
|
438
|
+
const now = Date.now();
|
|
439
|
+
cache.set(key, { result, createdAt: now, lastAccessAt: now });
|
|
354
440
|
return result;
|
|
355
441
|
});
|
|
356
442
|
}
|
|
@@ -440,17 +526,36 @@ async function generateInParallel(stats, generators, batchSize) {
|
|
|
440
526
|
*/
|
|
441
527
|
async function generateWithCache(cache, stats, type, params, generatorFn) {
|
|
442
528
|
// Try cache
|
|
443
|
-
|
|
529
|
+
let cached = null;
|
|
530
|
+
try {
|
|
531
|
+
cached = await cache.get(type, params);
|
|
532
|
+
}
|
|
533
|
+
catch (err) {
|
|
534
|
+
Logger.warn('GenerationCache.get failed; treating as cache miss', {
|
|
535
|
+
type,
|
|
536
|
+
error: err instanceof Error ? err.message : String(err),
|
|
537
|
+
});
|
|
538
|
+
}
|
|
444
539
|
if (cached !== null) {
|
|
445
|
-
|
|
446
|
-
|
|
540
|
+
try {
|
|
541
|
+
stats.cacheHits++;
|
|
542
|
+
return JSON.parse(cached);
|
|
543
|
+
}
|
|
544
|
+
catch (err) {
|
|
545
|
+
Logger.warn('Failed to parse cached generation result; treating as cache miss', {
|
|
546
|
+
type,
|
|
547
|
+
error: err instanceof Error ? err.message : String(err),
|
|
548
|
+
});
|
|
549
|
+
}
|
|
447
550
|
}
|
|
448
551
|
// Generate
|
|
449
552
|
const startTime = performance.now();
|
|
450
553
|
const result = await generatorFn();
|
|
451
554
|
const duration = performance.now() - startTime;
|
|
452
|
-
// Cache result
|
|
453
|
-
cache
|
|
555
|
+
// Cache result (fire-and-forget)
|
|
556
|
+
void cache
|
|
557
|
+
.set(type, params, JSON.stringify(result))
|
|
558
|
+
.catch((err) => Logger.error('GenerationCache.set failed', err));
|
|
454
559
|
stats.cacheMisses++;
|
|
455
560
|
stats.savedTime += duration;
|
|
456
561
|
return result;
|
|
@@ -458,6 +563,16 @@ async function generateWithCache(cache, stats, type, params, generatorFn) {
|
|
|
458
563
|
/**
|
|
459
564
|
* Get optimization statistics
|
|
460
565
|
*/
|
|
566
|
+
function getCacheStatusSync(cache) {
|
|
567
|
+
const state = cache[GENERATION_CACHE_STATE_SYMBOL];
|
|
568
|
+
const map = state?.cache;
|
|
569
|
+
if (!(map instanceof Map))
|
|
570
|
+
return { size: 0, keys: [] };
|
|
571
|
+
return {
|
|
572
|
+
size: map.size,
|
|
573
|
+
keys: Array.from(map.keys()),
|
|
574
|
+
};
|
|
575
|
+
}
|
|
461
576
|
function getOptimizerStats(cache, stats) {
|
|
462
577
|
const total = stats.cacheHits + stats.cacheMisses;
|
|
463
578
|
const hitRate = total > 0 ? (stats.cacheHits / total) * 100 : 0;
|
|
@@ -467,7 +582,7 @@ function getOptimizerStats(cache, stats) {
|
|
|
467
582
|
hitRate: `${hitRate.toFixed(1)}%`,
|
|
468
583
|
parallelRuns: stats.parallelRuns,
|
|
469
584
|
estimatedSavedTime: `${stats.savedTime.toFixed(2)}ms`,
|
|
470
|
-
cacheStatus: cache
|
|
585
|
+
cacheStatus: getCacheStatusSync(cache),
|
|
471
586
|
};
|
|
472
587
|
}
|
|
473
588
|
export default PerformanceOptimizer;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Memory Profiler
|
|
3
3
|
* Tracks heap memory usage and garbage collection events
|
|
4
4
|
*/
|
|
5
|
-
import { MemoryDelta, MemorySnapshot } from './types';
|
|
5
|
+
import type { MemoryDelta, MemorySnapshot } from './types';
|
|
6
6
|
export interface IMemoryProfiler {
|
|
7
7
|
start(): void;
|
|
8
8
|
end(): MemorySnapshot;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryProfiler.d.ts","sourceRoot":"","sources":["../../../src/profiling/MemoryProfiler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryProfiler.d.ts","sourceRoot":"","sources":["../../../src/profiling/MemoryProfiler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,IAAI,CAAC;IACd,GAAG,IAAI,cAAc,CAAC;IACtB,KAAK,IAAI,WAAW,CAAC;IACrB,gBAAgB,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1C,cAAc,IAAI,cAAc,GAAG,IAAI,CAAC;IACxC,SAAS,IAAI,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;cACO,eAAe;IAmEzB;;OAEG;uBACgB,MAAM,GAAG,MAAM;EAGlC,CAAC;AAEH;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* N+1 Query Pattern Detector
|
|
3
3
|
* Analyzes query logs to identify N+1 patterns
|
|
4
4
|
*/
|
|
5
|
-
import { IN1Detector } from './types';
|
|
5
|
+
import type { IN1Detector } from './types';
|
|
6
6
|
/**\n * N1Detector analyzes query logs to identify N+1 patterns
|
|
7
7
|
* Groups identical queries and flags those executed 5+ times as critical
|
|
8
8
|
* Sealed namespace for immutability
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"N1Detector.d.ts","sourceRoot":"","sources":["../../../src/profiling/N1Detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAA4B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"N1Detector.d.ts","sourceRoot":"","sources":["../../../src/profiling/N1Detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,kBAAkB,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;cACO,WAAW;EAiCrB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Query Logger
|
|
3
3
|
* Tracks database query execution with parameters, duration, and context
|
|
4
4
|
*/
|
|
5
|
-
import { QueryLogEntry } from './types';
|
|
5
|
+
import type { QueryLogEntry } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* QueryLogger tracks all database queries executed during a request context
|
|
8
8
|
* Provides N+1 detection heuristic by flagging identical queries executed 5+ times
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryLogger.d.ts","sourceRoot":"","sources":["../../../src/profiling/QueryLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryLogger.d.ts","sourceRoot":"","sources":["../../../src/profiling/QueryLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnF;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/C;;OAEG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE3F;;OAEG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;IAErE;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;OAEG;IACH,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAE3C;;OAEG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExC;;OAEG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5C;AASD;;;;GAIG;AACH,eAAO,MAAM,WAAW;;mBAGP,YAAY;IAG3B;;OAEG;wBACiB,MAAM,GAAG,IAAI;IAcjC;;OAEG;kBACW,MAAM;IAIpB;;OAEG;kBAEI,MAAM,UACH,OAAO,EAAE,YACP,MAAM,YACP,MAAM,GACd,IAAI;IA+BP;;OAEG;0BACkB,MAAM,GAAoB,aAAa,EAAE;IAK9D;;OAEG;8BAEQ,MAAM,GACd,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1D;;;OAGG;4BACoB,MAAM,cAA8B,MAAM,GAAO,aAAa,EAAE;IAavF;;OAEG;oBACa,MAAM,GAAG,IAAI;IAS7B;;OAEG;kBACW,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAU1C;;OAEG;4BACoB,MAAM,GAAoB,MAAM;IAIvD;;OAEG;+BACuB,MAAM,GAAoB,MAAM;EAI1D,CAAC"}
|